Function 函数打开文件并导航到指定的行号

Function 函数打开文件并导航到指定的行号,function,vim,Function,Vim,我在缓冲区中有递归的grep(实际上是ag)输出,其格式为filename:linenumber:。。。[匹配]…,我希望能够转到光标下当前的引用(文件和行号)。告诉我我可以执行正常模式移动,所以在提取file:line部分后,我编写了以下函数: function OpenFileNewTab(name) let l:pair=split(a:name, ":") execute "tabnew" get(l:pair, 0) execute "normal!" get(

我在缓冲区中有递归的
grep
(实际上是
ag
)输出,其格式为
filename:linenumber:。。。[匹配]…
,我希望能够转到光标下当前的引用(文件和行号)。告诉我我可以执行正常模式移动,所以在提取file:line部分后,我编写了以下函数:

function OpenFileNewTab(name)
    let l:pair=split(a:name, ":")
    execute "tabnew" get(l:pair, 0)
    execute "normal!" get(l:pair, 1) . "G"
endfunction
它应该在选项卡中打开指定的文件,然后执行
G
,就像我可以手动执行的那样,转到指定的行号。但是,光标只停留在第1行。我做错了什么

,仅按标题,将是一个完全重复的,但它谈论在其他文件中定位符号,而我手头已经有了位置

编辑:我的grep/ag映射如下:

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>
nnoremap ag:execute“new\| read!ag--literal-w”“”g:repo\|:set filetype=c
nnoremap gf^v2t:“zy:执行OpenFileNewTab(“z”)
为了获得我的grep/ag结果,我将光标放在我要搜索的单词上并输入
ag
,然后在新的缓冲区中,我将光标放在一行上并输入
gf
——它从开始到第二个冒号进行选择并调用
OpenFileNewTab


编辑2:我在Cygwin上,如果有什么重要的-我怀疑。

为什么不设置
&grepprg
呼叫ag

" 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>
根据曼恩公司的说法 设置grepprg=ag \--vimgrep\$* set grepformat=%f:%l:%c:%m “然后(未测试) nnoremap ag:grep-w
正如其他人在评论中所说,您只是在尝试模拟quickfix windows已经提供的功能。而且,我们很幸运vim可以调用grep,它有一个变化点,让我们指定要使用哪个grep程序:
'grepprg'

为什么不将
&grepprg
设置为调用ag

" 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>
根据曼恩公司的说法 设置grepprg=ag \--vimgrep\$* set grepformat=%f:%l:%c:%m “然后(未测试) nnoremap ag:grep-w
正如其他人在评论中所说,您只是试图模拟quickfix windows已经提供的功能。而且,我们很幸运vim可以调用grep,它有一个变化点,让我们指定要使用哪个grep程序:
'grepprg'

使用。在quicklist中的一行按Enter键通常会打开该文件;file line将使表单的任何文件名
文件:行:列
(和几种其他格式)打开
文件
,并定位到

使用。在快速列表中的一行上按Enter键将正常打开该文件;文件行将使表单的任何文件名
文件:行:列
(和其他几种格式)打开
文件
并定位到

我认为在
获取(…)之前缺少
两个exec cmd
。你是怎么做的grep?我个人觉得把grep/ag结果放在qf中并在这里和那里跳转是很方便的…@Kent你不需要“.”,
exe
然后将与spaces一起加入参数你的函数调用看起来是正确的。你应该首先用手动字符串测试它,例如
调用OpenFileNewTab('/cygdrive/c/temp/foobar.vim:20')
我想,你的映射是错误的。看起来很奇怪,我同意@Kent。你可能想研究一下使用快速修复列表。你可以通过下面的Vimcasts插曲体验一下快速修复列表:为什么不直接使用内置的
:grep
?我认为
get(…)之前缺少两个exec cmd
。你是怎么做的grep?我个人觉得把grep/ag结果放在qf中并在这里和那里跳转是很方便的…@Kent你不需要“.”,
exe
然后将与spaces一起加入参数你的函数调用看起来是正确的。你应该首先用手动字符串测试它,例如
调用OpenFileNewTab('/cygdrive/c/temp/foobar.vim:20')
我想,你的映射是错误的。看起来很奇怪,我同意@Kent。你可能想研究一下使用快速修复列表。你可以通过下面的Vimcasts插曲体验一下快速修复列表:为什么不直接使用内置的
:grep
?谢谢你的建议,但在快速修复中,我已经可以跳转到比赛线了(虽然我不知道是否/如何让它也尊重列号)。我喜欢将第三方脚本保持在最低限度。感谢您的建议,但在quickfix中,我已经可以跳转到匹配线(尽管我不知道是否/如何让它也尊重列号)。我喜欢尽量减少第三方脚本。在了解了
:grep
quickfix
之后,我就这样做了。我已经完成了,并且。唯一剩下的事情是使quickfix荣誉列编号-
--列
已指定,但使用Enter键仍会转到行开始。根据
man ag建议的设置
set grepprg=ag\--vimgrep\$*
set grepformat=%f:%l:%c:%m
在了解了
:grep
quickfix
之后,我走了那条路。我已经把它拿到了,并且。唯一剩下的事情是让quickfix荣誉列编号-
——列
被指定,但用Enter键它仍然转到行的开头。Sug根据
man ag
set grepprg=ag\--vimgrep\$*
set grepformat=%f:%l:%c:%m