Backspace tanpa menambahkan untuk mematikan dering

12

Menggunakan Crtl + Backspace atau Ctrl + Del menambahkan teks yang dihapus ke cincin pembunuhan.
Bagaimana saya bisa mencegah hal ini terjadi? Saya tidak perlu meminta setiap bagian teks dikirim ke ring bunuh ketika terhapus.

Pertanyaan sampingan: Apa tujuan dari pengaturan default ini? :)

Daniel Hitzel
sumber
Tentang pertanyaan sampingan: mungkin memiliki salinan cadangan dari apa yang Anda hapus tanpa melalui undo. Tapi tebakan liar.
Manuel Uberti

Jawaban:

7

Menurut dokumentasi:

<C-delete>menjalankan perintah kill-word (ditemukan di global-map), yang merupakan fungsi Lisp yang dikompilasi interaktif di ‘simple.el’.

Pasti terikat <C-delete>, M-d.

(kill-word ARG)

Bunuh karakter-karakter ke depan sampai menemukan akhir kata. Dengan argumen ARG, lakukan ini berkali-kali.

Sekarang, mari kita telusuri kode sumber:

(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))))

Kemudian, di dalam dokumentasi untuk kill-regionfungsi yang kami temukan:

Bunuh ("potong") teks antara titik dan tanda.
This deletes the text from the buffer and saves it in the kill ring. Perintah [yank] dapat mengambilnya dari sana. (Jika Anda ingin menyelamatkan wilayah tanpa membunuhnya, gunakan [kill-ring-save].)

[...]

Program Lisp harus menggunakan fungsi ini untuk membunuh teks. (Untuk menghapus teks, gunakan delete-region.)

Sekarang, jika Anda ingin melangkah lebih jauh, ini adalah beberapa fungsi yang dapat Anda gunakan, untuk menghapus tanpa menyalin ke 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)

Atas perkenan ErgoEmacs

Nsukami _
sumber
terima kasih, itu menyelesaikannya. Bagaimana dengan pertanyaan sampingan? : p
Daniel Hitzel
3
@DanielHitzel Maaf, saya tidak punya jawaban untuk pertanyaan sampingan :)
Nsukami _
Jadi saya tidak sendirian: D
Daniel Hitzel
4

Karena Emacs 24, tanpa konfigurasi apa pun, Anda dapat menghapus teks apa pun tanpa menambahkannya ke cincin bunuh dengan memilihnya lalu menekan Backspaceatau Delete. Ketika tanda aktif, tombol-tombol ini menghapus wilayah alih-alih hanya menghapus karakter sebelum / sesudah kursor.

Yaitu, pindah ke salah satu ujung teks yang ingin Anda hapus, tekan Ctrl+ Space, pindah ke ujung lainnya, dan tekan Backspace(atau Delete) hapus wilayah yang disorot. Atau pindah ke satu ujung, tahan Shiftsaat Anda menggunakan tombol gerakan untuk pergi ke ujung lainnya, dan tekan Backspace.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Nah, itu tidak terjadi pada saya dengan Emacs 25.1 di MacOS.
NVaughan
0

Saya memiliki masalah yang sama dan menyelesaikannya dengan lebih mudah dengan cara ini:

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

Memanggil (backward-delete-char-untabify 1 nil)memberitahu Emacs untuk mundur-menghapus satu karakter (itu 1parameternya) dan tidak menyalin ke cincin (itu nilparameternya). Anda memerlukan fungsi lambda (yaitu anonim) karena Anda mengikat fungsi dengan parameter ke kunci.

NVaughan
sumber