vim, schnelles Wechseln zwischen Dateien mit Vanilla Vim (keine Plugins)

103

Ich verstehe, dass die Beschränkung auf Vanilla Vim (ohne Plugins) die Leistung des Editors einschränkt, aber da ich häufig zwischen verschiedenen Computern wechsle, ist es oft zu schwierig, meine Umgebung überall hin zu bewegen. Ich möchte nur in Vanille Vim bleiben.

Was mich zurückhält, ist die Möglichkeit, schnell zwischen Dateien zu wechseln. I (glauben zumindest) ein gutes Verständnis haben Puffer , Fenster , Tabs , sowie netrw ( Vex, Exusw.).

Aber in einem Editor wie Sublime Text kann ich einfach tippen ctrl- pund bin sofort bei der Datei.

Ich weiß, dass ich auf die Shell zugreifen kann, aber ich frage mich, ob es noch andere "versteckte" Geheimnisse gibt, um schnell zwischen Dateien in Vim zu wechseln, die nicht nur auf dem Dateinamen basieren.

Jonathan.Brink
quelle
2
Dies beantwortet Ihre Frage nicht, könnte Sie jedoch dazu verleiten
ajwood
Ich persönlich synchronisiere meine Einstellungen mit Dropbox. Es ist ungeschickt, aber es funktioniert mehr oder weniger, ohne darüber nachdenken zu müssen. Das einzige Plugin, das ich benutze und kenne, funktioniert gut für das, was Sie wollen, ist Command-T ( github.com/wincent/Command-T ). Strg-P ​​könnte eine Alternative sein ( vim.org/scripts/script.php?script_id=3736 ).
FX
1
Hast du danielmiessler.com/study/vim gesehen ? Er hat die sehr kluge Praxis, sein vimrc + alle Plugns, die er braucht, in Github zu stecken ... überall kann er es klonen und voila, Vim ist genau so, wie er es mag. Brilliant
Bobox
6
@ Bobox, Zehntausende von Menschen tun das; Daran ist nichts Außergewöhnliches.
Romainl

Antworten:

236

Das nächste Äquivalent ("am nächsten", nicht "genau") zu ST2's Ctrl+ Pist ein Plugin namens "Get Ready" ... CtrlP . Es gibt andere ähnliche Plugins wie Command-T oder FuzzyFinder .

Ich benutze CtrlP und ich liebe es, aber ich unterstütze von ganzem Herzen Ihre Entscheidung, "Plugin-frei" zu werden. Es ist nicht der einfachste Weg, aber es wird sich auf lange Sicht auszahlen.


Dateien öffnen

Der einfachste Weg, eine Datei zu öffnen, ist :e /path/to/filename. Zum Glück erhalten Sie Tab-Vervollständigung und Platzhalter: den klassischen *und einen speziellen **, der für "jedes Unterverzeichnis" steht.

Wenn Sie all das kombinieren, können Sie Folgendes tun:

:e **/*foo<Tab>

um aus allen Dateien zu wählen, die fooihren Namen im Arbeitsverzeichnis enthalten, oder:

:e **/*foo/*bar<Tab>

Wählen Sie aus allen Dateien, die barin ihrem Namen enthalten sind, unter einem beliebigen Unterverzeichnis, das fooin seinem Namen enthalten ist, irgendwo unter dem Arbeitsverzeichnis.

Natürlich, das Arbeiten für :tabe[dit], :sp[lit]und :vs[plit]auch.

Diese Befehle sind jedoch auf eine Datei beschränkt. Verwenden Sie :nextdiese Option , um mehrere Dateien zu öffnen:

:next **/*.js

und schauen Sie sich an :help arglist.


Zwischen Puffern springen

:b[uffer] ist der grundlegende Pufferumschaltbefehl:

:b4         " switch to buffer number 4
:bn         " switch to next buffer in the buffer list
:bp         " switch to previous buffer in the buffer list
:bf         " switch to first buffer in the buffer list
:bl         " switch to last buffer in the buffer list
:b foo<Tab> " switch by buffer name with tab-completion
:b#         " switch to the alternate file

Beachten Sie, dass viele dieser Befehle und ihre Verwandten eine Zählung akzeptieren.

Der :lsBefehl zeigt Ihnen eine Liste der geladenen Puffer. Es ist jedoch etwas "speziell": Puffern wird beim Erstellen eine Nummer zugewiesen, sodass Sie eine Liste haben können, die aussieht, als würden 1 2 5Sie Puffer löschen. Das ist ein bisschen umständlich, ja, und das macht das Umschalten auf einen Puffer anhand seiner Nummer etwas zu mühsam. Wechseln Sie lieber nach Teilnamen :b foo<Tab>oder Radfahren :bn :bp.

