2

我使用%寄存器来编译当前.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

但是,当我使用 来检查寄存器时aecho @a寄存器已正确创建。所以我不明白为什么这不起作用。请帮忙。

PS我的最终目标是创建一个条件映射:

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
4

2 回答 2

2

%它本身不是一个寄存器,它是一个“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) 中。

于 2021-09-19T19:35:41.687 回答
0

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

nn <expr>ww ':up <bar> !pdflatex '..(@% =~? 'chapter\d\+\.tex$' ? '%:h:h/main.tex' : '%')..'<CR>'
于 2021-09-20T05:08:53.230 回答