Backspace senza aggiungere per uccidere l'anello


12

Utilizzando Crtl + Backspace o Ctrl + Canc si aggiunge il testo eliminato all'anello di eliminazione.
Come posso evitare che ciò accada? Non è necessario che ogni singolo pezzo di testo venga inviato all'anello di eliminazione quando viene eliminato.

Domanda a margine: qual è lo scopo di questa impostazione predefinita comunque? :)


Informazioni sulla domanda a margine: probabilmente per avere una copia di backup di ciò che elimini senza passare undo. Immagino selvaggio, però.
Manuel Uberti,

Risposte:


7

Secondo la documentazione:

<C-delete>esegue il comando kill-word (trovato in global-map), che è una funzione Lisp compilata interattiva in ‘simple.el’.

È legato a <C-delete>, M-d.

(kill-word ARG)

Uccidi i personaggi in avanti fino a quando non trovi la fine di una parola. Con l'argomento ARG, fallo così tante volte.

Ora, sfogliamo il codice sorgente:

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

Quindi, all'interno della documentazione per la kill-regionfunzione troviamo:

Uccidi ("taglia") il testo tra punto e segno.
This deletes the text from the buffer and saves it in the kill ring. Il comando [yank] può recuperarlo da lì. (Se vuoi salvare la regione senza ucciderla, usa [kill-ring-save].)

[...]

I programmi Lisp dovrebbero usare questa funzione per uccidere il testo. (Per eliminare il testo, utilizzare delete-region.)

Ora, se vuoi andare oltre, questa è una funzione che puoi usare, per cancellare senza copiare in 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)

Per gentile concessione di ErgoEmacs


grazie, questo l'ha risolto. E la domanda secondaria? : p
Daniel Hitzel,

3
@DanielHitzel Spiacente, non ho la risposta alla domanda secondaria :)
Nsukami _

Quindi non sono solo: D
Daniel Hitzel,

4

Da Emacs 24, senza alcuna configurazione, è possibile eliminare qualsiasi testo senza aggiungerlo al kill ring selezionandolo e quindi premendo Backspaceo Delete. Quando il segno è attivo, questi tasti eliminano la regione invece di eliminare il carattere prima / dopo il cursore.

Ossia, sposta su un'estremità del testo che desideri eliminare, premi Ctrl+ Space, sposta sull'altra estremità e premi Backspace(o Delete) per eliminare l'area evidenziata. Oppure spostati a un'estremità, mantieni premuto Shiftmentre usi i tasti di spostamento per passare all'altra estremità e premi Backspace.


Bene, non è il caso per me con Emacs 25.1 in MacOS.
NVaughan,

0

Ho avuto lo stesso problema e l'ho risolto più facilmente in questo modo:

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

La chiamata (backward-delete-char-untabify 1 nil)dice a Emacs di cancellare all'indietro un carattere (che è il 1parametro) e che si astiene dal copiare sull'anello (che è il nilparametro). È necessaria una funzione lambda (ovvero anonima) perché si associa una funzione con parametri a una chiave.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.