对于每一个人来讲,都会有特别喜欢的编辑器。对于不少热爱Unix/Linux的人来讲,Vim/vi确定是很熟悉的“编辑利器”了。java
固然,对于Mac用户来讲,确定也不乏对Vim狂热的人。庆幸的是,Vim对Mac用户提供了一个独立的应用程序MacVim。编程
做为一个Unix的衍生系统,macOS天然支持用户与OS经过Shell来交互,所以也就引入了要讨论的问题: 在Mac终端下,输入MacVim启动命令mvim却没法启动MacVim。vim
首先,考虑MacVim独立应用和Mac终端自带的Vim的区别:数组
1.MacVim做为Mac下的典型GUI Vim(gvim),可以提供更优秀的编辑界面,而没必要拘束于Mac终端的配置文件(包括配色、窗口大小)bash
2.MacVim在使用时,是独立打开一个新的窗口,而不是像终端Vim同样,占用终端界面的窗口(固然,经过macOS的cmd+T快捷键也可建立一个新的Terminal标签页,切换过程只需Ctrl+Tab切换标签页,这样看起来彷佛也让终端下Vim编辑文件显得更直观)app
3.MacVim若是脱离终端来使用(每次都要点击MacVim应用来启动,并输入要编辑的文件的路径),将会变得失去其快捷性,尽管macOS可让你把任何文件拖动到MacVim上来实现用MacVim对该文件进行编辑,但这彷佛就在必定程度上违背了使用Vim的“初心”(我眼中的Vim,就是让人脱离鼠标,只靠键盘便可编辑一切)编辑器
所以,咱们就须要让MacVim的启动速度如终端下Vim同样迅速便捷,又要让MacVim真正地启动自身的应用程序。这就是安装MacVim后,还会提供mvim命令的最好解释。函数
可是,在个人终端下,安装MacVim后,mvim命令却并不能发挥做用,具体表现以下:测试
1.将mvim拷贝一份到/usr/local/bin/目录下,重启bash,仍没法使用mvim,报错“Sorry, cannot find Vim executable.”spa
2.将mvim拷贝一份到/usr/bin/目录下(涉及到Apple在macOS更新中引入的RootLess控制机制,如何解除请查阅其余博客),没法使用mvim,报错相同
3.经过输入mvim可执行文件的全路径(/Applications/MacVim.app/Contents/bin/mvim)来执行mvim编辑文件,可行
固然,查阅了几篇如何解决一、2的报错的博客,但感受众说纷纭...因而乎,便考虑本身来写一个相似解析命令的中间程序来帮助执行mvim命令
既然已经能够经过mvim全路径来执行,那么每次输入这个全路径天然是十分痛苦的,因而就考虑到用一个程序来帮助输入这些字符串。
因而,即可以写一个C程序来实现(暂且将这个程序叫作gvim):
因而,经过这段代码能够看到,在输入$ gvim file1.txt file2.txt ...以后,就能让Shell解析命令,传入到gvim程序中,gvim程序就会将这些字符串表明的文件“拼接”上mvim的全路径,再经过system函数来调用执行这条完整的命令: $ /Applications/MacVim.app/Contents/bin/mvim file1.txt file2.txt ...
这就是gvim的实现原理,也就是整个设计过程的思路。
可是!!!这个程序依旧是存在问题的,好比我在一个包含有20+个Java源文件的目录下,输入命令$gvim *.java 来对这些Java文件依次进行编辑,这时就会由于gvim.c中cmd的长度受限,此时Shell也只能反馈信息:"Abort trap: 6" (数组越界),这天然是确定的,个人完整命令的长度超过了180的限定长度。
此时就回到了C/C++的经典问题,C中对于数组的内存分配是固定的(只指声明数组的方式来分配内存,不包括malloc、calloc函数),那么该如何分配给一个字符串适当的长度,能保证它既能包括我要输入的全部命令字符、又能不过多地消耗内存。
天然就想到了C++的String!(不要提Java...毕竟涉及到Shell了嘛,专业脸)
因而就有了gvim的C++版本:
这里,用到的就是std::string来实现字符串的构造,调用它的append方法来实现拼接,同时调用std::string.c_str()函数来实现std::string转换为const char *类型(由于system严格要求其传入参数为const char *类型),从而因为std::string的灵活性(长度变化由传入的字符串来决定),便可解决“输入的完整命令超级长”的问题。
至此,就能够编译生成这个可执行程序gvim了:
$ g++ gvim.cpp -o gvim
$ mv ./gvim /usr/local/bin/
重启Shell
至此,就能够用$ gvim 来代替 $ mvim 了。虽然并未从根本上解决掉那个问题,但终究是靠所学的知识达成了目标!
下面放出实验结果测试截图:
Okay,搞定!
但愿此文能对那些配置mvim路径搞到头大的朋友,一个简单的解决思路。
记念一下今天这个算是特殊的日子吧,感受本身身上单身狗的芳香愈发浓郁......
========== 分割线 ==========
固然,经过Shell编程,能够更加简单地解决这个问题... 因而就有了方法3:
定义一个名字为"mvim"的可执行文件(Shell脚本),输入命令 “ /Applications/MacVim.app/Contents/bin/mvim $* ”。就像这样:
这个命令就是将全部参数(即$*)原封不动地传给前面的可执行程序(脚本),因此... 一句命令的事儿。
$ echo "/Applications/MacVim.app/Contents/bin/mvim $*" > mvim && mv mvim /usr/local/bin/
(到这儿,真的发现本身变化仍是蛮大的,哈哈哈哈,当时的cpp居然写得这么渣... 尽管如今还有好多不懂的东西,但慢慢积累吧,编辑记录都留着,见证成长[手动二哈])
固然,看到了评论区的命令别名,天然也是很好的解决办法,配置一下就ok,在此十分感谢。
但愿还有方法建议的朋友评论区更正,感谢。
编辑于2018.5.20
第一次修改于2018.5.22
第二次修改于2019.3.1