对于每个人来说,都会有特别喜欢的编辑器。对于很多热爱Unix/Linux的人来说,Vim/vi肯定是很熟悉的“编辑利器”了。

  当然,对于Mac用户来说,肯定也不乏对Vim狂热的人。庆幸的是,Vim对Mac用户提供了一个独立的应用程序MacVim。

  作为一个Unix的衍生系统,macOS自然支持用户与OS通过Shell来交互,因此也就引入了要讨论的问题: 在Mac终端下,输入MacVim启动命令mvim却无法启动MacVim。

  首先,考虑MacVim独立应用和Mac终端自带的Vim的区别:

    1.MacVim作为Mac下的典型GUI Vim(gvim),能够提供更优秀的编辑界面,而不必拘束于Mac终端的配置文件(包括配色、窗口大小)

    2.MacVim在使用时,是独立打开一个新的窗口,而不是像终端Vim一样,占用终端界面的窗口(当然,通过macOS的cmd+T快捷键也可创建一个新的Terminal标签页,切换过程只需Ctrl+Tab切换标签页,这样看起来似乎也让终端下Vim编辑文件显得更直观)

    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.”

    2.将mvim拷贝一份到/usr/bin/目录下(涉及到Apple在macOS更新中引入的RootLess控制机制,如何解除请查阅其他博客),无法使用mvim,报错相同

    3.通过输入mvim可执行文件的全路径(/Applications/MacVim.app/Contents/bin/mvim)来执行mvim编辑文件,可行

  当然,查阅了几篇如何解决1、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

Mac的Terminal中无法使用mvim解决方案的更多相关文章

  1. pycharm中的Terminal 中无法使用git的问题

    1.先找到git的安装路径,建议使用Everything工具 2.打开pycharm中的setting > tools > Terminal 3.把git的安装路径加上启动文件 bash. ...

  2. 解决 Mac 的 Terminal 中,Java 乱码的问题

    在 .bash_profile 文件中,增加如下行: export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 然后,重新加载该配置 source .bash_pr ...

  3. 在Mac OS X中配置Apache + PHP + MySQL

    在Mac OS X中配置Apache + PHP + MySQL Mac OS X 内置Apache 和 PHP,使用起来非常方便.本文以Mac OS X 10.6.3和为例.主要内容包括: 启动Ap ...

  4. Mac OS Terminal 几个快捷键

    在Mac系统中几个键位组合可以使Terminal的操作更加灵活方便. 1.将光标移动到行首:ctrl + a 2.将光标移动到行尾:ctrl + e 3.清除屏幕:            ctrl + ...

  5. [转] - 在mac的终端中使用sublime打开文件

    在mac的终端中使用sublime打开文件 使用sublime提供的命令行工具.这个命令行工具位于 /Applications/Sublime\ Text\ 2.app/Contents/Shared ...

  6. 在Mac OS X中使用VIM开发STM32(2)

    本文原创于http://www.cnblogs.com/humaoxiao,非法转载者请自重! 在我先前的博文⎣在Mac OS X中使用VIM开发STM32(1)⎤中,我们安装完成了MACVIM,这一 ...

  7. 【转】Mac OS X 中 Zsh 下 PATH 环境变量的正确设置

    在 Mac OS X 中使用 zsh,环境变量 PATH 一不小心就会变得很紊乱,表现为自己设置的路径总是被放到系统路径之后,部分路径还会有重复.这是我们不太了解 zsh 启动时加载文件的顺序和 Ma ...

  8. 在 Mac OS X 中建立加密的 Zip 压缩 -- 让机密资料加上密码

    在 Mac OS X 中要压缩档案的話,基本上就用滑鼠点右鍵选「压缩...」就可以制作 Zip 格式的压缩档,很方便.但如果是机密的资料要透过 Email 等管道传送时,常常会需要建立加密的 Zip ...

  9. 让Mac OS X中的PHP支持GD

    GD库已经是近乎于是现在主流PHP程序的标配了,所以也必须让Mac OS X中的PHP支持GD.在网上搜索了好多,最终按照这个方式成功实现,如何让Mac OS X支持PHP,请查看<让PHP跑在 ...

随机推荐

  1. Python - 查看类的方法和属性,dir(),help()

    1. dir()查看类的方法和属性 查看slice类的方法和属性 dir(slice) 2.help() 查看某个方法的文档 查看slice类中的indices方法 help(slice.indice ...

  2. 5_6 团体队列(UVa540)<queue与STL其他容器的综合运用>

    先给出T个团体,并给出每个团体有多少人和每个人的编号,然后所有团体一起排队,排成一条大队列,排队的原则是,一个成员加入,如果这个成员所在的团体已经有人在排队了,那么他就加到他所在团体的最后面,而不是整 ...

  3. springMVC的跳转

    服务器内部跳转: return "forward:/forward/test1";  或者 request.getRequestDispatcher(path).forward(r ...

  4. 以太坊执行miner.start返回null终极解决方案

    参考博文:https://blog.csdn.net/wo541075754/article/details/79260040

  5. windows和ubuntu安装以太坊客户端Mist

    Mist钱包下载地址:https://github.com/ethereum/mist/releases Mist = Ethereum Wallet + Web3 浏览器 Dapp:bancor 史 ...

  6. XC1263 签到题(哇 ,写得我怀疑人生啊!!!@!@)

    1263: 签到题 时间限制: 1 Sec  内存限制: 128 MB提交: 174  解决: 17 标签提交统计讨论版 题目描述 大家刚过完寒假,肯定还没有进入状态,特意出了一道签到题给各位dala ...

  7. 迭代器对象numpy.nditer在数组上进行迭代——修改数组的值

    nditer对象有另一个可选参数op_flags,默认情况下,nditer将视待迭代遍历的数组为只读对象(read-only),为了在遍历数组的同时,实现对数组元素值得修改,必须指定op_flags= ...

  8. 【SSM 】导出excel含图片

    ExprotRentUtils package com.kikyo.stat.utils; import java.awt.image.BufferedImage; import java.io.By ...

  9. 【Fine学习笔记】Xcode的快捷方式

    Xcode快捷键 文件 CMD + N: 新文件:  CMD + SHIFT + N: 新项目: CMD + O: 打开: CMD + S: 保存:  CMD + SHIFT + S: 另存为: CM ...

  10. ApacheBench(ab)压力测试工具

    服务器负载太大而影响程序效率也是很常见的,Apache服务器自带有一个叫AB(ApacheBench)的工具,可以对服务器进行负载测试 基本用法: ab  -n 全部请求数 -c 并发数测试url 注 ...