Wie auch immer, hier ist eine coole Zuordnung, die alle geladenen Puffer auflistet und die Eingabeaufforderung für Sie ausfüllt. Sie wartet darauf, dass Sie die Nummer eines Puffers eingeben und drücken <enter>:

nnoremap gb :ls<CR>:b<Space>

Mit dieser Zuordnung ist das Umschalten auf einen anderen Puffer so einfach wie:

gb
(quickly scanning the list)
3<CR>

oder:

gb
(quickly scanning the list)
foo<tab><CR>

Die Idee stammt von diesem Bild aus Bairuis Sammlung von Vim-Infografiken :

Fliegen gegen Radfahren

Vim hat auch <C-^>(oder <C-6>auf einigen Tastaturen) die Möglichkeit, :b#zwischen dem aktuellen und dem vorherigen Puffer zu springen. Verwenden Sie diese Option, wenn Sie häufig zwischen zwei Puffern wechseln.

Lesen Sie alles über Puffer in :help buffers.


Zur Erklärung gehen

Innerhalb einer Datei können Sie gdoder verwenden gD.

Innerhalb eines Projekts ist die "Tags" -Funktion von Vim Ihr Freund, aber Sie benötigen einen externen Code-Indexer wie ctags oder cscope. Die grundlegendsten Befehle sind :tag foound <C-]>mit dem Cursor auf einen Methodennamen. Beide Werkzeuge sind gut integriert in Vim: siehe :help tags, :help ctagsund :help cscope.

Für das, was es wert ist, verwende ich die Tag-Navigation ausgiebig, um mich innerhalb eines Projekts zu bewegen (meistens unter Verwendung von StrgPs :CtrlPTagund :CtrlPBufTagBefehlen, aber auch der eingebauten), und meine bevorzugte "generische" Pufferumschaltmethode ist der Name.


Bereitstellen Ihrer Konfiguration

Viele Vim-Benutzer stellen ihre Konfiguration unter Versionskontrolle, wodurch es sehr schnell und einfach ist, Ihre eigene Konfiguration auf einem neuen Computer zu installieren. Denk darüber nach.


BEARBEITEN

Vor einigen Monaten musste ich an einem Remote-Computer mit einem veralteten Vim arbeiten. Ich hätte ein richtiges Vim installieren und meine eigene geliebte Konfiguration klonen können, aber ich entschied mich, dieses Mal leicht zu reisen, um "die Säge zu schärfen". Ich baute schnell einen Minimalisten .vimrcund besuchte ein paar halb vergessene native Features. Nach diesem Auftritt entschied ich, dass CtrlP nicht so notwendig war und entfernte es: Native Features und benutzerdefinierte Zuordnungen sind nicht so sexy, aber sie erledigen den Job ohne große Abhängigkeiten.


Jonglieren mit Dateien

set path=.,**
nnoremap <leader>f :find *
nnoremap <leader>s :sfind *
nnoremap <leader>v :vert sfind *
nnoremap <leader>t :tabfind *

:findist ein wirklich großartiger Befehl, sobald Sie set pathrichtig. Mit meinen Einstellungen ,ffoo<Tab>finden Sie alle Dateien, die enthaltenfoo im aktuellen Verzeichnis befinden, rekursiv gefunden. Es ist schnell, intuitiv und leicht. Natürlich profitiere ich von der gleichen Fertigstellung und den gleichen Platzhaltern wie mit :editund mit Freunden.

Um den Vorgang noch schneller zu gestalten, kann ich mit den folgenden Zuordnungen ganze Teile des Projekts überspringen und Dateien rekursiv im Verzeichnis der aktuellen Datei suchen:

nnoremap <leader>F :find <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>S :sfind <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>V :vert sfind <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>T :tabfind <C-R>=expand('%:h').'/*'<CR>

WARNUNG! Die pathOption ist extrem leistungsfähig. Der .,**obige Wert funktioniert für mich, aber die von mir verwendeten Sprachen haben keine Standardbibliothek. Der richtige Wert hängt ganz von Ihren Bedürfnissen ab.


Mit Puffern jonglieren

set wildcharm=<C-z>
nnoremap <leader>b :buffer <C-z><S-Tab>
nnoremap <leader>B :sbuffer <C-z><S-Tab>

In den obigen Zuordnungen werden die verfügbaren Puffer im "Wildmenü" mit einer leeren Eingabeaufforderung aufgelistet, sodass ich entweder im Menü navigieren <Tab>oder einige Buchstaben eingeben und <Tab>die Liste erneut eingrenzen kann . Wie bei den obigen Dateizuordnungen ist der Vorgang schnell und nahezu reibungslos.

