Ah sim. O Isearch lê as chaves que você digita, as procura isearch-mode-map
e as invoca no buffer atual .
ISearch faz não , apesar das aparências, use o minibuffer. Ele usa a área de eco. Ou seja, o que você vê é realmente mensagens de saída , incluindo ecos dos caracteres digitados.
Isso deve fazer o que você pede:
(defun mydelete ()
"Delete the failed portion of the search string, or the last char if successful."
(interactive)
(with-isearch-suspended
(setq isearch-new-string
(substring
isearch-string 0 (or (isearch-fail-pos) (1- (length isearch-string))))
isearch-new-message
(mapconcat 'isearch-text-char-description isearch-new-string ""))))
(define-key isearch-mode-map (kbd "DEL") 'mydelete)
(BTW, sua pergunta diz o delete
personagem, mas você escreveu DEL
, que é o caractere de backspace.)
Como @Malabarba aponta em um comentário, quando você define a nova sequência de pesquisa como ""
(sequência vazia), with-isearch-suspended
retoma pesquisando a última sequência de pesquisa, em vez de começar com uma sequência de pesquisa vazia.
Este é um " recurso " de with-isearch-suspended
, em geral. Mas porque às vezes você pode realmente deseja esvaziar a cadeia de pesquisa para a retomada, na versão de with-isearch-suspended
em isearch + .El variável eu adicionei isearchp-if-empty-prefer-resuming-with-last
, para controlar isso. Se você vincular isso nil
e definir isearch-new-string
como ""
, a pesquisa será retomada com uma sequência de pesquisa vazia.
Portanto, com o Isearch +, você pode fazer o que quiser com esta definição:
(defun mydelete ()
"Delete the failed portion of the search string, or the last char if successful."
(interactive)
(let ((isearchp-if-empty-prefer-resuming-with-last nil))
(with-isearch-suspended
(setq isearch-new-string
(substring
isearch-string 0 (or (isearch-fail-pos) (1- (length isearch-string))))
isearch-new-message
(mapconcat 'isearch-text-char-description isearch-new-string "")))))
Percebo também agora que Emacs 24,4 introduziu uma regressão, que eu arquivado Emacs bug # 20466 para, o que significa que a ligação DEL
em isearch-mode-map
não é suficiente. Eles adicionaram uma ligação separada para <backspace>
, além de uma para DEL
. Isso significa que <backspace>
não é mais traduzido DEL
para o Isearch (mas ainda assim é traduzido para o Emacs em geral).
Então, se você quer que a tecla Backspace para fazer o que você pediu em Emacs 24.4 ou mais tarde, então você não pode simplesmente ligar DEL
para mydelete
. Você precisa ligar <backspace>
para mydelete
. Dumb, AFAICT, mais sobre n'arrete pas le progres ...
Adicionei um comando semelhante ao Isearch + e o vinculeiC-M-l
(a mesma chave usada para remover uma incompatibilidade de conclusão no Icicles ).
Esteja ciente também de que, C-g
no Isearch, também, quando houver uma incompatibilidade, você removerá o texto incompatível. (Mas C-g
também tem efeito quando a pesquisa é bem-sucedida.)
Eu deveria ter mencionado que o Isearch + também teve um comportamento opcional ao longo de linhas semelhantes por um bom tempo. M-k
durante o Isearch, alterna entre três comportamentos, que são controlados pelo valor da opção isearchp-drop-mismatch
:
replace-last
- Sua entrada atual substitui o último texto incompatível. Você sempre pode ver sua última entrada, mesmo que seja uma incompatibilidade. E está disponível para edição usando M-e
.
nil
- Sua entrada atual é anexada, mesmo que a entrada anterior tenha uma parte incompatível.
qualquer outra coisa - Sua entrada atual será ignorada (removida) se causar uma incompatibilidade. A cadeia de pesquisa sempre tem correspondências bem-sucedidas.
isearch+.el
. (A) corrige a remoção automática de incompatibilidade, para que a envolvente funcione bem. E adiciona uma opção,isearchp-ring-bell-function
que você pode usar para suprimir a campainha durante a pesquisa.isearch-del-char
e pela resposta de Drew, mas parece funcionar como pretendido. Awith-isearch-suspended
macro foi a culpada.