Nawigacja po plikach Vima

90

Bardzo się staram nauczyć vima po używaniu TextMate przez ostatnie kilka lat.

Zacząłem zapisywać do pamięci część nawigacji w pliku, ale mam problemy z nawigacją między wieloma plikami.

W moim przepływie pracy dość często przerzucam się między kilkoma plikami (wystarczająco dużo plików, aby okna podzielonego okienka stały się zbyt małe).

Obecnie używam NERDTree, ale zagłębianie się w katalogi jest uciążliwe, a także ciągle używam CTRL+ W h/ CTRL+ W ldo przeskakiwania tam iz powrotem.

Myślę, że zrobiłbym lepiej z kartami, między którymi mogę łatwo się przełączać, ale może muszę użyć innego przepływu pracy.

Chciałbym również użyć skrótu „Idź do pliku ...”, takiego jak CMD+ Tw TextMate. Znalazłem, fuzzy_file_finderale wymaga to zbudowania vima z powiązaniami Ruby, co nie dotyczy instalacji natywnych, nad którymi pracowałem.

Chociaż mógłbym przebudować, głównym powodem, dla którego chcę przejść na vim, jest to, że mogę mieć jedno środowisko edytora, o którym wiem, że będzie z łatwością działało na dowolnej platformie.

Opcje, które są przytłaczające, są bardzo mile widziane!

Pete
źródło
1
Nie znalazłem naprawdę satysfakcjonującego sposobu poruszania się po plikach i buforach, który w ogóle nie używa zewnętrznych pomocy. Wbudowane rzeczy są dość złe (mam na myśli zmianę na bufor według jego numeru? Kto chodzi po okolicy, pamiętając tymczasowe numery buforów ...)
Svend
1
@svend: możesz odnosić się do buforów zarówno po nazwie, jak i numerze - zobacz moją odpowiedź poniżej
Dave Kirby

Odpowiedzi:

92

Nie uważam, aby zagłębianie się w podkatalogi za pośrednictwem zwykłego starego :ebyłoby tak uciążliwe, biorąc pod uwagę przyzwoitą konfigurację uzupełniania kart.

Spójrz na 'wildmenu'opcję, aby Vim pokazał listę uzupełnień (nazw plików) w linii modelu powyżej linii poleceń. Możesz zmienić 'wildmode'opcję, aby dalej skonfigurować rodzaj uzupełniania tabulatorami, które Vim zrobi.

Osobiście używam :set wildmode=full.

Mój przepływ pracy wygląda tak:

  1. :cd do katalogu najwyższego poziomu mojego projektu.
  2. Aby otworzyć plik foo/bar/baz:

    • Najprostszy scenariusz: typ :e f<tab>b<tab>b<tab><enter>.

    • Jeśli istnieje więcej niż jeden plik rozpoczynający się bw jednym z tych katalogów może trzeba zrobić <left>lub <right>czy inny <tab>na klawiaturze, aby przejść pomiędzy nimi (lub wpisz kilka więcej listów do dwuznaczności).

    • W najgorszym przypadku istnieją pliki i katalogi, które mają wspólną nazwę i musisz przejść do katalogu. W takim przypadku wpisz nazwę katalogu, a następnie wpisz, *<tab>aby przejść do szczegółów.

  3. Otwórz 2 lub 3 okna i w razie potrzeby otwórz pliki we wszystkich.
  4. Gdy plik zostanie otwarty w buforze, nie zabijaj bufora. Pozostaw ją otwartą w tle podczas otwierania nowych plików. Po prostu :enowy plik w tym samym oknie.
  5. Następnie użyj :b <tab>do przełączania buforów, które są już otwarte w tle. Jeśli wpiszesz :b foo<tab>, będzie pasować tylko do aktualnie otwartych plików, które pasują foo.

Używam również tych mapowań, aby ułatwić otwieranie nowych okien i przeskakiwanie między nimi, ponieważ robię to często.

