Mac的Terminal中无法使用mvim解决方案

  对于每个人来说,都会有特别喜欢的编辑器。对于很多热爱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的全路径,再通过Unix的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 来代替 $ mvim 了。虽然并未从根本上解决掉那个问题,但终究是靠所学的知识达成了目标!

  下面放出实验结果测试截图:

 

  Okay,搞定!

  希望此文能对那些配置mvim路径搞到头大的朋友,一个简单的解决思路。

  纪念一下今天这个算是特殊的日子吧,感觉自己身上单身狗的芳香愈发浓郁......

      编辑于2018.5.20

原文地址:https://www.cnblogs.com/stevenshen123/p/9065259.html

时间: 2024-10-09 01:20:13

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

Mac 下 Terminal 中 Java乱码的解决方法

在 .bash_profile 中增加一行 export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 就可以了. Mac 下 Terminal 中 Java乱码的解决方法,布布扣,bubuko.com

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

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

解决mac 10.11 以后 无法使用未签名第三驱动

解决 最新版 mac 系统 无法使用未签名第三驱动 10.12.多 我的情况是 10.11.4 Beta (15E27e) 使用绿联usb网卡不正常. 下面的命令为检测驱动是否装载的一些命令.sudo kextload /Library/Extensions/AX88772.kext 报错: failed to load - (libkern/kext) not found; check the system/kernel logs for errors or try kextutil(8).

解决在IE8中无法使用原生JSON的问题

转自:http://www.iitshare.com/ie8-not-use-native-json.html 起因 在项目中要将页面上的js对象传给后台,想到可以用json转成字符串传递. 1 2 var obj = {"a":1 "b":2, "c":3}; var str = JSON.stringify(obj); 上述代码在firefox,chrome中测试都没问题,可是在ie8下确提示JSON Not Defined,google了一

Mac OS Terminal 几个快捷键

在Mac系统中几个键位组合可以使Terminal的操作更加灵活方便. 1.将光标移动到行首:ctrl + a 2.将光标移动到行尾:ctrl + e 3.清除屏幕:            ctrl + l 4.搜索以前使用命令:ctrl + r 5.清除当前行:         ctrl + u 6.清除至当前行尾:   ctrl + k 7.单词为单位移动:option + 方向键 启动快捷键 按下按键或组合键,直到所需的功能出现(例如,在启动过程中按住 Option 直到出现“启动管理程序”

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

在 Mac OS X 中使用 zsh,环境变量 PATH 一不小心就会变得很紊乱,表现为自己设置的路径总是被放到系统路径之后,部分路径还会有重复.这是我们不太了解 zsh 启动时加载文件的顺序和 Mac OS X 的 shell 类型导致的. zsh 启动过程中会依次读取以下文件: /etc/zshenv $ZDOTDIR/.zshenv($ZDOTDIR 未设置时默认为 $HOME) 如果是 login shell,读取 /etc/zprofile, $ZDOTDIR/.zprofile 如果

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

在Mac OS X中配置Apache + PHP + MySQL Mac OS X 内置Apache 和 PHP,使用起来非常方便.本文以Mac OS X 10.6.3和为例.主要内容包括: 启动Apache 运行PHP 安装MySQL 使用phpMyAdmin 配置PHP的MCrypt扩展库 设置虚拟主机 启动Apache 有两种方法: 打开“系统设置偏好(System Preferences)” -> “共享(Sharing)” -> “Web共享(Web Sharing)”. 打开“终端

MAC系统XAMPP 中 MySQL命令行客户端配置使用

在PHP的学习过程中,MySQL估计是必然会接触的. MySQL的管理相信大家也会使用phpmyadmin: 好吧,phpmyadmin的确是MySQL管理的神器,你想要的,他好多都有,在开发的过程中,对于后台数据库的设计架构帮助真的很大. 但是,在这篇文章的主角确不是它. MySQL客户端 MySQL安装包里面,在一个名为bin的文件夹,放置了很多工具包,但是使用他们的方式是命令行(ps:最近上瘾了). 在MAC系统,使用命令行的工具可以使用系统自带的Terminal: 顺便在这提一下,笔者使

在Mac OS X中配置Apache + PHP + MySQL 很详细

这是一篇超级详细的配置mac os下面php+mysql+apache的文章.非常详细我的大部分配置就是参考上面的内容的,比如,PHP不能连接数据库,就是改一下默认的php.ini中pdo_mysql.default_socket[因为现在都用PDO了嘛.不用mysql的连接库了]因为我是用navicat的,所以对phpmyadmin那一块的配置就不太关心了.不过MCrypt的安装可以参考.原文来自:在Mac OS X中配置Apache + PHP + MySQL内容如下: Mac OS X 内