在vim ex模式下,@%做什么?

在vim ex模式下,@%做什么?,vim,ex,Vim,Ex,我正在编写一个小的vim leader映射,以将(GitHub风格的markdown)中的文件转换为pdf 这两种方法都起作用,而且似乎在功能上是等效的: nnoremap <expr> <leader>pdf ':! pandoc -f markdown_github --latex-engine=xelatex ' . shellescape(@%,1). ' -o ' . shellescape(expand('%:r'), 1) . ".pdf \<cr&g

我正在编写一个小的vim leader映射,以将(GitHub风格的markdown)中的文件转换为pdf

这两种方法都起作用,而且似乎在功能上是等效的:

nnoremap <expr> <leader>pdf ':! pandoc -f markdown_github --latex-engine=xelatex ' . shellescape(@%,1). ' -o ' . shellescape(expand('%:r'), 1) . ".pdf \<cr>"

nnoremap <expr> <leader>pdf ':! pandoc -f markdown_github --latex-engine=xelatex ' . shellescape(expand('%'),1). ' -o ' . shellescape(expand('%:r'), 1) . ".pdf \<cr>"
nnoremap pdf':!pandoc-f markdown\u github--latex引擎=xelatex'。shellescape(@%,1)。'-哦。shellescape(展开('%:r'),1)。“.pdf\”
nnoremap pdf':!pandoc-f markdown\u github--latex引擎=xelatex'。shellescape(展开(“%”),1)。'-哦。shellescape(展开('%:r'),1)。“.pdf\”
我让第一个可以工作(感谢Stack Overflow;),但我没有真正理解第一个shellescape中的
@%
。所以我用
扩展('%')
替换了它,我“得到”了更多

有人能解释这两者之间的区别吗?甚至可以到哪里去查?我确实读过
:help:@
,但它谈到了
以ex命令的形式执行寄存器的内容,这似乎不是这里发生的事情


任何帮助/指点都很好

@%
是一个寄存器,其中包含与当前缓冲区关联的文件名。它可以像任何其他寄存器一样使用,例如:

i<C-r>%
"%p
i%
%p

在第一个示例中,
shellescape()
需要一个字符串作为其第一个参数,并输出一个字符串。发生这种情况时,
@%
的类型是字符串,因此可以直接使用
@%

@%
是一个包含与当前缓冲区关联的文件名的寄存器。它可以像任何其他寄存器一样使用,例如:

i<C-r>%
"%p
i%
%p

在第一个示例中,
shellescape()
需要一个字符串作为其第一个参数,并输出一个字符串。发生这种情况时,
@%
的类型是字符串,因此可以直接使用
@%

谢谢。让我困惑的是
execute
部分。将我的文件名作为ex命令执行可能(我原以为)会破坏一些东西。它实际上是在“执行”寄存器,还是
%
寄存器是一个特殊的寄存器,当它被“执行”时,它只返回自身?
@
符号用于两件事:a)执行
的内容,就像它是一个Ex命令(在cmd行模式下)或一个宏(在正常模式下)一样和b)在表达式中使用
的内容。但我必须承认Vimscript充满了这样的歧义。如果有疑问,请阅读文档的相关部分。谢谢。让我困惑的是
execute
部分。将我的文件名作为ex命令执行可能(我原以为)会破坏一些东西。它实际上是在“执行”寄存器,还是
%
寄存器是一个特殊的寄存器,当它被“执行”时,它只返回自身?
@
符号用于两件事:a)执行
的内容,就像它是一个Ex命令(在cmd行模式下)或一个宏(在正常模式下)一样和b)在表达式中使用
的内容。但我必须承认Vimscript充满了这样的歧义。如有疑问,请阅读文件的相关章节。