Kann ich mit dem Vim Ctrlp-Plugin einen bestimmten Ordner in einem Projekt ignorieren?

17

Das Vim Ctrlp-Plugin kann bestimmte Ordnernamen global ignorieren. Z.B:

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

Ich habe jedoch eine projektspezifische Ignorierregel. Ich hätte gerne etwas Ähnliches wie eine .gitignoreAkte.

Gibt es eine Möglichkeit, einen bestimmten Ordner in einem bestimmten Projekt zu ignorieren, ohne meine globale Konfiguration zu ändern?

Nathan Long
quelle
Hast du den Issue Tracker des Plugins ausprobiert?
Romainl

Antworten:

20

Verwenden Sie einen benutzerdefinierten Auflistungsbefehl

Mit Strg können Sie festlegen, mit welchem ​​Befehl eine Liste der Dateien im Ordner abgerufen werden soll. Wenn Sie also einen Namen ausschließen möchten beets.txt, können Sie Folgendes tun:

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

Das ist global, aber es deutet auf die Antwort hin: Geben Sie Ihren eigenen Shell-Befehl an.

Noch besser ist, dass Sie mit Strg mehrere Shell-Befehle mit Markierungen versehen können. Dies bedeutet: "Wenn Sie diese Markierung im Stammverzeichnis sehen, verwenden Sie diesen Befehl."

Ich fand dies in :help ctrlpund änderte es leicht, basierend auf dem Kommentar des Autors zu einem Problem.

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

Dies bedeutet: "Wenn Sie .gitin dem Ordner sehen, verwenden Sie git ls-files.... Andernfalls verwenden Sie, wenn Sie sehen .hg, hg --cwd...ein reguläres find."

Also, einen bestimmten Ordner in einem Projekt zu ignorieren, einen Befehl entwickeln , die diesen Ordner ignorieren, legen Sie dann eine eindeutige Markierung in diesem Projekt Ctrlp zu lassen , dass Sie Ihren speziellen Befehl hier verwenden mögen .

(In meinem Fall wollte ich eigentlich die darin enthaltenen Dateien ignorieren .gitignore, sodass der git ls-filesobige Befehl für mich funktioniert.)

Nathan Long
quelle
Das ist großartig, vielen Dank für diese Antwort.
Denis
git -C% s ls-files --cached --exclude-standard --andere sollten für git arbeiten.
Arunprasad Rajkumar
11

Wenn Sie das Silver Searcher-Backend für CtrlP verwenden (das viel schneller ist), fügen Sie .agignoreIhrem Projektverzeichnis einfach eine Datei im folgenden Format hinzu .gitignore:

.git/
.hg/
.svn/

Alternativ können Sie eine globale ~/.agignoreDatei behalten .

Fügen Sie den Silver Searcher als Backend hinzu .vimrc

let g:ctrlp_user_command = 'ag %s -l --nocolor --hidden -g ""'
adarsh
quelle
1
Danke, dass du das gepostet hast. So fügen Sie einen weiteren Datenpunkt hinzu: Ich habe diesen angepasst if executable("ag") let g:ctrlp_user_command = 'ag %s -l --nocolor --depth 8 -g ""' endif . Die Tiefenbegrenzung ist nützlich, wenn ich versehentlich Strg-P ​​drücke, während ich eine Datei in meinem Ausgangsordner bearbeite. Ich fand, dass die versteckte Flagge Dateien in .git /
Eric Hu
6

Gibt absichtlich nicht verfolgte Dateien in einer Datei an

Um dies mit einer Datei wie .gitignore(basierend auf der Nathan grep-Lösung) zu lösen , habe ich eine Datei mit dem Namen erstellt .ctrlpignoreund die zu ignorierenden Muster durch Linien getrennt:

node_modules/
\.log$
...

Und meine CTRLP-Konfiguration:

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

Vielleicht .gitignorekann das Programm verwendet werden, um die Dateien in ctrlp zu ignorieren, ohne dass eine neue Datei erstellt werden muss, um fast dasselbe zu tun.

19WAS85
quelle
Ich habe dieses Snippet hinzugefügt, aber es bricht das allgemeine CTRLP-Verhalten. Wenn ich orderscontroller eingebe, werden nur _spec-Dateien und keine eigentlichen orders_controller.rb-Dateien gefunden.
Jedi
1

Wie Wagner Andrade sagte, .ctrlpignorewäre es eine gute Idee , ein separates zu verwenden.

Eine robustere und bequemere vim-Einstellung sieht folgendermaßen aus:

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'

.ctrlpignoreKann in jedes Verzeichnis gestellt werden, das von ctrlp als Root-Verzeichnis erkannt wird. Hier ist ein Beispiel, mit dem jede Zeile beginnt./

vim ~/.ctrlpignore

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

Hinweis:

  1. grep -Fwird Muster interpretieren, z. './.tmp', als feste Zeichenfolge, wenn Sie nicht möchten, dass Ihre './ptmp' herausgefiltert werden. Es gibt noch einige kleine Fehler: './.tmp' filtert auch './.tmp2' heraus. Vergiss es, ich mag es nicht\.

  2. g:ctrlp_custom_ignorewird ignoriert, wenn g:ctrlp_user_commandgesetzt. Diese könnten komplexer gestaltet werdeng:ctrlp_user_command

  3. White-List statt Black-List ist ebenfalls möglich. Bequemer, wenn in einem separaten Skript implementiert

Zhazha
quelle