分享 [译] Terminal 功夫——方便开发者的实用技巧

rennyallen · 发布于 2016年12月02日 · 最后由 jjfujj 回复于 2017年2月13日 · 4586 次阅读
26688
本帖已被设为精华帖!

前言

这是我在过去几年中提炼出的一些方便你编程的小技巧和提示。在这篇文章中,你将学到如何更有效率地做你每天做的事情。

 

快速搜索命令行历史记录

我真的很难记住一些命令,特别是那些有一大堆参数的。而且有时候更烦,你不得不停下来然后又去google你两个小时之前引用的某个命令。不用担心,reverse-i-search可以拯救你。打开你的终端,按下Ctrl + R。输入你最近使用的命令的前几个字符,它会显示出符合你要查询的命令。如果有多个匹配的命令,重复按Ctrl + R直到找到你想要的然后按Ctrl + E选择即可。
你也可以输入history就可以显示出你之前执行过的命令列表。

 

缩短退格时间

你是否遇到过很长的查询,比如跨了4行,然后你想跳到前边去做一些修改,或者是你写了很长的命令,跨了4行,结果发现只是在最开始的地方有点错?这时候你可能要按箭头,然后一个一个字符地把光标移到开头去。但你可以使用快捷方法,这些方法可以节省你很多按方向键和空格键的时间。

Ctrl + K - 删除光标右边的所有内容

Ctrl + W - 删除光标左右的所有内容(一次一个单词)

Ctrl + A - 跳到行首

Ctrl + E - 跳到行尾

 

在 rails console 中用 _ 访问最后一个表达式

这是另一个我经常犯的错误:在 rails 控制台中查询一个 ActiveRecord model,忘了把结果保存在一个变量里,然后按加上一个变量再做一遍。

很幸运比我聪明的人也有这个问题,实际上他们已经解决了。每次你在 console 里面执行一个命令或者是功能,其返回值都会被保存在一个叫做_的变量里(对,就是一个下划线)

所以,比如你在 console 里面执行了User.first(5)。你得到了前5个 users 但是你忘了存在一个变量里。这时你只需要_.first.name或者更好的是你可以 users = _. 现在变量 users 就等于User.first(5)的返回值了。

 

找到任何URL的 Controller 和 Action

这个也超有用,尤其是当你的 routes 文件达到了500行,你有5个不同的 namespaces,还有一堆自定义的 actions 时。你有个URL,你想知道它执行的是哪个 Controller 和 Action。常见的方法是打开 routes 文件然后扫描整个文件去查找。或者你会用 RailsPanel 来查看 Controller 和 Action。但这都要耗些时间。

如果你想要秒秒钟搞定这件事,在 rails console 里面用这个命令:

Rails.application.routes.recognize_path "http://localhost:3000/users/11"

Ps: 当用在不是GET的action上的时候要小心,可能会返回正确的controller,错误的action

 

在 sandbox 里面玩

你想在 console 中弄乱一些值然后看看程序怎么反应,但是你又不想破坏你的原始数据库?不用害怕,rails console 里面有一个内置的选项为此而设。用以下命令启动 rails console

rails console --sandbox

在这个模式下 console 被包装在数据库事务中启动。当你退出回话后,事务将回滚。所以你可以随意增删改数据,当你退出 console 时数据库会被恢复到原始状态。但要小心在沙箱里面运行事务因为并非所有数据库都可以处理嵌套事务。

 

重新加载控制台

你在 console 里面试了一些东西,不起作用。然后你要改一下你的代码再试一次,这时候不用关掉 console 又重新启动,只需 reload!

 

去除ri和rdoc

bundle installing

你在 Github 上看到一个很好的项目,你立即把它 clone 下来然后bundle install。然后...你花了30分钟来下载所有的 gems,而这其中一半的时间都花在了下载 RDoc 和 ri 文件上了,你可能从来不用这些,甚至你可能根本不知道这是什么鬼。可以说只要你联网了你就不是必须要用他们,但是当你 bundle 的时候会自动下载。这里有两个方法来处理:

第一,如果你是安装单个 gem,使用

gem install rails --no-ri --no-rdoc

这样就告诉 bundler 不要下载 RDoc 和集成 ri 文件。这样就节省了很多时间和空间。

但上面这个方法只是在你安装单个gem的时候有用。如果你想让安装所有gem的时候都默认这样做的话:

步骤1. 在home目录下创建一个文件命名为.gemrc

cd ~; touch .gemrc;

步骤2. 在你的编辑器里面打开这个文件

subl ~/.gemrc # 用你的编辑器打开这个文件

步骤3. 将以下代码粘贴进去即可

gem: --no-ri --no-rdoc
install: --no-rdoc --no-ri
update:  --no-rdoc --no-ri

我们还可以更深入一点。很多大中型项目的gem平均要跑50秒,这还不包括解决每个gem的依赖。例如Discourse这个项目有大概150个gems

我们可以通过并发安装gem让这变得更快,确保充分利用你的网络带宽处理能力。我们通过给bundler加上--jobs这个参数来完成。

bundle install discourse --jobs=4

