2014-02-17 6 views
0

Я пытаюсь создать пользовательскую команду использовать vimgrep для поиска шаблона в данном шаблоне файла, какGVim аргументы пользовательских команд

:command -nargs=* Find :tabnew <bar> vimgrep /<arg1>/gj <arg2> <bar> cw <cr> 

Как получить доступ аргументы arg1 и arg2?

Edit 1: Я придумал следующее решение

command! -nargs=* Find call VimFind(<f-args>) 
function! VimFind(searchPattern,filePattern,...) 
    let searchCommand = 'vimgrep /'.a:searchPattern.'/gj '.a:filePattern.'|cw' 
    if a:0 > 0 && a:1 == 'n' 
    let searchCommand = 'tabnew|'.l:searchCommand 
    endif 
    execute l:searchCommand 
endfunction 

Есть уборщик способ сделать это?

Edit 2: Ах хорошо, вышеупомянутые ошибки функции и затем открывает новую вкладку, когда ничего не найдено

ответ

1

Используя <f-args> и функцию, Vim анализирует отдельные аргументы команды для вас; это правильный способ сделать это.

Чтобы справиться с ошибками из :vimgrep, вы должны вложить execute l:searchCommand с try...catch, например .:

try 
    execute l:searchCommand 
catch /^Vim\%((\a\+)\)\=:E/ 
    tabclose 

    echohl ErrorMsg 
    echomsg 'Search failed' 
    echohl None 
endtry 

Я не понимаю, почему вы должны :tabnewдо поиска; если вы это сделаете впоследствии (но до :cw), вам не нужно очищать в случае неудачных поисков.

+0

Ах! Я хотел бы открыть результаты на новой вкладке, опционально, на основе третьего параметра. Поместите вкладку между vimgrep и cw! как это работает? почему tabnew в начале дает ошибку, если vimgrep ничего не находит? – Rnet

+0

Я уверен, что ошибка исходит от ': vimgrep'; однако сообщение об ошибке внутри функции длинное и уродливое, так что try..catch с ': echomsg' лучше. –

Смежные вопросы