nnoremap <PageUp>   :bprevious<CR>
nnoremap <PageDown> :bnext<CR>

Diese Abbildungen sprechen für sich.


Jonglieren mit Tags

nnoremap <leader>j :tjump /

Diese Zuordnung verwendet die Regex-Suche anstelle der Ganzwortsuche, damit ich ,jba<Tab>Tags finden kannfoobarbaz() .

Ja, Fuzzy Matching macht süchtig, aber ohne Fuzzy können Sie genauso produktiv sein. Und das zu einem Bruchteil der Kosten.


MEHR BEARBEITEN

Ein paar zusätzliche Tipps / Tricks…


Wildmenü-Optionen

Das "Wildmenü", aktiviert mit set wildmenu erleichtert die Datei- / . Sein Verhalten wird von einer Reihe von Optionen bestimmt, die es wert sind, untersucht zu werden:

wildmode sagt Vim, wie sich das "Wildmenü" verhalten soll:

set wildmode=list:full

wildignore filtert die ganze Kruft heraus:

set wildignore=*.swp,*.bak
set wildignore+=*.pyc,*.class,*.sln,*.Master,*.csproj,*.csproj.user,*.cache,*.dll,*.pdb,*.min.*
set wildignore+=*/.git/**/*,*/.hg/**/*,*/.svn/**/*
set wildignore+=tags
set wildignore+=*.tar.*

wildignorecaseermöglicht es Ihnen zu suchen foound zu finden Foo:

set wildignorecase

Dateimarkierungen

augroup VIMRC
  autocmd!

  autocmd BufLeave *.css  normal! mC
  autocmd BufLeave *.html normal! mH
  autocmd BufLeave *.js   normal! mJ
  autocmd BufLeave *.php  normal! mP
augroup END

Ich habe dieses Juwel kürzlich bei jemand anderem gefunden ~/.vimrc. Es erstellt eine Dateimarkierung genau an der Position des Cursors, wenn Sie einen Puffer verlassen, sodass Sie überall 'Jzum zuletzt von Ihnen bearbeiteten JavaScript-Puffer springen. Genial.

romainl
quelle
2
+1. Ich hatte keine Ahnung von dem „jedes Unterverzeichnis“ in Kombination mit , :eaber ich würde es verwende viel von nun an. Ich staune über die Arbeit, die in Strg-P ​​steckt, und kann viel daraus lernen, aber es hat bei mir nicht funktioniert. Ich fand es etwas träge und unterbrach als solches meinen Gedankengang während der Arbeit (könnte mein System, meine Einstellungen, ich selbst sein, aber ich habe nicht nachgeforscht)
Lieven Keersmaekers
2
**ist in der Tat großartig.
Romainl
1
Ich würde gerne wieder für die gbKarte stimmen . Ein anderes werde ich viel benutzen. Alle Puffer-Plugins, die ich ausprobiert habe (CtrlP, bufExplorer, ...), sind bei weitem nicht so schnell (zugegeben, sie bieten mehr Funktionalität, aber nicht genug, um sie weiterhin zu verwenden) .
Lieven Keersmaekers
2
@LievenKeersmaekers, das ist , wo ich es von bekam und dies ist , wo das dumme Bild herkommt. Danke Bairui!
Romainl
4
Dies könnte die größte Antwort aller Zeiten sein.
Craigp
5

Die Antwort hängt stark von Ihren Vorlieben und Umständen ab. Einige Beispiele:

  • Wenn es sich hauptsächlich um zwei Dateien handelt (z. B. einen C-Header und eine Implementierungsdatei), <C-^>ist dies sehr praktisch. Im Allgemeinen die alternative Datei ein wichtiges Konzept.
  • Wenn Sie ein großes Editorfenster verwenden, wird durch das Fenster :splitdas Problem des Lokalisierens eines Puffers vom Lokalisieren des Fensters behoben (sobald alle Puffer geöffnet sind). Sie können verwenden[N]<C-w><C-w> um schnell darauf zu wechseln.
  • Wenn Sie sich (einige) Puffernummern merken können, sind die Befehle :[N]b[uffer]und :[N]sb[uffer]sehr praktisch. :lssagt dir die Zahlen.

Plugins (oder zumindest benutzerdefinierte Zuordnungen) können die Dinge erheblich verbessern, und auf vim.org gibt es eine ganze Reihe von Themen zu diesem Thema . Es gibt verschiedene Mechanismen zum Verteilen Ihrer Konfiguration (Pathogen + GitHub, Dropbox, ...), oder Sie können Serverdateien über das mit Vim gelieferte netrw- Plugin remote bearbeiten .

