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.