vim, passando rapidamente da un file all'altro utilizzando vanilla Vim (nessun plugin)


103

Capisco che limitarmi a vanilla Vim (senza usare plugin) limita la potenza dell'editor, ma siccome passo frequentemente tra macchine diverse, spesso è troppo difficile spostare il mio ambiente ovunque. Voglio solo restare in Vanilla Vim.

Qualcosa che mi trattiene è la capacità di passare rapidamente da un file all'altro. I (credo almeno) avere una buona comprensione di buffer , finestre , schede , così come netrw ( Vex, Ex, ecc).

Ma in un editor come Sublime Text , posso semplicemente digitare ctrl- pe immediatamente sono al file.

So che posso scendere alla shell, ma mi chiedo se ci siano altri segreti "nascosti" per passare rapidamente da un file all'altro in Vim basati su qualcosa di più del nome del file.


2
Questo non risponde alla tua domanda, ma potrebbe persuaderti a considerare l'utilizzo di plug-in: dudarev.com/blog/keep-vim-settings-and-plugins-in-git-repo
ajwood

Sincronizzo personalmente le mie impostazioni con Dropbox. È goffo ma funziona più o meno senza doverci pensare. L'unico plugin che uso e che conosco funziona bene per quello che vuoi è Command-T ( github.com/wincent/Command-T ). Ctrl-P potrebbe essere un'alternativa ( vim.org/scripts/script.php?script_id=3736 ).
FX

1
Hai visto danielmiessler.com/study/vim ? Ha la pratica molto intelligente di mettere il suo vimrc + tutti i plug-in di cui ha bisogno in Github ... ovunque vada può clonarlo e voilà, Vim è esattamente come gli piace. Brillante
bobox

6
@bobox, decine di migliaia di persone lo fanno; non c'è niente di straordinario in questo.
romainl

Risposte:


236

L'equivalente più vicino ("più vicino", non "esatto") a Ctrl+ di ST2 Pè un plugin chiamato, preparati… CtrlP . Esistono altri plugin simili come Command-T o FuzzyFinder .

Uso CtrlP e lo adoro, ma sostengo con tutto il cuore la tua decisione di andare "senza plugin". Non è il modo più semplice per procedere, ma a lungo termine ripagherà.


Apertura di file

Il modo più semplice per aprire un file è :e /path/to/filename. Per fortuna, ottieni il completamento con tabulazione e caratteri jolly: il classico *e uno speciale **, che sta per "qualsiasi sottodirectory".

Combinando tutto ciò, puoi fare:

:e **/*foo<Tab>

scegliere tra tutti i file che contengono foonel loro nome nella directory di lavoro oppure:

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

per scegliere tra tutti i file che contengono barnel loro nome in qualsiasi sottodirectory contenente foonel suo nome, ovunque sotto la directory di lavoro.

Naturalmente, che lavora per :tabe[dit], :sp[lit]e :vs[plit], anche.

Tuttavia, questi comandi sono limitati a un file. Utilizzare :nextper aprire più file:

:next **/*.js

e dai un'occhiata :help arglist.


Saltando tra i respingenti

:b[uffer] è il comando di commutazione del buffer di base:

: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

Nota che molti di questi comandi e dei loro parenti accettano un conteggio.

Il :lscomando mostra un elenco di buffer caricati. È un po '"speciale", però: ai buffer viene assegnato un numero quando vengono creati in modo da poter avere un elenco che assomiglia 1 2 5se si eliminano i buffer. Questo è un po 'imbarazzante, sì, e questo rende il passaggio a un buffer in base al suo numero un po' troppo problematico. Preferisci il passaggio per nome parziale :b foo<Tab>o in bicicletta :bn :bp.

Ad ogni modo, ecco una bella mappatura che elenca tutti i buffer caricati e popola il prompt per te, in attesa che tu digiti il ​​numero di un buffer e premi <enter>:

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

Con questa mappatura, passare a un altro buffer è semplice come:

gb
(quickly scanning the list)
3<CR>

o:

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

L'idea nasce da questa immagine tratta dalla raccolta di infografiche di Vim di Bairui :

Volare vs ciclismo

Vim ha anche <C-^>(o <C-6>su alcune tastiere), l'equivalente in modalità normale di, :b#per passare dal buffer corrente a quello precedente. Usalo se alterni spesso tra due buffer.

Leggi tutto sui buffer in :help buffers.


Vai alla dichiarazione

All'interno di un file, puoi usare gdo gD.

All'interno di un progetto, la funzione "tag" di Vim è tua amica, ma avrai bisogno di un indicizzatore di codice esterno come ctags o cscope. I comandi di base sono :tag fooe <C-]>con il cursore sul nome di un metodo. Entrambi gli strumenti sono ben integrati in Vim: vedono :help tags, :help ctagse :help cscope.

