Vim-Dateinavigation

88

Ich bemühe mich sehr, vim zu lernen, nachdem ich TextMate in den letzten Jahren verwendet habe.

Ich habe begonnen, einen Teil der In-File-Navigation in den Speicher zu übertragen, habe jedoch Probleme beim Navigieren zwischen mehreren Dateien.

In meinem Workflow ist es ziemlich üblich, dass ich ziemlich regelmäßig zwischen einer Handvoll Dateien wechsle (genug Dateien, so dass Fenster im geteilten Bereich zu klein werden).

Ich verwende derzeit NERDTree, finde es jedoch mühsam, Drilldowns in Verzeichnisse durchzuführen, und verwende ständig CTRL+ W h/ CTRL+, W lum hin und her zu springen .

Ich denke, ich würde es besser mit Registerkarten machen, zwischen denen ich leicht wechseln kann, aber vielleicht muss ich einen anderen Workflow verwenden.

Ich möchte auch eine Verknüpfung "Gehe zu Datei ..." wie CMD+ Tin TextMate. Ich habe festgestellt, fuzzy_file_finderaber es erfordert, dass vim mit Ruby-Bindungen erstellt wird, was bei den nativen Installationen, an denen ich gearbeitet habe, nicht der Fall ist.

Während ich könnte den Hauptgrund Wiederaufbau ich vim wechseln will , ist so ich eine Editor Umwelt haben kann , dass ich leicht Arbeit über jede Plattform kennen.

Die Möglichkeiten da draußen sind überwältigend. Ideen werden sehr geschätzt!

Pete
quelle
1
Ich habe keine wirklich zufriedenstellende Methode zum Navigieren in Dateien und Puffern gefunden, bei der überhaupt keine externen Hilfsmittel verwendet werden. Das eingebaute Zeug ist ziemlich schlecht (ich meine, durch seine Nummer in einen Puffer zu wechseln? Wer erinnert sich an temporäre Puffernummern ...)
Svend
1
@svend: Sie können Puffer sowohl nach Namen als auch nach Nummer referenzieren - siehe meine Antwort unten
Dave Kirby

Antworten:

91

Ich finde es nicht so :eumständlich , in Unterverzeichnisse über einfach alt zu bohren, wenn man eine anständige Konfiguration für die Tab-Vervollständigung bedenkt.

Sehen Sie sich die 'wildmenu'Option an, mit der Vim eine Liste der Vervollständigungen (Dateinamen) in der Modeline über der Befehlszeile anzeigt. Sie können die 'wildmode'Option ändern , um die Art der Tab-Vervollständigung, die Vim ausführt, weiter zu konfigurieren.

Persönlich benutze ich :set wildmode=full.

Mein Workflow sieht folgendermaßen aus:

  1. :cd in das oberste Verzeichnis meines Projekts.
  2. So öffnen Sie eine Datei foo/bar/baz:

    • Einfachstes Szenario: Typ :e f<tab>b<tab>b<tab><enter>.

    • Wenn es mehr als eine Datei mit Start bin einem dieser Verzeichnisse , die Sie vielleicht ein zu tun haben, <left>oder <right>oder eine andere <tab>auf der Tastatur zwischen ihnen zu springen (oder ein paar mehr Buchstaben eindeutig zu machen geben).

    • Im schlimmsten Fall gibt es Dateien und Verzeichnisse, die einen gemeinsamen Namen haben, und Sie müssen einen Drilldown in das Verzeichnis durchführen. In diesem Fall vervollständigen Sie den Verzeichnisnamen auf der Registerkarte und geben Sie ihn ein, *<tab>um einen Drilldown durchzuführen.

  3. Öffnen Sie 2 oder 3 Fenster und öffnen Sie bei Bedarf alle Dateien.
  4. Wenn eine Datei in einem Puffer geöffnet ist, beenden Sie den Puffer nicht. Lassen Sie es im Hintergrund geöffnet, wenn Sie neue Dateien öffnen. Nur :eeine neue Datei im selben Fenster.
  5. Verwenden Sie :b <tab>diese Option, um Puffer zu durchlaufen, die bereits im Hintergrund geöffnet sind. Wenn Sie eingeben :b foo<tab>, wird es nur mit aktuell geöffneten Dateien übereinstimmen, die übereinstimmen foo.

