平时用 vim 书写 Markdown,希望能够方便地预览。我的想法是这样的:按下键盘上的 [F5],就能直接在浏览器中打开 Markdown 文件的 html。现有的解决方案是像 MarkdownPreview 那样的实时浏览器预览插件,但是在 Windows 上面的装用不是很方便。我的电脑已经安装了 Pandoc,希望可以用 Pandoc 加上 vim 编程实现这个 Markdown 预览功能。
pandoc 是一款功能强大的文档转换工具,其能够在多种文档格式之间进行转换,可以将 Markdown 语言书写的文档编译成 html 格式的网页文件。安装好 Pandoc 之后,在命令行中输入如下的命令可以实现转换:
pandoc ./[你要转换的文件的文件名].md -f markdown+tex_math_dollars -t html --mathjax -s -o ./[你要输出的网页文件的文件名].html
其中,-f
参数表示输入的文件类型。在 markdown
后面加上 +tex_math_dollars
,调用拉泰赫公式的格式,否则 Markdown 中编辑的公式无法显示;下出现的 --mathjax
亦同。-t
参数表示你要输出的文件类型,-s
表示按照标准格式输出,不加上的话主要的问题是代码高亮看不见。-o
表示指定输出的文件。
想要实现的效果是:按下 [F5] ,自动打开浏览器并显示编译好的 Markdown 文件,在每次预览结束后删除这个临时的预览文件。我们可以很容易地写出如下的代码添加到 Windows 下 Vim 安装目录下的 .\Vim\_vimrc
文件:
" 定义快捷键
map :w:call Run()
imap :w:call Run()
" 写一个用于实现功能的函数
func! Run()
if expand("%:e") == "md"
pandoc "%" -f markdown+tex_math_dollars -t html --mathjax -s -o ./temprunfile.html && start .\temprunfile.html
:! del .\temprunfile.html
redraw!
echohl WarningMsg | echo " Running on browser ."
else
redraw!
echo "This is not a Markdown File ."
endif
endfunction
在 Edge 近期更新之后,出现了一些问题,就是不知道微软最近抽什么风,edge 浏览器更新了几个没有用的大聪明功能。起始页的右侧多了这个意义不明的滚动条,加上这个 “必应发现” 按钮和侧边栏。由于国内互联网策略的原因,国内用户没有办法使用 New Bing,所以这个按钮出现在这个位置,会导致人对于自己无法使用 New Bing 的命运感到无可奈何、长吁短叹,非常的膈应。而且主页也很不雅观,图片加载也受到了一些影响,有时候会显示不全。侧边栏的功能,基本也是没有什么用的。因此许多人会选择隐藏旁边的滚动条和必应发现按钮。
隐藏滚动条的方法,是在必应启动的时候追加如下的参数:
--disable-features=msUndersideButton
效果是可以把滚动条变成细长的 Windows 10 的样式。
而隐藏 “必应发现” 按钮则是追加这个参数:
--enable-features=OverlayScrollbar,OverlayScrollbarWinStyle,OverlayScrollbarWinStyleAnimation
日常使用 Edge 方便,可以先关闭 Edge 的 “始终显示侧边栏” 和 “启动增强” 之后,把这两个参数添加到快捷方式的 “目标” 一栏中,这样每一次在桌面上点击 Edge 启动的时候就都可以隐藏这两者。
想必大家已经意识到了问题的所在:
_vimrc
里书写上述这一段代码的时候,并没有指定 msedge.exe
启动的时候使用这两个参数。那么当 Edge 启动之后,用户看见了预览的文件,点击了新选项卡,看到的 Edge 起始界面就会包含未被隐藏的滚动条和 “必应发现” 按钮,很不雅观,而后面的所有新标签都会出现这种情况。_vimrc
里添加一段指定 msedge 启动的时候使用这两个参数的代码,形如 :pandoc "%" -f markdown+tex_math_dollars -t html --mathjax -s -o ./temprunfile.html && start msedge --disable-features=msUndersideButton --enable-features=OverlayScrollbar,OverlayScrollbarWinStyle,OverlayScrollbarWinStyleAnimation & start .\temprunfile.html && start .\temprunfile.html
所以我们要解决现在面临的这个境况,就需要整理一下我们的思路。我们一方面希望启动 Edge 的时候可以带上这两个参数,另一方面我们希望在 Edge 已经带参数启动并在运行的时候直接在现有的 Edge 里面打开预览文件。这个程序的流程如下:
最理想的程度,我们希望可以只按两下键盘,第一下按下 [F5] 进入预览,第二下在 vim 打开的终端里按下任意按键关闭预览删除临时运行文件。因此,上述的流程控制在 _vimrc
文件中必须使用两行代码实现。
因此,我们可以使用管道实现 if 流程控制。
使用 tasklist 可以列出所有正在运行的程序,可以列出的结果把参数传递给 find 命令,判断是否存在 msedge.exe
这一进程。使用的命令如下:
tasklist | find /i "msedge.exe"
在此基础上加上 “如果成功执行了 find 命令(也就是成功找到了 Edge 的进程)就不打开 Edge,否则打开 Edge ” 的判断。用管道符号 ||
连接前一个命令和带参数运行 Edge 的命令:
tasklist | find /i "msedge.exe" || start msedge --disable-features=msUndersideButton --enable-features=OverlayScrollbar,OverlayScrollbarWinStyle,OverlayScrollbarWinStyleAnimation
看一下执行的效果。第一次在 CMD 中运行的时候,Edge 处于关闭状态,这个时候成功启动了 vim。再次执行,反馈找到了 Edge,没有执行启动 Edge 的操作。
再加上成功运行 Pandoc 就执行这一操作和无论上述命令是否成功执行都尝试打开 temprunfile.html 的命令:
pandoc "%" -f markdown+tex_math_dollars -t html --mathjax -s -o "temprunfile.html" && tasklist | find /i "msedge.exe" || start msedge --disable-features=msUndersideButton --enable-features=OverlayScrollbar,OverlayScrollbarWinStyle,OverlayScrollbarWinStyleAnimation & start .\temprunfile.html
故而经过修改,_vimrc
中完整的函数和快捷键定义应该为:
" 定义快捷键
map :w:call Run()
imap :w:call Run()
" 写一个用于实现功能的函数
func! Run()
if expand("%:e") == "md"
pandoc "%" -f markdown+tex_math_dollars -t html --mathjax -s -o "temprunfile.html" && tasklist | find /i "msedge.exe" || start msedge --disable-features=msUndersideButton --enable-features=OverlayScrollbar,OverlayScrollbarWinStyle,OverlayScrollbarWinStyleAnimation & start .\temprunfile.html
:! del .\temprunfile.html
redraw!
echohl WarningMsg | echo " Running on browser ."
else
redraw!
echo "This is not a Markdown File ."
endif
endfunction
在 Edge 已经启动的情况下,打开的 html 预览会追加到已有的窗口的 tab ,而未启动 Edge 的时候会以修改过滚动条和 “必应发现” 不显示的情况下启动 Edge,预览文件。同时,文件中的 LaTeχ 公式显示正常。
而 Edge 的新页标签也是干干净净的,没有糟心的滚动条,图片加载正常,没有 “必应发现” 膈应人。
唯一美中不足的是 vim 会产生两个小弹窗,需要切换到弹窗按两下任意按键。
对于浏览器而言,删除本地文件之后浏览器依然可以正常显示,所以这两个弹窗可以随便按。