Per quel che vale, utilizzo ampiamente la navigazione per tag per muovermi all'interno di un progetto (usando principalmente i comandi :CtrlPTage i :CtrlPBufTagcomandi di CtrlP , ma anche quelli incorporati ) e il mio metodo di cambio buffer "generico" preferito è per nome.


Distribuzione della tua configurazione

Molti utenti di Vim mettono la propria configurazione sotto il controllo della versione, il che rende molto semplice e veloce l'installazione della propria configurazione su una nuova macchina. Pensaci.


MODIFICARE

Alcuni mesi fa, ho dovuto lavorare su una macchina remota con un Vim obsoleto. Avrei potuto installare un Vim adeguato e clonare la mia amata configurazione ma ho deciso di viaggiare leggero, questa volta, per "affilare la sega". Ho rapidamente creato un minimalista .vimrce ho rivisitato un paio di funzionalità native semidimenticate. Dopo quel concerto, ho deciso che CtrlP non era così necessario e me ne sono sbarazzato: le funzionalità native e le mappature personalizzate non sono così sexy ma fanno il lavoro senza molte dipendenze.


Giocoleria con i file

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

:findè davvero un ottimo comando non appena lo fai set pathcorrettamente. Con le mie impostazioni, ,ffoo<Tab>troverò tutti i file che contengono foosotto la directory corrente, in modo ricorsivo. È veloce, intuitivo e leggero. Ovviamente traggo vantaggio dallo stesso completamento e dagli stessi caratteri jolly di :edite amici.

Per rendere il processo ancora più veloce, le seguenti mappature mi consentono di saltare intere parti del progetto e di trovare i file in modo ricorsivo nella directory del file corrente:

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>

AVVERTIMENTO! L' pathopzione è estremamente potente. Il valore sopra .,**- - funziona per me ma le lingue che uso non hanno una libreria standard. Il valore corretto dipende interamente dalle tue esigenze.


Giocoleria con i respingenti

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

Le mappature sopra elencano i buffer disponibili nel "wildmenu" con un prompt vuoto, permettendomi di navigare nel menu <Tab>o di digitare alcune lettere e di <Tab>nuovo di restringere l'elenco. Come con le mappature dei file sopra, il processo è veloce e quasi senza attriti.

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

Quelle mappature parlano da sole.


Giocoleria con i tag

nnoremap <leader>j :tjump /

Questa mappatura utilizza la ricerca regex invece della ricerca di parole intere, quindi posso ,jba<Tab>trovare tag foobarbaz().

Sì, la corrispondenza sfocata crea dipendenza, ma senza di essa puoi essere altrettanto produttivo. E per una frazione del costo.


PIÙ MODIFICA

Un paio di suggerimenti / trucchi aggiuntivi ...


Opzioni del menu selvaggio

Il "wildmenu", abilitato con set wildmenu, semplifica la navigazione tra file / buffer. Il suo comportamento è governato da una serie di opzioni che vale la pena indagare:

wildmode dice a Vim come vuoi che si comporti il ​​"wildmenu":

set wildmode=list:full

wildignore filtra tutto il cruft:

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.*

wildignorecaseti permette di cercare fooe trovare Foo:

set wildignorecase

Contrassegni di file

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

Di recente ho trovato questo gioiello in qualcun altro ~/.vimrc. Crea un contrassegno di file nella posizione esatta del cursore ogni volta che lasci un buffer in modo che, ovunque tu sia, 'Jsalti all'ultimo buffer JavaScript che hai modificato. Eccezionale.


2
+1. Non avevo idea di "qualsiasi sottodirectory" in combinazione con :ema la userò molto da ora in poi. Mi meraviglio del lavoro che è entrato in Ctrl-P e posso imparare molto da esso ma non ha funzionato per me. L'ho trovato un po 'lento e come tale ha interrotto il mio corso di pensiero mentre lavoravo (potrebbe essere il mio sistema, le mie impostazioni, me stesso ma non ho indagato)
Lieven Keersmaekers

2
**è fantastico, davvero.
romainl

1
Mi piacerebbe votare di nuovo per la gbmappa. Un altro lo userò molto. Tutti i plugin di buffer che ho provato (CtrlP, bufExplorer, ...) non sono così veloci come questo (concesso, offrono più funzionalità ma non abbastanza per continuare a usarli) .
Lieven Keersmaekers

2
@LievenKeersmaekers, questo è dove l'ho preso da e questo è dove il quadro stupida proviene. Grazie Bairui!
romainl

