Tôi có thể tải plugin Vim Ctrlp để bỏ qua một thư mục cụ thể trong một dự án không?


17

Các Plugin Vim Ctrlp có một cách để bỏ qua trên toàn cầu tên thư mục nhất định. Ví dụ:

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

Tuy nhiên, tôi có một quy tắc bỏ qua dành riêng cho một dự án. Tôi muốn một cái gì đó giống như một .gitignoretập tin.

Có cách nào để bỏ qua một thư mục cụ thể trong một dự án cụ thể mà không sửa đổi cấu hình toàn cầu của tôi không?


Bạn đã thử theo dõi vấn đề của plugin chưa?
romainl

Câu trả lời:


20

Sử dụng lệnh liệt kê tùy chỉnh

Ctrlp cho phép bạn nói với nó sử dụng lệnh nào để lấy danh sách các tệp trong thư mục. Vì vậy, nếu bạn muốn loại trừ bất cứ thứ gì có tên beets.txt, bạn có thể làm:

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

Đó là toàn cầu, nhưng nó bắt đầu hướng đến câu trả lời: cung cấp lệnh shell của riêng bạn.

Thậm chí tốt hơn, Ctrlp cho phép bạn cung cấp nhiều lệnh shell với các điểm đánh dấu, nghĩa là "nếu bạn thấy điểm đánh dấu này trong thư mục gốc, hãy sử dụng lệnh này."

Tôi đã tìm thấy điều này :help ctrlpvà đã sửa đổi một chút dựa trên nhận xét của tác giả về một vấn đề.

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

Điều này có nghĩa là: "Nếu bạn thấy .gittrong thư mục, hãy sử dụng git ls-files.... Nếu không, nếu bạn thấy .hg, hãy sử dụng hg --cwd..., nếu không hãy sử dụng thông thường find."

Vì vậy, để bỏ qua một thư mục cụ thể trong một dự án, hãy nghĩ ra một lệnh sẽ bỏ qua thư mục đó, sau đó đặt một điểm đánh dấu duy nhất vào dự án đó để cho Ctrlp mà bạn muốn sử dụng lệnh đặc biệt của mình ở đây .

(Trong trường hợp của tôi, tôi thực sự muốn bỏ qua các tệp trong đó .gitignore, vì vậy git ls-fileslệnh trên hoạt động với tôi.)


Thật tuyệt vời, cảm ơn rất nhiều vì câu trả lời này.
Denis

git -C% s ls-files --cached --exclude-standard - bà mẹ nên làm việc cho git.
Arunprasad Rajkumar

11

Nếu bạn đang sử dụng phụ trợ Silver Searcher cho CtrlP (nhanh hơn nhiều), chỉ cần thêm một .agignoretệp vào thư mục dự án của bạn ở cùng định dạng như .gitignoresau:

.git/
.hg/
.svn/

Ngoài ra, giữ một ~/.agignoretập tin toàn cầu .

Thêm Trình tìm kiếm bạc làm phần phụ trợ với phần này trong phần của bạn .vimrc

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

1
Cảm ơn đã đăng bài này. Để thêm một điểm dữ liệu khác: Tôi đã điều chỉnh điều này if executable("ag") let g:ctrlp_user_command = 'ag %s -l --nocolor --depth 8 -g ""' endif . Giới hạn độ sâu rất hữu ích nếu tôi vô tình nhấn ctrl-p trong khi chỉnh sửa tệp trong thư mục nhà của mình. Tôi thấy rằng cờ ẩn sẽ bao gồm các tệp trong .git /
Eric Hu

6

Chỉ định các tập tin cố định không bị theo dõi trong một tập tin

Để giải quyết vấn đề này bằng một tệp như .gitignore(dựa trên giải pháp grep của Nathan), tôi đã tạo một tệp có tên .ctrlpignorevà đặt các mẫu nên được bỏ qua, cách nhau bởi các dòng:

node_modules/
\.log$
...

Và cấu hình ctrlp của tôi:

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

Có lẽ .gitignorechính nó có thể được sử dụng để bỏ qua các tệp trong ctrlp, không cần tạo một tệp mới để làm gần như điều tương tự.


Tôi đã thêm đoạn mã này nhưng nó phá vỡ hành vi ctrlp quá mức, nếu tôi nhập đơn vị điều khiển đơn hàng, nó chỉ tìm thấy các tệp _spec, không có tệp order_controll.rb thực tế.
jedi

1

Như Wagner Andrade đã nói, sử dụng một chiếc tách biệt .ctrlpignoresẽ là một ý tưởng tốt.

Một cài đặt vim mạnh mẽ và thuận tiện hơn là như thế này:

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'

.ctrlpignorecó thể được đặt trong bất kỳ thư mục nào sẽ được nhận dạng là một thư mục gốc bởi ctrlp. Đây là một ví dụ, mọi dòng đều bắt đầu bằng./

vim ~/.ctrlpignore

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

Ghi chú:

  1. grep -Fsẽ giải thích mô hình, ví dụ. './.tmp', dưới dạng một chuỗi cố định nếu bạn không muốn './ptmp' của bạn được lọc ra. Vẫn còn một số lỗi nhỏ: './.tmp' cũng sẽ lọc ra './.tmp2'. Quên đi, tôi không thích\.

  2. g:ctrlp_custom_ignoresẽ bị bỏ qua nếu g:ctrlp_user_commandđược đặt. Chúng có thể được thực hiện trong một phức tạp hơng:ctrlp_user_command

  3. danh sách trắng thay vì danh sách đen cũng có thể. Thuận tiện hơn nếu được thực hiện trong một tập lệnh riêng biệt

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.