Як я можу видалити поточний рядок у 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, це дійсно круто. І приємна та точна відповідь btw.
слу

2
Існує також C-k C-kякийсь вид роботи як d$ S-jvim, але це може видалити рядки вперед досить добре.
Тео Белаар

Чому в ньому немає місця 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

Він є універсальним для видалення вибраного або рядка за замовчуванням, якщо нічого не вибрано.

З огляду на запитання, ймовірно, ви також зацікавлені у тому, щоб тиражувати "ривок" Віма yy(хоча, кажучи, у Emacs "yank" заплутано "покладений" 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, можете скористатися наведеним нижче кодом.

Для операції "введення в рядок" (вбити / видалити) я рекомендую використовувати 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.