Como posso usar marcas para ir para locais em arquivos que abri recentemente, mas que não foram alterados?

11

Muitas vezes, edito um arquivo - acho que meu trabalho está concluído - depois fecho o arquivo e passo para a próxima. Mas então percebo que preciso voltar para esse código e ajustá-lo um pouco mais.
Se eu abrir o arquivo novamente, posso usar a .marca e pular para a posição da última edição com '..
Agora estou tentando encontrar uma maneira de usar as marcas do vim para ir para os locais nos arquivos que visitei recentemente, mas que não foram alterados.
Eu sei que posso definir uma marca manualmente, mas na maioria das vezes, não espero voltar e, portanto, não a defino e preciso usar uma marca que o vim gere automaticamente.
A "marca parece que isso poderia ser uma maneira de conseguir isso, a partir de :h motion.

" Para a posição do cursor quando saiu do buffer atual pela última vez. O padrão é o primeiro caractere da primeira linha. Veja | salto na última posição | para saber como usar isso para cada arquivo aberto. Apenas uma posição é lembrada por buffer, não uma para cada janela. Enquanto o buffer estiver visível em uma janela, a posição não será alterada. {não no Vi}.

No entanto, se eu

  • feche todas as janelas que mostram um buffer (mas o buffer ainda está presente na lista de buffers). ou:
  • matar todas as instâncias do buffer

a marca parece não atualizar, como posso usar uma marca para pular para um local da última posição do cursor no buffer / arquivo?

the_velour_fog
fonte
2
Eu acho que você está procurando Ctrl+oe Ctrl+i... :h jump-motionspara obter mais informações
Sundeep
@ spasic isso não é uma má sugestão, mas uma vez que você faça algumas dezenas de saltos, a posição será perdida em uma lista enorme de saltos. Ao definir as marcas no buffer, você tem uma lista menor de marcas / locais para gerenciar
the_velour_fog
Se você ainda não leu, acho que essa dica seria interessante. Talvez você precise ajustar o seuviminfo
statox
@statox obrigado. Eu vi isso e a dica no vim ajuda. Acho que essas soluções causam um salto automático para a "marca quando você abre um arquivo. Eu realmente queria pular para a última posição do cursor manualmente. Além disso, eu simplesmente não conseguia entender quando a "marca é definida e atualizada; portanto, para mim, a "marca é inutilizável.
the_velour_fog

Respostas:

6

Aqui está uma solução clássica: use

`H

para pular para o último arquivo HTML e assim por diante ...

augroup VIMRC
  autocmd!

  autocmd BufLeave *.css  normal! mC
  autocmd BufLeave *.html normal! mH
  autocmd BufLeave *.js   normal! mJ
  autocmd BufLeave *.php  normal! mP
augroup END
romainl
fonte
2
obrigado, parece que isso poderia realmente ser útil. Eu o carreguei no meu vimrc para testá-lo. Mudei para autocmd para, WinLeavecomo notei BufLeave, não parece disparar quando você fecha uma divisão e o buffer ainda está aberto em outro lugar. Eu sei que é um pouco de um caso extremo, mas WinLeaveparece funcionar sobre uma gama mais ampla de tipo situações "arquivo de fechamento", mas eu ainda estou apenas testando ...
the_velour_fog
3

Eu escrevi esta declaração vimscript que parece funcionar

autocmd BufLeave * :normal ml

Explicação

  • BufLeave comando automático: parece acionar quando você
    • mover para outra janela
    • quando você fecha a última janela exibindo o buffer
    • quando você fecha o próprio buffer com bd
  • :normal- parece que por padrão, a commandparte do autocmd é um comando ex. Então, para dizer ao vim para executar um comando no modo normal, você precisa adicionar:normal
  • ml- definir uma marca l(mnemônico: último )

Uso

para recuperar a posição do cursor da última vez que você esteve no buffer, basta pressionar

'l

ou

`l
the_velour_fog
fonte
0

Se você deseja que o cursor restaure a última posição conhecida pelo viminfo , use

autocmd BufReadPost * call setpos(".", getpos("'\""))

A resposta de romainl tem sido particularmente útil para mim, e tenho usado muito isso (desde que sou desenvolvedor da Web):

augroup VIMRC
    autocmd!
    autocmd BufLeave,WinLeave *.html normal! mH
    autocmd BufLeave,WinLeave *.css normal! mC
    autocmd BufLeave,WinLeave *.js normal! mJ
augroup end

nnoremap <space>h `Hzz
nnoremap <space>c `Czz
nnoremap <space>j `Jzz

A última coisa potencialmente útil é a opção :help 'nostartofline:

               *'startofline'* *'sol'* *'nostartofline'* *'nosol'*
'startofline' 'sol' boolean (default on)
            global
            {not in Vi}
    When "on" the commands listed below move the cursor to the first
    non-blank of the line.  When off the cursor is kept in the same column
    (if possible).  This applies to the commands: CTRL-D, CTRL-U, CTRL-B,
    CTRL-F, "G", "H", "M", "L", gg, and to the commands "d", "<<" and ">>"
    with a linewise operator, with "%" with a count and to buffer changing
    commands (CTRL-^, :bnext, :bNext, etc.).  Also for an Ex command that
    only has a line number, e.g., ":25" or ":+".
    In case of buffer changing commands the cursor is placed at the column
    where it was the last time the buffer was edited.
    NOTE: This option is set when 'compatible' is set.
dylnmc
fonte