Команда Emacs для удаления до непробельного символа - PullRequest
41 голосов
/ 15 января 2009

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

function_call(
     'first_arg',
     'second')

до

function_call('first_arg', 'second')

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

Ответы [ 10 ]

59 голосов
/ 15 января 2009

Вы можете попробовать delete-indentation, мою любимую команду для объединения нескольких строк в одну строку. В вашем примере поместите курсор на строку со «секундой» и дважды нажмите M - ^ . Вот документы:

M - ^ запускает команду delete-indentation, которая является интерактивной скомпилированной функцией Lisp в simple.el.

Он связан с M - ^ .

(delete-indentation &optional arg)

Присоедините эту строку к предыдущей и исправьте пробелы при соединении. Если есть префикс заполнения, удалите его в начале этой строки. С аргументом, присоедините эту строку к следующей строке.

27 голосов
/ 15 января 2009

Посмотрите на функцию fixup-whitespace. Поставляется с Emacs, в simple.el. Его документы:

Исправление пробелов между объектами вокруг точки. Оставьте один пробел или ни одного, в зависимости от контекста.

Аналогичная функция, just-one-space, что

Удаляет все пробелы и табуляции вокруг точки, оставляя один пробел

обычно связан с M-SPC .

17 голосов
/ 15 января 2009

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

Есть команда, которая делает это почти так:

M- \ запускает команду delete-horizontal-space которая представляет собой интерактивную скомпилированную функцию Lisp в `simple.el '.

Это связано с М - \.

(удаление-горизонтальный-пробел и опционально только в обратном направлении)

Удалить все пробелы и вкладки вокруг точки. Если backward-only не ноль, удаляйте их только перед точкой.

6 голосов
/ 15 января 2009

Я использую следующий макрос, чтобы «вытянуть» следующую строку в конец текущей строки, сжимая пробелы.

(defun pull-next-line() 
  (interactive) 
  (move-end-of-line 1) 
  (kill-line)
  (just-one-space))

Это полная противоположность move-line-up @ jrockway и delete-indentation, что я считаю более естественным. Команда just-one-space в макросе в точности совпадает с * Mike's M-SPACE.

Я связываю pull-next-line с M-J (по аналогии с J Vim для команды "join"), используя в моем .emacs.

следующее
(global-set-key (kbd "M-J") 'pull-next-line)

Пример. Вызов pull-next-line в первой строке

function_call(
     'first_arg',
     'second')

выходы

function_call( 'first_arg',
     'second')

Второй вызов - 1026 *

function_call( 'first_arg', 'second')
6 голосов
/ 15 января 2009

Вы всегда можете использовать M-z для удаления до символа.

Например, в вашем случае:

M-z 'для удаления до одинарной кавычки (к сожалению, это также удалит одинарную кавычку, но это незначительное неудобство).

5 голосов
/ 15 января 2009

Alt-space уменьшит строку пробела до одного пробела, но не удалит символ новой строки. Тем не менее, это должно немного помочь.

Чтобы удалить все от точки до первого непробельного (или новой строки), введите непробельный символ, Alt-space, backspace (чтобы удалить окончательный пробельный символ), затем backspace (чтобы удалить добавленный вами символ. 1003 *

Чтобы превратить объявление многострочной функции в однострочное объявление, используйте комбинацию команд Alt-space, backspace и Alt-E (goto-endofline).

4 голосов
/ 14 сентября 2010

Довольно радикальный способ сделать это - Hungry-Delete mode:

Hungry-Delete - второстепенный режим, при котором удаление удаляет все пробелы в направлении, которое вы удаляете.

3 голосов
/ 28 ноября 2009

Немного другой подход - создание макроса клавиатуры, который сделает эту работу за вас. Итак, для создания стадии макроса общий сценарий выглядит так:

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 в одну строку

Убедитесь, что вы не забыли сохранить макрос клавиатуры, выполнив M-x insert-kbd-macro где-нибудь в вашем файле .emacs - вот как это выглядит:

(fset 'jline
   [?\M-b end ?\C-  ?\C-\M-f home ?\C-w escape ? ])
1 голос
/ 15 января 2009

Если вы хотите, чтобы все ваши операции удаления выполнялись таким образом, вы можете проверить жадное удаление.

1 голос
/ 15 января 2009

Я делаю это:

(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)

Чтобы решить вашу проблему, в строке с надписью "second)" просто наберите C-x , C-x ,

...