Jak mogę usunąć bieżącą linię w Emacsie?


122

Jaki jest odpowiednik vi w emacsie dd? Chcę usunąć bieżącą linię. Wypróbowano CTRL+, kale usuwa tylko z bieżącej pozycji.

Odpowiedzi:


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

Jest również

C-S-backspace   # Ctrl-Shift-Backspace

który wywołuje M-x kill-whole-line.

Jeśli chcesz ustawić inne globalne powiązanie klucza, umieść to w ~ / .emacs:

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

Jeśli chcesz usunąć kilka całych linii, możesz poprzedzić polecenie numerem:

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

Czasami C-x zpomocny jest również :

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.

To działa. Czy można to zrobić za pomocą jednego polecenia? Czy w tym celu będę musiał utworzyć niestandardowe powiązanie klawiszy?
Manoj Govindan

14
Nie wiedziałem C-x z, to naprawdę fajne. A przy okazji miła i precyzyjna odpowiedź.
slu

2
Jest też coś, C-k C-kco działa jak d$ S-jw vimie, ale może całkiem ładnie usunąć linie do przodu.
Theo Belaire

Dlaczego w środku nie ma miejsca C-cd?
Elliot Gorokhovsky

@ RenéG: Przestrzeń jest opcjonalna.
unutbu

11

Jeśli nie chcesz zabijać linii (co spowodowałoby umieszczenie jej w schowku systemu operacyjnego i zabicie pierścienia), ale po prostu ją usuń:

(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

Inna metoda usunięcia linii bez umieszczania jej w pierścieniu zabijania:

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

Spowoduje to pozostawienie punktu na początku pustej linii. Aby się tego również pozbyć, możesz chcieć dodać coś takiego (delete-blank-lines)na końcu funkcji, jak w tym przykładzie, który jest być może trochę mniej intuicyjny:

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

1

Najszybszym / najprostszym sposobem usunięcia (zabicia) pełnego wiersza, z dowolnego punktu w wierszu, bez wybierania czegokolwiek, jest:

C-w  ; kill-region

Jest wszechstronny w usuwaniu wszystkiego, co jest zaznaczone, lub domyślnie linii, jeśli nic nie jest wybrane.

Biorąc pod uwagę to pytanie, prawdopodobnie jesteś również zainteresowany replikacją "szarpnięcia" Vima yy(chociaż w żargonie Emacsa "szarpnięcie" jest myląco "wstawieniem" Vima p). To jest:

M-w  ; kill-ring-save

Ładne, przystające i łatwe do zapamiętania. Nawet trochę podobny do Vima i_CTRL-W.

Gdy umieścisz coś w pierścieniu zabijania za pomocą jednego z powyższych, prawdopodobnie będziesz chciał to „wyszarpnąć” (wkleić):

M-y  ; yank-pop

(Zauważ, że CS-backspace może nie działać w terminalowym Emacs.)


1

Zamiast mieć oddzielny klucz do usuwania linii lub wywoływać prefiks-argument. Możesz użyć crux-smart-kill-line, która „zabije do końca linii i zabije całą linię przy następnym wywołaniu”. Ale jeśli wolisz deletezamiastkill , możesz użyć poniższego kodu.

W przypadku operacji typu punkt-łańcuch (zabij / usuń) zalecam użycie 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))))

źródło

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.