Backspace โดยไม่ต้องเพิ่มเพื่อฆ่าริง


12

การใช้ Crtl + Backspace หรือ Ctrl + Del จะเพิ่มข้อความที่ถูกลบไปยัง kill ring
ฉันจะป้องกันไม่ให้เกิดเหตุการณ์เช่นนี้ได้อย่างไร ฉันไม่จำเป็นต้องส่งข้อความทุกชิ้นไปยังแหวนฆ่าเมื่อถูกลบ

คำถามด้าน: วัตถุประสงค์ของการตั้งค่าเริ่มต้นนี้คืออะไร? :)


เกี่ยวกับคำถามด้านข้าง: undoอาจจะมีสำเนาสำรองของสิ่งที่คุณลบโดยไม่ต้องผ่าน เดาป่าแม้ว่า
Manuel Uberti

คำตอบ:


7

ตามเอกสาร:

<C-delete>รันคำสั่งฆ่าคำ (ที่พบในโลกแผนที่) ‘simple.el’ซึ่งเป็นแบบโต้ตอบรวบรวมฟังก์ชั่นเสียงกระเพื่อมใน

<C-delete>, M-dมันถูกผูกไว้กับ

(kill-word ARG)

ฆ่าตัวละครไปข้างหน้าจนกว่าจะพบจุดจบของคำ ด้วยอาร์กิวเมนต์ ARG ให้ทำเช่นนี้หลายครั้ง

ตอนนี้เรามาดูซอร์สโค้ด:

(defun kill-word (arg)                                                                                                     
  "Kill characters forward until encountering the end of a word.                                                           
With argument ARG, do this that many times."
  (interactive "p")
  (kill-region (point) (progn (forward-word arg) (point))))

จากนั้นภายในเอกสารสำหรับkill-regionฟังก์ชั่นที่เราพบ:

ทำลายข้อความ ("ตัด") ระหว่างจุดและเครื่องหมาย
This deletes the text from the buffer and saves it in the kill ring. คำสั่ง [yank] สามารถเรียกดูได้จากที่นั่น (หากคุณต้องการบันทึกพื้นที่โดยไม่ฆ่ามันให้ใช้ [kill-ring-save])

[ ... ]

โปรแกรมเสียงกระเพื่อมควรใช้ฟังก์ชั่นนี้เพื่อฆ่าข้อความ (หากต้องการลบข้อความให้ใช้delete-region)

ตอนนี้ถ้าคุณต้องการที่จะไปต่อไปนี้เป็นฟังก์ชั่นบางอย่างที่คุณสามารถใช้สำหรับการลบโดยไม่ต้องคัดลอกไปยัง kill-ring:

(defun my-delete-word (arg)
  "Delete characters forward until encountering the end of a word.
With argument, do this that many times.
This command does not push text to `kill-ring'."
  (interactive "p")
  (delete-region
   (point)
   (progn
     (forward-word arg)
     (point))))

(defun my-backward-delete-word (arg)
  "Delete characters backward until encountering the beginning of a word.
With argument, do this that many times.
This command does not push text to `kill-ring'."
  (interactive "p")
  (my-delete-word (- arg)))

(defun my-delete-line ()
  "Delete text from current position to end of line char.
This command does not push text to `kill-ring'."
  (interactive)
  (delete-region
   (point)
   (progn (end-of-line 1) (point)))
  (delete-char 1))

(defun my-delete-line-backward ()
  "Delete text between the beginning of the line to the cursor position.
This command does not push text to `kill-ring'."
  (interactive)
  (let (p1 p2)
    (setq p1 (point))
    (beginning-of-line 1)
    (setq p2 (point))
    (delete-region p1 p2)))

; bind them to emacs's default shortcut keys:
(global-set-key (kbd "C-S-k") 'my-delete-line-backward) ; Ctrl+Shift+k
(global-set-key (kbd "C-k") 'my-delete-line)
(global-set-key (kbd "M-d") 'my-delete-word)
(global-set-key (kbd "<M-backspace>") 'my-backward-delete-word)

ความอนุเคราะห์จากErgoEmacs


ขอบคุณที่แก้ไขมัน แล้วคำถามด้านข้างล่ะ : p
Daniel Hitzel

3
@DanielHitzel ขออภัยฉันไม่มีคำตอบสำหรับคำถามข้างเคียง :)
Nsukami _

ดังนั้นฉันไม่ได้อยู่คนเดียว: D
Daniel Hitzel

4

ตั้งแต่ Emacs 24 โดยไม่ต้องกำหนดค่าใด ๆ คุณสามารถลบข้อความใด ๆ โดยไม่ต้องเพิ่มมันไปที่แหวนฆ่าโดยการเลือกแล้วกดหรือBackspace Deleteเมื่อเครื่องหมายทำงานปุ่มเหล่านี้จะลบพื้นที่แทนการลบอักขระก่อน / หลังเคอร์เซอร์

นั่นคือย้ายไปที่ปลายด้านหนึ่งของข้อความที่คุณต้องการลบกดCtrl+ Spaceย้ายไปที่ปลายอีกด้านแล้วกดBackspace(หรือDelete) ลบบริเวณที่ถูกเน้นสี หรือย้ายไปที่ปลายด้านหนึ่งถือShiftในขณะที่คุณใช้แป้นเคลื่อนไหวเพื่อไปยังส่วนอื่น ๆ Backspaceและกด


ไม่ใช่สำหรับฉันกับ Emacs 25.1 ใน MacOS
NVaughan

0

ฉันมีปัญหาเดียวกันและแก้ไขได้ง่ายขึ้นด้วยวิธีนี้:

(global-set-key (kbd "<backspace>")
          '(lambda () (interactive) (backward-delete-char-untabify 1 nil)))

การโทร(backward-delete-char-untabify 1 nil)บอกให้ Emacs ย้อนกลับลบถ่านหนึ่งตัว (นั่นคือ1พารามิเตอร์) และจะละเว้นจากการคัดลอกไปยังวงแหวน (นั่นคือnilพารามิเตอร์) คุณต้องใช้ฟังก์ชัน lambda (เช่นไม่ระบุชื่อ) เนื่องจากคุณผูกฟังก์ชันกับพารามิเตอร์กับคีย์

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