" 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

Otwarcie Vima, skonfigurowanie niektórych okien i otwarcie kilku plików zajmuje mi kilka sekund. Osobiście nigdy nie znalazłem żadnego ze skryptów do przeglądania plików stron trzecich za bardzo użyteczny.

Brian Carper
źródło
4
Czubek kapelusza dla niesamowitej eksploracji. Machnięcie palcem dla skillz ++, które musisz już zrozumieć, jest eksploracją.
Pan Baudin
256

Prostym sposobem przeglądania systemu plików jest polecenie:

:Sex

Nie zmyślam :)


źródło
14
iz pomocy widzę, że: Vex też jest świetny.
jrwren
15
A to ma 69 głosów za. Chyba nie mam serca, żeby to zmienić.
AlbeyAmakiir
3
A :Vexjeśli chcesz podzielić ekran w pionie zamiast w poziomie
sreenivas
1
Wow, nigdy nie wiedziałem o tym. Uważam, że jest :Vexbardziej praktyczny, ale :Sexwłaśnie sprawiłem, że mój dzień.
William Robertson,
2
dla przypomnienia, :Sedziała też (to samo dla Ve, Tewariantów). Nie ma co robić tego dziwnie :)
towc
46

:Sex, :Vex, :TexI :Exsą przydatne polecenia ex (ploring) pliki w systemie, jeśli chcesz korzystać z czegoś innego:e

(gdzie S/V/Tsą skrótami od Split / Vertical / Tab)

Emil Rehhnberg
źródło
7

Jeśli jeszcze ich nie znalazłeś, możesz sprawdzić:

  • oryginalna wtyczka Fuzzy Finder - której IIRC nie ma problemów z wiązaniem Rubiego
  • wtyczka Project - podobna do NERDTree
  • wtyczka eksploratora buforów - pokazuje listę otwartych buforów

Pamiętaj również, że możesz zmienić przypisanie skrótów klawiszowych w pliku .vimrc, aby były mniej kłopotliwe. Często używam podzielonych okien; Zauważyłem, że następujące kwestie znacznie ułatwiają radzenie sobie z nimi:

" 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
źródło
5

Myślę, że zrobiłbym lepiej z kartami, między którymi mogę łatwo się przełączać, ale być może muszę użyć innego przepływu pracy.

Czy znasz zakładki Vima? Nie jestem pewien, czy odnosiłeś się do zakładek Vima, czy też szukałeś TextMate. Nie jest jasne, jakiej wersji Vima używasz, ale ma zakładki od co najmniej 7.0 (które wydaje się być zainstalowane wszędzie, gdzie ostatnio spojrzę) i są niesamowite.

:tabeotwiera nową kartę (skrót od „edycji karty”, czyli np. :tabedo pustego :tabe path/to/filepliku lub do otwierania pliku w nowej karcie), możesz poruszać się między sąsiednimi kartami za pomocą gt/ gT, a jest też kilka innych poleceń nawigacyjnych związanych z zakładkami, ponieważ można się spodziewać po Vimie ( :help tabs)

Mój przepływ pracy dla dużych projektów zwykle obejmuje kilka kart, z których każda ma od 1 do 3 okien, w zależności od potrzebnego kontekstu. Działa to jeszcze lepiej, jeśli mam okno terminala o podwójnej szerokości, ponieważ mogę podzielić go w pionie :vs, więc pojedyncza karta może z łatwością pokazać mi 4 pliki naraz z dużą ilością miejsca na każdy.

Ostatnia wskazówka: czasami używam polecenia „switch buffer” ( :sb <partial_buf_name>), które jest trochę podobne do rozmytych wyników TM, ponieważ działa całkiem dobrze, ale tylko dla już otwartych buforów. Nadal świetnie sprawdza się, gdy mam otwartych kilkanaście lub więcej plików jednocześnie. (NB musiałem :set switchbuf=usetabw moim vimrc, aby to działało na różnych kartach, ale kiedy to jest ustawione, jest świetne.)

