Vim技巧:用substitute命令转换RMarkdown到MediaWiki格式
我来帮你搞定这两个转换的Vim替换命令,核心是解决正则转义和动态匹配的问题,具体如下:
1. 标题格式转换(RMarkdown → MediaWiki)
RMarkdown的# title、## subtitle这类行首标题,要对应转成MediaWiki的=title=、==subtitle==,关键是让#的数量和=的数量对应,用Vim的表达式替换可以一次性处理所有层级的标题:
%s/^\(\#\+\) \(.*\)$/\=repeat('=', strlen(submatch(1))) . submatch(2) . repeat('=', strlen(submatch(1)))/g
命令解释:
^:匹配行首,确保我们只处理行首的标题标记(避免误匹配内容里的#)\(\#\+\):捕获一个或多个#(这里转义#是为了明确区分正则语法和实际字符,避免歧义):匹配标题标记后的空格\(.*\):捕获标题的实际内容$:匹配行尾,确保整行都是标题内容\=:开启Vim表达式替换,允许用Vim脚本动态生成替换内容repeat('=', strlen(submatch(1))):根据捕获到的#的数量,生成对应个数的=,实现标题层级的对应转换
2. 公式格式转换
分两种情况处理,核心是转义$(因为在Vim正则里$是行尾锚点,必须转义才能匹配实际的$符号)
行内公式:$inline formula$ → <math>inline formula</math>
%s/\$\([^$]*\)\$/<math>\1<\/math>/g
命令解释:
\$:匹配实际的$符号(转义后才不会被当作行尾锚点)\([^$]*\):捕获两个$之间的所有内容([^$]表示除了$之外的任意字符,确保不会匹配到跨行的公式)<math>\1<\/math>:把捕获的公式内容包裹在MediaWiki的数学标签里,\1引用前面捕获的公式内容
独立公式:$$standalone formula $$ → :<math>standalone formula</math>
%s/\$\$\([^$]*\)\$\$/:<math>\1<\/math>/g
命令解释:
\$\$:匹配实际的$$符号(两个转义的$)- 后面的逻辑和行内公式一致,只是替换后的标签前多了一个
:,符合MediaWiki独立公式的格式要求
小提示
如果你的文档里有转义的\$(即RMarkdown里要显示实际的$符号),这些命令会误匹配,需要先处理这类情况:比如先把\$替换成临时标记(如TEMP_DOLLAR),转换完公式后再替换回$。另外,执行命令前可以加c选项(比如%s/.../.../gc),逐个确认替换,避免误改。
内容的提问来源于stack exchange,提问作者Olivier Ma
相关产品推荐
相关产品推荐

