Posso ottenere il plug-in Vim Ctrlp per ignorare una cartella specifica in un progetto?


17

Il plugin Vim Ctrlp ha un modo per ignorare globalmente determinati nomi di cartelle. Per esempio:

let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn)$'

Tuttavia, ho una regola da ignorare specifica per un progetto. Vorrei qualcosa di più simile a un .gitignorefile.

C'è un modo per ignorare una cartella specifica in un progetto specifico senza modificare la mia configurazione globale?


Hai provato il tracker dei problemi del plug-in?
romainl

Risposte:


20

Utilizzare un comando di elenco personalizzato

Ctrlp ti permette di dirgli quale comando usare per ottenere un elenco di file nella cartella. Quindi, se volessi escludere qualsiasi nome beets.txt, potresti fare:

let g:ctrlp_user_command = 'find %s -type f | grep -v "beets.txt"'

È globale, ma inizia a puntare verso la risposta: fornire il proprio comando di shell.

Ancora meglio, Ctrlp ti consente di fornire più comandi shell con marcatori, il che significa "se vedi questo marcatore nella directory principale, usa questo comando".

Ho trovato questo :help ctrlpe modificato leggermente in base al commento dell'autore su un problema.

let g:ctrlp_user_command = {
  \ 'types': {
    \ 1: ['.git', 'cd %s && git ls-files --cached --exclude-standard --others'],
    \ 2: ['.hg', 'hg --cwd %s locate -I .'],
    \ },
  \ 'fallback': 'find %s -type f'
  \ }

Ciò significa: "Se vedi .gitnella cartella, usa git ls-files.... Altrimenti, se vedi .hg, usa hg --cwd..., altrimenti usa un normale find."

Quindi, per ignorare una cartella specifica in un progetto, escogitare un comando che ignorerà quella cartella, quindi posizionare un marcatore univoco in quel progetto per consentire a Ctrlp di utilizzare il comando speciale qui .

(Nel mio caso, volevo davvero ignorare i file presenti .gitignore, quindi il git ls-filescomando sopra funziona per me.)


È fantastico, grazie mille per questa risposta.
Denis,

git -C% s ls-files --cached --exclude-standard --others dovrebbe lavorare per git.
Arunprasad Rajkumar,

11

Se stai usando il backend Silver Searcher per CtrlP (che è molto più veloce), aggiungi semplicemente un .agignorefile alla directory del tuo progetto nello stesso formato di .gitignore:

.git/
.hg/
.svn/

In alternativa, mantenere un ~/.agignorefile globale .

Aggiungi Silver Searcher come backend con questo nel tuo .vimrc

let g:ctrlp_user_command = 'ag %s -l --nocolor --hidden -g ""'

1
Grazie per aver pubblicato questo Per aggiungere un altro punto dati: l'ho adattato if executable("ag") let g:ctrlp_user_command = 'ag %s -l --nocolor --depth 8 -g ""' endif . Il limite di profondità è utile se premo accidentalmente ctrl-p durante la modifica di un file nella mia cartella home. Ho scoperto che la bandiera nascosta includerebbe i file in .git /
Eric Hu

6

Specifica i file non tracciati intenzionalmente in un file

Per risolverlo con un file simile .gitignore(basato sulla soluzione grep di Nathan), ho creato un file chiamato .ctrlpignoree ho inserito i pattern che dovrebbero essere ignorati, separati da linee:

node_modules/
\.log$
...

E la mia configurazione ctrlp:

let g:ctrlp_user_command = 'find %s -type f | grep -v "`cat .ctrlpignore`"'

Forse lo .gitignorestesso può essere usato per ignorare i file in ctrlp, non è necessario creare un nuovo file per fare quasi la stessa cosa.


Ho aggiunto questo frammento ma interrompe il comportamento generale di ctrlp, se digito ordinicontrollore trova solo i file _spec, nessun file ordini_controllore.rb effettivo.
jedi

1

Come diceva Wagner Andrade , usare una soluzione separata .ctrlpignoresarebbe una buona idea.

Un'impostazione vim più robusta e conveniente è come questa:

let g:ctrlp_user_command = 'cd %s;
  \ commonfilter="\.(jpg|bmp|png|jar|7z|zip|tar|gz|tgz|bz)$";
  \ if [ ! -r ".ctrlpignore" ]; then
  \   find . -type f | grep -Evi "$commonfilter";
  \ else
  \   find . -type f | grep -vF "$(cat .ctrlpignore)" | grep -Evi "$commonfilter";
  \ fi'

.ctrlpignorepuò essere inserito in qualsiasi directory che verrà riconosciuta come directory principale da ctrlp. Ecco un esempio, ogni riga inizia con./

vim ~/.ctrlpignore

./Desktop
./R
./.vim
./.local/lib
.....

Nota:

  1. grep -Finterpreterà il modello, es. './.tmp', come stringa fissa se non vuoi che il tuo './ptmp' venga filtrato. Ci sono ancora alcuni bug banali: './.tmp' filtrerà anche './.tmp2'. Dimenticalo, non mi piace\.

  2. g:ctrlp_custom_ignoreverrà ignorato se g:ctrlp_user_commandimpostato. Quelli potrebbero essere fatti in un modo più complessog:ctrlp_user_command

  3. è anche possibile la lista bianca anziché la lista nera. Più conveniente se implementato in uno script separato

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.