Ich verwende diese Zuordnungen auch, um das Öffnen neuer Fenster und das Wechseln zwischen ihnen zu erleichtern, da ich dies so oft mache.

" Window movements; I do this often enough to warrant using up M-arrows on this"
nnoremap <M-Right> <C-W><Right>
nnoremap <M-Left> <C-W><Left>
nnoremap <M-Up> <C-W><Up>
nnoremap <M-Down> <C-W><Down>

" Open window below instead of above"
nnoremap <C-W>N :let sb=&sb<BAR>set sb<BAR>new<BAR>let &sb=sb<CR>

" Vertical equivalent of C-w-n and C-w-N"
nnoremap <C-w>v :vnew<CR>
nnoremap <C-w>V :let spr=&spr<BAR>set nospr<BAR>vnew<BAR>let &spr=spr<CR>

" I open new windows to warrant using up C-M-arrows on this"
nmap <C-M-Up> <C-w>n
nmap <C-M-Down> <C-w>N
nmap <C-M-Right> <C-w>v
nmap <C-M-Left> <C-w>V

Ich brauche nur wenige Sekunden, um Vim zu öffnen, einige Fenster einzurichten und einige Dateien darin zu öffnen. Persönlich habe ich keines der Dateisuch-Skripte von Drittanbietern als sehr nützlich empfunden.

Brian Carper
quelle
4
Hutspitze für die tolle Explenation. Wag of the Finger für die Skillz ++ müssen Sie bereits die Explenation verstehen müssen.
Herr Baudin
252

Eine einfache Möglichkeit zum Durchsuchen des Dateisystems ist der folgende Befehl:

:Sex

Ich mache das nicht nach :)


quelle
14
und von der Hilfe sehe ich das: Vex ist auch großartig.
Jrwren
12
Und das hat 69 positive Stimmen. Ich glaube nicht, dass ich das Herz habe, das zu ändern.
AlbeyAmakiir
3
Und :Vexwenn Sie den Bildschirm vertikal statt horizontal
teilen
1
Wow, ich habe beides nie gewusst. Ich finde es :Vexpraktischer, habe aber :Sexgerade meinen Tag gemacht.
William Robertson
1
:Sefunktioniert auch für den Datensatz (das gleiche gilt für die Ve, TeVarianten). Keine Notwendigkeit, es komisch zu machen :)
Towc
46

:Sex, :Vex, :TexUnd :Exsind nützliche Befehle für ex (ploring) , um die Dateien auf Ihrem System , wenn Sie etwas anderes verwenden möchten aus:e

(wo S/V/Tstehen für Split / Vertical / Tab)

Emil Rehhnberg
quelle
7

Wenn Sie sie noch nicht gefunden haben, sollten Sie Folgendes überprüfen:

  • das ursprüngliche Fuzzy-Finder- Plugin - das IIRC hat keine Ruby-Bindungsprobleme
  • das Projekt-Plugin - ähnlich wie NERDTree
  • Das Puffer-Explorer-Plugin - zeigt eine Liste der geöffneten Puffer an

Denken Sie auch daran, dass Sie wichtige Verknüpfungen in Ihrer .vimrc neu zuordnen können, um sie weniger umständlich zu machen. Ich benutze oft geteilte Fenster; Ich habe festgestellt, dass Folgendes den Umgang mit ihnen erheblich erleichtert:

" set your own personal modifier key to something handy
let mapleader = "," 

" use ,v to make a new vertical split, ,s for horiz, ,x to close a split
noremap <leader>v <c-w>v<c-w>l
noremap <leader>s <c-w>s<c-w>j
noremap <leader>x <c-w>c

