vim脚本“我想在cscope中替换tnext”

时间:2012-03-09 21:15:06

标签: vim cscope

我想为cscope替换一个:tnext命令,但它不能满足我的期望。

1)下图显示了按预期工作的代码。我可以达到第二个符号实例。

function MyCounter()

    if !exists("s:counter")
        let s:counter = 1
        echo "script executed for the first time"
    else
        let s:counter = s:counter + 1
        echo "script executed " . s:counter . " times now"
    endif
endfunction

nmap <space>w :ls<CR>
nmap <space>i :call MyCounter()
nmap <space>n :cs find s <C-R>=expand("<cword>")<CR><CR>2<CR>

2)下面的代码无效

function MyCounter()
    if !exists("s:counter")
        let s:counter = 1
        echo "script executed for the first time"
    else
        let s:counter = s:counter + 1
        echo "script executed " . s:counter . " times now"
    endif
endfunction

nmap <space>w :ls<CR>
nmap <space>i :call MyCounter()
nmap <space>n :cs find s <C-R>=expand("<cword>")<CR><CR><C-R>=str2nr(s:counter)<CR>

1和2代码段之间的区别是= str2nr(s:counter) 即,在用户按下n时动态计算符号的n实例

在按空格键+ n之前我总是按空格+ i

请建议我为什么第二个代码段不起作用。

2 个答案:

答案 0 :(得分:0)

你可以尝试

nmap <space>n :exec "cs find s" expand("<cword>") "\| norm" str2nr(s:counter)

您似乎在正常模式下使用<C-R>=str2nr...,这将无效。

免责声明:我无法测试上述方法是否可行。

修改

您可能想要使用cscopetag设置:

                        *cscopetag* *cst*
If 'cscopetag' set, the commands ":tag" and CTRL-] as well as "vim -t" will
always use |:cstag| instead of the default :tag behavior.  Effectively, by
setting 'cst', you will always search your cscope databases as well as your
tag files.  The default is off.  Examples: >
    :set cst
    :set nocst

这应该为您提供一组丰富的使用标签的命令,这些命令可以为您提供所需的方法(:tjump:tnext等)

答案 1 :(得分:0)

问题是由尝试排队处理字符引起的 通过表达式的评估获得。有必要做 表达式是表达式1(参见:help :map-<expr>)或使用 feedkeys()功能。为了便于修改映射,我愿意 建议使用第一种方法并按如下方式更改映射。

:nnoremap <expr> <space>n ':cs find s '.expand('<cword>')."\r".s:counter."\r\r"