Каждому разработчику нужен быстрый способ поиска текущего слова в нескольких файлах.
Как пользователь 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!
У вас есть другой / лучший способ достичь того же результата?
Я бы очень хотел об этом услышать :)