Estou tendo um problema estranho com um mapeamento de modo normal de Esc.
Se você criar o arquivo escmapvimrc
com o conteúdo:
set nocompatible
set showcmd " Doesn't affect the problem: just makes it easier to see
nnoremap <Esc> :noh<CR><esc>
E então inicie o vim usando este vimrc:
vim --noplugin -u escmapvimrc
Em seguida, o vim iniciará no modo pendente do operador com um c
comando aguardando mais entradas, exibindo um arquivo vazio e exibindo a linha de comandos :noh
.
Se você remover a nnoremap
linha, o problema desaparecerá.
Se você depurar e passar por tudo, obterá a seguinte saída:
Entering Debug mode. Type "cont" to continue.
/[...]/escmapvimrc
line 1: set nocompatible
>s
/[...]/escmapvimrc
line 2: set showcmd " Doesn't affect the problem: just makes it easier to see
>s
/[...]/escmapvimrc
line 3: nnoremap <Esc> :noh<CR><esc>
>s
/[...]/escmapvimrc
line 4: End of sourced file
>s
Press ENTER or type command to continue
Depois de pressionar enter, a tela de inicialização do Vim é exibida e abaixo:
Entering Debug mode. Type "cont" to continue.
cmd: noh
>s
A tela de inicialização do Vim desaparece e você está no modo pendente de operador, conforme descrito acima.
O que está acontecendo?
EDIT: O comportamento é como descrito no Vim 7.3. No Vim 7.4.52, as nmap
causas do Vim são iniciadas no modo Substituir ao iniciar o Vim sem um arquivo. (Se o Vim 7.4.52 for iniciado com um arquivo, no entanto, ele também será iniciado com um comando c em andamento.) De qualquer maneira, o problema desaparecerá quando o nmap for removido.
fonte
:noh
para mim. Fazer o mesmo com o gvim não mostrou esse comportamento.nnoremap <c-l> :noh<cr><c-l>
/alksdjflaskj
para esclarecer o destaque da pesquisa, que também é bastante rápido.Respostas:
O Vim envia durante a inicialização alguns códigos de terminal especiais (que geralmente contêm a
<esc>
chave) para determinar várias coisas (cores, bs, ...) Se você mapeou,<esc>
isso provavelmente irá confundir o analisador dos códigos de retorno e coisas estranhas podem acontecer.Portanto, use o mapa acima somente depois que tudo estiver configurado corretamente (por exemplo, através de um comando automático do VimEnter).
fonte
'term'
opção é definida. Isso geralmente é apenas durante a inicialização, mas pode haver cenários em que é definido em tempo de execução.VimEnter
especificamente não funcione.O terminal Linux usa seqüências de escape ANSI (ou seja, cadeias de caracteres começando com
<Esc>
) para enviar chaves especiais ao Vim e como parte do protocolo de comunicação com o qual o aplicativo consulta seus recursos. Seu mapeamento interfere nisso e, portanto, leva a esses comportamentos "estranhos".Portanto, não mapeie
<Esc>
. Use outra tecla. O problema é menos pronunciado no GVIM, mas também não o recomendo.fonte
<Esc><Esc>
?Tente o seguinte:
cf /programming//a/16027716/400545
fonte
escapemapvimrc
arquivo por este, quando a inicialização do Vim é concluída, estou no modo de linha de comando, com a linha de comando contendo o seguinte conteúdo::83/94/95^G
(isso é literalCTRL-G
no final). Essa parte:help
parece sugerir que talvez esse não seja o melhor momento para configurar o mapeamento:Note that this event may be triggered halfway executing another event, especially if file I/O, a shell command or anything else that takes time is involved.
Tentei configurar um comando automático para definir o mapeamento posteriormente na inicialização, mas o problema ainda ocorreu. *
Eventualmente, criei um comando automático para ocorrer na primeira vez que entro no modo Inserir. Obviamente, essa não é uma solução perfeita, mas para mim funcionará a maior parte do tempo e parece ser o melhor que posso fazer:
ATUALIZAÇÃO : Depois de usar a versão mais longa abaixo sem problemas por alguns anos, decidi que ela estava com um pouco de engenharia excessiva e, desde então, usei essa versão muito mais simples, que apenas redefine o mapeamento toda vez que você entra no modo de inserção:
O mapeamento não precisa ser redefinido toda vez que você entra no modo de inserção, mas também não faz mal ao Vim.
VERSÃO ORIGINAL :
* Eu tentei anexá-lo a vários eventos:
VimEnter
,BufReadPost
,BufWinEnter
, e até mesmoCursorMoved
(!), Mas estes todos parecem fogo muito cedo.fonte
TermResponse
comando automático?t_RV
,t_u7
,t_RF
,t_RB
, E possivelmente outros.) Então isso pode também dependem de seu terminal