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