Làm cách nào để tương tác tìm kiếm / grep với VIM?


12

Có cách nào để định cấu hình VIM để tìm kiếm tương tác bên trong mỗi tệp cho toàn bộ dự án không?

Bằng cách tương tác , tôi có nghĩa là cập nhật từng tổ hợp phím.

Một cái gì đó như Emacsdvisor -git-grep , xem: ví dụ demo .


Tôi không sử dụng cá nhân nên tôi không chắc chắn 100% nhưng tôi nghĩ ctrl-phoặc một plugin tương tự là thứ bạn đang tìm kiếm. Lưu ý rằng unite.vimcũng sẽ có thể làm điều đó nhưng tôi sẽ không khuyên bạn nên nó bởi vì theo tôi nó là một nặng khá và plugin lỗi-tạo.
statox

ctrl-pcách nào để tương tác tìm kiếm nội dung tập tin? Tôi chỉ từng sử dụng nó để tương tác tìm kiếm các tập tin dựa trên tên của họ.
ideaman42

Tôi nghĩ điều đó là có thể nhưng như tôi đã nói tôi không sử dụng nó nên có lẽ tôi đã sai
statox

Câu trả lời:


14

Tôi không chắc đây là thứ bạn đang tìm kiếm, nhưng có lẽ bạn có thể thử fzffzf.vim .

Nếu bạn sử dụng vim-plug làm trình quản lý plugin, tất cả những gì bạn cần làm để cài đặt chúng, là thêm các dòng này vào vimrc:

Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
Plug 'junegunn/fzf.vim'

... ở đâu đó giữa các dòng:

call plug#begin('~/.vim/plugged')

và:

call plug#end()

Sau đó thực hiện :PlugInstall.


Trong số các lệnh và ánh xạ khác nhau được cung cấp bởi fzf.vim(mục đích duy nhất của chúng dường như là cài đặt ánh xạ và các lệnh yêu cầu fzftìm kiếm mờ thông qua các nguồn được xác định trước), có lệnh :Ag.

Để có thể sử dụng nó, bạn cần cài đặt lệnh shell ag . Trên các bản phân phối dựa trên debian, nó có thể được thực hiện bằng lệnh sau:

apt-get install silversearcher-ag

Dự án trên github giải thích cách cài đặt nó trên MacOS:

brew install the_silver_searcher

:Aglà một trình bao bọc xung quanh $ agvà cho phép bạn tìm kiếm mờ một mẫu trong các tệp của thư mục hiện tại (mẫu được hiển thị khi bạn nhập :pwd). Các trận đấu được cập nhật sau mỗi lần nhấn phím.

Bạn có thể:

  • chu kỳ tiến và lùi thông qua các trận đấu với C-nC-p
  • chọn trận đấu hiện tại và di chuyển đến trận đấu tiếp theo / trước với Tab/S-Tab
  • chọn hoặc bỏ chọn tất cả các trận đấu có M-ahoặcM-d

Nếu bạn chọn một hoặc một vài trận đấu, sau khi nhấn Enter, chúng sẽ điền vào danh sách quickfix. Từ đó bạn sẽ có thể điều hướng qua chúng bằng các lệnh / ánh xạ Vim mặc định, chẳng hạn như :cnext:cprevious.

nhập mô tả hình ảnh ở đây

Nếu bạn muốn thêm tiền tố vào tất cả các lệnh được cài đặt bởi fzf.vimvà tránh ghi đè các lệnh hiện có, bạn có thể thêm tiền tố này vào vimrc:

let g:fzf_command_prefix = 'your_prefix'

Tôi sử dụng Fzflàm tiền tố, đó là lý do tại sao tôi không gõ :Agnhưng :FzfAg.


Nếu bạn thích sử dụng git grepthay vì ag, có vẻ như bạn có thể cài đặt trình bao bọc tùy chỉnh của riêng mình xung quanh nó :GGrep, như thế này:

command! -bang -nargs=* GGrep
  \ call fzf#vim#grep('git grep --line-number '.shellescape(<q-args>), 0, <bang>0)

Nó được giải thích trong :h fzf-vim-customization.

Ngoài ra, nếu fzfmở ra một cửa sổ trong tmux, và bạn sẽ thích nó mất toàn bộ màn hình thay vào đó, bạn có thể thêm một tiếng nổ cho tất cả các lệnh ( :Ag!, :GGrep!, ...).


Như bạn đã nói trong bình luận cuối cùng của bạn , theo mặc định fzfthay đổi cấu hình của trình bao của bạn. Ví dụ: nếu bạn sử dụng bash, nó sẽ thêm dòng sau vào ~/.bashrc:

[ -f ~/.fzf.bash ] && source ~/.fzf.bash

Điều này sẽ nguồn tập tin ~/.fzf.bash. Cái sau chứa một số mã:

