Backspace sem adicionar para matar o anel

12

Usar Crtl + Backspace ou Ctrl + Del adiciona o texto excluído ao anel de interrupção.
Como posso impedir que isso aconteça? Não preciso enviar todos os trechos de texto para o ring kill quando ele for excluído.

Pergunta secundária: Qual é o objetivo dessa configuração padrão? :)

Daniel Hitzel
fonte
Sobre a questão secundária: provavelmente, você deve ter uma cópia de backup do que você exclui sem passar undo. Palpite, no entanto.
Manuel Uberti

Respostas:

6

De acordo com a documentação:

<C-delete>executa o comando kill-word (encontrado no mapa global), que é uma função Lisp compilada interativa em ‘simple.el’.

É obrigado a <C-delete>, M-d.

(ARG de palavra matada)

Mate os personagens para a frente até encontrar o final de uma palavra. Com o argumento ARG, faça isso várias vezes.

Agora, vamos procurar o código fonte:

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

Em seguida, dentro da documentação para a kill-regionfunção, encontramos:

Mate (corte) o texto entre o ponto e a marca.
This deletes the text from the buffer and saves it in the kill ring. O comando [yank] pode recuperá-lo a partir daí. (Se você deseja salvar a região sem matá-la, use [kill-ring-save].)

[...]

Os programas Lisp devem usar esta função para eliminar texto. (Para excluir texto, use delete-region.)

Agora, se você quiser ir além, esta é uma função que você pode usar para excluir sem copiar para o 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)

Cortesia de ErgoEmacs

Nsukami _
fonte
obrigado, isso resolveu. E a questão paralela? : p
Daniel Hitzel
3
@DanielHitzel Desculpe, eu não tenho a resposta para a pergunta lado :)
Nsukami _
Então, eu não estou sozinho: D
Daniel Hitzel
4

Desde o Emacs 24, sem nenhuma configuração, você pode excluir qualquer texto sem adicioná-lo ao anel de morte, selecionando-o e pressionando Backspaceou Delete. Quando a marca está ativa, essas teclas excluem a região em vez de excluir o caractere antes / depois do cursor.

Ou seja, vá para uma extremidade do texto que deseja excluir, pressione Ctrl+ Space, vá para a outra extremidade e pressione Backspace(ou Delete) para excluir a região destacada. Ou vá para uma extremidade, mantenha pressionado Shiftenquanto usa as teclas de movimento para ir para a outra extremidade e pressione Backspace.

Gilles 'SO- parar de ser mau'
fonte
Bem, esse não é o meu caso com o Emacs 25.1 no MacOS.
NVaughan
0

Eu tive o mesmo problema e resolvi-o mais facilmente desta maneira:

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

A chamada (backward-delete-char-untabify 1 nil)diz ao Emacs para excluir um char (esse é o 1parâmetro) e evita copiar para o anel (esse é o nilparâmetro). Você precisa de uma função lambda (ou seja, anônima) porque está vinculando uma função com parâmetros a uma chave.

NVaughan
fonte