Backspace bez dodawania do zabicia pierścienia

12

Używanie Crtl + Backspace lub Ctrl + Del dodaje usunięty tekst do pierścienia zabijania.
Jak mogę temu zapobiec? Nie muszę wysyłać każdego fragmentu tekstu do pierścienia zabijania, gdy zostanie usunięty.

Pytanie poboczne: Jaki jest cel tego ustawienia domyślnego? :)

Daniel Hitzel
źródło
O bocznym pytaniu: prawdopodobnie mieć kopię zapasową tego, co usuwasz bez przechodzenia undo. Ale zgaduję.
Manuel Uberti

Odpowiedzi:

7

Zgodnie z dokumentacją:

<C-delete>Wykonuje polecenie kill-word (znaleziono w globalnej-MAP), który jest interaktywny skompilowany funkcja w Lisp ‘simple.el’.

Jest to związane z <C-delete>, M-d.

(słowo-zabójstwo ARG)

Zabijaj postacie do przodu, aż napotkasz koniec słowa. Z argumentem ARG rób to tyle razy.

Teraz przejrzyjmy kod źródłowy:

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

Następnie w dokumentacji kill-regionfunkcji znajdujemy:

Zabij („wytnij”) tekst między punktem a znakiem.
This deletes the text from the buffer and saves it in the kill ring. Polecenie [yank] może je stamtąd pobrać. (Jeśli chcesz uratować region bez jego zabijania, użyj [kill-ring-save].)

[...]

Programy Lisp powinny używać tej funkcji do zabijania tekstu. (Aby usunąć tekst, użyj delete-region.)

Teraz, jeśli chcesz pójść dalej, możesz użyć tej funkcji do usuwania bez kopiowania do 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)

Dzięki uprzejmości ErgoEmacs

Nsukami _
źródło
dzięki, że to rozwiązało. Co z pytaniem dodatkowym? : p
Daniel Hitzel
3
@DanielHitzel Przepraszamy, nie mam odpowiedzi na pytanie poboczne :)
Nsukami _
Więc nie jestem sam: D
Daniel Hitzel
4

Ponieważ Emacs 24, bez żadnej konfiguracji, możesz usunąć dowolny tekst bez dodawania go do pierścienia zabijania, zaznaczając go, a następnie naciskając Backspacelub Delete. Gdy znacznik jest aktywny, klawisze te usuwają region, a nie tylko usuwają znak przed / za kursorem.

Oznacza to, że przejdź do jednego końca tekstu, który chcesz usunąć, naciśnij Ctrl+ Space, przejdź do drugiego końca i naciśnij Backspace(lub Delete), aby usunąć podświetlony region. Lub przejdź do jednego końca, przytrzymaj, Shiftgdy używasz klawiszy ruchu, aby przejść do drugiego końca i naciśnij Backspace.

Gilles „SO- przestań być zły”
źródło
Cóż, tak nie jest w przypadku Emacsa 25.1 w systemie MacOS.
NVaughan,
0

Miałem ten sam problem i rozwiązałem go łatwiej w ten sposób:

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

Wywołanie (backward-delete-char-untabify 1 nil)mówi Emacsowi, aby usunął do tyłu jeden znak (to jest 1parametr) i powstrzymuje się od kopiowania na pierścień (to jest nilparametr). Potrzebujesz funkcji lambda (anonimowej), ponieważ wiążesz funkcję z parametrami do klucza.

NVaughan
źródło