用于获取当前文件名称的Vim语法

时间:2015-02-19 15:36:24

标签: bash vim

在Vim中,我可以使用以下命令回显当前文件名:

:echo @%

我在此处找到了相关信息:http://vim.wikia.com/wiki/Get_the_name_of_the_current_file

有人可以解释为什么@符号是必要的吗?如果我输入不带@符号的命令,我会收到错误:

E15: Invalid expression: %
E15: Invalid expression: %

但是,如果我尝试将文件名作为参数发送到bang命令,则@符号在参数中显示为常规字符。删除@符号有效。换句话说,在我的.bash_profile中,我有以下功能:

test_func() {
        echo $1
}

在Vim,我跑:

:! test_func @%    #outputs @path/to/my/file
:! test_func %     #outputs path/to/my/file

@符号的作用是什么?为什么在将输出发送到bash函数时它的行为会有所不同?

2 个答案:

答案 0 :(得分:5)

我相信那是:h expr-register

  

注册 expr-register @r

     
     

@r注册内容&#39; <&#39;

     

结果是指定寄存器的内容,作为单个字符串。   在需要时插入换行符。获取未命名的内容   注册使用@&#34;要么 @@。见| register |有关可用的解释   寄存器。

     

使用&#39; =&#39;注册你得到表达本身,而不是它   评估为。使用| eval()|评估它。

至于为什么你不需要:!那可能是因为:h cmdline-special

  
      
  1. 特殊字符 cmdline-special
  2.         

    注意:这些是执行命令行中的特殊字符。如果你想   在键入时插入特殊内容可以使用CTRL-R命令。对于   例如,&#34;%&#34;代表当前文件名,而CTRL-R%代表   当前文件名。见| c_CTRL-R |。

         

    注意:如果您想避免使用Vim脚本中的特殊字符,则可能需要   使用| fnameescape()|。

         

    在Ex命令中,在可以使用文件名的位置,以下内容   人物有特殊的意义。这些也可以用在表达式中   function expand()| expand()|。     %替换为当前文件名。 :_% c _%

答案 1 :(得分:5)

:echo采用Vimscript 表达式,而:!采用外部命令,这是 filename ,:edit

接受

对于外部命令和文件名,%下描述了#:help cmdline-special等特殊字符。这也包括这个重要的句子:

  

在Ex命令中,在可以使用文件名的地方,以下内容   字符有特殊含义。

相比之下,:echo不是文件名,而是表达式。有几种方法可以解析当前文件名;最直接的是通过expand()

:echo expand('%')

或者,由于当前文件名也存储在特殊寄存器%中,寄存器通过@ sigil进行寻址:

:echo @%

反过来

这也解释了为什么:edit g:variable无法正常工作的常见问题。 Vim的评估规则与大多数编程语言不同。您需要使用:execute来评估变量(或表达式);否则,字面意思;即Vim使用变量名称本身作为参数。