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ử fzf và fzf.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 fzf
tì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
:Ag
là một trình bao bọc xung quanh $ ag
và 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-n
vàC-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-a
hoặ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
và :cprevious
.
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.vim
và 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 Fzf
làm tiền tố, đó là lý do tại sao tôi không gõ :Ag
nhưng :FzfAg
.
Nếu bạn thích sử dụng git grep
thay 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 fzf
mở 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 fzf
thay đổ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 fzf
chươ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 readline
chức năng mặc định .
Ví dụ, fzf
liên kết hàm fzf-file-widget
với C-t
. Khóa này thường được sử dụng bởi readline để thực thi transpose-chars
chứ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-t
giữ 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-widget
vớ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 zsh
shell, 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 fzf
cấu hình. Sau đó, mở lại một thiết bị đầu cuối và xem đầu ra của bind -P
lệ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 readline
rà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-t
khó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
( \e
viết tắt của phím thoát và dường như nó M-c
tạo ra các mã khóa giống như escape + c
).
Bạn có thể làm điều tương tự zsh
bằng cách nhìn vào đầu ra của bindkey
lệ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 fzf
từ 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-t
và M-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
Và 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
ctrl-p
hoặc một plugin tương tự là thứ bạn đang tìm kiếm. Lưu ý rằngunite.vim
cũ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.