Wie kann ich die aktuelle Zeile in Emacs löschen?

122

Was ist das Emacs-Äquivalent von vi dd? Ich möchte die aktuelle Zeile löschen. Versucht CTRL+, kaber es wird nur von der aktuellen Position gelöscht .

Manoj Govindan
quelle

Antworten:

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

Es gibt auch

C-S-backspace   # Ctrl-Shift-Backspace

was aufruft M-x kill-whole-line.

Wenn Sie eine andere globale Schlüsselbindung festlegen möchten, fügen Sie diese in ~ / .emacs ein:

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

Wenn Sie mehrere ganze Zeilen löschen möchten, können Sie dem Befehl eine Nummer voranstellen:

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

Manchmal finde ich auch C-x zhilfreich:

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.
unutbu
quelle
Das funktioniert. Gibt es eine Möglichkeit, dies mit einem Befehl zu tun? Muss ich dazu eine benutzerdefinierte Schlüsselbindung erstellen?
Manoj Govindan
14
Wusste nicht C-x z, das ist echt cool. Und übrigens eine nette und präzise Antwort.
Slu
2
Es gibt auch, C-k C-kwas irgendwie wie ein d$ S-jin vim funktioniert , aber dies kann Zeilen vorwärts ziemlich gut löschen.
Theo Belaire
Warum ist kein Platz drin C-cd?
Elliot Gorokhovsky
@ RenéG: Der Platz ist optional.
Unutbu
11

Für den Fall, dass Sie die Zeile nicht beenden möchten (wodurch sie in die Zwischenablage des Betriebssystems eingefügt und der Ring beendet wird), sondern einfach löschen:

(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)))))
Vladimir Panteleev
quelle
3

Eine andere Methode, um die Zeile zu löschen, ohne sie in den Kill Ring zu legen:

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

Dadurch bleibt der Punkt am Anfang einer leeren Zeile. Um dies ebenfalls zu beseitigen, möchten Sie möglicherweise etwas wie (delete-blank-lines)das Ende der Funktion hinzufügen , wie in diesem Beispiel, das möglicherweise etwas weniger intuitiv ist:

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

Der schnellste / einfachste Weg, eine vollständige Linie von einem beliebigen Punkt der Linie aus zu löschen (zu töten), ohne etwas auszuwählen, ist:

C-w  ; kill-region

Es ist vielseitig einsetzbar, um ausgewählte Elemente oder standardmäßig eine Zeile zu löschen, wenn nichts ausgewählt ist.

Angesichts der Frage sind Sie wahrscheinlich auch daran interessiert, Vims "Ruck" zu replizieren yy(obwohl in Emacs Sprache ein "Ruck" verwirrenderweise Vims "Put" ist p). Das ist:

M-w  ; kill-ring-save

Schön und kongruent und ziemlich leicht zu merken. Sogar etwas ähnlich wie bei Vim i_CTRL-W.

Sobald Sie etwas mit einem der oben genannten Punkte in den Kill-Ring gelegt haben, möchten Sie es wahrscheinlich "ziehen" (einfügen):

M-y  ; yank-pop

(Beachten Sie, dass CS-Backspace in Terminal-Emacs möglicherweise nicht funktioniert.)

Micah Elliott
quelle
1

Anstatt einen separaten Schlüssel zum Löschen der Zeile zu haben oder ein Präfixargument aufzurufen. Sie können die Crux-Smart-Kill-Linie verwenden, die "bis zum Ende der Linie tötet und beim nächsten Anruf die ganze Linie tötet". Aber wenn Sie es vorziehen , deletestatt kill, können Sie den Code unten verwenden.

Für Point-to-String-Operationen (Kill / Delete) empfehle ich die Verwendung von 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))))

Quelle

Azzamsa
quelle