Я не уверен, что это то, что вы ищете, но, возможно, вы могли бы попробовать fzf и fzf.vim .
Если вы используете vim-plug в качестве менеджера плагинов, все, что вам нужно сделать, чтобы установить их, это добавить следующие строки в ваш vimrc
:
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
Plug 'junegunn/fzf.vim'
... где-то между строк:
call plug#begin('~/.vim/plugged')
и:
call plug#end()
Затем выполните :PlugInstall
.
Среди различных команд и отображений, предоставляемых fzf.vim
(чья единственная цель, по-видимому, заключается в установке отображений и команд, запрашивающих fzf
нечеткий поиск по предопределенным источникам), есть команда :Ag
.
Чтобы использовать его, вам нужно установить команду оболочки ag . В дистрибутивах на основе Debian это можно сделать с помощью следующей команды:
apt-get install silversearcher-ag
Проект на github объясняет, как установить его на MacOS:
brew install the_silver_searcher
:Ag
является оберткой вокруг $ ag
и позволяет нечетко искать шаблон в файлах текущего каталога (тот, который отображается при вводе :pwd
). Матчи обновляются после каждого нажатия клавиши.
Вы можете:
- цикл вперед и назад через матчи с
C-n
иC-p
- выберите текущий матч и перейдите к следующему / предыдущему с помощью
Tab
/S-Tab
- выберите или отмените выбор всех совпадений с помощью
M-a
илиM-d
Если вы выберете одно или несколько совпадений, после нажатия Enter они будут заполнены списком быстрых исправлений. Оттуда вы сможете перемещаться по ним с помощью команд / отображений Vim по умолчанию, таких как :cnext
и :cprevious
.
Если вы хотите добавить префикс ко всем установленным командам fzf.vim
и избежать переопределения существующих команд, вы можете добавить это в vimrc
:
let g:fzf_command_prefix = 'your_prefix'
Я использую Fzf
в качестве префикса, поэтому я не печатал, :Ag
но :FzfAg
.
Если вы предпочитаете использовать git grep
вместо ag
, кажется, вы можете установить вокруг него свою собственную оболочку, :GGrep
например:
command! -bang -nargs=* GGrep
\ call fzf#vim#grep('git grep --line-number '.shellescape(<q-args>), 0, <bang>0)
Это объясняется в :h fzf-vim-customization
.
Кроме того , если fzf
открывает панель в tmux, и вы предпочли бы это занимает весь экран вместо этого, вы можете добавить челку для всех команд ( :Ag!
, :GGrep!
, ...).
Как вы сказали в своем последнем комментарии , по умолчанию fzf
изменяется конфигурация вашей оболочки. Например, если вы используете bash
, он добавит следующую строку в ваш ~/.bashrc
:
[ -f ~/.fzf.bash ] && source ~/.fzf.bash
Это будет источником файла ~/.fzf.bash
. Последний содержит некоторый код:
# 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"
Этот код добавляет путь к переменной окружения $PATH
: /home/user/.fzf/bin
; это папка, содержащая fzf
программу.
Он также содержит 2 других файла:
/home/user/.fzf/shell/completion.bash
/home/user/.fzf/shell/key-bindings.bash
Первый, похоже, определяет функции завершения, а второй устанавливает привязки клавиш.
К сожалению, привязки клавиш могут переопределять readline
функции по умолчанию .
Например, fzf
связывает функцию fzf-file-widget
с C-t
. Этот ключ обычно используется readline для выполнения transpose-chars
функции.
Если вы не хотите этого, одним из возможных решений было бы восстановить привязки клавиш внутри вашей ~/.bashrc
, после того, как fzf
он выбрал ее конфигурацию. Например, если вы хотите C-t
сохранить его старое поведение, то есть транспонировать 2 символа вокруг курсора и привязать fzf-file-widget
к другой клавише, скажем C-x C-t
, вы можете добавить эти строки в конце ~/.bashrc
:
bind -x '"\C-x\C-t": fzf-file-widget'
bind '"\C-t": transpose-chars'
То же самое относится и к zsh
оболочке, но синтаксис для установки привязки ключей немного отличается:
bindkey '^X^T' fzf-file-widget
bindkey '^T' transpose-chars
Если одна из привязок ключа оболочки, к которой вы привыкли, была переопределена fzf
, вы хотите восстановить ее, но не знаете, какое именно имя функции было выполнено, вы можете попробовать следующее.
Сначала, внутри ~/.bashrc
, временно закомментируйте строку, которая является источником fzf
конфигурации. Затем снова откройте терминал и посмотрите на вывод bind -P
команды, которую вы можете прочитать в буфере Vim:
bind -P | vim -R -
Я не уверен, но я думаю, что он должен отображать большинство или все readline
привязки клавиш. Если вы ищете имя функции readline, связанной с C-t
клавишей, в буфере Vim вы будете искать \\C-t
. И если вы искали привязанный к M-c
(мета / альтернативный ключ), вы бы искали \\ec
( \e
обозначает escape-ключ, и кажется, что он M-c
производит те же коды клавиш, что и escape + c
).
Вы можете сделать то же самое zsh
, посмотрев на вывод bindkey
команды. Но на этот раз это ^[
клавиша-модификатор meta / alt, в то время как одиночный ^
символ caret ( ) обозначает клавишу управления.
В настоящее время я нашел 4 привязки клавиш, выполняющие функции, содержащие fzf
ключевое слово в их имени. Они используют последовательности клавиш C-i
(так же, как Tab
) C-r
, C-t
и M-c
. Они связаны со следующими функциями:
C-i fzf-completion
C-r fzf-history-widget
C-t fzf-file-widget
M-c fzf-cd-widget
Первоначально в моей системе readline
(библиотека, используемая bash
для редактирования командной строки) связывала эти ключи с этими функциями:
C-i complete
C-r reverse-search-history
C-t transpose-chars
M-c capitalize-word
И zle
(редактор строк, используемый zsh
) связал их с:
C-i expand-or-complete
C-r history-incremental-search-backward
C-t transpose-chars
M-c capitalize-word
ctrl-p
или подобный плагин - то, что вы ищете. Обратите внимание, что этоunite.vim
тоже должно быть в состоянии сделать, но я бы не рекомендовал этого, потому что, на мой взгляд, это довольно тяжелый и создающий ошибки плагин.