2012-02-09 13 views
9

我想用一個自定義的erlang repl來使用rlwrap。rlwrap是否可以使用包裝命令自己的TAB完成?

如果我將它作爲「rlwrap -a myrepl」運行,它會很好地工作。

問題是,myrepl內置tab選項卡完成,它被rlwrap踩踏。

我要讓rlwrap釋放TAB鍵

+0

什麼是myrepl?這是一個erlang問題還是perl/rlwrap問題? – Isac 2012-02-09 15:30:21

+0

對我來說,使用rlwrap的好處大於Erlang自動完成的值。我無法讓他們一起工作,所以我使用「rlwrap erl -oldshell」。 – alavrik 2012-02-09 16:30:06

回答

18

不能使用rlwrap的行編輯/歷史,並在同一時間你REPL的TAB完成。

rlwrap爲不具備的命令提供了線編輯,歷史記錄和(非常簡單)的完成。一個與TAB完成相似的命令應該不需要rlwrap來執行其行編輯,如果它?

-a--always-readline)選項是替代的一種相當粗糙的方式。rlwrap的行編輯行爲適用於您的命令。它主要用於具有非常簡單的行編輯器的命令,命令歷史記錄

如果你想,因爲你喜歡rlwrap的裝飾性(如持續的歷史,或彩色提示)使用-a選項將命令的(如TAB完成),繼續前進,但它是不可能挑選一些花式一個,並保持其他一些。

這是(小)價格計劃(及其用戶)必須支付避免readline庫和它隨附的GPL許可證。

漢斯(rlwrap作者)


編輯(2017年4月):

在許多情況下,將有可能使用filter恢復完成。有關此示例,請參閱A node shell based on readline

+3

Erlang shell具有TAB完成功能,但在其他幾個區域缺少。會話之間沒有歷史記錄,線路編輯功能有限等 – 2012-02-10 08:28:37

+0

@Hans你是否看到任何原因,如果我改變rlwrap的源代碼並從特殊鍵中刪除TAB,或者將它重新連接到其他某個鍵,我不會得到這個工作?沒有時間嘗試,但我利用你的回覆我的帖子。 – 2012-02-25 12:38:55

+6

@ Gabriel:從「特殊鍵」中刪除TAB是不夠的,這隻會給你一個死的TAB鍵。真正需要做的是TAB清除底層命令的輸入緩衝區,將當前的readline輸入緩衝區傳遞給它,定位它的光標,然後傳遞TAB,分析結果輸出(包括光標移動命令),最後填充readline輸入緩衝區並相應地設置rl_point。 所有這些步驟都很困難且容易出錯;特別是解析你的命令的輸出將需要rlwrap包含一個虛擬終端仿真器。 – 2012-02-26 14:37:27

0

Rlwrap很可愛。但是在Erlang中,它只提供持續的歷史記錄,同時打破erl的選項卡完成。

最根本的問題是Erlang的erl REPL只是陳舊,並且沒有遵循正常的* nix約定。此外,他們拒絕解決這個問題,因爲他擔心那些無法接受任何改變的隨機,粗暴的系統管理員。沒有任何rlwrap「duct-tape」黑客可以修復糟糕的UX REPL。

從頭開始編寫REPL(比如pry/ipython/etc)會更好(儘管工作量要多得多)。可配置顏色,製表符完成,持久歷史記錄,分頁,CLI觀察器,插件等。

Rlwrap在具有原始外殼的程序上發光。

+0

我認爲你對「隨機,粗暴的系統管理員」過於苛刻,並且高估使用優秀的'readline'庫的難度。這些舊的和破壞的REPL的主要原因是'readline'的GPL許可證:使用'readline'意味着你的程序必須是GPL。從四分之一世紀以前,請參閱[電子郵件交換](http://clisp.cvs.sourceforge.net/viewvc/clisp/clisp/doc/Why-CLISP-is-under-GPL) - 可能是第一批GPL強制執行,其中'readline'起了關鍵作用。 – 2017-04-23 21:22:27

相關問題