Подтвердить что ты не робот

Команда Emacs для удаления до непропускаемого символа

Я часто хочу сделать многострочный вызов функции и уменьшить ее до одной строки. Например, конвертировать...

function_call(
     'first_arg',
     'second')

к

function_call('first_arg', 'second')

Есть ли у emacs некоторые команды, которые помогут с этим. В частности, есть ли команда, которая удалит все пробелы от точки до первого символа без пробелов?

4b9b3361

Ответ 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.