【开发提速系列】使用NIX作为开发环境


如果你不是专门做限制在Windows下的开发的话,试试在nix(mac osx/linux)下开发吧,有很多tip可以帮你提升开发速度。

编码问题

如果原先在windows下开发的,转到nix下之后可能遇到的第一个问题不是软件,而是各种编码问题。以下是一些常见问题的解决方法:

ssh乱码

luit -encoding your_encoding ssh

luit是一种临时性的解决方法,不用改变你的terminal的编码。encoding设置为远程服务器的编码。

文件内容乱码

想临时看一下的话,尝试一下 iconv。典型使用如:

iconv -f file_encoding -t utf-8 input_file | less

file_encoding为你input_file的实际编码,默认iconv直接输出到stdout。想要转发到文件,加个 >output_file即可。

文件名乱码

iconv不能用于文件名转换,你需要的是convmv。典型用法:

convmv -f filename_encoding -t utf-8 -r directory

因为文件名转换不能类似iconv输出到stdout,所以convmv实际是需要你确认的。比如上面的命令只会尝试性地转换,除非你加上–notest参数。

使用git管理svn

git是nix下很好用的一个版本管理工具,如果开发时你使用svn的话,尝试下git-svn吧。
个人使用git管理svn的契机是因为svn多分支并行开发时互相切换比较麻烦,在学习git时发现git拥有自己想要的快速分支切换和修改暂存功能。之后有通过git like switch svn之类的关键字找到了git-svn。到现在为止,个人使用git-svn有半年多了,基本没啥问题。
git相对svn另外一个好处是支持本地分支。在公司svn不允许自己建立实验分支的情况,git很好地满足了需要。我就经常在正式svn分支建立之前创建git下的实验分支,等到svn分支建立之后cherry-pick过去,不丢失自己的前期工作。
git的log和diff很快。这就是分布式版本控制和集中式的典型区别。
对在命令行管理git的人来说,显示当前分支的名字是个挺实用的功能。我原先在使用svn时根本没考虑过这点。
最后一点,git的撤销真得很方便,svn的撤销我到现在为止还不是很了解……

tmux/screen

有人说,没用过tmux/screen不算使用过linux。好吧,撇开是否算使用过不谈,tmux/screen确实是日常开发必不可少的工具。
个人认为tmux/screen主要的功能有两块,远程执行自由退出不中断和自由的多window/frame的操作。后者对于本地基于terminal的开发来说提供了无限可能。
就像用windows开发你会开非常多的窗口,实际上nix你也可能开非常多的窗口。但是tmux/screen使用卡片式/平铺式布局大大降低了这种窗口“爆炸”的情况,而且随时随地快速开启和关闭window/frame,就像git快速创建和销毁分支一样。
有了tmux/screen,对于我平时Java开发,只要开启三个窗口:firefox/eclipse/terminal,实施上大部分日常操作你都可以在terminal中完成。没有做不到,只有你想不到。

ack

这是我的关键字搜索命令演化

find –type f –name ‘*.xml’ –exec fgrep –Hn –color foo {} \;
find –type f –name ‘*.xml’ | xargs fgrep –Hn –color foo
ack –xml foo

ack不愧是程序员用的搜索命令。如果你熟悉grep的话,理解和使用ack不会很难。

ssh

windows下默认是没有ssh的,你需要下专门的软件,而nix下ssh基本都是内置的。而且nix提供了额外的基于ssh的功能。
比如对于你常用的服务器,.ssh/config写上一段:

Host myserver
  User: foo
  HostName: foo.d123.alipay.net

你就能用ssh myserver快速连接了。
如果你不想老是输入密码,试试sshpass。或者换用证书方式,一劳永逸。
远程复制文件,有scp/rsync。不用下专门的软件,当然如果你想下的话,试试filezilla,各平台都有。

alias

alias只是一个功能,似乎不能和前面的命令相比较。不过,个人认为合理使用alias能够大大提高你的开发速度。
比如快速进入某个目录,alias foo=’cd /home/xy/a/b/c/foo’,当然用符号链接也行。
自动命令参数,alias grep=’grep –color=auto’,(ubuntu默认就是)
快速登录某个服务器,alias myserver=’luit -encoding ISO-8859-1 sshpass -p 12345678 ssh -t foo@foo.bar.com screen -RR’,一下子完成了6件事情!
如果是经常使用的命令行,强烈建议alias成能快速输入的命令。

当然,你有时候需要了解当前有哪些alias,直接执行alias即可。
其次,临时禁用alias的话,只要在命令前加\即可,比如\grep foo
最后,xargs貌似不支持alias,比如ls * | xargs grep xxx,你要自己重新加上参数