在我的工作中,我總是在尋求能提高生產力,和讓開發更有趣的方法。當你在bash上飛快輸入一系列的命令,你知道你的朋友會花兩倍的時間來做這一些列操作,沒有什麼比這個讓人感覺更好的了。你是否曾經:
心裡默默地埋怨你的同事,為了到命令行的頭部,不斷地按左方向鍵。但其實你可以只需要按下CTRL + A就能達到目的 ?
看到某人一次又一次輸入相同的命令,而你可以只需要在它面前加一個! ?
當你的朋友羅列他使用的IDE的各種優點的時候,你是否會翻白眼,因為你知道你可以使用vim完成同樣的功能?
如果是這樣的話,下面這些小提示就很適合你。
聲明:這篇文章不是對vim,git和其他終端的偏見。我無意挑起終端和IDE的戰爭,只是想告訴一些對我來說很有趣的招數。
git add -p
如果你已經使用git很長一段時間了,你很可能遇到過原子提交這個概念了。本質上,這個概念指一次提交只包含相關操作,不包含邏輯上不相關的事情。例如,你對一個類的改動和相關的單元測試應該在一個提交中,而對另一個不同類的操作你應該放在另一個提交中。
但是,如果在一個文件中包含多個不相關操作的時候應該怎麼辦,或者你會想要把他們放在多個提交中,這樣你可以單獨對他們進行revert操作?或者你在一個文件中寫了很多log日志的語句,但是你不希望將這些語句提交到項目中去怎麼辦?通常人們使用的git命令是達不到這個要求的:
- $ git diff
- diff --git a/some-file.c b/some-file.c
- index f383179..09e4e35 100644
- --- a/some-file.c
- +++ b/some-file.c
- @@ -2,6 +2,8 @@
- int main(void) {
- printf("doing some stuff\n");
- - printf("doing some more stuff\n");
- + do_some_stuff();
- + printf("doing some unrelated stuff\n");
- + do_some_unrelated_stuff();
- return 0;
- }
- $ git add some-file.c
- $ git commit
- [master 1938906] some unrelated stuff, cramming it all in one commit 'cause I'm lazy
- 1 file changed, 3 insertions(+), 1 deletion(-)
- $ echo "Whoops we just committed unrelated stuff. Not very modular of us."
git add的 -p (代表patch)參數對於這種場景是非常有用的。這個會告訴git add,我想要做一個特殊的add操作,並且這個命令有個非常好的交互界面能讓我們明確指定我們想要操作文件中的哪個部分。git會將所有的變動自動分塊,你可以使用y或者n來通過或者拒絕這個分塊,或者你也可以使用s將它切成更細粒度的塊。如果git不能自動將變動分成你希望的塊的話,你可以使用e(edit)選項來指定更多細節。
這個帖子中有更多關於git add -p的細節:How can I commit only part of a file in git
補充說明:一些評論指出,-p參數也可以和其他的一些命令,比如git check –,在一起使用。因此你可以將文件的一部分恢復回來,而保持其他的部分的變化。很方便吧!
vim的 CTRL-P/CTRL-N 自動完成的功能
這是vim的殺招之一,並且我發現很多人(即使是vim的大師)都不是很經常使用。假如你是個馬虎的用戶(當ssh進入一個空間的時候使用vim去編輯一些配置文件),這招會潛在幫到你很多的。很多人聲稱他們不能放棄IDE的特性原因就是IDE的智能提示這項功能,這個功能能自動完成變量和函數的名字。這些特性是非常受歡迎的,因為它不會讓我們因為拼寫而出現錯誤,也縮短了編譯/運行/調試的周期。許多人沒有意識到直接從vim的黑盒子中也有類似的功能,而且是不需要任何插件的。
在INSERT模式下,你可以按下CTRL-N鍵下移建議的自動完成下拉框(這個下拉框vim是從當前緩沖中獲取,如果有的話,也會從tags中獲取),或者按下CTRL-P鍵來上移(如果記不住助記符的話,記著這兩個分別是代表“NEXT”和“PREVIOUS”)。如果只有一個可能的自動完成條目,vim就會繼續輸入,然後插入這個唯一的條目。非常方便且有效率,特別當你的代碼中有大量的長變量/方法/常量名稱的時候。
CTRL-P/CTRL-N可以和下個招數一起協同工作,具體使用和上面章節說的一樣
豐富的ctags
使用vim的人都知道打開一個遠距離目錄中的文件是很麻煩的(可以使用:e 來減緩麻煩程度,但是仍然不能瞬間做到)。如果你正好是在一個team中工作,或者在一個大項目中工作,迅速完成這個事情對你的工作來說是至關重要的。
豐富的ctags(http://ctags.sourceforge.net/)會讓這個世界變得更好。使用ctags,你可以在頂級目錄下跑一個命令,生成一個”tags”文件,然後,你就可以使用Ctrl-] 來“跳到” 你鼠標制定的定義(比如說,一個類名)。按CTRL-T回到你之前的位置。
你可以在git中搭建一個提交後鉤子(http://tbaggery.com/2011/08/08/effortless-ctags-with-git.html),當你提交代碼之後會自動生成ctags文件!漂亮。
在bash和zsh中CTRL-R
是否有曾經在終端輸入過一個命令,然後當你再次輸入前幾個字的時候,你會突然發現,你希望有個更簡便的方法能自動補充完整個命令,以便你能編輯或者再次運行它?如果是這種情況的話,那麼,告訴你個好消息:你可以!只需要按下CTRL+R 然後輸入你想要查詢的東西。終端將會將你想要的填充進去,如果有多個選擇的話,你可以按下反復按下CTRL+R來進行選擇。當你發現了你需要的命令,你可以使用通常的操作來操作這個命令(如果你使用標准的bash鍵綁定的話,你可以使用CTRL+A,CTRL+E,方向鍵等。)。試試吧!如果你不記得你要ssh的機器,使用這個方法你會感覺到很方便。
history| grep $COMMAND 對你來說也非常有用的,如果你只是想要查看最近運行的命令的話。
vim 宏
許多時候,當你寫代碼或者做相關任務的時候,即使可能只是非常微小的操作,你也會發現你自己非常需要一個方法來一遍一遍重復相同的編輯命令。不同的開發者會使用不同的方法來達到這個目的。例如,SubLime Text(http://www.sublimetext.com/)有個“殺招”是放多個光標在不同的位置,然後統一編輯。在Vim(在emacs也一樣,但是我們這裡只介紹vim的方法),你可以使用記錄和回放來完成這個目標。這是個非常有用且方便的工具,它會根據你的操作量的大小在不同程度加速你的代碼寫作速度。
要制作一個宏,在normal模式下按下q,然後按下其他的按鍵來“命名”宏(通常我使用q)。vim將會開始記錄你的鍵盤操作,vim將會記錄你的鍵盤操作,知道你按下了q來保存宏。你可以在normal模式下使用@-letter來重放,所以我通常使用@-q。你也可以在@重放命令前加個數字,這樣,你可以一遍又一遍重復執行你的宏(就像許多vim使用者,已經非常習慣來這樣做了)。如果你非常習慣使用vim的花哨的操作命令(例如,使用/搜索來定位),然後你只需要一些小小的聯系,你就可以很快地操作大量的宏了,你會將你的還在依靠鼠標進行操作的同事遠遠甩在後面了。
更多關於vim 宏的操作,請查看:Vim Wiki(Macros)
這是這篇文章的所有內容了,希望你能喜歡這篇文章。
原文鏈接:http://nathanleclaire.com/blog/2013/10/27/5-cool-unix-hacks-for-fun-and-productivity/