2016-07-29 47 views
20

IPython的新版本不再依賴於readline,而是使用純Python庫prompt-toolkit,解決了Apple和Windows系統上的維護問題。IPython 5.0和控制檯中的鍵綁定

一個新功能是可以編輯多行代碼塊,使用光標鍵在代碼塊中自由移動 - 具有這種功能,至少對我而言,這是一個問題:因爲ret插入代碼中的一個新的生產線,整個塊傳遞給你要使用快捷鍵ALT + RET 可能是不太方便的按鍵順序ESC其次RET解釋。

我說,這是一個問題,因爲選擇我的終端仿真器是xterm和,很多Linux發行版,快捷ALT + RET不傳遞給應用程序,但它直接使用運行IPython的XTerm,切換所述終端的屏幕填充(@ThomasDickey,xterm的mantainer和共同作者指出,默認情況下,xterm不關心向應用程序發送Enter上的修飾符位當一個解除全屏幕動作時)。

由於這個原因,我想修改至少這個特定的IPython鍵綁定。

我發現IPython的不適用於新的5.0版本的previouos版本,基於readline的版本的說明(排序)。

我需要的是說明,它使我能夠在IPython的用戶文檔中找到可以綁定的可能操作的名稱,綁定操作的快捷方式的名稱以及配置新的密鑰綁定。

未能有這種類型的典型答案,我可以很樂意與配方來完成這個特定的鍵綁定,用這個配方仍然工作在IPython的6.0

+3

我大多都贊成你,因爲你教過我可以擊中'esc'退出編輯模式來執行命令! :) –

+2

在這個問題上獲得了30分(我迄今爲止的最好成績),我覺得有必要在這個問題上投入一點信譽 – gboffi

+3

+1教我說'alt + return'技巧! – wim

回答

4

您可以更改xterm的配置。

xterm可配置(並記錄)。在xterm的手冊中,Default Key Bindings部分顯示該鍵的默認綁定:

     Alt <Key>Return:fullscreen() \n\ 

可以抑制,在不止一種方法綁定:使用

  • omitTranslation資源打壓功能
  • fullscreen資源設置爲never

然而,僅僅抑制它不會使它發送一些有趣的東西(的xterm忽略修飾符輸入)。設置一個translation資源的作品,例如,在你的$HOME/.Xdefaults文件:

*VT100*translations:  #override \n\ 
    Alt <Key>Return: string("\033[27;3;13~") 
+0

Thomas,你的回答很有用,謝謝。如果IPython被記錄爲xterm以及xterm,那麼我會非常高興...... 1000謝謝你對xterm的評價。再見 – gboffi

2

CTRL + j中的條件ctrl + m鍵盤快捷鍵正在驗證條目。

+0

謝謝你的回答。 ctrl + j或ctrl + m快捷鍵與RET afaict完全相同。當您編輯多行代碼塊時,所有這些快捷方式都會在當前光標位置插入一個換行符,而alt + RET或序列Esc RET將強制執行代碼塊,而不考慮光標的位置。如果您認爲問題的這方面不夠清楚,我可以嘗試編輯我的問題。 – gboffi

+0

我正在使用Windows,並在我的控制檯Esc RET和ctrl + j或ctrl + m做同樣的事情:執行block.-,alt RET什麼也沒做,RET插入一個新行。你有另外的經歷嗎?你在使用什麼操作系統(Windows,Linux,Mac OS)? –

0

使用prompt_toolkit時修改鍵盤快捷鍵的配置是(還)沒有可能的;儘管如果從源代碼安裝IPython會很容易。如果您查看文件IPython/terminal/shortcuts.py,您會看到它包含各種邏輯;特別是,你會發現:

# Ctrl+J == Enter, seemingly 
registry.add_binding(Keys.ControlJ, 
        filter=(HasFocus(DEFAULT_BUFFER) 
          & ~HasSelection() 
          & insert_mode 
        ))(newline_or_execute_outer(shell)) 

此綁定CTRLJ(回車)功能newline_or_execute_outer負責增加新的線路;它在文件後面定義。特別是如果您在代碼塊的末尾按兩次輸入,它應該執行該塊而不需要使用任何其他快捷方式。

地帶,增加了新線的邏輯:

def execute_outer(shell): 
    def execute(event): 
     """When the user presses return, insert a newline or execute the code.""" 
     b = event.current_buffer 

     # some logic to also dismiss the completer 

     b.accept_action.validate_and_handle(event.cli, b) 
    return execute 

綁定它周圍線20出頭:

registry.add_binding(Keys.ControlE, 
        filter=(HasFocus(DEFAULT_BUFFER) 
          & ~HasSelection() 
          & insert_mode 
        ))(execute_outer(shell)) 

和享受。如果您對文檔不滿意,歡迎提供幫助;例如,把答案的主旨放在那裏,然後回饋給他們。這是一個有點傷人閱讀苛刻的評論,當我們在發行說明中也說:

New terminal interface 

The overhaul of the terminal interface will probably cause a range of minor 
issues for existing users. This is inevitable for such a significant 
change, and we’ve done our best to minimise these issues. Some changes that 
we’re aware of, with suggestions on how to handle them: 

IPython no longer uses readline configuration (~/.inputrc). We hope that 
the functionality you want (e.g. vi input mode) will be available by 
configuring IPython directly (see Terminal IPython options). If something’s 
missing, please file an issue. 

... 

實際上幫助改善IPython的有與動作名稱配置按鍵綁定也可以理解,這樣的話你就可以回答你自己的問題。