小白今天看到一篇很好很有用的文章:
原文链接:http://nathanleclaire.com/blog/2013/10/27/5-cool-unix-hacks-for-fun-and-productivity/
在我的工作中,我总是在寻求能提高生产力,和让开发更有趣的方法。当你在bash上飞快输入一系列的命令,你知道你的朋友会花两倍的时间来做这一些列操作,没有什么比这个让人感觉更好的了。你是否曾经:
心里默默地埋怨你的同事,为了到命令行的头部,不断地按左方向键。但其实你可以只需要按下CTRL + A就能达到目的 ?
小白批注:CTRL-A会移动到命令的开头,CTRL-E会挪到命令的末尾
看到某人一次又一次输入相同的命令,而你可以只需要在它面前加一个! ?
当你的朋友罗列他使用的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 (http://stackoverflow.com/questions/1085162/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可以和下个招数一起协同工作,具体使用和上面章节说的一样
小白批注:CTRL-N向下,CRTL-P向上进行选择,选择后,Esc键即可确定已选择的,的确很好用。
丰富的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的花哨的操作命令(例如,使用/搜索来定位),然后你只需要一些小小的联系,你就可以很快地操作大量的宏了,你会将你的还在依靠鼠标进行操作的同事远远甩在后面了。