Czy mogę sprawić, by wtyczka Vim Ctrlp zignorowała określony folder w jednym projekcie?

17

Wtyczki Vim Ctrlp ma sposób aby globalnie ignorować niektóre nazwy folderów. Na przykład:

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

Mam jednak zasadę ignorowania, która jest specyficzna dla jednego projektu. Chciałbym coś bardziej jak .gitignoreplik.

Czy istnieje sposób zignorowania określonego folderu w konkretnym projekcie bez zmiany mojej konfiguracji globalnej?

Nathan Long
źródło
Czy wypróbowałeś narzędzie do śledzenia problemów z wtyczką?
romainl

Odpowiedzi:

20

Użyj niestandardowego polecenia na liście

Ctrlp pozwala ci powiedzieć, jakiego polecenia użyć, aby uzyskać listę plików w folderze. Więc jeśli chcesz wykluczyć coś nazwanego beets.txt, możesz:

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

Jest to globalne, ale zaczyna wskazywać odpowiedź: podaj własne polecenie powłoki.

Co więcej, Ctrlp pozwala na dostarczanie wielu poleceń powłoki ze znacznikami, co oznacza „jeśli zobaczysz ten znacznik w katalogu głównym, użyj tego polecenia”.

Znalazłem to :help ctrlpi nieznacznie zmodyfikowałem na podstawie komentarza autora do problemu.

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

Oznacza to: „Jeśli widzisz .gitw folderze, użyj git ls-files.... W przeciwnym razie, jeśli widzisz .hg, użyj hg --cwd..., w przeciwnym razie użyj zwykłego find”.

Tak więc, aby zignorować określony folder w jednym projekcie, opracuj polecenie, które zignoruje ten folder, a następnie umieść unikalny znacznik w tym projekcie, aby umożliwić Ctrlp, że chcesz użyć tutaj specjalnego polecenia .

(W moim przypadku naprawdę chciałem zignorować pliki, które tam były .gitignore, więc git ls-filespowyższe polecenie działa dla mnie).

Nathan Long
źródło
To niesamowite, wielkie dzięki za tę odpowiedź.
Denis,
git -C% s ls-files --cached --exclude-standard - inne powinny działać dla git.
Arunprasad Rajkumar
11

Jeśli używasz zaplecza Silver Searchera dla CtrlP (który jest znacznie szybszy), po prostu dodaj .agignoreplik do katalogu projektu w tym samym formacie, co .gitignore:

.git/
.hg/
.svn/

Alternatywnie, zachowaj ~/.agignoreplik globalny .

Dodaj Silver Searchera jako backend z tym w swoim .vimrc

let g:ctrlp_user_command = 'ag %s -l --nocolor --hidden -g ""'
adarsh
źródło
1
Dzięki za opublikowanie tego. Aby dodać kolejny punkt danych: dostosowałem to if executable("ag") let g:ctrlp_user_command = 'ag %s -l --nocolor --depth 8 -g ""' endif . Limit głębokości jest przydatny, jeśli przypadkowo wcisnę ctrl-p podczas edycji pliku w folderze domowym. Odkryłem, że ukryta flaga będzie zawierać pliki w .git /
Eric Hu
6

Określa celowo nieśledzone pliki w pliku

Aby rozwiązać ten problem za pomocą pliku typu .gitignore(oparty na rozwiązaniu Nathan grep), utworzyłem plik o nazwie .ctrlpignorei umieściłem wzorce, które należy zignorować, oddzielając je liniami:

node_modules/
\.log$
...

I moja konfiguracja ctrlp:

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

Być może .gitignoresam może zostać użyty do zignorowania plików w ctrlp, bez potrzeby tworzenia nowego pliku, aby zrobić prawie to samo.

19WAS85
źródło
Dodałem ten fragment kodu, ale łamie on ogólne zachowanie ctrlp, jeśli wpiszesz poleceniecontrcontroller, znajdzie tylko pliki _spec, a nie rzeczywisty plik.
jedi
1

Jak powiedział Wagner Andrade , .ctrlpignoredobrym pomysłem byłoby użycie oddzielnego .

Bardziej niezawodne i wygodne ustawienie vima wygląda następująco:

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'

.ctrlpignoremożna umieścić w dowolnym katalogu, który zostałby rozpoznany jako katalog główny przez ctrlp. Oto przykład, od którego zaczyna się każda linia./

vim ~/.ctrlpignore

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

Uwaga:

  1. grep -Fzinterpretuje wzór, np. „./.tmp”, jako stały ciąg znaków, jeśli nie chcesz, aby filtr „./ptmp” został odfiltrowany. Wciąż są trywialne błędy: „./.tmp” również odfiltruje „./.tmp2”. Zapomnij, nie lubię\.

  2. g:ctrlp_custom_ignorezostanie zignorowany, jeśli g:ctrlp_user_commandjest ustawiony. Można to zrobić w bardziej złożony sposóbg:ctrlp_user_command

  3. możliwa jest również biała lista zamiast czarnej listy. Bardziej wygodne, jeśli zostało zaimplementowane w osobnym skrypcie

zhazha
źródło