Vim中%寄存器复制后调用失效及LaTeX条件编译映射实现问题
错误原因
你写的映射中pdflatex a里的a仅被识别为普通字符,Vim不会自动将其解析为寄存器a的内容。如果要在Ex命令中插入寄存器内容,需要使用<C-r>{寄存器名}语法,比如要插入寄存器a的内容应写为<C-r>a,不过你的需求完全不需要额外使用寄存器中转。
最终实现方案
你需要的条件编译逻辑可以直接通过Vim表达式映射实现,推荐使用非递归映射避免冲突,配置如下:
nnoremap :ww :w<CR>:exec '!pdflatex ' . (expand('%') =~ 'chapter' ? '../main.tex' : '%')<CR>
配置说明
expand('%')用于获取当前缓冲区的文件名,等价于%的实际展开结果=~是Vim脚本的正则匹配运算符,用于判断当前文件名是否包含chapter字符串- 三元表达式完全匹配你需要的规则:匹配到
chapter就编译上层目录的main.tex,否则直接编译当前文件 - 使用
exec拼接执行命令,可避免特殊字符转义问题
如果需要更稳定、适配更复杂路径的版本,可以将逻辑封装为函数,自动切换到当前文件所在目录执行编译,避免相对路径出错:
function! CompileTex() " 先保存当前文件 write let l:cur_file = expand('%:p') if l:cur_file =~# 'chapter' let l:cmd = 'cd ' . shellescape(expand('%:p:h')) . ' && pdflatex ../main.tex' else let l:cmd = 'cd ' . shellescape(expand('%:p:h')) . ' && pdflatex ' . shellescape(expand('%')) endif execute '!' . l:cmd endfunction nnoremap :ww :call CompileTex()<CR>
内容的提问来源于stack exchange,提问作者kksagar
相关产品推荐
相关产品推荐

