Movimento do cursor após $ motion
Eu jogo o grande jogo chamado VIM adventures (do qual estão as imagens abaixo). A pergunta é do jogo, mas também pode ser reproduzida no VIM, então este é o lugar que eu pergunto.
Suponha que você esteja dentro normal mode, em alguma linha ne coluna m. Se você pressionar a tecla j, sua posição se torna linha n+1e mesma coluna m. Se a linha n+1tiver menos colunas do que m, digamos o, você será colocado na coluna o. Pressione novamente j. Você é movido para a linha n+2, na coluna m(mesma verificação de antes). Veja, a coluna em que você começou m, é lembrada. Isso pode ser visto na primeira imagem, com linhas vermelhas representando jmovimento.
No entanto, se você estiver dentro normal modee pressionar a tecla $, você será movido para o final da linha atual. Agora considere a mesma sequência de movimentos descrita no parágrafo anterior. Cada movimento o jlevará para o último caractere dessa linha. mnão é lembrado neste caso. Isso pode ser visto na segunda imagem. Ao pressionar primeiro $, o cursor é colocado no final da primeira linha. Em seguida, ao pressionar vários jmovimentos, cada um pousa o cursor ou no final da linha, ignorando m, o que foi lembrado no primeiro parágrafo.
Não consigo encontrar isso em nenhuma documentação do VIM. Você pode me explicar como funciona esse mecanismo de lembrança ou apontar para a parte da documentação que explica isso?
Respostas
Na verdade, não há referências muito diretas a esse comportamento na documentação do $próprio comando.
A documentação do g$movimento, na verdade, se refere a este comportamento, explicando como g$difere de $:
É diferente de
$quando o último caractere da linha não está na tela ou quando uma contagem é usada. Além disso, os movimentos verticais mantêm a coluna, em vez de irem para o final da linha.
Além da documentação, você pode dar uma olhada em como o Vim realmente implementa esse rastreamento de coluna, já que funções como getcurpos()exportar essas informações como um atributo "curswant":
O
curswantnúmero é a coluna preferida ao mover o cursor verticalmente.
(Você também encontrará o atributo "curswant" no Dict retornado por winsaveview().)
Por exemplo, se você moveu horizontalmente em uma linha longa para a coluna 24 e, em seguida, verticalmente para uma linha que tem apenas 17 colunas, você verá o seguinte:
: echo getcurpos () [0, 39, 17 , 0, 24 ]
Você pode ver que está na coluna 17, mas "curswant" é a coluna 24 e o Vim irá para uma coluna de até 24 se uma linha tiver colunas suficientes.
Depois de pressionar $e dar outra olhada na getcurpos()saída, você verá:
: echo getcurpos () [0, 39, 17, 0, 2147483647 ]
Portanto, você verá que o Vim está implementando o $comportamento definindo "curswant" para um número muito grande, que é o maior número de colunas que o Vim pode armazenar em uma única linha.
(Esse número é na verdade 2 31 - 1, que é o número inteiro positivo máximo que você pode armazenar em um inttipo com sinal na linguagem C.)