Як інтерактивний пошук / греп з VIM?


12

Чи є спосіб налаштувати VIM для інтерактивного пошуку в кожному файлі для всього проекту?

Під інтерактивністю я маю на увазі оновлення кожного натискання клавіш.

Що - щось на зразок Emacs адвокат-ГИТ-Grep см: приклад демо .


Я не використовую його особисто, тому я не впевнений на 100%, але я думаю, що ctrl-pабо подібний плагін - це те, що ви шукаєте. Зауважте, що unite.vimце також має бути в змозі, але я б не рекомендував цього, оскільки, на мою думку, це досить важкий плагін і створює помилки.
statox

Чи ctrl-pє спосіб інтерактивного пошуку вмісту файлу? Я лише коли-небудь використовував його для інтерактивного пошуку файлів на основі їх імен.
ideaman42

Я думаю, що це можливо, але, як я вже сказав, я не використовую його, можливо, я помиляюся
statox

Відповіді:


14

Я не впевнений, що це те, що ви шукаєте, але, можливо, ви можете спробувати 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.

Щоб мати можливість ним скористатися, потрібно встановити команду shell shell 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. Цей ключ зазвичай використовується лінією читання для виконання transpose-charsфункції.

Якщо ви цього не хочете, одне можливе рішення - відновити ключові прив’язки всередині вашого ~/.bashrc, після того, як fzfбуде створено його конфігурацію. Наприклад, якщо ви хотіли C-tзберегти його стару поведінку, тобто перенести два символи навколо курсору, і прив'язати 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(мета / alt ключ), ви б шукали \\ec( \eозначає, що ключ для виходу, і, здається, M-cстворює ті самі кодові ключі, що і escape + c).

Ви можете зробити те саме, що zshподивившись на результат bindkeyкоманди. На цей раз, це ^[означає, що мета / модифікатор клавіші модифікатора 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

1
Це agокремий плагін / інструмент, який потрібно встановити?
ideaman42

@ ідеman42 Так, вибачте за це, я забув, що команда оболонки agтакож була необхідною. Я оновив відповідь.
user9433424

1
Можливо, варто відзначити, що ці інструменти досить нав'язливі, замінюючи ваші конфігурації bash та zsh за замовчуванням.
ideaman42

@ Ideman42 Ти маєш рацію, я оновив відповідь, щоб згадати цю проблему.
user9433424
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.