Mac的Terminal中沒法使用mvim解決方案

  對於每一個人來講,都會有特別喜歡的編輯器。對於不少熱愛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

相關文章
相關標籤/搜索