如何使用函数返回的值进行搜索

时间:2011-12-30 04:07:33

标签: vim editor

我想使用此文件中的当前文件名进行搜索。我已经知道使用:call expand("%:p:h")获取当前文件名。所以我想使用像/call expand("%:p:h")这样的命令进行搜索。我试过这个但是失败了,因为vim从字面上解析了这个函数调用。

3 个答案:

答案 0 :(得分:1)

如果当前文件名不包含应该转义的符号 到Vim模式语法(参见:help pattern),然后就可以输入

  

/ 控制 + - [R %

否则,必须准备当前文件名,将其放入最后一个 搜索注册,

:let @/ = '\V' . escape(expand('%:p:h'), '\')

并使用n / N/ 输入手动发出搜索命令或 ? 输入。为了减少键入,可以使用组合这些步骤的映射 引入的。

nnoremap <expr> <leader>f/ ExpandSearch('/')
nnoremap <expr> <leader>f? ExpandSearch('?')
function! ExpandSearch(dir)
    let @/ = '\V' . escape(expand('%:p:h'), '\')
    return a:dir . "\r"
endfunction

还有类似于 Ctrl + R 但更多 一般命令行扩展功能,表达式寄存器。一个人可以打字 编辑搜索模式时, Ctrl + R = ,输入 表达式(见:help expression),其评估结果如下 插入 Ctrl + = 击键的位置 被压了。不幸的是,除了上面解决的通常逃避问题 通过\V原子和escape()调用,这种扩展方式创建了一个新的 一。由于路径名是以交互方式插入的,因此也必须逃避 用于运行搜索命令的字符(/?)。可悲的是,它 无论如何都不可能保护这两个符号的出现 搜索方向:转发搜索中?的转义会转换问题 将\?原子标记到模式中。

答案 1 :(得分:1)

vim中有一个名为search()的函数会将光标移动到您的模式中:

:call search(expand("%:p:h"))

还有另一个名为matchadd()的函数,它将突出显示您的模式:

:call matchadd('Search', expand("%:p:h"))

如果文件名包含特殊字符,例如.*[],则应拨打escape()

:call search(escape(expand("%:p:h"), '.*[]'))

search({pattern} [, {flags} [, {stopline} [, {timeout}]]])  *search()*
        Search for regexp pattern {pattern}.  The search starts at the
        cursor position (you can use |cursor()| to set it).

matchadd({group}, {pattern}[, {priority}[, {id}]])
        Defines a pattern to be highlighted in the current window (a
        "match").  It will be highlighted with {group}.  Returns an
        identification number (ID), which can be used to delete the
        match using |matchdelete()|.

escape({string}, {chars})               *escape()*
        Escape the characters in {chars} that occur in {string} with a
        backslash.  Example:  
            :echo escape('c:\program files\vim', ' \')
        results in:  
            c:\\program\ files\\vim
        Also see |shellescape()|.

答案 2 :(得分:1)

通常,要在命令行中插入(或只是在插入模式下)某个函数返回的值,您应该使用以下内容:

控制+ R = 函数名()输入

顺便说一下,你说expand("%:p:h")返回当前文件名,但这是错误的:实际上它返回当前文件的完整路径,没有文件名。要获得没有路径的文件名,您应该使用expand("%:t")。请阅读:help expand以获取更多信息。

已编辑:在您的情况下,您可以使用@ib建议的搜索注册 @/的解决方案:这是一种更安全的方式。但是,如果我只需要在缓冲区中找到文件名,如果我的文件名不包含一些特殊字符,我会使用 Ctrl + R =

因此,搜索当前文件名的整个表达式是:

/\V 控制+ R = expand('%:t') 输入 输入

P.S。

搜索模式开头的

\V表示“ very nomagic ”模式。您可以在此处阅读::help \V