Esiste un modo per andare avanti e indietro in modo affidabile nella cronologia dei file


15

Vorrei andare al file che ho appena modificato l'ultimo e il prossimo tipo di plugin MRU.

:bnexte a :bprevvolte funziona, ma il più delle volte finisco in qualche file oscuro che non ricordo di aver modificato e costretto a ricorrere al plugin MRU.

C'è un modo per risolverlo?

Ctrl-^scambia tra gli ultimi due file. Qual è il modo migliore per navigare tra più?

Capisco che potrebbe essere complicato, ma sono d'accordo su tutto ciò che può migliorare il :bn :bpcomportamento attuale . I buffer che vedo spesso sono totalmente fuori posto. Forse c'è un plugin che può tenere traccia dei file recenti e fornire hook in modo da poter creare mappature?

La risposta ai commenti mi ha chiarito un po 'i pensieri. Credo che ciò che voglio sia riuscire a spostarmi tra i file in ordine di ultimi salvataggi. In questo modo, se torno alla cronologia, l'ordine non cambierà fino a quando non salverò il file che poi diventa ultimo e faccio un passo "indietro" nel file salvato prima, cioè quello da cui ho iniziato.

Qualcosa come Ctrl-O Ctrl-Icoppia che cambia i file immediatamente senza saltare il buffer corrente. Un po 'come ue Uin netrw:

   u    Change to recently-visited directory                 |netrw-u|
   U    Change to subsequently-visited directory             |netrw-U|

Per "il file che ho appena modificato per ultimo" intendi letteralmente "il file a cui ho apportato le ultime modifiche"? O intendi solo l'ultimo che hai visto in Vim?
Ricco

2
Se quest'ultimo, personalmente schiaccio Ctrl-O(o talvolta Ctrl-T) fino a quando non ci arrivo.
Ricco

Sì è quello che faccio troppo Ctrl-Oe Ctrl-I. Ma salta tra i punti di modifica e interrompe il flusso. Tutto quello che voglio andare avanti e indietro tra i buffer in ordine di accesso. In che modo i plugin visualizzano un elenco dei file più recenti? Li tengono traccia internamente?
firedev,

Ctrl-^scambia tra gli ultimi due file. Ma qual è il modo migliore per navigare tra più?
firedev,

Per accesso, non è ancora chiaro se intendi l'ordine in cui sono stati aperti, scritti, in una finestra focalizzata o modificati. Ctrl-O/Isono fwiw specifici della finestra, mentre MRU è generalmente globale. Se vuoi ordinare per ultimo accesso, non appena torni indietro una volta, l'ordine dell'elenco cambia, complicando ulteriormente le cose.
Matt Boehm,

Risposte:


7

Ho scritto una piccola funzione per colpire ripetutamente CTRL-O per me, fino a quando il buffer non cambia.

Puoi trovarlo qui . L'ho mappato su CTRL-U ma potresti sovrascrivere CTRL-O se lo desideri.

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>

Probabilmente potresti scrivere qualcosa di simile per <C-I>.

Problemi:

  • Se non esiste un buffer precedente, continuerà in modo silenzioso fino a quando non si preme CTRL-C!

Relazionato:

  • :jumps elenca le posizioni storiche che CTRL-O farà un passo indietro.
  • Il CTRL-T predefinito di Vim è una buona alternativa al mashing del CTRL-O, perché è a grana più grossa: si sposta indietro solo attraverso i salti di tag.

Vim sembra offrire solo un livello di cronologia dei file MRU, esposto su CTRL- ^. Tuttavia, quando ho usato :kwbdper chiudere alcuni buffer, ho notato che Vim fa un passo indietro ai buffer precedenti nell'ordine storico inverso previsto. Forse Vim ha un elenco MRU che non condivide con noi, o forse sceglie a quale buffer ricorrere in base alla cronologia delle posizioni CTRL-O ( :jumps).
joeytwiddle,

1
In alternativa, autocmd InsertLeave * normal mZsi ricorderà l'ultimo file modificato nel marchio globale Z . Puoi tornare con esso g'Z. // Ho, nmap <C-y> g'Zma continuo a usare Ctrl-U più spesso.
joeytwiddle,

6

È possibile utilizzare :lsper mostrare tutti i buffer. Per esempio:

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

Per tornare al buffer ext.markdown, utilizzare :e +Nbuf, dove si Ntrova il numero del buffer dalla prima colonna. Ad esempio: :e +2buf.

Puoi creare una semplice funzione per un'esperienza più interattiva:

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>

Dopo aver usato :ChooseBufo <Leader>bpuoi semplicemente digitare il numero del buffer che vuoi modificare.

Questo non è abbastanza "usato più di recente", poiché l'ordine è "aperto più di recente" (questo è probabilmente anche il motivo per cui :bnext/ :bprevnon funziona come previsto).


4

<C-6>è quello che ti serve, che ti riporta al buffer precedente che avevi aperto prima di quello attuale. Ci sono anche :bpreve :bnextche potresti usare per lo stesso.


<C-6>non è male ma non posso usarlo per tornare indietro di due buffer. bpreve bnextnon sono in ordine di salti.
Prassolitico,

Sì, non penso che ci sia un buon modo nativo per approfondire la storia. Dovresti usare alcuni plugin MRU, anche CtrlP ne ha uno, ce ne devono essere altri
Dhruva Sagar

2
Nota: non lo è <C-6>, lo è <C-^>. Mentre su molti emulatori terminali non c'è distinzione, su alcuni (incluso quello fornito con OS X), c'è. Per quest'ultimo caso, Shiftè necessario l'uso della chiave (presupponendo il layout Qwerty).
Tommaso

@tommcdo interessante, sono su osx, ma uso iterm invece di terminal.app, funziona allo stesso modo per me. Richiedere il tasto Maiusc su di esso sarebbe un peccato.
Dhruva Sagar,

Vieni a pensarci bene, potrebbe darsi che il mio sistema operativo stia afferrando quel key binding e non lo stia propagando a Vim. Il mio sistema operativo deve essere arrestato!
Tommaso

2

È inoltre possibile utilizzare :oldfilesper ottenere un elenco di file modificati.

L'elenco avrà numeri associati ai nomi dei file. Scegli un file, annota il numero (diciamo 14) e aprilo con:edit #<14

È inoltre possibile eseguire altri comandi su quel file o passare più file a un comando contemporaneamente. Maggiori informazioni QUI


1
L' altra risposta nel link mi ha insegnato:bro[wse] ol[dfiles][!]
Steve,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.