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)?

Jim
fonte
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.

John O'M.
fonte
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