Por que o cursor se move para o início da linha após <Esc>?


12

Notei que, ao editar uma linha em um arquivo .txt no modo de inserção, o cursor se moverá para o início da linha após uma gravação usando a sequência de teclas:

<esc>:w

Eu gostaria de mudar esse comportamento para que o cursor fique na posição seguinte a: write. Isso é possível? Não preciso que o cursor permaneça no modo de inserção, gostaria que ele mantivesse sua última posição após uma gravação.

Estou usando o gVim 7.4 no Windows. Meu .vimrc é muito básico, não acredito que nenhuma das minhas configurações interfira nesse comportamento. Também removi a fonte do mswin.vim e example.vim do meu .vimrc (fornecido com o instalador oficial do Windows do vim.org).

Depois de ler os comentários abaixo, analisei o problema novamente e percebi que o cursor só desliza para a extrema esquerda após uma gravação em linhas totalmente compostas por espaços em branco à direita. Em outras palavras, o cursor desliza apenas para a extrema esquerda após esc-: w quando a linha é um recuo pendente sem outros caracteres além de espaços . O .vimrc está manipulando comportamentos de indentação com estas configurações:

set tabstop=4
set softtabstop=4
set shiftwidth=4
set expandtab
set autoindent 

Portanto, uma nova linha criada abaixo de uma linha recuada conterá 4 espaços em branco à direita como os 4 primeiros espaços da linha (que eu quero manter). Após a tecla 'esc', pressione o cursor desliza para a extrema esquerda do buffer.

Existe uma maneira de manter a posição do cursor ao pressionar 'esc' para retornar ao modo normal, em uma linha composta por espaços em branco à direita (como indentação)?


3
Nunca notei esse comportamento no Vim em nenhuma plataforma ... O que acontece se você iniciar o gVim como: gvim -u NONE -U NONE(você pode usar o cmd.exe ou criar um atalho)? Isso impedirá o carregamento dos arquivos (g) vimrc.
— Martin Tournoij 17/02/2015

1
Esse é o seu arquivo vimrc completo ? Minha primeira suspeita seria que um autocmd no seu arquivo vimrc está removendo o espaço em branco à direita. O comportamento muda quando você inicia o gVim sem nenhum arquivo vimrc (veja o comentário acima)?
— Martin Tournoij 17/02/2015

O acima não é o meu .vimrc completo, existem outras configurações também. A execução do gVim sem um .vimrc (: scriptnames não mostra .vimrc ou .gvimrc) resolve meu problema. Você está absolutamente certo, preciso examinar meu .vimrc ou outra coisa que possa estar causando isso.
— Jim

Aparentemente, essa eliminação de espaços em branco em novas linhas é um comportamento desejável, estou lendo aqui que pretende manter o arquivo limpo de espaços em branco.
— Jim

É sobre abrir novas linhas ... Não é sobre gravar em um arquivo?
— Martin Tournoij 17/02/2015

Respostas:


11

Examinar a documentação do autoindent tem uma resposta sobre o porquê e como solucionar o problema. :help 'autoindent':

Copie o recuo da linha atual ao iniciar uma nova linha (digitando <CR> no modo Inserir ou ao usar o comando "o" ou "O"). Se você não digitar nada na nova linha, exceto <BS>ou CTRL-De, em seguida <Esc>, digite , CTRL-Oou <CR>, o recuo será excluído novamente. Mover o cursor para outra linha tem o mesmo efeito, a menos que o sinalizador 'I' esteja incluído em 'cpoptions'.

Em outras palavras, se você não perder o recuo, digite algo e depois retroceda antes de bater Esc, e o espaço inicial permanecerá.

Como alternativa, se você deseja apenas retornar ao nível de indentação quando voltar ao modo de inserção e também estiver usando 'cindent', use em Shift-Svez de i, o que limpará a linha (já vazia) e iniciará no nível de indentação apropriado. Essa não é uma solução tão geral quanto a acima, mas prefiro isso quando estou escrevendo código C, para que meus arquivos não sejam salvos com apenas linhas em espaço em branco.


Esta é uma resposta definitiva para minha pergunta na documentação original. Obrigado pelo resumo e pela narrativa - eu não teria pensado em investigar: h autoindent para obter essas informações. Obrigado também @Carpetsmoker pela discussão que leva a uma solução.
— 21715 Jim

Isso resolveu um problema que envolvia remapear o e O para não sair do modo de inserção, mas para manter o recuo. Isso pode ser feito nnoremap o o <BS><Esc><DEL>, ennoremap O O <BS><Esc><DEL>
— Max Coplan

Muito obrigado!
— Max Coplan
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.