【问题标题】:vim: how to replace a variable with its value in ~/.vimrcvim:如何用 ~/.vimrc 中的值替换变量
【发布时间】:2013-01-15 15:16:00
【问题描述】:

我也想在我的.vimrc 中提供类似的内容。

let dir=“/home/user/Downloads/”
set path=$dir
nnoremap gr :grep '\b<cword>\b' $dir/*<CR>

上面的代码当然是错误的,但也许你能理解我想要做什么。我想将path 的值设置为dir/home/user/Downloads/,并将第三行中的单词dir 替换为dir 的值。我试过了,失败了,谁能告诉我,任何帮助表示感谢!

【问题讨论】:

    标签: vim grep remap


    【解决方案1】:

    首先,有花哨的引号;你需要使用普通的(")。除此之外,:let 还可以。

    let dir = "/home/user/Downloads/"
    

    您可以使用:execute 来评估使用:set 定义的变量,但使用:let 更容易,因为它也可以使用特殊符号&amp;{optionname} 更改Vim 选项:

    let &path = dir
    

    对于映射,如果dir 在运行期间不发生变化,则使用:execute 是最简单的。注意引用的反斜杠必须如何转义(即加倍):

    execute "nnoremap gr :grep '\\b<cword>\\b' " . dir . "/*<CR>"
    

    所有这些信息都是:help eval 的一部分。了解出色而全面的帮助是如何构建的;所有信息都在里面(你只需要知道如何找到它)!

    【讨论】:

    • 谢谢,但是当我尝试用 vim 替换 grep 命令时,出现了错误。 exe "nnoremap gf :vim /\\b&lt;cword&gt;\\b/ " . dir . "/**/*&lt;CR&gt;",我很困惑为什么上面的代码是错误的。你能告诉我吗?非常感谢!
    • 什么样的错误?请更准确。一个问题是\b 在 Vim 中的含义有所不同。使用/\\&lt;&lt;cword&gt;\\&gt;/
    • 如果我写成你的:exe "nnoremap gf :vim /\\&lt;&lt;cword&gt;\\&gt;/ " . dir . "/**/*&lt;CR&gt;",vim 说 E480: No match: \\>,如果我就像我在评论中所说的那样写:exe "nnoremap gf :vim /\\b&lt;cword&gt;\\b/ " . dir . "/**/*&lt;CR&gt;",vim 说 E480: No match: \b\b,当前单词是“type. h"(并且光标在字母'e'下),我可以通过命令exe "nnoremap gf :vim /type/ " . dir . "/**/*&lt;CR&gt;"找到type这个词,所以我想也许vim认为要搜索的单词是字符串 "\b\b",而不是当前单词 type
    • 我认为&lt;cword&gt; 没有展开。试试exe "nnoremap gf :vim /\\&lt;" . expand("&lt;cword&gt;") . "\\&gt;/ " . dir . "/**/*&lt;CR&gt;"
    • 感谢您的帮助,但仍然失败。 vim 发现了一些奇怪的词,并且受限于我的能力,我找不到它在世界上搜索的内容。但是 grep 效果很好。我将使用 grep 代替。
    【解决方案2】:

    你必须使用这个符号:

    let variable_name = "value"
    

    并使用直引号。

    【讨论】:

      【解决方案3】:

      设置路径:

      set path=/home/user/Downloads/
      

      或将目录附加到路径。

      set path+=/home/user/Downloads/
      

      Path 是一个 Vim 变量,如果你打算只将它用于这个重新映射,它似乎不太适合使用。最好声明自己的变量,因为路径中还可以有许多目录,这些目录不适用于 grep。

      let g:search_path="/path/to/your/dir"
      
      nnoremap gr :grep '\<<cword>\>' <C-R>=eval("g:search_path")<CR>
      

      Ctrl+R 让我们在这里插入一个寄存器,然后使用它来调用表达式寄存器,我们用它来评估g:search_path

      查看:help expr-register 了解更多信息!

      这将在每次执行映射时评估您的 g:search_path 变量,允许您更改路径而不必每次都重新映射 gr

      【讨论】:

      • 我认为问题的重点是如何使用变量dir 而不是在字符串中指定路径。
      • 是的,我有点仓促,我道歉。
      • 而且您不要在:set 中使用引号。
      猜你喜欢
      • 2020-12-18
      • 1970-01-01
      • 2016-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多