bitprophet
źródło
1
Rozumiem, że zakładki są bardziej zachowaniem układu, a nie metodą otwierania jednego bufora w każdej zakładce (zobacz własne widoki zakładek Brama Molenaarsa w filmie „7 nawyków efektywnej edycji tekstu”.
Svend
Następnie, gdy już zorientujesz się, jak te polecenia działają dla Ciebie, możesz przypisać je do klawisza. Mam przełączanie kart kontrolnych między otwartymi buforami (a la firefox), ale zamiast tego możesz przełączać karty.
Jonathan Hartley
vim-titlecaseśruby z mapowaniami gt / gT, ale istnieje obejście .
naught101
5

Jak dotąd uważam LustyExplorer za najlepszy.

Możesz otworzyć plik, wpisując tylko część jego nazwy.

Możesz otworzyć plik z katalogu bieżącego lub bieżącego pliku pwdalbo z listy buforów.

Jeśli otworzysz plik z listy buforów, nie musisz nawigować po drzewie katalogów, chociaż niestety w pozostałych dwóch trybach nadal musisz nawigować po drzewie. Dobrą rzeczą jest to, że nie musisz zaczynać od pierwszej postaci.

Jeśli masz:

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

a chcesz go otworzyć dir_b/file.html, możesz go znaleźć, wpisującb<Tab>h

hasen
źródło
Zrobiłem kilka rozszerzeń tego niesamowitego dodatku. svendtofte.com/wp-content/uploads/2009/08/… svendtofte.com/other/vim-stuff W zasadzie pozwala mi po prostu wpisać nazwę ostatnio używanego pliku, bez względu na to, czy jest już załadowany, czy nie. Oznacza to, że musisz przeglądać FS tylko wtedy, gdy otwierasz plik po raz pierwszy.
Svend
4

Zaskakujące jest to, że :findpolecenie nie zostało wymienione w żadnej z odpowiedzi. Zwykle pracuję z projektami rails, w których muszę zagłębić się w hierarchię katalogów. Więc dla pliku application.cssznajdującego się we app/assets/stylesheets/wszystkim, co muszę wpisać, to, :find applicaa następnie naciśnij klawisz Tab, aby autouzupełnianie i Enter, aby otworzyć.

Imran Ali
źródło
3

Sprawdź wtyczkę ctrlp jako alternatywę dla wtyczki Command-T . Jest lepsze niż to, ponieważ jest to „natywny” skrypt Vima i nie wymaga kompilacji Vima z ruby ​​(lub inną obsługą), podczas gdy działa bardzo szybko i dyskretnie.

nikola
źródło
2

Jeśli żądany plik jest już załadowany do bufora (co jest prawdopodobne, jeśli regularnie przełączasz się między kilkoma plikami), możesz szybko przełączyć się do bufora za pomocą :b[uffer]polecenia.

:bmoże przyjąć numer bufora jako parametr lub (bardziej użytecznie) łańcuch, który pasuje do części ścieżki / nazwy pliku. Jeśli jest wiele dopasowań, możesz je przełączać za pomocą klawisza Tab.

Jeśli chcesz podzielić okno i otworzyć bufor w nowym oknie, użyj :sb name

Jeśli chcesz otworzyć bufor w nowej karcie, użyj :tab b name

Możesz również użyć :lspolecenia, aby wyświetlić listę aktualnie załadowanych buforów.

Dave Kirby
źródło
1

Używam tej funkcji do wyszukiwania plików w podkatalogach, chociaż jej nie napisałem. Pochodzi z wiki Vima :

funkcjonować! Znajdź (imię)
    niech l: list = system ("znajdź. -nazwa '" .a: nazwa. "' | grep -v \". svn / \ "| perl -ne 'print \" $. \\ t $ _ \ "' ") 
    niech l: num = strlen (substitute (l: list, "[^ \ n]", "", "g")) 
    jeśli l: num 0 
            echo „To nie jest liczba” 
            powrót 
        endif 
        jeśli l: inputl: num 
            echo „Poza zakresem” 
            powrót 
        endif 
        niech l: line = matchstr ("\ n" .l: list, "\ n" .l: input. "\ t [^ \ n] *") 
    jeszcze 
      niech l: line = l: list 
    endif 
    niech l: linia = substitute (l: linia, "^ [^ \ t] * \ t. /", "", "") 
    wykonaj ": e" .l: line 
funkcja końcowa 

Komenda! -nargs = 1 Znajdź: zadzwoń Znajdź („”)

Jedną rzeczą, którą lubię, jest obsługa symboli wieloznacznych (*). Jest również dobrze zachowany podczas wielu meczów.

uniquesnowflake8
źródło
1

Oprócz wildmenuodpowiedzi używam wtyczki BufExplorer i następujących mapowań do szybkiego przeskakiwania buforów:

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

Lub możesz po prostu zastąpić eksplorator buforów :lspoleceniem, które w zasadzie wyświetla to samo.

Ostatni mapuje, Alt-=aby pokazać eksplorator buforów.

Nie używam tak często systemu Windows, ponieważ zazwyczaj mam tylko jedno lub dwa okna.

Zmodyfikowałem również tak, statuslineaby zawierał numer bufora %2n, dzięki czemu zawsze wiem, który bufor jest edytowany. Widzieć:h statusline

Ayman
źródło
0

Oto coś dość trywialnego, które trzymam w moim .vimrc. Załaduje plik z dowolnego podkatalogu.

" 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>) 

Więc mogę po prostu powiedzieć:

: Er Main.java

i przeszuka podkatalogi, znajdź Main.java i załadować. Nie działa dobrze w przypadku wielu plików o tej samej nazwie, ale jest szybki i prosty.

Innym narzędziem, którego używam, jest VTreeExplorer , które zapewnia oparte na drzewie okno plików / katalogów i nie wymaga żadnych specjalnych opcji kompilacji z VIM (tj. Jest to wtyczka waniliowa).

Brian Agnew
źródło
Chciałbym móc ładować z podkatalogu, ale problem z wieloma plikami byłby dla mnie przełomem. Jestem deweloperem Django, więc zazwyczaj mają kilka podkatalogów, że wszyscy mają models.py, views.pyitp
Pete
0

Mój przepływ pracy przy znajdowaniu plików to wildmenu, autocwd i :e .

Odpowiednie części w .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\)$'

I jak z tego korzystać:

:e myf^D

To daje wszystkie pliki w bieżącym katalogu, które zaczynają się od myf. Możesz także<Tab> przez nie. Użyj powrotu, aby otworzyć :)

^Dzawsze da ci wszystkie dopasowania. Ponieważ autocmd zawsze przechodzi do folderu bieżącego pliku, z którym łatwo się pracuje. Jeśli jesteś w środku foo/bar.pyi chcesz iść do foo/baz.pysiebie, tylko zrób to :e baz.pyi tam jesteś. Działa to również z buforami ( :b foo^Dwyświetla wszystkie bufory zaczynające się od foo)

Armin Ronacher
źródło
A co z dostaniem się do innych katalogów? Na przykład często będę pracować między moim widokiem Pythona, szablonem HTML i plikami JavaScript, które znajdują się w różnych podkatalogach? W TextMate zaczynam wpisywać nazwę pliku i pojawiają się wszystkie dopasowania w moim „projekcie” (aka cwd).
Pete
Nie powraca do podfolderów, nie. Ale dostosowałem do tego mój przepływ pracy. Również po otworzeniu pliku mogę po prostu wspomnieć nazwę bufora i wszystko w porządku. Możesz powiedzieć Vimowi, aby zapamiętał otwarte bufory, wtedy zwykle nie potrzebujesz tej funkcji.
Armin Ronacher