" use ctrl-h/j/k/l to switch between splits
map <c-j> <c-w>j
map <c-k> <c-w>k
map <c-l> <c-w>l
map <c-h> <c-w>h
dlimeb
quelle
5

Ich finde LustyExplorer bisher am besten.

Sie können eine Datei öffnen, indem Sie nur einen Teil ihres Namens eingeben.

Sie können eine Datei aus dem Verzeichnis der aktuellen Datei oder der aktuellen Datei pwdoder aus der Pufferliste öffnen .

Wenn Sie eine Datei aus der Pufferliste öffnen, müssen Sie nicht durch den Verzeichnisbaum navigieren, obwohl Sie für die beiden anderen Modi leider immer noch durch den Baum navigieren müssen. Das Gute ist, dass Sie nicht mit dem ersten Charakter beginnen müssen.

Wenn Sie haben:

dir_a/
    ...
dir_b/
    file.js
    file.html

und Sie möchten öffnen dir_b/file.html, können Sie es im Allgemeinen durch Eingabe findenb<Tab>h

hasen
quelle
Ich habe einige Erweiterungen für dieses fantastische Addon vorgenommen. svendtofte.com/wp-content/uploads/2009/08/… svendtofte.com/other/vim-stuff Grundsätzlich kann ich nur den Namen einer kürzlich verwendeten Datei eingeben, unabhängig davon, ob sie bereits geladen ist oder nicht. Dies bedeutet, dass Sie den FS nur durchsuchen müssen, wenn Sie eine Datei zum ersten Mal öffnen.
Svend
4

Ich denke, ich würde es besser mit Registerkarten machen, zwischen denen ich leicht wechseln kann, aber vielleicht muss ich einen anderen Workflow verwenden.

Kennen Sie die Registerkarten von Vim? Ich bin mir nicht sicher, ob Sie sich dort auf Vims eigene Registerkarten beziehen oder nach TextMates suchen. Es ist unklar, welche Vim-Version Sie verwenden, aber es gibt seit mindestens 7.0 Registerkarten (die in letzter Zeit überall installiert zu sein scheinen), und sie sind fantastisch.

:tabeÖffnet eine neue (kurz für "Tab-Bearbeitung", z. B. :tabezum Leeren oder :tabe path/to/filezum Öffnen einer Datei in einer neuen Registerkarte). Sie können mit gt/ zwischen benachbarten Registerkarten wechseln gT, und es gibt auch eine Reihe anderer tab-bezogener Navigationsbefehle Sie könnten von Vim ( :help tabs) erwarten

Mein Workflow für große Projekte umfasst in der Regel mehrere Registerkarten mit jeweils 1 bis 3 Fenstern, je nachdem, welchen Kontext ich benötige. Dies funktioniert sogar noch besser, wenn ich ein doppelt breites Terminalfenster habe, mit dem ich vertikal teilen kann :vs, sodass mir auf einer einzelnen Registerkarte problemlos 4 Dateien gleichzeitig angezeigt werden können , für die jeweils viel Platz vorhanden ist.

Letzter Tipp: Ich verwende manchmal den Befehl "switch buffer" ( :sb <partial_buf_name>), der dem Fuzzy-Finding von TM irgendwie ähnelt, da er ziemlich gut funktioniert, aber nur für bereits geöffnete Puffer. Immer noch großartig, wenn ich ein Dutzend oder mehr Dateien gleichzeitig geöffnet habe. ( :set switchbuf=usetabHinweis: Ich musste in meinem vimrc arbeiten, damit dies über Registerkarten hinweg funktioniert, aber sobald dies festgelegt ist, ist es großartig.)

