Repita n vez que um mapeamento começar com uma contagem

7

Eu criei o seguinte mapeamento:

:map <F8> 3w

Quando pressionei 2<F8>, pensei que moveria seis palavras ( 2*3w), mas moveria 23 palavras. (Isso foi mencionado na seção de ajuda do editor vim)

Como mapeá-lo para trabalhar por 6 movimentos em vez de 23? Além disso, informe-me se esse recurso foi intencionalmente feito para funcionar dessa maneira em mapeamentos?

(Em todos os outros casos, é direto como 2 * 3 em vez de anúncio de 23, como 2d3wé igual a 6dw, assim como d6w)

SibiCoder
fonte

Respostas:

5

Outra solução é usar a variável v:countassim:

nnoremap <F8> :<C-u>execute "normal! " . v:count1 * 3 . "w"<CR>

Consulte :h v:count: A variável contém a contagem fornecida para o último comando do modo normal e, portanto, pode ser usada para obter uma contagem antes de um mapeamento.

Aqui o mapeamento usa o v:count1que é semelhante, v:countmas o padrão é zero quando nenhuma contagem é fornecida.

O mapeamento executa o comando normal, normal! Xwonde Xé substituído por 3 vezes a contagem fornecida antes do mapeamento.

A <C-U>é necessária para remover a faixa de linha que são incluídos quando se digita :após uma contagem.


Também é claro que sim, o comportamento que você observou é totalmente normal: seu mapeamento faz o Vim entender F8como 3wquando você digita algo antes do Vim como nenhuma maneira de entender que você deseja que ele faça uma multiplicação. Lembre-se de que um programa não pode entender sua intenção se você não a descrever.

statox
fonte
8

Você pode usar a expressão registradora para isso:

 :nnoremap <F8>  @='3w'<CR>

Isso usará o registro de expressão para criar um mapeamento repetível que você pode prefixar com um número:

 2<F8> will move 6 words

Um mapeamento no vim substituirá o significado de uma tecla / sequência de tecla pressionada. Então quando você faz

:map <F8> 3w

e

2<F8>
23w

O Vim converterá o arquivo <F8>para 3we o que você executa 23w.

Por outro lado, ao usar o registrador de expressão, você acaba fazendo:

 2<F8>
 2@='3w'<CR>

O que significa "2 vezes, execute o conteúdo do registro de expressão".

Meu palpite de se foi feito intencionalmente é que, dado o significado do mapeamento, é a maneira lógica que ele deve executar.

nobe4
fonte
Informe-me se isso foi feito intencionalmente.
SibiCoder # 20/16
Resposta atualizada.
nobe4
2
Relacionados Vimcasts episódio: Criando mapeamentos que aceitam uma contagem
Peter Rincker
O mapeamento do modo normal não funciona muito robusto porque funciona com um intervalo. Se você fornecer o mapeamento com uma contagem na última linha do arquivo, você receberá uma mensagem de erro: E16: Invalid range.
Jdhao 29/04/19