在Vim中,我可以使用以下命令回显当前文件名:
:echo @%
Run Code Online (Sandbox Code Playgroud)
我在这里找到了这些信息:http://vim.wikia.com/wiki/Get_the_name_of_the_current_file
有人可以解释为什么@符号是必要的吗?如果我输入没有@符号的命令,我收到一个错误:
E15: Invalid expression: %
E15: Invalid expression: %
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试将文件名bang作为参数发送到命令,则包括@符号在参数中显示为常规字符.删除@标志工作.换句话说,在我.bash_profile我有以下功能:
test_func() {
echo $1
}
Run Code Online (Sandbox Code Playgroud)
在Vim中,我运行:
:! test_func @% #outputs @path/to/my/file
:! test_func % #outputs path/to/my/file
Run Code Online (Sandbox Code Playgroud)
什么是@符号做?为什么发送输出到bash函数时不同的表现?
我相信是:h expr-register:
注册 expr-register @r
寄存器'r'的@r内容
结果是命名寄存器的内容,作为单个字符串。在需要的地方插入换行符。要获取未命名寄存器的内容,请使用@“或@@。有关可用寄存器的说明,请参见| registers |。
当使用'='寄存器时,您将获得表达式本身,而不是表达式的计算结果。使用| eval()| 进行评估。
至于为什么不需要那:!可能是因为:h cmdline-special。
- 特殊字符 cmdline-special
注意:这些是执行的命令行中的特殊字符。如果要在键入时插入特殊内容,可以使用CTRL-R命令。例如,“%”代表当前文件名,而CTRL-R%立即插入当前文件名。参见| c_CTRL-R |。
注意:如果要避免在Vim脚本中使用特殊字符,则可能要使用| fnameescape()|。
在Ex命令中,在可以使用文件名的位置,以下字符具有特殊含义。这些也可以在表达式函数expand()| expand()|中使用。%被替换为当前文件名。 :_% c_%
:echo接受Vimscript 表达式,而:!接受和外部命令,这是文件名的一种特殊情况,已被:editet al 接受。
对于外部命令和文件名,有特殊字符,例如%和#,在下进行了描述:help cmdline-special。这也包括以下关键句子:
在Ex命令中,在可以使用文件名的位置,以下字符具有特殊含义。
相反,:echo不带文件名,而是表达式。有几种方法可以解析当前文件名。最直接的是通过expand():
:echo expand('%')
Run Code Online (Sandbox Code Playgroud)
或者,由于当前文件名也存储在特殊寄存器中%,并且寄存器通过@sigil 寻址:
:echo @%
Run Code Online (Sandbox Code Playgroud)
这也解释了为什么:edit g:variable不能按预期工作的常见问题。Vim的评估规则与大多数编程语言不同。您需要使用:execute来评估变量(或表达式)。否则,将按字面意思使用;即Vim使用变量名本身作为参数。
| 归档时间: |
|
| 查看次数: |
1355 次 |
| 最近记录: |