Puis-je obtenir le plugin Vim Ctrlp pour ignorer un dossier spécifique dans un projet?

17

Le plugin Vim Ctrlp a un moyen d'ignorer globalement certains noms de dossier. Par exemple:

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

Cependant, j'ai une règle d'ignorance spécifique à un projet. Je voudrais quelque chose de plus comme un .gitignorefichier.

Existe-t-il un moyen d'ignorer un dossier spécifique dans un projet spécifique sans modifier ma configuration globale?

Nathan Long
la source
Avez-vous essayé l'outil de suivi des problèmes du plugin?
romainl

Réponses:

20

Utiliser une commande de liste personnalisée

Ctrlp vous permet de lui dire quelle commande utiliser pour obtenir une liste de fichiers dans le dossier. Donc, si vous vouliez exclure tout nom beets.txt, vous pourriez faire:

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

C'est global, mais cela commence à pointer vers la réponse: fournissez votre propre commande shell.

Encore mieux, Ctrlp vous permet de fournir plusieurs commandes shell avec des marqueurs, ce qui signifie "si vous voyez ce marqueur dans le répertoire racine, utilisez cette commande".

J'ai trouvé cela dans :help ctrlpet modifié légèrement en fonction du commentaire de l'auteur sur un problème.

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'
  \ }

Cela signifie: "Si vous voyez .gitdans le dossier, utilisez git ls-files.... Sinon, si vous voyez .hg, utilisez hg --cwd..., sinon utilisez un régulier find."

Donc, pour ignorer un dossier spécifique dans un projet, imaginez une commande qui ignorera ce dossier, puis placez un marqueur unique dans ce projet pour laisser Ctrlp que vous souhaitez utiliser votre commande spéciale ici .

(Dans mon cas, je voulais en fait ignorer les fichiers qui étaient dedans .gitignore, donc la git ls-filescommande ci-dessus fonctionne pour moi.)

Nathan Long
la source
C'est génial, merci beaucoup pour cette réponse.
Denis
git -C% s ls-files --cached --exclude-standard --others devrait fonctionner pour git.
Arunprasad Rajkumar
11

Si vous utilisez le backend Silver Searcher pour CtrlP (qui est beaucoup plus rapide), ajoutez simplement un .agignorefichier à votre répertoire de projet au même format qu'un .gitignore:

.git/
.hg/
.svn/

Vous pouvez également conserver un ~/.agignorefichier global .

Ajoutez Silver Searcher comme backend avec ceci dans votre .vimrc

let g:ctrlp_user_command = 'ag %s -l --nocolor --hidden -g ""'
adarsh
la source
1
Merci d'avoir posté ça. Pour ajouter un autre point de données: j'ai adapté cela if executable("ag") let g:ctrlp_user_command = 'ag %s -l --nocolor --depth 8 -g ""' endif . La limite de profondeur est utile si je frappe accidentellement ctrl-p lors de l'édition d'un fichier dans mon dossier personnel. J'ai trouvé que le drapeau caché inclurait des fichiers en .git /
Eric Hu
6

Spécifie des fichiers intentionnellement non suivis dans un fichier

Pour résoudre ce problème avec un fichier comme .gitignore(basé sur la solution grep de Nathan), j'ai créé un fichier nommé .ctrlpignoreet mis les modèles à ignorer, séparés par des lignes:

node_modules/
\.log$
...

Et ma configuration ctrlp:

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

Peut-être que le .gitignorelui - même peut être utilisé pour ignorer les fichiers dans ctrlp, sans avoir besoin de créer un nouveau fichier pour faire presque la même chose.

19WAS85
la source
J'ai ajouté cet extrait mais il casse le comportement général de ctrlp, si je tape Orderscontroller, il ne trouve que des fichiers _spec, pas de fichier Orders_controller.rb réel.
jedi
1

Comme l'a dit Wagner Andrade , utiliser un séparateur .ctrlpignoreserait une bonne idée.

Un paramètre vim plus robuste et pratique est comme ceci:

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'

.ctrlpignorepeut être placé dans n'importe quel répertoire qui serait reconnu comme répertoire racine par ctrlp. Voici un exemple, chaque ligne commence par./

vim ~/.ctrlpignore

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

Remarque:

  1. grep -Finterprètera le modèle, ex. './.tmp', comme une chaîne fixe si vous ne voulez pas que votre './ptmp' soit filtré. Il y a encore quelques bugs triviaux: './.tmp' filtrera également './.tmp2'. Oubliez ça, je n'aime pas\.

  2. g:ctrlp_custom_ignoresera ignoré si g:ctrlp_user_commandest défini. Cela pourrait être fait de manière plus complexeg:ctrlp_user_command

  3. une liste blanche au lieu d'une liste noire est également possible. Plus pratique s'il est implémenté dans un script séparé

zhazha
la source