Vim поиск класса - PullRequest
       15

Vim поиск класса

3 голосов
/ 15 февраля 2010

Как определить функцию vim, чтобы при вызове с

Foo

ищет через vimgrep

\s*class Foo

или

\s*struct Foo

[Это cscope / ctag бедняка; Я хочу, чтобы можно было ввести имя класса и заставить его искать класс.]

Если это легко, могу ли я попросить его заглянуть под мой курсор, чтобы использовать это «слово» в качестве имени для поиска?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 15 февраля 2010

Проверка <cword> в функции :h expand().

fun! MySearch()
  exe 'vimgrep /\s*class '.expand('<cword>').'/ *'
endfun
2 голосов
/ 15 февраля 2010

Вот взлом от новичка vim, который, кажется, работает:

function! SearchFunc()
  let l:filenames = substitute(glob("*.c") . glob("*.cpp") . glob("*.h"), '\n', ' ', 'g')
  try
    execute 'vimgrep /^\s*\(struct\|class\)\s*'  . expand("<cword>") . '/ ' . l:filenames
  catch
    echon 'No results found.'
    sleep 800m
  endtry
endfunction
nmap <Leader>fi :call SearchFunc()^M

Это должно найти слово под курсором при вводе \ fi.

Расшифровка кода:

Если вы обычно вызываете vimgrep в функции и он не находит никаких результатов, он выдает ошибку, которая выглядит довольно уродливо, поэтому я обернул ее внутри блока try / catch / endtry. Когда происходит ошибка, мы предполагаем, что это произошло из-за отсутствия совпадения, и отображаем сообщение, затем делаем короткую паузу, чтобы оно не исчезло сразу.

«nmap» отображает последовательность клавиш в «нормальном режиме», чтобы что-то сделать. В этом случае он вызывает функцию, которую мы только что определили. Вы должны набрать Ctrl-V, Ctrl-M в конце строки, чтобы создать ^ M , чтобы он имитировал нажатие клавиши возврата.

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

function! SearchFunc(findme)
  let l:filenames = substitute(glob("*.c") . glob("*.cpp") . glob("*.h"), '\n', ' ', 'g')
  try
    execute 'vimgrep /^\s*\(struct\|class\)\s*'  . a:findme . '/ ' . l:filenames
  catch
    echon 'No results found.'
    sleep 800m
  endtry
endfunction

Тогда вы можете позвонить, набрав

:call SearchFunc('foo')

Но было бы проще использовать встроенную функцию .

...