复制 % 寄存器并作为参数传递

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 &lt;CR&gt; :!pdflatex &lt;C-R&gt;a &lt;CR&gt; 也是如此,其中 &lt;C-R&gt; 是通过按 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+VCtrl+R 创建的.


如果我理解正确,我可能会看到您的方法存在第二个问题:

如果您的let @a=@% 在您的.vimrc 中,也会在您的编辑器启动时对其进行评估。要解决此问题,请将其和映射移至自动命令 (:h autocmd)。

【讨论】:

【参考方案2】:

我的最终目标是创建条件映射

nn <expr>ww ':up <bar> !pdflatex '..(@% =~? 'chapter\d\+\.tex$' ? '%:h:h/main.tex' : '%')..'<CR>'

【讨论】:

以上是关于复制 % 寄存器并作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章

C语言中,结构体作为函数参数传递,详解?

如何在汇编函数中将元素数组作为参数传递时转发ARM寄存器的地址指针

如何将函数作为参数传递,带参数? [复制]

是否可以在c中将函数作为参数传递? [复制]

将单元格区域作为变量传递并使用函数复制数据

作为参数的函数是不是必须按值传递? [复制]