@@ -1,42 +1,109 @@
---
title: 在 Interactive Ruby (irb) 中清空屏幕
+title_en: How to Clear the Console in Interactive Ruby (irb)
layout: post
permalink: /html/clear-the-irb-console-screen.html
-lang: zh_CN
+lang: zh_CN en
---
-因为强迫症<del>雷达喵</del>的原因,于是有了这两段代码。首先是无空行的版本:
+{% lang zh_CN %}
+因为强迫症<del>雷达喵</del>的原因,于是有了这篇文章。
+{% endlang %}
```ruby
-# -*- fist -*-: Windows / Linux,无回显无空行
+# -*- fist -*-: Windows / Linux, {% l zh_CN %}无回显无空行{% ell en %}w/o echo and empty lines{% el %}
->(a,b,c){x=a.method(b);a.send(c,b){send c,b,&x;false};print"\e[2J\e[H \e[D"}[irb_context,:echo?,:define_singleton_method]
```
-然后是有空行的版本:
+{% lang zh_CN %}
+这玩意儿可以将 IRB 屏幕清理地干干净净,既没有空行也没有 => nil。在 Linux/Windows 上都测试通过。
+{% elselang en %}
+This will fully clear your IRB screen, with no extra empty lines and “=> nil” stuff. Tested on Linux/Windows.
+{% endlang %}
+
+* * *
+
+{% lang zh_CN %}
+这一行可以展开成这样:
+{% elselang en %}
+This one-liner could be expanded as:
+{% endlang %}
```ruby
-# -*- fist -*-: Windows / Linux,无回显有空行
-->(x){def x.inspect;self;end;x}["\e[H\e[2J"]
+# -*- fist -*-: Windows / Linux, {% l zh_CN %}无回显无空行(展开){% ell en %}w/o echo and empty lines (expanded){% el %}
+lambda {
+ original_echo = irb_context.method(:echo?)
+ irb_context.send(:define_singleton_method, :echo?) {
+ send :define_singleton_method, :echo?, &original_echo
+ false
+ }
+ print "\e[2J\e[H \e[D"
+}.call
```
-好了你们玩儿蛋去。然后以下是对 [ruby – How Do You Clear The IRB Console? – Stack Overflow][1] 的部分粗糙翻译。
+{% lang zh_CN %}
+这儿用了不少黑科技呢……
-* * *
+首先,irb 会调用 `echo?` 来判断是否应该回显。我这里先把他存起来,用一个调用之后会恢复他的函数覆盖。当然,覆盖用的函数会返回 false 所以 irb 就不会回显结果了。
+
+然后,打印了几个 ANSI 控制字符。`\e[2J` 用来清屏,`\e[H` 把光标移动到左上角。`{% nbsp %}\e[D` 打印一个空格再马上退回光标,这是用来解决 Windows 上奇怪问题的。
-[楼主 John Topley][2]
-
-你们怎么在 IRB 里清屏?
+总而言之,谁没事会打这么多来清屏啊……不过,把他存进你的 `.irbrc` 里倒是不错。
+{% elselang en %}
+This uses lots of tricks.
+
+Firstly, irb will call `echo?` to check if the result should be printed. I saved the method, then redefined with a method which restores the definition but returns false so irb will not echo the result.
+
+Secondly, I printed some ANSI control chars. `\e[2J` will clean the screen and `\e[H` will move the cursor to the upper left position of the screen. `{% nbsp %}\e[D` will print a space and then move back the cursor while this is a workaround for something strange on Windows.
+
+Finally this is kind of not practical at all except you are saving this code in your `.irbrc`.
+{% endlang %}
* * *
-[106 票 John Topley][3]
-
-在 *Mac OS X* 或 *Linux* 上你可以用 `Ctrl + L` 来清空屏幕。
+{% lang zh_CN %}
+为了干掉空行,确实挺麻烦。但要是只想干掉回显倒是很简单。
+{% elselang en %}
+Whilst it needs really a lot to skip the empty line, it's easy to omit the echo only.
+{% endlang %}
+
+```ruby
+# -*- fist -*-: Windows / Linux {% l zh_CN %}无回显有空行{% ell en %}w/o echo but w/ empty lines{% el %}
+->(x){def x.inspect;self;end;x}["\e[H\e[2J"]
+```
+
+{% lang zh_CN %}
+这一行可以展开成这样:
+{% elselang en %}
+This one-liner could be expanded as:
+{% endlang %}
+
+```ruby
+# -*- fist -*-: Windows / Linux {% l zh_CN %}无回显有空行(展开){% ell en %}w/o echo but w/ empty lines (expanded){% el %}
+lambda {
+ x = "\e[H\e[2J"
+ def x.inspect
+ self
+ end
+ x
+}.call
+```
+
+{% lang zh_CN %}
+<del>好了雷达喵你玩儿蛋去。</del>
+{% endlang %}
* * *
-[29 票 Ben Hoffstein][4]
-
-*Windows* 里,把这个代码丢在 `%userprofile%\.irbrc` 里:
+{% lang en %}
+By the way, you can read this [ruby – How Do You Clear The IRB Console?][srcwa] on Stack Overflow.
+{% elselang zh_CN %}
+然后以下是对 [ruby – How Do You Clear The IRB Console? – Stack Overflow][src] 的部分粗糙翻译。
+
+[楼主 John Topley][2]:你们怎么在 IRB 里清屏?
+
+[106 票 John Topley][3]:在 *Mac OS X* 或 *Linux* 上你可以用 `Ctrl + L` 来清空屏幕。
+
+[29 票 Ben Hoffstein][4]:*Windows* 里,把这个代码丢在 `%userprofile%\.irbrc` 里:
```ruby
def cls
@@ -44,12 +111,8 @@ def cls
end
```
-* * *
+[11 票 TW Scannell][5]:在 *Ubuntu 11.10* 上 `clear` 差不多就行了,只是你会看到 `=> true`,把一切搞得很乱。
-[11 票 TW Scannell][5]
-
-在 *Ubuntu 11.10* 上 `clear` 差不多就行了,只是你会看到 `=> true`,把一切搞得很乱。
-
```
ruby-1.9.2-p290 :007 > system 'clear'
```
@@ -59,17 +122,14 @@ ruby-1.9.2-p290 :007 > system 'clear'
ruby-1.9.2-p290 :007 >
```
+[8 票 AShelly][6]:在 *\*nix* 上 <code>\`clear\`</code> 就行了。有趣的是,在 *Windows* 上用 `system 'cls'` 就行,<code>\`clear\`</code> 却不行。
-* * *
-
-[8 票 AShelly][6]
-
-在 *\*nix* 上 <code>\`clear\`</code> 就行了。
-有趣的是,在 *Windows* 上用 `system 'cls'` 就行,<code>\`clear\`</code> 却不行。
+{% endlang %}
- [1]: http://stackoverflow.com/questions/116593/how-do-you-clear-the-irb-console/116614
+ [src]: http://stackoverflow.com/questions/116593/how-do-you-clear-the-irb-console/116614
+ [srcwa]: http://stackoverflow.com/a/19467325/2724079
[2]: http://stackoverflow.com/q/116593/2724079
[3]: http://stackoverflow.com/a/116595/2724079
[4]: http://stackoverflow.com/a/116603/2724079
[5]: http://stackoverflow.com/a/8402819/2724079
- [6]: http://stackoverflow.com/a/116614/2724079
\ No newline at end of file
+ [6]: http://stackoverflow.com/a/116614/2724079