Каждому разработчику нужен быстрый способ поиска текущего слова в нескольких файлах.

Как пользователь vim я делал это в форме :Ack! < word > < directory_where_i_want_to_search >.

Несомненно, должен быть способ лучше!

Этот путь мне подарил мой энергичный соучастник, мистер Жоао Сибра. Он написал небольшую функцию vim, которую я считаю особенно полезной в моем повседневном рабочем процессе:

function! s:GrepOperator()
    let wordUnderCursor = expand("<cword>")
    silent execute "Ack! " . shellescape(wordUnderCursor) . " " . g:var_default
    copen
    redraw!
endfunction

Давайте разберемся, как это работает:

let wordUnderCursor = expand("<cword>")

мы начинаем с объявления переменной, которая будет содержать слово под курсором.

silent execute "Ack! " . shellescape(wordUnderCursor) . " " . g:var_default

мы выполняем команду оболочки незаметно (в моем случае мне нравится использовать инструмент поиска кода, похожий на ack, называемый the_silver_searcher), предоставляя wordUnderCursor и каталог, в котором мы хотим искать (который хранится в глобальной переменной var_default).

copen

открываем окно quickfix

redraw!

мы принудительно обновляем экран

Обратите внимание, что вы можете использовать любой инструмент, похожий на grep, вместо Ack.

Я также рекомендую прочитать help cword, чтобы получить больше возможностей. Для моего vimrc мне нужно было cWORD, чтобы захватить текст, разделенный пробелами, под курсором.

Как заполнить глобальную переменную каталогом для поиска?

В моем случае я считаю полезным установить его в текущий рабочий каталог. Этого можно добиться, установив в vimrc следующую строку:

let g:var_default = getcwd()

Как быстро вызвать функцию?

для этого нам понадобится мэппинг! Это достигается с помощью следующих строк:

vnoremap <leader>z :<c-u>call <SID>GrepOperator()<cr>

noremap <leader>z :<c-u>call <SID>GrepOperator()<cr>

с помощью этих строк я могу вызвать функцию vim в обычном и визуальном режиме. В моем случае вы можете видеть, что я сопоставил это с ‹лидером› z.

В заключение скажем, что быстрый способ навигации по результирующим документам может быть выполнен с помощью следующих сопоставлений:

nnoremap <leader>j :cnext<CR>

nnoremap <leader>k :cprevious<CR>

используя ‹лидер› j, мы переходим к следующему результату.

используя ‹лидер› k, мы переходим к предыдущему результату.

Вот и все! Теперь у нас есть быстрый и практичный способ поиска слов в vim!

У вас есть другой / лучший способ достичь того же результата?

Я бы очень хотел об этом услышать :)