2016-06-08 3 views
0

У меня есть выход рекурсивного grep (фактически ag) в буфере, который имеет форму filename:linenumber: ... [match] ..., и я хочу иметь возможность перейти к возникновению (файл и номер строки), находящийся под курсором. This сказал мне, что я мог бы выполнять движения нормального режима, так что после извлечения файла : линия часть, я написал эту функцию:Функция, чтобы открыть файл и перейти к указанному номеру строки

function OpenFileNewTab(name) 
    let l:pair=split(a:name, ":") 
    execute "tabnew" get(l:pair, 0) 
    execute "normal!" get(l:pair, 1) . "G" 
endfunction 

Предполагается открыть указанный файл на вкладке, а затем сделать <lineno>G , как я могу сделать вручную, чтобы перейти к указанному номеру строки. Однако курсор остается в строке 1. Что я делаю неправильно?

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

Edit: Мои отображения для Grep/ае следующим образом:

nnoremap <Leader>ag :execute "new \| read !ag --literal -w" "<C-r><C-w>" g:repo \| :set filetype=c<CR> 
nnoremap <Leader>gf ^v2t:"zy :execute OpenFileNewTab("<C-r>z")<CR> 

Чтобы получить мои Grep/AG результаты, я поставил курсор на слово, я хочу для поиска и ввода <leader>ag, то в новом буфере я помещаю курсор в строку и вводим <leader>gf - он выбирает от начала до второго двоеточия и вызывает OpenFileNewTab.

Редактировать 2: Я нахожусь на Cygwin, если это имеет какое-либо значение - я в этом сомневаюсь.

+3

Я думаю, что два exec cmds отсутствуют '.' перед' get (...) '. И как вы сделали grep? Лично я чувствую, что полезно иметь результат grep/ag в qf и перепрыгивать здесь и там ... – Kent

+0

Вам нужно оставить пространство после команд tabnew и normal. – SibiCoder

+0

Вы можете поместить панель ('|') и объединить обе команды в одном исполнении. Это должно решить. – SibiCoder

ответ

3

Почему бы вам не задать &grepprg, чтобы позвонить аг?

" according to man ag 
set grepprg=ag\ --vimgrep\ $* 
set grepformat=%f:%l:%c:%m 
" And then (not tested) 
nnoremap <Leader>ag :grep -w <c-r><c-w><cr> 

Как уже отмечалось в комментариях, вы просто пытаетесь эмулировать то, что уже предлагает окно quickfix. И нам повезло, что vim может вызывать grep, и у него есть вариант, чтобы указать, какую программу grep мы хотим использовать: 'grepprg'.

+0

Узнав о ': grep' и' quickfix', я пошел именно так. Я получил это, чтобы [не требовать Enter после grep] (http://vi.stackexchange.com/questions/7905/autoreturn-after-external-command), [не перейти к первому совпадению] (http: // stackoverflow.com/questions/5723841/prevent-vim-grep-from-opening-first-matching-file) и [автоматически открыть окно быстрого исправления] (http://vim.wikia.com/wiki/Automatically_open_the_quickfix_window_on_:make). Осталось только оставить число столбцов в столбце fastfix - '--column' указано, но с enter он все равно переходит в начало строки. – mcmlxxxvi

+0

Предлагаемые настройки в соответствии с 'man ag':' set grepprg = ag \ --vimgrep \ $ * 'и' set grepformat =% f:% l:% c:% m' –

+0

Спасибо, Питер! Я обновляю –

0

file-line plugin. Нажатие Enter в строке в списке быстрого доступа обычно открывает этот файл; file-line сделает любое имя файла формы file:line:column (и нескольких других форматов), чтобы открыть file и поместить в line и column.

+0

Спасибо за предложение, но в quickfix я уже могу перейти к строке соответствия (хотя я не знаю, как и как сделать так, чтобы он также учитывал номера столбцов). И мне нравится сдерживать сторонние скрипты. – mcmlxxxvi