复制 % 寄存器并作为参数传递
Posted
技术标签:
【中文标题】复制 % 寄存器并作为参数传递【英文标题】:Duplicate % register and pass as an argument 【发布时间】:2021-11-13 16:14:13 【问题描述】:我使用%
寄存器来编译使用pdflatex
的当前.tex
文件。我已将其映射到 ww
,文件首先保存然后编译。
map :ww :w <CR> :!pdflatex % <CR>
这很好用。现在我尝试将%
复制到另一个寄存器,然后使用新寄存器创建类似的映射,但这不起作用。
let @a=@%
map :ww :w <CR> :!pdflatex a <CR>
当我编译时,我收到以下错误消息:
! I can't find file `a'.
<*> a
但是,当我使用echo @a
检查寄存器a
时,该寄存器已正确创建。所以我不明白为什么这不起作用。请帮忙。
附:我的最终目标是创建一个条件映射:
if % contains 'chapter':
map :ww :w <CR> :!pdflatex ../main.tex <CR>
else
map :ww :w <CR> :!pdflatex % <CR>
这样vim就可以处理目录结构了:
.
├── chapter1
│ ├── chapter1.tex
├── chapter2
│ ├── chapter2.tex
├── chapter3
│ ├── chapter3.tex
├── main.tex
【问题讨论】:
您的问题是%
不是寄存器,它只是当前文件的占位符(尽管 "%
也是保存该值的寄存器)。您可以使用 Ctrl-R 加上该寄存器的字母从寄存器中插入值,map :ww :w <CR> :!pdflatex <C-R>a <CR>
也是如此,其中 <C-R>
是通过按 Ctrl-V 创建的单个“字母”,然后在插入模式下按 Ctrl-R .
@L3viathan,您应该考虑将该评论转化为答案。
【参考方案1】:
%
本身不是一个寄存器,它是一个“Ex 特殊字符”(参见:h cmdline-special
)。
要在插入或命令行/ex 模式下粘贴寄存器的内容,您可以按Ctrl+R,后跟标识该寄存器的字符。如果您编辑例如您的 .vimrc
并会在插入模式下执行此操作,您将粘贴寄存器 当前 的值,这不适合在映射中使用,因此您需要使用 对其进行转义Ctrl+V:
map :ww :w <CR> :!pdflatex ^Ra <CR>
这里,^R
是一个单个字符,它是使用键序列 Ctrl+V、Ctrl+R 创建的.
如果我理解正确,我可能会看到您的方法存在第二个问题:
如果您的let @a=@%
在您的.vimrc
中,也会在您的编辑器启动时对其进行评估。要解决此问题,请将其和映射移至自动命令 (:h autocmd
)。
【讨论】:
【参考方案2】:我的最终目标是创建条件映射
nn <expr>ww ':up <bar> !pdflatex '..(@% =~? 'chapter\d\+\.tex$' ? '%:h:h/main.tex' : '%')..'<CR>'
【讨论】:
以上是关于复制 % 寄存器并作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章