在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函数时它的行为会有所不同?
答案 0 :(得分:5)
我相信那是:h expr-register
:
注册 expr-register @r
@r注册内容&#39; <&#39;
结果是指定寄存器的内容,作为单个字符串。 在需要时插入换行符。获取未命名的内容 注册使用@&#34;要么 @@。见| register |有关可用的解释 寄存器。
使用&#39; =&#39;注册你得到表达本身,而不是它 评估为。使用| eval()|评估它。
至于为什么你不需要:!
那可能是因为:h cmdline-special
。
- 特殊字符 cmdline-special
醇>注意:这些是执行命令行中的特殊字符。如果你想 在键入时插入特殊内容可以使用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使用变量名称本身作为参数。