Как я могу удалить текущую строку в 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.