4
Questa potrebbe essere la più grande risposta mai vista.
craigp

5

La risposta dipende molto dalle tue preferenze e circostanze. Qualche esempio:

  • Se si tratta principalmente di due file (ad esempio un'intestazione C e un file di implementazione), <C-^>è molto utile. In generale, il file alternativo è un concetto importante.
  • Se si utilizza una finestra di editor di grandi dimensioni, Windows :splitrisolve il problema di individuare un buffer dall'individuazione della finestra (una volta aperti tutti i buffer). È possibile utilizzare [N]<C-w><C-w>per passare rapidamente ad esso.
  • Se riesci a memorizzare (pochi) numeri di buffer, i comandi :[N]b[uffer]e :[N]sb[uffer]sono piuttosto utili; :lsti dice i numeri.

I plugin (o almeno le mappature personalizzate) possono migliorare molto le cose, e su vim.org c'è tutta una varietà su questo argomento . Esistono vari meccanismi per distribuire la tua configurazione (Pathogen + GitHub, Dropbox, ...), oppure puoi modificare in remoto i file del server tramite il plugin netrw fornito con Vim.


4
Probabilmente varrebbe la pena menzionare ctags, cscope, gtags, id e friends. Trovo che l'uso di segni maiuscoli sia molto utile. Utilizzare mAper memorizzare il segno Ae `` `` A ''` per tornare. Trovo netrw molto più utile dopo aver appreso :Rexquale ritorni a explorer. :b, :ee molti altri possono accettare caratteri jolly come *e **. Il :bcomando può assumere un nome file parziale. <c-d>Combinalo con o il menu selvaggio puoi andare abbastanza lontano. Per quanto riguarda i plugin, puoi usare qualcosa di specifico del dominio come rail.vim che fornisce comandi di navigazione specifici per rails o qualcosa di più generale come CtrlP.
Peter Rincker

@PeterRincker: +1 per aver menzionato i marchi. Suggerisco di costruire una risposta con dei voti.
Helbreder

Cosa significano <C - ^> e [N] <Cw> <Cw>?
Josh Desmond,

5

A volte è anche utile scorrere in sequenza un elenco di file (ad esempio, se hai fatto qualcosa come vim *.phpaprire più file contemporaneamente). Quindi puoi usare :n[ext](oltre a :prev[ious], :fir[st]e :la[st]) per la navigazione (oltre a quanto suggerito nelle altre risposte).


4

Puoi completare il completamento con caratteri jolly dalla riga di comando senza plug-in. per esempio

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

ti permetterà di scorrere tutti i file che iniziano con 'foo' nell'albero delle directory sotto ./src e selezionare quello che vuoi modificare.

Se hai già modificato il file ed è ancora in un buffer, puoi passare ad esso con:

:b foo<tab>

che scorrerà attraverso tutti i buffer con "foo" nel percorso. Potrebbe essere necessario impostare le opzioni wildmode e wildmenu per ottenere il comportamento desiderato. io ho

wildmode=longest:full
wildmenu

nel mio .vimrc.


2

Se sei su un nome di file e vuoi saltare a quel file, gflo farà per te. Mi piace anche usare ctags , che non è un plugin; devi solo creare i tag e puoi facilmente saltare intorno alla tua base di codice.


1

Se vuoi passare da un file all'altro nell'editor vim, vedi sotto la risposta

Prima premere il Esctasto per uscire dalla modalità di modifica.

Quindi digita :eper controllare il percorso del file corrente.

se vuoi andare su un altro file, digita :e /path-of-file.txt/usando questo sei in grado di cambiare.

Se vuoi andare al file precedente, digita semplicemente :e#quale interruttore al percorso del file precedente.


0

Ho avuto lo stesso problema con Vim.

L'ultima cosa che voglio è dipendere dai plugin per un'attività banale come il cambio di file.

Ho aggiunto le seguenti righe a .vimrc

set path+=**
set wildmenu

E BAM! Ora posso :find any/filename/in/any/folder/finché vim è nella directory principale del progetto. Il completamento della scheda funziona. I caratteri jolly funzionano!

Una volta che i file sono già aperti e ci sono un sacco di buffer in background (che potresti usare :lsper vedere tutti i buffer), l'esecuzione :b any/file <TAB>eseguirà una ricerca sfocata di tutti i buffer e salterà al file richiesto. Nel caso in cui non sia univoco ci sarà un wildmenu di schede (da qui la seconda riga in .vimrc) che possono essere selezionate usando tab.

La mia risposta arriva da questo fantastico video
https://www.youtube.com/watch?v=XA2WjJbmmoM&feature=youtu.be&t=489
Ci sono altri trucchi e consiglio di guardarlo.

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.