Bagaimana cara menghapus baris saat ini di Emacs?

122

Apa padanan emacs dari vi dd? Saya ingin menghapus baris saat ini. Mencoba CTRL+ ktetapi hanya menghapus dari posisi saat ini.

Manoj Govindan
sumber

Jawaban:

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

Ada juga

C-S-backspace   # Ctrl-Shift-Backspace

yang memanggil M-x kill-whole-line.

Jika Anda ingin menyetel pengikatan kunci global yang berbeda, Anda harus meletakkan ini di ~ / .emacs:

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

Jika Anda ingin menghapus sejumlah baris, Anda dapat mengawali perintah dengan angka:

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

Terkadang saya juga merasa C-x zterbantu:

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
sumber
Ini bekerja. Apakah ada cara untuk melakukan ini dengan menggunakan satu perintah? Apakah saya harus membuat pengikatan kunci khusus untuk melakukan ini?
Manoj Govindan
14
Tidak tahu C-x z, itu sangat keren. Dan jawaban yang bagus dan tepat btw.
slu
2
Ada juga C-k C-kyang berfungsi seperti d$ S-jin vim, tetapi ini dapat menghapus baris ke depan dengan cukup baik.
Theo Belaire
Mengapa tidak ada ruang di dalamnya C-cd?
Elliot Gorokhovsky
@ RenéG: Spasi adalah opsional.
unutbu
11

Jika Anda tidak ingin mematikan baris (yang akan memasukkannya ke clipboard OS dan mematikan cincin) tetapi cukup hapus:

(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
sumber
3

Metode lain untuk menghapus baris tanpa menempatkannya ke dalam kill ring:

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

Ini akan meninggalkan titik di awal baris kosong. Untuk menghilangkan ini juga, Anda mungkin ingin menambahkan sesuatu seperti (delete-blank-lines)di akhir fungsi, seperti dalam contoh ini, yang mungkin sedikit kurang intuitif:

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

Cara tercepat / termudah untuk menghapus (membunuh) satu baris penuh, dari titik mana pun di baris, tanpa memilih apa pun, adalah:

C-w  ; kill-region

Ini serbaguna dalam menghapus apa pun yang dipilih, atau garis secara default jika tidak ada yang dipilih.

Dengan adanya pertanyaan tersebut, Anda mungkin juga tertarik untuk mereplikasi "yank" Vim, yy(meskipun dalam bahasa Emacs, "yank" membingungkan adalah "put" Vim, p). Ini adalah:

M-w  ; kill-ring-save

Bagus dan kongruen, dan cukup mudah diingat. Bahkan sedikit mirip dengan Vim i_CTRL-W.

Setelah Anda memasukkan sesuatu ke dalam kill ring dengan salah satu cara di atas, Anda mungkin ingin "menarik" (menempelkannya):

M-y  ; yank-pop

(Perhatikan bahwa CS-backspace mungkin tidak berfungsi di terminal Emacs.)

Micah Elliott
sumber
1

Daripada memiliki kunci terpisah untuk menghapus baris, atau harus memanggil prefix-argument. Anda dapat menggunakan crux-smart-kill-line yang akan "membunuh sampai akhir baris dan mematikan seluruh baris pada panggilan berikutnya". Tapi jika Anda lebih memilih deletebukan kill, Anda dapat menggunakan kode di bawah ini.

Untuk operasi point-to-string (kill / delete) saya sarankan untuk menggunakan 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))))

sumber

azzamsa
sumber