0

现在,我在 Python 2.7 中运行以下代码:

import readline as rl
rl.parse_and_bind('set editing-mode vi') #allow for arrow keys to be used
rl.set_completer()
raw_input()

据此,应该删除完成器功能,我认为rl.set_completer()会使选项卡正常工作。但是,tab 键根本不起作用。

我也尝试过编写自己的函数并将其作为完成者传递,但这也不起作用。(如果有人能找到一种方法来使 Tab 键正常工作,那也足够了。)

我如何获得使用箭头键的能力raw_input,但也有一个普通的标签?

4

2 回答 2

0

您可以使用

#allow for arrow keys to be used for raw_input.
readline.parse_and_bind('set editing-mode vi') 

#set the tab key to make 4 spaces
readline.parse_and_bind("TAB: '    '")

由于某种原因,使用readline.parse_and_bind("TAB: '\t'")导致 Python 使用过多的 CPU 并且只会冻结屏幕,所以我不得不将其切换为使用空格。

于 2016-07-08T22:09:45.533 回答
0
rl.set_completer()

删除完成函数,但不删除 TAB 绑定。所以标签被吃掉了,但是当标签被传递给“无函数”时,什么也没做。

readline.parse_and_bind("TAB: '\t'")

导致对底层完成函数的无限调用。

Read TAB -> Return TAB -> Read TAB …

最简单的方法,至少在这里测试的时候,是使用默认的emacs模式。如果仅导入readline而不设置任何内容,则read_raw适用于箭头键,并且 TAB 会导致 TAB。

如果这不是一个选项,请设置自定义完成函数。(适用于 Python 3)。这也很可能是更安全的选择。

如果按 TAB 键,则会调用完成函数。对于一个TAB 键,state参数开始于0并在每次调用函数时递增。当我们返回TAB时,检查 state 是很重要的0否则它将被一次又一次地调用。

我们还必须返回文本(如果有),否则它会被readline.

简单的例子:

#!/usr/bin/env python2.7

import readline

def rl_tab_expander():
    def completer(txt, state):
        if state == 0:
            return txt + '\t'

    return completer

readline.set_completer(rl_tab_expander())
readline.parse_and_bind('set editing-mode vi')

while 1:
    inp = raw_input("$ ")
    if inp.strip() in ('exit', 'q', 'quit'):
        break

检查原始测试

您可以使用日志文件。在这里,我们看看如果我们返回 TAB 或者如果我们不state按照上面的示例进行检查,完成函数中会发生什么。我们将限制设置为state25,否则它将继续无限。

在一个控制台窗口中运行脚本并在另一个控制台窗口中执行tail -f /tmp/test-readline.log

#!/usr/bin/env python2.7

import readline
import logging

logging.basicConfig(filename = '/tmp/test-readline.log', level = logging.DEBUG)

def rl_tab_expander():
    def completer(txt, state):
        logging.debug("STATE: %2d TXT: %s", state, repr(txt))
        if state > 24:
            return None
        return txt + '\t'

    return completer

readline.set_completer(rl_tab_expander())
readline.parse_and_bind('set editing-mode vi')

while 1:
    inp = raw_input("$ ")
    if inp.strip() in ('exit', 'q', 'quit'):
        break

结果

DEBUG:root:STATE:         0 TXT: ''
DEBUG:root:STATE:         1 TXT: ''
DEBUG:root:STATE:         2 TXT: ''
...
DEBUG:root:STATE:        24 TXT: ''
DEBUG:root:STATE:        25 TXT: ''

在不限制state级别的情况下,这将一直持续到程序被杀死或者如果我们按下 Ctrl+C 并幸运的话。

于 2019-10-06T19:58:17.803 回答