Gibt es eine Möglichkeit, zuverlässig im Dateiverlauf vor- und zurückzugehen?


15

Ich möchte zu der Datei gehen, die ich soeben bearbeitet habe, wie es MRU-Plugins tun.

:bnextund :bprevfunktioniert manchmal, aber meistens lande ich einfach in einer undurchsichtigen Datei, an deren Bearbeitung ich mich nicht mehr erinnere, und bin gezwungen, auf das MRU-Plugin zurückzugreifen.

Gibt es eine Möglichkeit, das Problem zu beheben?

Ctrl-^wechselt zwischen zwei letzten Dateien. Wie kann man am besten zwischen mehreren navigieren?

Ich verstehe, dass es schwierig sein könnte, aber ich stimme allem zu, was das aktuelle :bn :bpVerhalten verbessern kann . Die Puffer, die ich oft sehe, sind völlig fehl am Platz. Vielleicht gibt es ein Plugin, das die neuesten Dateien verfolgt und Hooks bereitstellt, damit ich Zuordnungen erstellen kann?

Das Antworten auf Kommentare hat meine Gedanken ein wenig geklärt. Ich glaube, ich möchte in der Lage sein, Dateien in der Reihenfolge der letzten Speicherungen zu durchsuchen. Auf diese Weise ändert sich die Reihenfolge, wenn ich in den Verlauf zurück gehe, erst, wenn ich die zuletzt gespeicherte Datei speichere und einen Schritt "zurück" zu der Datei mache, die direkt davor gespeichert wurde, dh zu der Datei, von der ich gestartet habe.

So etwas wie ein Ctrl-O Ctrl-IPaar, das Dateien sofort wechselt, ohne den aktuellen Puffer zu durchlaufen. Art wie uund Uin netrw:

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

Mit "der Datei, die ich zuletzt bearbeitet habe" meinen Sie wörtlich "die Datei, an der ich zuletzt Änderungen vorgenommen habe"? Oder meinst du nur den letzten, den du in Vim gesehen hast?
Rich

2
In letzterem Fall zerdrücke ich persönlich nur Ctrl-O(oder manchmal Ctrl-T), bis ich dort ankomme.
Rich

Ja das mache ich auch Ctrl-Ound Ctrl-I. Aber es springt zwischen Bearbeitungspunkten und das unterbricht den Fluss. Alles, was ich zwischen den Puffern hin und her gehen möchte, in der Reihenfolge des Zugriffs. Wie zeigen Plugins eine Liste der neuesten Dateien an? Verfolgen sie sie intern?
firedev

Ctrl-^wechselt zwischen zwei letzten Dateien. Aber wie kann man am besten zwischen mehr navigieren?
firedev

Mit Zugriff ist immer noch nicht klar, ob Sie die Reihenfolge meinen, in der sie geöffnet, geschrieben, in einem fokussierten Fenster angezeigt oder geändert wurden. Ctrl-O/Isind fensterspezifisch fwiw, während MRU normalerweise global ist. Wenn Sie die Reihenfolge nach dem letzten Zugriff wünschen, ändert sich die Reihenfolge der Liste, sobald Sie einmal zurückspringen, was die Sache noch komplizierter macht.
Matt Boehm

Antworten:


7

Ich habe eine kleine Funktion geschrieben, um für mich immer wieder STRG-O zu drücken, bis sich der Puffer ändert.

Sie können es finden sich hier . Ich habe es CTRL-U zugeordnet, aber Sie können CTRL-O überschreiben, wenn Sie möchten.

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>

Sie könnten wahrscheinlich etwas Ähnliches für schreiben <C-I>.

Probleme:

  • Wenn kein vorheriger Puffer vorhanden ist, wird die Endlosschleife fortgesetzt, bis Sie STRG-C drücken!

Verbunden:

  • :jumps listet die historischen Orte auf, durch die STRG-O zurücktritt.
  • Vims Standard-STRG-T ist eine gute Alternative zum Mischen von STRG-O, da es gröber ist: Es bewegt sich nur durch Tag-Sprünge zurück.

