Bisakah saya mendapatkan plugin Vim Ctrlp untuk mengabaikan folder tertentu dalam satu proyek?

17

The Vim Ctrlp Plugin memiliki cara untuk global mengabaikan nama folder tertentu. Misalnya:

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

Namun, saya memiliki aturan abaikan yang khusus untuk satu proyek. Saya ingin sesuatu yang lebih seperti .gitignorefile.

Apakah ada cara untuk mengabaikan folder tertentu dalam proyek tertentu tanpa mengubah konfigurasi global saya?

Nathan Long
sumber
Apakah Anda mencoba pelacak masalah plugin?
romainl

Jawaban:

20

Gunakan perintah daftar kustom

Ctrlp memungkinkan Anda memberi tahu perintah apa yang digunakan untuk mendapatkan daftar file di folder. Jadi, jika Anda ingin mengecualikan nama apa pun beets.txt, Anda dapat melakukan:

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

Itu bersifat global, tetapi mulai mengarah ke jawaban: berikan perintah shell Anda sendiri.

Lebih baik lagi, Ctrlp memungkinkan Anda menyediakan beberapa perintah shell dengan marker, yang berarti "jika Anda melihat marker ini di direktori root, gunakan perintah ini."

Saya menemukan ini dalam :help ctrlp, dan sedikit dimodifikasi berdasarkan komentar penulis pada suatu masalah.

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

Ini berarti: "Jika Anda melihat .gitdi folder, gunakan git ls-files.... Jika tidak, jika Anda melihat .hg, gunakan hg --cwd..., jika tidak gunakan biasa find."

Begitu, untuk mengabaikan folder tertentu dalam satu proyek, buat sebuah perintah yang akan mengabaikan folder itu, lalu tempatkan penanda unik di proyek itu untuk membiarkan Ctrlp yang Anda ingin gunakan perintah khusus Anda di sini .

(Dalam kasus saya, saya sebenarnya ingin mengabaikan file yang ada di dalam .gitignore, jadi git ls-filesperintah di atas berfungsi untuk saya.)

Nathan Long
sumber
Itu luar biasa, terima kasih banyak untuk jawaban ini.
Denis
git -C% s ls-files --cached --exclude-standard --lain harus bekerja untuk git.
Arunprasad Rajkumar
11

Jika Anda menggunakan backend Silver Searcher untuk CtrlP (yang jauh lebih cepat), cukup tambahkan .agignorefile ke direktori proyek Anda dalam format yang sama dengan .gitignore:

.git/
.hg/
.svn/

Atau, simpan ~/.agignorefile global .

Tambahkan Penelusur Perak sebagai backend dengan ini di Anda .vimrc

let g:ctrlp_user_command = 'ag %s -l --nocolor --hidden -g ""'
Adarsh
sumber
1
Terima kasih telah memposting ini. Untuk menambahkan titik data lain: Saya mengadaptasi ini if executable("ag") let g:ctrlp_user_command = 'ag %s -l --nocolor --depth 8 -g ""' endif . Batas kedalaman berguna untuk jika saya tidak sengaja menekan ctrl-p saat mengedit file di folder rumah saya. Saya menemukan bahwa bendera tersembunyi akan menyertakan file dalam .git /
Eric Hu
6

Menentukan file yang sengaja dilacak dalam suatu file

Untuk mengatasi ini dengan file seperti .gitignore(berbasis di solusi Nathan grep), saya membuat file bernama .ctrlpignoredan meletakkan pola yang harus diabaikan, dipisahkan oleh baris:

node_modules/
\.log$
...

Dan konfigurasi ctrlp saya:

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

Mungkin .gitignoreitu sendiri dapat digunakan untuk mengabaikan file di ctrlp, tidak perlu membuat file baru untuk melakukan hal yang hampir sama.

19WAS85
sumber
Saya menambahkan potongan ini tetapi merusak perilaku ctrlp overal, jika saya mengetik orderscontroller, ia hanya menemukan file _spec, tidak ada file orders_controller.rb yang sebenarnya.
jedi
1

Seperti kata Wagner Andrade , menggunakan terpisah.ctrlpignore akan menjadi ide yang baik.

Pengaturan vim yang lebih kuat dan nyaman adalah seperti ini:

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'

.ctrlpignoredapat dimasukkan ke dalam direktori apa saja yang akan dikenali sebagai direktori root oleh ctrlp. Berikut ini sebuah contoh, setiap baris dimulai dengan./

vim ~/.ctrlpignore

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

catatan:

  1. grep -Fakan menafsirkan pola, mis. './.tmp', sebagai string tetap jika Anda tidak ingin './ptmp' Anda difilter. Masih ada beberapa bug sepele: './.tmp' juga akan memfilter './.tmp2'. Lupakan saja, aku tidak suka\.

  2. g:ctrlp_custom_ignoreakan diabaikan jika g:ctrlp_user_commanddiatur. Itu bisa dilakukan secara lebih kompleksg:ctrlp_user_command

  3. daftar putih bukan daftar hitam juga dimungkinkan. Lebih nyaman jika diimplementasikan dalam skrip terpisah

zhazha
sumber