运行这个命令你会看到gems的安装快得飞起。然而这不是任何时候都适用的,有时候会出现死锁或者冲突。解决方法只需运行:

bundle install discourse --jobs=1

这样就设置回了默认的情况。

 

看一下gem内部

或许因为你的好奇心,你想看一下一个特定的功能是怎么执行的,想看一下你正在使用的一个gem的源代码。是的,你可以每次去google github 里面的项目然后在那里看。但是其实可以不用这样。只需要

EDITOR=subl bundle open devise

subl这里是你的编辑器,devise是你的gem名字。这里我们打开了devise这个gem。这样做的好处是它可以打开你正在使用的gem的版本。

然后你可以在项目里面做你想做的事情,你可以修改代码来理解它做了什么事,可以修改下function甚至是增加functions。当你看完了代码之后,你可以用以下命令使它回到初始状态

gem pristine devise

 

在你的代码里面写注释

当你写代码的时候,你可能想在代码里面快速地做一些笔记。或许你可能想写下“想要重构”之类的。不用切换到其他地方去做笔记,rails提供了一个东西,你只需要在你的程序里面使用 #TODO.

#TODO make this a one line function.
def new
end

之后你可以在console里面输入以下命令来查看你的所有笔记: bundle exec rake notes:todo

但这样久了之后你可能会发现你有很多 todos,你可能想要描述得更加具体,你可以做一些自定义的修改,比如:

#REFACTOR make this a one line function.
def new
end

然后这样去查找: bundle exec rake notes:custom ANNOTATION=REFACTOR

 

找到任何方法的源地址

有时你在 console 中使用一个方法,尤其是你引用的 gem 包里面定义的方法,你想看看它的源代码。方法经常在不同的文件之间有相同的名称,你不确定是调用的哪个,或者说想查看这个方法在哪里定义的。这时候找到源代码的位置的最简单方法是:

user.method(:password=).source_location 
=> #["/Users/ror365/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/activemodel-4.2.0/lib/active_model/secure_password.rb", 119]

返回的是确切的文件路径和相应的行号,然后你就可以按照这个去查找啦。

 

列出所有的 rake 任务

如果你有一个较大的应用程序,你写了多个 rake 任务,然后 rails 本身也内置了一些rake任务,这时候你可能很难记住或者找到他们。最简单快速的方法来找到 rake 任务,运行:

bundle exec rake -T

-T这个参数告诉 rake 列出在这个应用程序里面找到的所有 rake 任务,而且可以打印出这个任务的描述。

 

清理一些磁盘空间

我的一个同事,他的 Macbook Pro 有120个G的硬盘。时间长了就占满了,然后他想找一些东西来删掉。我碰巧有次看到他在做这个事,然后就问他:“你清理你的rails logs了吗?”他说没有,然后他去看log,他本地的 development log 已经占用了2G的空间。看来从他买了这电脑就一直没清理过。

日复一日地开发一个应用程序,你可能没注意到你所做的每个请求都写在了开发日志(development log)里面。这可能并不是很大,但是它会快速地增加。不用手动去删除它,你可以运行这个专门为此设计的命令:

bundle exec rake log:clear

这会清理你的日志从而你可以获得一些硬盘空间。

 

找出所有过时的gems

开源世界,变化万千。如果你有一堆gems,你可能经常需要更新他们。然而运行bundle update命令有点危险,因为它会破坏一些东西。我建议在你的项目里先执行

bundle outdated

这样会列出所有需要更新的gems。然后你可以根据这个去bundle update某个单独的gem.

 

总结

一个人可以知道的小技巧是无限的,知道这些可能并不会让你成为一个更好的开发者,而且一个知道这些小提示和技巧的人也不见得比你厉害,虽然往往会有这样的错觉。这些小技巧可以使你更高效一点,没有别的。

原文翻译时有改动)

 
共收到 17 条回复
14099

查找方法Ctags更方便

12834

上班还在翻译,可以的!

17

http://sheet.shiar.nl/readline

快捷键不全, 要把 readline 的快捷键都列出来, Terminal 和 irb 都是基于 readline 的.

26688

#2楼 @hemengzhi88 哈哈,空闲时间翻译了下

46

赞,谢谢分享,不过 --no-ri --no-rdoc 已经被 --no-document 替代。 rubygems/History.txt

96

reload! 这个好

1107 jasl 将本帖设为了精华贴 12月03日 00:23
17365

收掌压Ctrl使用shell快捷键很丝滑。

9041

用了IDE,比如RubyMine后,你上面的可以tips可以缩减到几行

20690

很好的小技巧!

990

terminal 里用的是 Emcacs 的 keybinding.

实用的还有Ctrl-f Ctrl-b Alt-f Alt-b 等...

9770

经常忘记_这个方式,学到了

14602

#11楼 @huhongda 能不能分享一下rubymine的实用技巧呢 😆

96

#快速搜索命令行历史记录
Ctrl+S to search forward

13303

我一般使用bundle show gem_name;然后cd过去的方法来看gem的源码,也可以直接在里面调试。

96

赞以下:
_
Rails.application.routes.recognize_path "http://localhost:3000/users/11"
rails console --sandbox
reload!

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册