Vim bietet anscheinend nur eine Ebene des MRU-Dateiversionsverlaufs, der mit STRG- ^ angezeigt wird. Beim :kwbdSchließen einiger Puffer ist mir jedoch aufgefallen , dass Vim in der erwarteten umgekehrten Reihenfolge zu den vorherigen Puffern zurückkehrt. Möglicherweise hat Vim eine MRU-Liste, die es nicht mit uns teilt, oder es wählt basierend auf dem CTRL-O-Standortverlauf ( :jumps), auf welchen Puffer zurückgegriffen werden soll .
Joeytwiddle

1
Alternativ autocmd InsertLeave * normal mZwird die zuletzt bearbeitete Datei in der globalen Marke Z gespeichert . Mit können Sie darauf zurückkommen g'Z. // Ich habe, nmap <C-y> g'Zaber ich neige immer noch dazu, Strg-U häufiger zu verwenden.
Joeytwiddle

6

Mit können Sie :lsalle Puffer anzeigen. Beispielsweise:

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

Um zum Puffer zurückzukehren ext.markdown, verwenden Sie :e +Nbuf, wobei Ndie Puffernummer aus der ersten Spalte ist. Zum Beispiel: :e +2buf.

Sie können eine einfache Funktion für ein interaktiveres Erlebnis erstellen:

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>

Nach der Verwendung von :ChooseBufoder können <Leader>bSie einfach die Nummer des Puffers eingeben, den Sie bearbeiten möchten.

Dies ist nicht ganz "zuletzt verwendet", da der Auftrag "zuletzt geöffnet" ist (dies ist wahrscheinlich auch der Grund, warum :bnext/ :bprevnicht wie erwartet funktioniert).


4

<C-6>ist das, was Sie brauchen, um zum vorherigen Puffer zurückzukehren, den Sie vor dem aktuellen geöffnet hatten. Es gibt auch :bprev&, :bnextdie Sie für das gleiche verwenden könnten.


<C-6>ist nicht schlecht, aber ich kann das nicht verwenden, um zwei Puffer zurückzuspringen. bprevund bnextsind nicht in der Reihenfolge der Sprünge.
Praxeolitic

Ja, ich glaube nicht, dass es eine gute einheimische Möglichkeit gibt, tiefer in die Geschichte einzusteigen. Sie müssten ein MRU-Plugin verwenden, auch CtrlP hat eines, es muss andere geben
Dhruva Sagar

2
Hinweis: Es ist nicht <C-6>, es ist <C-^>. Während es bei vielen Terminalemulatoren keine Unterscheidung gibt, gibt es bei einigen (einschließlich dem, der mit OS X geliefert wird) eine. Für den letzteren Fall ist die Verwendung des ShiftSchlüssels erforderlich (QWERTY-Layout vorausgesetzt).
tommcdo

@tommcdo interessant, ich bin auf osx, aber benutze iterm anstelle der terminal.app, es funktioniert bei mir genauso. Das Erfordernis der Umschalttaste wäre ein Mist.
Dhruva Sagar

Wenn Sie sich das vorstellen, könnte es sein, dass mein Betriebssystem diese Schlüsselbindung übernimmt und sie nicht an Vim weitergibt. Mein Betriebssystem muss gestoppt werden!
tommcdo

2

Sie können auch verwenden :oldfiles, um eine Liste der von Ihnen bearbeiteten Dateien abzurufen.

Die Liste enthält mit Dateinamen verknüpfte Nummern. Wählen Sie eine Datei aus, notieren Sie sich die Nummer (z. B. 14) und öffnen Sie sie mit:edit #<14

Sie können auch andere Befehle für diese Datei ausführen oder mehrere Dateien gleichzeitig an einen Befehl übergeben. Mehr dazu HIER


1
Die andere Antwort im Link hat mich gelehrt:bro[wse] ol[dfiles][!]
Steve
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.