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

rennyallen · December 02, 2016 · Last by jjfujj replied at February 13, 2017 · 8488 hits
Topic has been selected as the excellent topic by the admin.

前言

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

快速搜索命令行历史记录

我真的很难记住一些命令,特别是那些有一大堆参数的。而且有时候更烦,你不得不停下来然后又去 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.

总结

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

原文翻译时有改动)

查找方法 Ctags 更方便

上班还在翻译,可以的!

http://sheet.shiar.nl/readline

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

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

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

reload! 这个好

jasl mark as excellent topic. 03 Dec 00:23

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

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

很好的小技巧!

terminal 里用的是 Emcacs 的 keybinding.

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

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

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

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

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

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

You need to Sign in before reply, if you don't have an account, please Sign up first.