Команда Emacs для удаления до непропускаемого символа
Я часто хочу сделать многострочный вызов функции и уменьшить ее до одной строки. Например, конвертировать...
function_call(
'first_arg',
'second')
к
function_call('first_arg', 'second')
Есть ли у emacs некоторые команды, которые помогут с этим. В частности, есть ли команда, которая удалит все пробелы от точки до первого символа без пробелов?
Ответы
Ответ 1
Вы можете попробовать delete-indentation
, мою любимую команду для объединения нескольких строк в одну строку. В вашем примере поставьте курсор на строку со "вторым" и дважды нажмите M-^. Вот документы:
M-^ запускается команда delete-indentation
, которая является интерактивной
скомпилированная функция Lisp в simple.el
.
Он привязан к M-^.
(delete-indentation &optional arg)
Присоедините эту строку к предыдущей и исправьте пробел при соединении. Если есть префикс заполнения, удалите его с начала этой строки. С аргументом присоедините эту строку к следующей строке.
Ответ 2
Взгляните на функцию fixup-whitespace
. Он поставляется с Emacs, в simple.el
. Его документы:
Исправить пустое пространство между объектами вокруг точки. Оставьте одно пространство или нет, в соответствии с контекстом.
Аналогичная функция just-one-space
, что
Удаляет все пробелы и вкладки вокруг точки, оставляя одно пробел
обычно привязывается к M-SPC.
Ответ 3
В частности, есть ли команда, которая удалит все пробелы от точки до первого символа без пробелов?
Там команда, которая делает почти это:
M-\запускает команду delete-horizontal-space которая представляет собой интерактивную скомпилированную функцию Lisp в `simple.el '.
Он связан с M - \.
(delete-horizontal-space & опционально только в обратном направлении)
Удалить все пробелы и вкладки вокруг точки. Если только обратное - не ноль, удалите их только до точки.
Ответ 4
Alt-space уменьшит строку пробела до одного символа пробела, но не удалит новую строку. Тем не менее, это должно помочь немного.
Чтобы удалить все из точки в первый не-пробел (или новую строку), введите не-пробелы char, Alt-space, backspace (чтобы удалить окончательный пробел char), затем backspace (чтобы удалить char вы добавили.
Чтобы включить объявление многострочной функции в однострочное объявление, используйте комбинацию команд Alt-space, backspace и Alt-E (goto-endofline).
Ответ 5
Я использую следующий макрос, чтобы "вытащить" следующую строку в конец текущей строки, сжимая пробел.
(defun pull-next-line()
(interactive)
(move-end-of-line 1)
(kill-line)
(just-one-space))
Это точно противоположно @jrockway move-line-up
и delete-indentation
, что я считаю более естественным. Команда just-one-space
в макросе точно равна @Mike M-SPACE
.
Я привязываю pull-next-line
к M-J
(по аналогии с Vim J
, для команды "join" ), используя следующее в моем .emacs
.
(global-set-key (kbd "M-J") 'pull-next-line)
Пример. Вызов pull-next-line
в первой строке
function_call(
'first_arg',
'second')
дает
function_call( 'first_arg',
'second')
Вызов второй раз дает
function_call( 'first_arg', 'second')
Ответ 6
Вы всегда можете использовать M-z для удаления до символа.
Например, в вашем случае:
M-z ', чтобы удалить до одной цитаты (к сожалению, это также удалит одинарную кавычку, но это небольшое неудобство).
Ответ 7
Достаточно решительный способ сделать это: Hungry-Delete:
Hungry-Delete - это второстепенный режим, который приводит к удалению всех пробелов в том направлении, которое вы удаляете.
Ответ 8
Несколько иной подход - это создание макроса клавиатуры для выполнения задания для вас.
поэтому для создания макростара общий сценарий выглядит так:
foo
bar
[строка с "foo", затем несколько строк позже и с некоторыми пробелами, напишите "bar" ]
тогда стоящий где-то между foo и bar, выполните следующие действия:
C-x ( ; start recording macro
M-b ; move backwards to the beginning of foo
END ; move to the end of foo
C-space ; place mark
C-M-f ; move to the end of bar
HOME ; move to the beginning of the line
C-w ; yank out all the white space
M-SPACE ; leave only one space
C-x ) ; end recording the macro
M-x name-last-kbd-macro ; name it, call it jline or something
Теперь вы всегда можете удалить все пробелы между двумя словами с помощью M-x one-line
Удостоверьтесь, что вы не забыли сохранить макрос клавиатуры, выпустив M-x insert-kbd-macro где-нибудь в вашем файле .emacs - вот как это выглядит:
(fset 'jline
[?\M-b end ?\C- ?\C-\M-f home ?\C-w escape ? ])
Ответ 9
Я делаю это:
(defun move-line-up ()
"Removes leading spaces from the current line, and then moves
the current line to the end of the previous line."
(interactive)
(let (start end)
(save-excursion
(beginning-of-line)
; get first non-space character, only look on this line
(let ((search-end (save-excursion (end-of-line) (point))))
(re-search-forward "[^[:space:]]" search-end))
(setq end (1- (point)))
(previous-line)
(end-of-line)
(setq start (point))
(delete-region start end))
(goto-char start)))
(defun move-next-line-up ()
"Moves the next line to the end of the current line"
(interactive)
(next-line)
(move-line-up))
И привяжите их как:
(global-set-key (kbd "C-x ,") 'move-line-up)
(global-set-key (kbd "C-x .") 'move-next-line-up)
Итак, чтобы решить вашу проблему, в строке, которая говорит "вторая", просто запустите C-x , C-x ,
Ответ 10
Если вы хотите, чтобы все ваши удаления действовали таким образом, вы можете проверить greedy-delete.