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

Duplicate % register and pass as an argument

我使用%寄存器编译当前.tex文件使用pdflatex。我将其映射到 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 时,寄存器已正确创建。所以我不明白为什么这不起作用。请帮忙

P.S。我的最终目标是创建一个条件映射:

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

% 本身不是寄存器,它是一个“Ex 特殊字符”(参见 :h cmdline-special)。

为了在插入或commandline/ex模式下粘贴寄存器的内容,您可以按Ctrl+R , 后跟标识寄存器的字符。如果你编辑,例如您的 .vimrc 并会在插入模式下执行此操作,您将粘贴寄存器当前具有 的值,这不适合在映射中使用,因此您需要转义它与 Ctrl+V:

map :ww :w <CR> :!pdflatex ^Ra <CR>

这里,^R是用按键序列Ctrl+V,[=29创建的单个字符=]Ctrl+R.


如果我理解正确的话,你的方法可能还有第二个问题:

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

My ultimate goal is to create a conditional mapping

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