# Setup fzf
# ---------
if [[ ! "$PATH" == */home/user/.fzf/bin* ]]; then
  export PATH="$PATH:/home/user/.fzf/bin"
fi

# Auto-completion
# ---------------
[[ $- == *i* ]] && source "/home/user/.fzf/shell/completion.bash" 2> /dev/null

# Key bindings
# ------------
source "/home/user/.fzf/shell/key-bindings.bash"

Mã này nối thêm một đường dẫn đến biến môi trường $PATH: /home/user/.fzf/bin; đó là thư mục chứa fzfchương trình.

Nó cũng nguồn 2 tập tin khác:

/home/user/.fzf/shell/completion.bash
/home/user/.fzf/shell/key-bindings.bash

Cái đầu tiên dường như xác định các hàm hoàn thành, trong khi cái thứ hai cài đặt các ràng buộc chính.

Thật không may, các ràng buộc chính có thể ghi đè các readlinechức năng mặc định .
Ví dụ, fzfliên kết hàm fzf-file-widgetvới C-t. Khóa này thường được sử dụng bởi readline để thực thi transpose-charschức năng.

Nếu bạn không muốn điều này, một giải pháp khả thi sẽ là khôi phục các ràng buộc chính bên trong bạn ~/.bashrc, sau khi fzfđã lấy được cấu hình của nó. Ví dụ: nếu bạn muốn C-tgiữ hành vi cũ của nó, đó là hoán đổi 2 ký tự xung quanh con trỏ và liên kết fzf-file-widgetvới một khóa khác, giả sử C-x C-t, bạn có thể thêm các dòng này vào cuối ~/.bashrc:

bind -x '"\C-x\C-t": fzf-file-widget'
bind '"\C-t": transpose-chars'

Điều tương tự cũng áp dụng cho zshshell, nhưng cú pháp để cài đặt một ràng buộc khóa hơi khác một chút:

bindkey '^X^T' fzf-file-widget
bindkey '^T' transpose-chars

Nếu một trong các ràng buộc khóa shell mà bạn đã sử dụng bị ghi đè fzf, bạn muốn khôi phục nó, nhưng không biết tên chính xác của hàm được thực thi là gì, bạn có thể thử điều sau đây.

Đầu tiên, bên trong của bạn ~/.bashrc, tạm thời nhận xét dòng nguồn fzfcấu hình. Sau đó, mở lại một thiết bị đầu cuối và xem đầu ra của bind -Plệnh mà bạn có thể đọc trong bộ đệm Vim:

bind -P | vim -R -

Tôi không chắc chắn, nhưng tôi nghĩ nó sẽ hiển thị hầu hết hoặc tất cả các readlineràng buộc chính. Nếu bạn đang tìm tên của hàm readline được liên kết với C-tkhóa, trong bộ đệm Vim, bạn sẽ tìm kiếm \\C-t. Và nếu bạn đang tìm kiếm một ràng buộc M-c(khóa meta / alt), bạn sẽ tìm kiếm \\ec( \eviết tắt của phím thoát và dường như nó M-ctạo ra các mã khóa giống như escape + c).

Bạn có thể làm điều tương tự zshbằng cách nhìn vào đầu ra của bindkeylệnh. Nhưng lần này, ^[là viết tắt của phím bổ trợ meta / alt, trong khi một ^ký tự dấu mũ ( ) là viết tắt của phím điều khiển.


Hiện tại, tôi tìm thấy 4 ràng buộc chính thực hiện các chức năng có chứa fzftừ khóa trong tên của chúng. Họ sử dụng các chuỗi chính C-i(giống như Tab) C-r, C-tM-c. Chúng bị ràng buộc với các chức năng sau:

C-i    fzf-completion
C-r    fzf-history-widget
C-t    fzf-file-widget
M-c    fzf-cd-widget

Trên hệ thống của tôi, ban đầu, readline(thư viện được sử dụng bashđể chỉnh sửa dòng lệnh) đã ràng buộc các khóa đó với các chức năng này:

C-i     complete
C-r     reverse-search-history
C-t     transpose-chars
M-c     capitalize-word

zle(trình chỉnh sửa dòng được sử dụng bởi zsh), ràng buộc chúng:

C-i     expand-or-complete
C-r     history-incremental-search-backward
C-t     transpose-chars
M-c     capitalize-word

1
agmột plugin / công cụ riêng biệt cần được cài đặt?
ideaman42

@ ideaman42 Vâng, xin lỗi về điều đó, tôi quên rằng lệnh shell agcũng cần thiết. Tôi cập nhật câu trả lời.
dùng9433424

1
Có lẽ đáng chú ý các công cụ này là khá xâm nhập, thay thế cấu hình bash và zsh của bạn theo mặc định.
ideaman42

@ ideaman42 Bạn nói đúng, tôi đã cập nhật câu trả lời để đề cập đến vấn đề này.
dùng9433424
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.