Existe uma maneira de ir e voltar com confiança no histórico de arquivos

15

Eu gostaria de ir para o arquivo que acabei de editar, última e próxima, como os plugins MRU fazem.

:bnexte :bprevfunciona algumas vezes, mas na maioria das vezes acabo em algum arquivo obscuro. Não me lembro de editar e fui forçado a voltar ao plugin MRU.

Existe uma maneira de consertar isso?

Ctrl-^alterna entre os dois últimos arquivos. Qual é a melhor maneira de navegar entre mais?

Entendo que pode ser complicado, mas concordo com qualquer coisa que possa melhorar o :bn :bpcomportamento atual . Os buffers que vejo frequentemente estão totalmente fora de lugar. Talvez haja um plugin que possa acompanhar os arquivos recentes e fornecer ganchos para que eu possa criar mapeamentos?

Responder aos comentários me esclareceu um pouco. Acredito que o que eu quero é poder mover os arquivos na ordem dos últimos salvamentos. Dessa forma, se eu voltar no histórico, a ordem não será alterada até que eu salve o arquivo que se torna o último e faça um passo "de volta" para o arquivo salvo antes disso, ou seja, o de onde eu comecei.

Algo como um Ctrl-O Ctrl-Ipar que alterna os arquivos imediatamente sem pular o buffer atual. Mais ou menos como ue Uem netrw:

   u    Change to recently-visited directory                 |netrw-u|
   U    Change to subsequently-visited directory             |netrw-U|
firedev
fonte
Por "o arquivo que eu editei por último", você quer dizer literalmente "o arquivo que eu editei recentemente"? Ou você quer dizer apenas o último que você tinha visível no Vim?
Ricos
2
Neste último caso, eu apenas amasso Ctrl-O(ou às vezes Ctrl-T) até chegar lá.
Ricos
Sim, isso é o que eu faço muito Ctrl-Oe Ctrl-I. Mas ele pula entre os pontos de edição e isso interrompe o fluxo. Tudo o que eu quero ir e voltar entre buffers em ordem de acesso. Como os plug-ins exibem uma lista dos arquivos mais recentes? Eles os acompanham internamente?
firedev
Ctrl-^alterna entre os dois últimos arquivos. Mas qual é a melhor maneira de navegar entre mais?
firedev 25/06
Por acesso, ainda não está claro se você quer dizer a ordem em que foram abertos, gravados, em uma janela focada ou alterados. Ctrl-O/Isão fwiw específicos da janela, enquanto o MRU é geralmente global. Se você deseja que a ordem seja acessada mais recentemente, assim que você voltar uma vez, a ordem da lista mudará, complicando ainda mais as coisas.
precisa

Respostas:

7

Eu escrevi uma pequena função para pressionar CTRL-O repetidamente para mim, até que o buffer mude.

Você pode encontrá-lo aqui . Mapeei-o para CTRL-U, mas você poderia substituir CTRL-O se quisesse.

function! GoBackToRecentBuffer()
  let startName = bufname('%')
  while 1
    exe "normal! \<c-o>"
    let nowName = bufname('%')
    if nowName != startName
      break
    endif
  endwhile
endfunction

nnoremap <silent> <C-U> :call GoBackToRecentBuffer()<Enter>

Você provavelmente poderia escrever algo semelhante para <C-I>.

Problemas:

  • Se não houver buffer anterior, ele continuará em loop silencioso até você pressionar CTRL-C!

Palavras-chave:

  • :jumps lista os locais históricos pelos quais o CTRL-O voltará.
  • O CTRL-T padrão do Vim é uma boa alternativa para esmagar o CTRL-O, porque é mais granulado: ele volta apenas pelos saltos de tag.
joeytwiddle
fonte
O Vim parece oferecer apenas um nível do histórico de arquivos MRU, exposto no CTRL- ^. No entanto, notei ao usar :kwbdpara fechar alguns buffers, que o Vim volta para os buffers anteriores na ordem histórica reversa esperada. Talvez o Vim tenha uma lista MRU que não esteja compartilhando conosco, ou talvez escolha qual buffer retornar com base no histórico de localização CTRL-O ( :jumps).
Joeytwiddle
11
Alternativamente, autocmd InsertLeave * normal mZvai se lembrar do último arquivo editado na marca mundial Z . Você pode voltar com isso g'Z. // Eu tenho, nmap <C-y> g'Zmas continuo a usar Ctrl-U com mais frequência.
precisa saber é o seguinte
6

Você pode usar :lspara mostrar todos os buffers. Por exemplo:

:ls
  1      "vim.markdown"                 line 160
  2      "ext.markdown"                 line 0
  3 #    "~/to"                         line 1
  4 %a   "~/TODO"                       line 68

Para voltar ao buffer ext.markdown, use :e +Nbuf, onde Nestá o número do buffer da primeira coluna. Por exemplo: :e +2buf.

Você pode criar uma função simples para uma experiência mais interativa:

fun! ChooseBuf()
    redir => buffers
        silent ls
    redir end

    echo l:buffers
    let l:choice = input('Which one: ')
    execute ':edit +' . l:choice . 'buf'
endfun
command! ChooseBuf call ChooseBuf()
nnoremap <Leader>b :call ChooseBuf()<CR>

Depois de usar :ChooseBufou <Leader>bvocê pode apenas digitar o número do buffer que deseja editar.

Isso não é "usado mais recentemente", pois o pedido foi "aberto mais recentemente" (provavelmente é também por isso que :bnext/ :bprevnão funciona como esperado).

Martin Tournoij
fonte
4

<C-6>é o que você precisa, que o leva de volta ao buffer anterior que você tinha aberto antes do atual. Também existem :bpreve :bnextvocê pode usar para o mesmo.

Dhruva Sagar
fonte
<C-6>não é ruim, mas não posso usar isso para pular dois buffers. bpreve bnextnão estão em ordem de saltos.
Praxeolitic
Sim, eu não acho que exista uma boa maneira nativa de aprofundar a história. Você teria que usar algum plugin MRU, mesmo CtrlP tem um, deve haver outros
Dhruva Sagar
2
Nota: não é <C-6>, é <C-^>. Enquanto em muitos emuladores de terminal não há distinção, em alguns (incluindo o que acompanha o OS X), existe. Para o último caso, Shifté necessário o uso da chave (assumindo o layout Qwerty).
Tommcdo
@ tommcdo interessante, estou no osx, mas use iterm em vez do terminal.app, funciona da mesma forma para mim. Exigir a tecla Shift seria uma chatice.
Dhruva Sagar 9/15
Venha para pensar sobre isso, pode ser que meu sistema operacional esteja pegando essa ligação de chave e não a propagando para o Vim. Meu sistema operacional deve estar parado!
Tommcdo
2

Você também pode usar :oldfilespara obter uma lista dos arquivos editados.

A lista terá números associados aos nomes de arquivos. Escolha um arquivo, anote o número (digamos 14) e abra-o com:edit #<14

Você também pode executar outros comandos nesse arquivo ou passar vários arquivos para um comando de uma só vez. Mais sobre isso AQUI

Karolis Koncevičius
fonte
11
A outra resposta na ligação me ensinou:bro[wse] ol[dfiles][!]
Steve