ฉันจะลบบรรทัดปัจจุบันใน 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.

นี้ได้ผล มีวิธีดำเนินการโดยใช้คำสั่งเดียวหรือไม่? ฉันจะต้องสร้างการผูกคีย์ที่กำหนดเองเพื่อดำเนินการนี้หรือไม่
Manoj Govindan

14
ไม่รู้C-x zว่าเจ๋งจริงๆ และคำตอบที่ดีและแม่นยำ btw
slu

2
นอกจากนี้ยังมีC-k C-kสิ่งที่ทำงานเหมือนเป็นd$ S-jกลุ่ม แต่สามารถลบบรรทัดไปข้างหน้าได้ค่อนข้างดี
Theo Belaire

ทำไมไม่ได้มีพื้นที่ในC-cd?
Elliot Gorokhovsky

@ 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

ดีและสอดคล้องกันและค่อนข้างจำง่าย i_CTRL-Wแม้เพียงเล็กน้อยคล้ายกับเป็นกลุ่มของ

เมื่อคุณใส่บางสิ่งลงในวงแหวนสังหารด้วยข้อใดข้อหนึ่งข้างต้นคุณอาจต้องการ "ดึง" (วาง):

M-y  ; yank-pop

(โปรดทราบว่า CS-backspace อาจไม่ทำงานใน Terminal 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))))

แหล่ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.