如何在vim下使用外部PDF阅读器在光标下打开pdf文件(使用'gf')

Lia*_*ang 5 vim autocmd

current gf命令将打开*.pdf文件作为ascii文本.我想用外部工具(如okular,foxitreader等)打开pdf文件.我尝试使用autocmd来实现它:

au BufReadCmd *.pdf silent !FoxitReader % & "open file under cursor with FoxitReader
au BufEnter *.pdf <Ctrl-O> "since we do not really open the file, go back to the previous buffer
Run Code Online (Sandbox Code Playgroud)

但是,第二个autocmd无法按预期工作.我无法找到一种以某种方式执行<Ctrl-o>命令的autocmd方法.

任何人都可以给我如何暗示<Ctrl-O>autocmd,或干脆直接提出一个更好的方法来打开PDF文件gf

谢谢.

sid*_*yll 8

那是因为autocmd一个ex命令(以冒号开头).要模拟正常模式命令的执行,请使用该 :normal命令.问题是你不能直接传递<C-O>(而不是 <Ctrl-O>):normal,它将被视为文字字符(<,然后是C,然后是r),这不是一个非常有意义的正常命令.您有两种选择:

1.插入文字^ O字符

使用controlvcontrolo得到一个:

au BufEnter *.pdf normal! ^O
Run Code Online (Sandbox Code Playgroud)

2.使用:execute构建命令

这样,您可以使用转义序列获得更可读的结果:

au BufEnter *.pdf exe "normal! \<c-o>"
Run Code Online (Sandbox Code Playgroud)

无论如何,这不是最合适的命令.<C-O>只是跳转到跳转列表中的上一个位置,因此缓冲区保持打开状态.我会做的事情如下:

au BufEnter *.pdf bdelete
Run Code Online (Sandbox Code Playgroud)

代替.我还有另一个解决方案.


比如用地图创建另一个命令gO.然后直接使用您的PDF阅读器,或者open如果您使用的是MacOS X或Darwin(不确定其他Unix系统是否拥有它,以及如何调用它).这就像双击作为参数传递的文件的图标一样,因此它将打开默认的PDF阅读器或任何其他配置为默认打开任何文件的应用程序,如图像等.

:nnoremap gO :!open <cfile><CR>
Run Code Online (Sandbox Code Playgroud)

<cfile>将扩展到光标下的文件.因此,如果要在Vim中打开文件,请使用gf.如果要使用默认应用程序打开它,请使用gO.

如果您没有此命令或更喜欢仅使用PDF的解决方案,请为首选命令创建一个映射:

:nnoremap gO :!FoxitReader <cfile> &<CR>
Run Code Online (Sandbox Code Playgroud)