¿Hay alguna manera de ir y venir de manera confiable en el historial de archivos?

15

Me gustaría ir al archivo que acabo de editar el último y siguiente tipo de complementos de MRU.

:bnexty :bprevfunciona a veces, pero la mayoría de las veces acabo en un archivo oscuro que no recuerdo haber editado y me veo obligado a recurrir al complemento MRU.

¿Hay alguna forma de arreglarlo?

Ctrl-^intercambia entre los dos últimos archivos. ¿Cuál es la mejor manera de navegar entre más?

Entiendo que puede ser complicado, pero estoy de acuerdo con cualquier cosa que pueda mejorar el :bn :bpcomportamiento actual . Los amortiguadores que veo a menudo están totalmente fuera de lugar. ¿Quizás haya un complemento que pueda realizar un seguimiento de los archivos recientes y proporcionar ganchos para que pueda crear asignaciones?

Responder a los comentarios me aclaró un poco los pensamientos. Creo que lo que quiero es poder moverme por los archivos en el orden de los últimos guardados. De esa manera, si vuelvo al historial, el orden no cambiará hasta que guarde el archivo, que luego se convierte en el último y haga un paso "atrás" al archivo guardado justo antes, es decir, desde el que he comenzado.

Algo así como un Ctrl-O Ctrl-Ipar que cambia los archivos inmediatamente sin saltar alrededor del búfer actual. Algo así como uy Uen netrw:

   u    Change to recently-visited directory                 |netrw-u|
   U    Change to subsequently-visited directory             |netrw-U|
firedev
fuente
Por "el archivo que acabo de editar por última vez", ¿quiere decir literalmente "el archivo en el que hice modificaciones más recientemente"? ¿O simplemente te refieres al último que tenías visible en Vim?
Rico
2
Si es lo último, personalmente solo hago puré Ctrl-O(o a veces Ctrl-T) hasta que llegue allí.
Rico
Si eso es lo que hago demasiado Ctrl-Oy Ctrl-I. Pero salta entre los puntos de edición y eso rompe el flujo. Todo lo que quiero ir y venir entre buffers en orden de acceso. ¿Cómo muestran los complementos una lista de los archivos más recientes? ¿Los siguen internamente?
firedev
Ctrl-^intercambia entre los dos últimos archivos. Pero, ¿cuál es la mejor manera de navegar entre más?
firedev
Por acceso, todavía no está claro si te refieres al orden en que fueron abiertos, escritos, en una ventana enfocada o cambiados. Ctrl-O/Ison ventanas específicas de ventana, mientras que MRU es generalmente global. Si desea ordenar por acceso reciente, tan pronto como salte una vez, el orden de la lista cambia, lo que complica aún más las cosas.
Matt Boehm

Respuestas:

7

Escribí una pequeña función para presionar repetidamente CTRL-O para mí, hasta que cambie el búfer.

Lo puedes encontrar aquí . Lo asigné a CTRL-U, pero podría anular CTRL-O si lo deseara.

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>

Probablemente podrías escribir algo similar para <C-I>.

Cuestiones:

  • Si no hay un búfer anterior, continuará en bucle silencioso hasta que presione CTRL-C.

Relacionado:

  • :jumps enumera las ubicaciones históricas por las que CTRL-O retrocederá.
  • El CTRL-T predeterminado de Vim es una buena alternativa al machacado de CTRL-O, porque es de grano más grueso: solo retrocede a través de saltos de etiqueta.
joeytwiddle
fuente
Vim parece ofrecer solo un nivel de historial de archivos MRU, expuesto en CTRL- ^. Sin embargo, cuando utilicé :kwbdpara cerrar algunos buffers, he notado que Vim retrocede a los buffers anteriores en el orden histórico inverso esperado. Tal vez Vim tenga una lista MRU que no comparte con nosotros, o tal vez elija a qué búfer recurrir en función del historial de ubicaciones CTRL-O ( :jumps).
joeytwiddle
1
Por otra parte, autocmd InsertLeave * normal mZse recuerda el último archivo editado en la marca mundial Z . Puedes volver a hacerlo con g'Z. // Sí, nmap <C-y> g'Zpero aún tiendo a usar Ctrl-U con más frecuencia.
joeytwiddle
6

Puede usar :lspara mostrar todos los buffers. Por ejemplo:

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

Para volver al búfer ext.markdown, use :e +Nbuf, donde Nes el número del búfer de la primera columna. Por ejemplo: :e +2buf.

Puede crear una función simple para una experiencia más interactiva:

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>

Después de usar :ChooseBufo <Leader>bsimplemente puede escribir el número del búfer que desea editar.

Esto no está "utilizado más recientemente", ya que el pedido está "abierto más recientemente" (esto probablemente también sea por qué :bnext/ :bprevno funciona como se espera).

Martin Tournoij
fuente
4

<C-6>es lo que necesita, que lo lleva de vuelta al búfer anterior que tenía abierto antes del actual. También hay :bprev& :bnextque podrías usar para lo mismo.

Dhruva Sagar
fuente
<C-6>no está mal, pero no puedo usar eso para retroceder dos buffers. bprevy bnextno están en orden de saltos.
Praxeolítico
Sí, no creo que haya una buena forma nativa de profundizar en la historia. Tendría que usar un complemento MRU, incluso CtrlP tiene uno, debe haber otros
Dhruva Sagar
2
Nota: no <C-6>lo es <C-^>. Si bien en muchos emuladores de terminal no hay distinción, en algunos (incluido el que se incluye con OS X), sí lo hay. Para el último caso, Shiftse requiere el uso de la clave (asumiendo el diseño Qwerty).
tommcdo
@tommcdo interesante, estoy en osx, pero uso iterm en lugar de terminal.app, funciona igual para mí. Requerir la tecla Shift sería un fastidio.
Dhruva Sagar
Ahora que lo pienso, podría ser que mi sistema operativo está tomando esa combinación de teclas y no la está propagando a Vim. ¡Mi sistema operativo debe ser detenido!
tommcdo
2

También puede usar :oldfilespara obtener una lista de los archivos que editó.

La lista tendrá números asociados con nombres de archivo. Elija un archivo, anote el número (digamos 14) y ábralo con:edit #<14

También puede ejecutar otros comandos en ese archivo o pasar varios archivos a un comando a la vez. Más sobre esto AQUÍ

Karolis Koncevičius
fuente
1
La otra respuesta en el enlace me enseñó:bro[wse] ol[dfiles][!]
Steve