Показать все совпадающие результаты grep на новой вкладке в Vim

Я пытаюсь сопоставить горячую клавишу, чтобы сделать в Vim следующее:

  1. Совпадение с текущим c-словом, отмеченным в данный момент курсором
  2. Создать список всех найденных вхождений в текущем проекте
  3. Откройте новую вкладку с результатами

Итак, один пример, который у меня есть, который использует CTAGS, открывает объявление переменной/функции в новой вкладке следующим образом:

map <C-\> :split<CR>:exec("tag ".expand("<cword>"))<CR>

При нажатии CTRL-\ открывается новая вкладка с объявлением переменной/функции, на которой находится курсор.

Команда, которую я пытаюсь сопоставить, показана ниже:

:lvim /\<\(text_i_want_to_find\)\>/gj *.c
:lw

Когда я запускаю эту команду, открывается новая вкладка со списком всех .c файлов, содержащих текст text_i_want_to_find. Мне нужно изменить это, чтобы делать две вещи, отличные от того, что он делает сейчас:

  1. Поиск всех файлов с расширениями .c, .h, .cpp, .mk, а не только .c, а также поиск файлов с именем "Makefile"
  2. Ищите c-слово под курсором, как сопоставление CTRL-\, которое я показал выше, вместо того, чтобы вводить текст вручную text_i_want_to_find

Вот код в моем файле .vimrc для сопоставления. Я не совсем уверен, что CTRL-/ вообще можно отобразить, поэтому мне нужно решить еще одну проблему.

map <C-/> :split<CR>:lvim /\<\(.expand("<cword>")\)\>/gj *.c *.h *.cpp *.mk Makefile

Есть ли у кого-нибудь советы по исправлению этого сопоставления Vim?


РЕДАКТИРОВАТЬ:

После просмотра ответов, предоставленных мне, вот окончательная версия моего кода:

command! -nargs=1 SearchAll execute " grep -srnw --binary-files=without-match --exclude={*~,tags} --exclude-dir=.svn  . -e " . expand("<args>") . " " <bar> cwindow
map <C-g> :SearchAll <cword><CR>

Я сопоставил его с CTRL+g. Я также могу вызвать его как команду двоеточия:

:SearchAll my_text_to_search_for

Надеюсь, это поможет и другим!


person Cloud    schedule 24.04.2012    source источник


Ответы (1)


Конечно, это не работает: вы забыли :execute, команда :lvimgrep сама по себе не принимает выражения, поэтому вы ищете expand("<cword>"), за которым не следует символ ключевого слова (\>), и которому предшествует любой символ, который не следует за символом ключевого слова. (\<.). \( и \) здесь бесполезны. Другие примечания:

  1. Не используйте map: вам не нужна работа этого отображения в визуальном и операторно-зависимом режимах, а также возможность использования других отображений.
  2. Некоторые шаблоны можно объединять: *.[ch] *.cpp *.mk Makefile или даже *.{[ch],cpp,mk} Makefile.
  3. <C-\> можно сопоставить, но не <C-/> (надеюсь, только в настоящее время, но реальной работы по исправлению не ведется): \ — это 0x5C, а <C-\> — это 0x5C-0x40=0x1C. Но / это 0x2F и 0x2F-0x40‹0. В моей системе нажатие <C-/> в терминале преобразуется в <C-_>, как и <C-->.
  4. Команда :split не открывает новую вкладку, а открывает новое окно. Для этого добавьте к нему :tab.
  5. :lvimgrep не собирается показывать вам результаты. Он также не перейдет к первому результату, если вы не удалите флаг j.
  6. Вы забыли последнее <CR>, а также :lw<CR>. Я использую :lopen ниже, в этом контексте они дают точно такой же результат.
  7. Вы забыли <C-u> после первого : или <C-\><C-n> перед: нужно отбросить количество.
  8. Вам действительно не нужно :execute ни в одном из ваших сопоставлений, потому что есть <C-r>=expand("cword")<CR> или ярлык по умолчанию <C-r><C-w>.
  9. Не пишите :exec(str): это сбивает с толку, потому что :execute не является функцией, и этот синтаксис побуждает других думать, что это так. Используйте :execute str.

Таким образом, окончательное отображение:

nnoremap <C-\> :<C-u>tab split \| lvimgrep /\V\<<C-r><C-w>\>/gj *.{[ch],cpp,mk} Makefile \| lopen<CR>

. Замените его на

nnoremap <C-\> :<C-u>lvimgrep /\V\<<C-r><C-w>\>/gj *.{[ch],cpp,mk} Makefile \| tab lopen<CR>

если вы не хотите видеть текущий файл во вновь открытой вкладке.

Оба сопоставления предполагают, что у вас нет ни /, ни \ в опции 'iskeyword', если вы замените <C-r><C-w> на <C-r>=escape(expand('<cword>'), '/\')<CR>.

person ZyX    schedule 24.04.2012
comment
Спасибо. В конце концов я нашел частичный ответ и в вики Vim: map ‹F4› :execute grep -srnw --binary-files=without-match --exclude-dir=.git --exclude-from=exclude.list . -э . расширить(‹cword›) . ‹бар› cокно‹CR› - person Cloud; 24.04.2012
comment
Вики @Dogbert Vim содержит кучу советов по плохому коду, я никогда им не пользуюсь: достаточно знания справки Vim. Они могут быть полезны, но каждый раз когда я видел ссылку на vim wiki, я видел код, который нельзя использовать как есть, если я перешел по ссылке. Есть хороший совет, чтобы сломать почти любой совет по vim: поменять местами : и ; с отображениями noremap : ; и noremap ; :. // Эти сопоставления используются людьми, потому что пропуск сдвига может дать значительное ускорение, а ; по-прежнему можно использовать. - person ZyX; 25.04.2012