Ingo Karkat
quelle
4
Wäre wahrscheinlich erwähnenswert ctags, cscope, gtags, id und Freunde. Ich finde die Verwendung von Großbuchstaben sehr hilfreich. Verwenden Sie mAdiese AOption, um die Marke zu speichern, und `` `` A```, um zurückzukehren. ich finde netrw viel nützlicher, nachdem ich erfahren habe, :Rexwas zum Explorer zurückkehrt. :b, :eUnd viele andere können Platzhalter wie nehmen *und **. Der :bBefehl kann einen partiellen Dateinamen annehmen. Kombinieren Sie das mit <c-d>oder dem Wildmenü, das Sie ziemlich weit bringen können. Für Plugins können Sie etwas Domain-spezifisches wie rail.vim verwenden, das schienenspezifische Navigationsbefehle bereitstellt, oder etwas Allgemeineres wie CtrlP.
Peter Rincker
@PeterRincker: +1 für die Erwähnung von Noten. Ich schlage vor, eine Antwort mit Noten zu konstruieren.
Helbreder
Was bedeutet <C - ^> und [N] <Cw> <Cw>?
Josh Desmond
5

Manchmal ist es auch praktisch, eine Liste von Dateien nacheinander durchzugehen (z. B. wenn Sie vim *.phpmehrere Dateien gleichzeitig geöffnet haben möchten). Dann können Sie verwenden :n[ext](wie auch :prev[ious], :fir[st]und :la[st]) für die Navigation (zusätzlich zu dem, was in den anderen Antworten vorgeschlagen wurde).

chris
quelle
4

Sie können die Vervollständigung von Platzhalterregistern in der Befehlszeile ohne Plugins ausführen. z.B

:e src/**/foo*<tab>

Mit dieser Option können Sie alle Dateien, die mit 'foo' beginnen, im Verzeichnisbaum unter ./src durchlaufen und die Datei auswählen, die Sie bearbeiten möchten.

Wenn Sie die Datei bereits bearbeitet haben und sie sich noch in einem Puffer befindet, können Sie zu ihr wechseln mit:

:b foo<tab>

Dadurch werden alle Puffer mit 'foo' im Pfad durchlaufen. Möglicherweise müssen Sie die Optionen Wildmode und Wildmenu festlegen, um das gewünschte Verhalten zu erzielen. ich habe

wildmode=longest:full
wildmenu

in meiner .vimrc.

Dave Kirby
quelle
2

Wenn Sie einen Dateinamen haben und zu dieser Datei springen möchten, gferledigen Sie dies für Sie. Ich benutze auch gerne ctags , was kein Plugin ist. Sie erstellen einfach die Tags und können problemlos in Ihrer Codebasis herumspringen.

gpojd
quelle
1

Wenn Sie im vim-Editor zwischen Dateien wechseln möchten, lesen Sie bitte die Antwort unten

Drücken Sie zuerst die EscTaste, um den Bearbeitungsmodus zu verlassen.

Geben Sie dann ein :e, um den aktuellen Dateipfad zu überprüfen.

Wenn Sie eine andere Datei erstellen möchten, geben :e /path-of-file.txt/Sie diese ein, und Sie können wechseln.

Wenn Sie zur vorherigen Datei :e#wechseln möchten, geben Sie einfach den Schalter zum vorherigen Dateipfad ein.

Amol Udage
quelle
0

Ich hatte das gleiche Problem mit Vim.

Das Letzte, was ich möchte, ist, sich auf Plugins für eine Aufgabe zu verlassen, die so banal ist wie das Wechseln von Dateien.

Ich habe die folgenden Zeilen hinzugefügt .vimrc

set path+=**
set wildmenu

Und BAM! Ich kann jetzt :find any/filename/in/any/folder/, solange sich vim im Stammverzeichnis des Projekts befindet. Die Tab-Vervollständigung funktioniert. Platzhalter funktionieren!

Sobald Dateien bereits geöffnet sind und sich im Hintergrund eine Menge Puffer befinden (Sie können :lsalle Puffer anzeigen), wird beim Ausführen :b any/file <TAB>die Suche nach allen Puffern unscharf und es wird zur gewünschten Datei gesprungen. Falls es nicht eindeutig ist, gibt es ein Platzhaltermenü mit Registerkarten (daher die 2. Zeile in .vimrc), das über die Registerkarte ausgewählt werden kann.

Meine Antwort kommt von diesem fantastischen Video
https://www.youtube.com/watch?v=XA2WjJbmmoM&feature=youtu.be&t=489
Es gibt weitere Tricks und ich empfehle, es anzuschauen.

Ja
quelle