用VIM编辑LaTeX文件编译C代码

0yycz8jy  于 2022-12-04  发布在  其他
关注(0)|答案(1)|浏览(159)

我的C代码在我用VIM编辑的LaTeX文件中,位于'm'n标记之间。它包含LaTeX格式化命令,这些命令必须首先删除,等等。因此我需要使用管道(作为标准输入)将'm'n之间的代码转换为我的外部Windows程序mergeC.exe(用C编写),在必要的转换后,它应将正确的代码存储到文件PROG.c中,其中PROG应替换为VIM寄存器"p的内容(例如,文件名应为SmithNormal.c)。随后,应通过执行shell命令gcc PROG.c -o PROG.exe编译PROG.c。我希望将VIM命令(宏)存储到寄存器"g中,以便写入@g将执行这两个操作。
我是一个VIM初学者,我可以写:'m,'nw !mergeC,这是可行的,但不知道如何将寄存器"p中的名称传递给mergeC(它应该像mergeC PROG那样,PROG将被存储到argv[1]中)。
我已经试验过类似这样的命令

:'m,'n w !mergeC getreg('p')

这导致错误消息。

pes8fvy9

pes8fvy91#

你就快到了。
:help getreg()是检索寄存器内容的正确方法,但是在:!之后,被求值的表达式只有%和friends(参见:help cmdline-special),因此getreg('p')将被直接传递给shell,shell不知道如何处理它。
为了在:!命令中获取getreg('p')的内容,您需要:help :execute

:execute "'n,'mw !mergeC " . getreg("p")

其在将结果与命令的其余部分连接之前评估getreg('p'),然后执行完整的命令。
我没有你的mergeC命令,所以我即兴创作了一个人造的例子如下:

现在,您的问题是将其放入寄存器中。我建议在这种情况下进行记录,因为由于所有引号和特殊字符,手动设置寄存器可能会被证明是复杂的:

qg                                          " start recording in register "g
:execute "'n,'mw !mergeC ".getreg('p')<CR>  " do your thing
q                                           " stop recording

相关问题