Windows平台OmniMarkupPreviewer配置引发的思考

git

假装思考

这篇博客其实并不是教程,只是记录一下今天遇到的我觉得值得吐槽的一件事情。事情是这样的,今天下午我打算回来写个博客,因为博客是用Hexo搭建的,所以写的时候自然想使用markdown来写。平时我都用Atom来写因为它提供了实时预览的功能,但是最近Atom是越用越卡,而在线编辑的又感觉太麻烦,我感觉还是Sublime用起来爽于是就试着找了一个markdown的插件,也就是OmniMarkupPreviewer。配置好之后体验了一把(这篇博客就是用这个插件写的)。OmniMarkupPreviewer确实是一个不错的插件,不过…好像现在程序员们都很有钱嘛,不管是百度还是谷歌搜出来的教程都是Mac的配置,我试着配置了一下,发现别的功能都是正常的,但是无法直接在Sublime中按Ctrl+Alt+O打开浏览器实时预览,而这正是我需要的最核心的功能啊。于是我又尝试用我蹩脚的英文开始搜索,仅有的几个提问竟然都没有人回答。我不禁开始深思难道真的是我太low了吗作为一个程序员我竟然不用Mac真可耻!不过作为一个程序员,不手动解决这个问题我是绝对不会善罢甘休的,于是我继续搜索,整整用了一个小时,依然没有解决这个问题。
我突然发现我浏览过的数十篇介绍如何配置的文章几乎全都如出一辙,copied and pasted, again and again,所以虽然我点开了几十个链接,真正有用的信息其实就那么几条,有的人用的是Windows粘贴在自己博客里面的教程却是Mac的配置文件,我真想问他真的使用这个插件了吗?还是说这个插件其实以前Windows也是这么配置的?(后来我看了源码并不是这样配置的)还有的人直接就是原封不动的复制粘贴了别人的教程,哦,不过他们却不辞辛劳的把原文链接和原作者名匿去了,这样显得更像自己写的?
互联网的开放性使得越来越多的信息变得冗余,相比没有网络的时代,我们能获取知识的途径更多了更便捷了,但是冗余的信息也让我们耗费更多本不应该耗费的时间在搜索和提取信息上。而造成这些信息冗余的正是我们这些互联网的使用者。有时候我在想,网上那么多错误、虚假、重复的信息是否能有一种技术或者一批“网络卫士”来清除这些信息只保留那些有价值的不重复的信息呢?我这么一个不知名初出茅庐不久的程序员当然不是想喊出什么和谐网络净化知识的口号,现阶段更没有这个能力去开发实现,我只是觉得作为一个技术从业者,参考、总结、整理优秀的技术文档存入自己的知识库无可厚非,但直接复制粘贴别人的文章到自己的博客中,甚至没有验证过是否可行,除了让信息变得更加冗余之外有什么意义呢?

Don’t repeat yourself
And
Don’t repeat others

尝试解决问题

写了这么多废话,还是说一下Windows上这玩意儿怎么配置吧。由于没找到答案,所以我决定自己从源码中寻找答案,从来没写过python的我硬着头皮打开了源码,我定位到了这段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def launching_web_browser_for_url(url, success_msg_default=None, success_msg_user=None):
try:
setting = Setting.instance()
if setting.browser_command:
browser_command = [os.path.expandvars(arg).format(url=url)
for arg in setting.browser_command]

if os.name == 'nt':
# unicode arguments broken under windows
encoding = locale.getpreferredencoding()
browser_command = [arg.encode(encoding) for arg in browser_command]

subprocess.Popen(browser_command)
if success_msg_user:
sublime.status_message(success_msg_user)
else:
# Default web browser
desktop.open(url)
if success_msg_default:
sublime.status_message(success_msg_default)
except:
if setting.browser_command:
log.exception('Error while launching user defined web browser')
else:
log.exception('Error while launching default web browser')

显然这就是打开浏览器调用的函数,于是我将browser_command和url打印出来,发现传入的参数是跟配置文件中写的一样,但是subprocess.Popen(browser_command)却报错,看来参数有误

1
2
encoding = locale.getpreferredencoding()
browser_command = [arg.encode(encoding) for arg in browser_command]

我又将encoding的值打印输出,系统拿到的值是cp936编码,查了一下这是GBK编码的别名,看来这并没有什么问题

微软的CP936通常被视为等同GBK,连 IANA 也以“CP936”为“GBK”之别名[1]。事实上比较起来, GBK 定义之字符较 CP936 多出95字(15个非汉字及80个汉字)

这时候我注意到subprocess.Popen(browser_command)中并不包含url的参数,而浏览器应该不仅仅打开自身,还需要跳转到对应的url上,所以参数应该是从browser_command中传入的,果然在browser_command中有一个{url}

"browser_command": ["open", "-a", "Google Chrome", "{url}"]

也就是说这个是不应该被修改的,于是我尝试将前面的所有参数替换为"C:/Program Files (x86)/Google/Chrome/Application/chrome.exe",果然问题得到解决了。不过这时候我接着看了下面的代码,if setting.browser_command:下面有else,也就是说如果这一项没有配置,系统也会尝试用默认浏览器去打开这个链接,果然我将browser_command置空后依然能打开

结论

所以结论是,Windows平台OmniMarkupPreviewer配置项browser_command应该设置为空(默认浏览器打开)或者["$your_browser_path",{url}]

注:如果你按上述配置了,但依然不能用,控制台提示类似TypeError: Type str doesn't support the buffer API这样的错误,请参考这个Pull Request进行修改

坚持原创技术分享,您的支持将鼓励我继续创作!