You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:57:03