Bitprophet
quelle
1
Mein Verständnis von Registerkarten ist, dass es sich eher um einen Layout-Preserver handelt, nicht wirklich um eine Methode, bei der ein Puffer in jeder Registerkarte geöffnet ist (siehe Bram Molenaars eigene Ansichten zu Registerkarten im Video "7 Gewohnheiten einer effektiven Textbearbeitung".
Svend
Sobald Sie solche Befehle gefunden haben, die für Sie funktionieren, können Sie sie an einen Schlüssel binden. Ich habe Control-Tab-Flip zwischen offenen Puffern (a la Firefox), aber Sie könnten stattdessen Tabs wechseln.
Jonathan Hartley
vim-titlecaseSchrauben mit dem GT / GT - Mappings, aber es gibt eine Behelfslösung .
naught101
4

Es ist überraschend zu sehen, dass der :findBefehl in keiner der Antworten erwähnt wurde. Normalerweise arbeite ich mit Rails-Projekten, bei denen ich tief in die Verzeichnishierarchie vordringen muss. Also für eine Datei application.css, die sich in app/assets/stylesheets/allem befindet, was ich eingeben muss, ist :find applicaund dann die Tabulatortaste drücken, um sie automatisch zu vervollständigen, und die Eingabetaste , um sie zu öffnen.

Imran Ali
quelle
3

Schauen Sie sich das Plugin ctrlp als Alternative zum Plugin Command-T an . Es ist insofern besser, als es ein 'natives' Vim-Skript ist und Vim nicht mit Ruby (oder anderer Unterstützung) kompiliert werden muss, während es sehr schnell und unauffällig läuft.

Nikola
quelle
2

Wenn die gewünschte Datei bereits in einen Puffer geladen ist (was wahrscheinlich ist, wenn Sie regelmäßig zwischen einer Handvoll Dateien wechseln), können Sie mit dem :b[uffer]Befehl schnell zum Puffer wechseln .

:bSie können entweder eine Puffernummer als Parameter oder (nützlicher) eine Zeichenfolge verwenden, die einem Teil des Pfads / Dateinamens entspricht. Wenn mehrere Übereinstimmungen vorhanden sind, können Sie diese mithilfe der Registerkarte durchlaufen.

Wenn Sie das Fenster teilen und den Puffer im neuen Fenster öffnen möchten, verwenden Sie :sb name

Wenn Sie den Puffer in einer neuen Registerkarte öffnen möchten, verwenden Sie :tab b name

Sie können den :lsBefehl auch verwenden , um eine Liste der aktuell geladenen Puffer anzuzeigen.

Dave Kirby
quelle
1

Ich benutze diese Funktion, um Dateien in Unterverzeichnissen zu finden, habe sie aber nicht geschrieben. Es ist aus dem Vim-Wiki :

Funktion! Finden (Name)
    let l: list = system ("find. -name '" .a: name. "' | grep -v \". svn / \ "| perl -ne 'print \" $. \\ t $ _ \ "' ") 
    sei l: num = strlen (Ersatz (l: Liste, "[^ \ n]", "", "g")) 
    wenn l: num 0 
            Echo "Keine Zahl" 
            Rückkehr 
        endif 
        wenn l: inputl: num 
            Echo "Außer Reichweite" 
            Rückkehr 
        endif 
        let l: line = matchstr ("\ n" .l: list, "\ n" .l: input. "\ t [^ \ n] *") 
    sonst 
      sei l: line = l: list 
    endif 
    sei l: Zeile = Ersatz (l: Zeile, "^ [^ \ t] * \ t. /", "", "") 
    Führen Sie ": e" .l: line aus 
Endfunktion 

Befehl! -nargs = 1 Suchen: Aufruf von Suchen ("")

Eine Sache, die ich mag, ist, dass es Platzhalter unterstützt (*). Es ist auch gut für mehrere Spiele benommen.

uniquesnowflake8
quelle
1

Zusätzlich zu den wildmenuAntworten verwende ich das BufExplorer- Plugin und die folgenden Zuordnungen, um Puffer schnell zu überspringen :

nmap <A-1> :b 1<CR>
nmap <A-2> :b 2<CR>
nmap <A-3> :b 3<CR>
...
nmap <A-0> :b 10<CR>
nmap <A-=> \bs

Oder Sie können einfach den Puffer-Explorer durch den :lsBefehl ersetzen , der im Grunde dasselbe anzeigt.

Der letzte ordnet Alt-=den Puffer-Explorer zu.

Ich benutze Windows nicht so oft, da ich normalerweise nur ein oder zwei Fenster habe.

Ich habe das auch so geändert statusline, dass es die Puffernummer enthält %2n, sodass ich immer weiß, welcher Puffer bearbeitet wird. Sehen:h statusline

Ayman
quelle
0

Hier ist etwas ziemlich Triviales, das ich in meinem stecke .vimrc. Es wird eine Datei aus einem beliebigen Unterverzeichnis geladen.

" load from an unspecified subdirectory 
function! LoadFromSubdirectory(filespec) 
  let filename = glob("`find . -name '" . a:filespec . "' -print`") 
  exe ':e '.filename 
endfunction 
:command -nargs=1 Er :call LoadFromSubdirectory(<f-args>) 

Also kann ich einfach sagen:

: Er Main.java

und es wird Unterverzeichnisse durchsuchen, finden Main.javaund laden. Es verhält sich nicht gut für mehrere Dateien mit demselben Namen, aber es ist schnell und einfach.

Das andere Tool, das ich verwende, ist VTreeExplorer , das ein baumbasiertes Fenster mit Dateien / Verzeichnissen bereitstellt und keine speziellen Build-Optionen von VIM erfordert (dh es ist ein Vanilla-Plugin).

Brian Agnew
quelle
Ich möchte in der Lage sein, aus einem Unterverzeichnis zu laden, aber das Problem mit mehreren Dateien wäre ein Deal Breaker für mich. Ich bin ein Django - Entwickler, so ich in der Regel eine Reihe von Unterverzeichnissen habe , dass alle eine haben models.py, views.pyetc.
Pete
0

Mein Workflow zum Suchen von Dateien ist das Wildmenü, autocwd und :e.

Relevante Teile in der .vimrc:

set wildmenu
set wildignore=*.dll,*.o,*.pyc,*.bak,*.exe,*.jpg,*.jpeg,*.png,*.gif
set wildmode=list:full
set autochdir
let g:netrw_list_hide='^\.,.\(pyc\|pyo\|o\)$'

Und wie man es benutzt:

:e myf^D

Das gibt alle Dateien im aktuellen Verzeichnis, die mit myf beginnen. Sie können auch <Tab>durch sie. Verwenden Sie zum Öffnen return :)

^Dwird Ihnen immer alle Übereinstimmungen geben. Da autocmd immer in den Ordner der aktuellen Datei wechselt, ist es einfach, damit zu arbeiten. Wenn du drin bist foo/bar.pyund zu dir gehen foo/baz.pywillst, tu es nur :e baz.pyund du bist da. Das funktioniert auch mit Puffern ( :b foo^Dlistet alle Puffer auf, die mit foo beginnen)

Armin Ronacher
quelle
Wie wäre es mit anderen Verzeichnissen? Zum Beispiel arbeite ich oft zwischen meiner Python-Ansicht, HTML-Vorlage und JavaScript-Dateien, die sich alle in verschiedenen Unterverzeichnissen befinden. In TextMate gebe ich den Namen der Datei ein und alle Übereinstimmungen in meinem "Projekt" (auch bekannt als cwd) werden angezeigt.
Pete
Es wird nicht in Unterordner zurückgeführt, nein. Aber ich habe meinen Workflow daran angepasst. Auch wenn die Datei ich öffne, kann ich nur den Namen des Puffers erwähnen und es geht mir gut. Sie können Vim anweisen, sich an die geöffneten Puffer zu erinnern, dann benötigen Sie diese Funktion normalerweise überhaupt nicht.
Armin Ronacher