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