Как я могу удалить текущую строку в Emacs?


122

Что Emacs эквивалентно vi dd? Я хочу удалить текущую строку. Пробовал CTRL+, kно он удаляет только с текущей позиции.

Ответы:


212
C-a # Go to beginning of line
C-k # Kill line from current point

А также есть

C-S-backspace   # Ctrl-Shift-Backspace

который вызывает M-x kill-whole-line.

Если вы хотите установить другую привязку глобального ключа, вы должны поместить это в ~ / .emacs:

(global-set-key "\C-cd" 'kill-whole-line)     # Sets `C-c d` to `M-x kill-whole-line`

Если вы хотите удалить несколько целых строк, вы можете добавить к команде номер:

C-u 5 C-S-backspace    # deletes 5 whole lines
M-5 C-S-backspace      # deletes 5 whole lines

C-u C-S-backspace      # delete 4 whole lines. C-u without a number defaults to 4

C-u -5 C-S-backspace   # deletes previous 5 whole lines
M--5 C-S-backspace     # deletes previous 5 whole lines

Иногда мне также C-x zпомогают:

C-S-backspace         # delete 1 whole line
C-x z                 # repeat last command
z                     # repeat last command again. 
                      # Press z as many times as you wish. 
                      # Any other key acts normally, and ends the repeat command.

Это работает. Есть ли способ сделать это одной командой? Придется ли мне для этого создать привязку пользовательского ключа?
Манодж Говиндан

14
Не знал C-x z, это действительно круто. И, кстати, хороший и точный ответ.
slu

2
Там также есть C-k C-kчто-то вроде d$ S-jin vim, но это может довольно хорошо удалять строки вперед.
Theo Belaire 08

Почему нет места C-cd?
Эллиот Гороховский

@ RenéG: Пробел необязательный.
unutbu

11

Если вы не хотите уничтожать строку (которая помещает ее в буфер обмена ОС и убивает кольцо), а просто удалите ее:

(defun delete-current-line ()
  "Delete (not kill) the current line."
  (interactive)
  (save-excursion
    (delete-region
     (progn (forward-visible-line 0) (point))
     (progn (forward-visible-line 1) (point)))))

3

Другой способ удалить строку, не помещая ее в список уничтожений:

(defun delete-current-line ()
  "Deletes the current line"
  (interactive)
  (delete-region
   (line-beginning-position)
   (line-end-position)))

Это оставит точку в начале пустой строки. Чтобы избавиться от этого, вы можете добавить что-то вроде этого (delete-blank-lines)в конец функции, как в этом примере, что, возможно, немного менее интуитивно понятно:

(defun delete-current-line ()
 "Deletes the current line"
 (interactive)
 (forward-line 0)
 (delete-char (- (line-end-position) (point)))
 (delete-blank-lines))

1

Самый быстрый / простой способ удалить (уничтожить) всю строку из любой точки строки, ничего не выбирая:

C-w  ; kill-region

Он универсален для удаления всего, что выбрано, или строки по умолчанию, если ничего не выбрано.

Учитывая вопрос, вы, вероятно, также заинтересованы в воспроизведении «yank» Vim yy(хотя на языке Emacs «yank» сбивает с толку «put» Vim p). Это:

M-w  ; kill-ring-save

Красиво, гармонично и довольно легко запоминается. Даже немного похож на Vim's i_CTRL-W.

После того, как вы поместили что-то в список убийств одним из вышеперечисленных способов, вы, вероятно, захотите «выдернуть» (вставить) это:

M-y  ; yank-pop

(Обратите внимание, что CS-backspace может не работать в терминале Emacs.)


1

Вместо того, чтобы иметь отдельный ключ для удаления строки или вызывать префикс-аргумент. Вы можете использовать crux-smart-kill-line, который «убьет до конца строки и убьет всю строку при следующем вызове». Но если вы предпочитаете deleteвместо kill, вы можете использовать приведенный ниже код.

Для операции «точка-строка» (kill / delete) я рекомендую использовать zop-to-char

(defun aza-delete-line ()
  "Delete from current position to end of line without pushing to `kill-ring'."
  (interactive)
  (delete-region (point) (line-end-position)))

(defun aza-delete-whole-line ()
  "Delete whole line without pushing to kill-ring."
  (interactive)
  (delete-region (line-beginning-position) (line-end-position)))

(defun crux-smart-delete-line ()
  "Kill to the end of the line and kill whole line on the next call."
  (interactive)
  (let ((orig-point (point)))
    (move-end-of-line 1)
    (if (= orig-point (point))
        (aza-delete-whole-line)
      (goto-char orig-point)
      (aza-delete-line))))

источник

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.