停用 readline 自动完成
Deactivate readline autocompletion
我试图在使用后停用 readline 自动完成功能。因此我想写一个这样的装饰器:
#!python
from contextlib import contextmanager
import readline
def main():
with readline_autocompletion():
raw_input('first: ')
raw_input('second: ')
@contextmanager
def readline_autocompletion():
readline.parse_and_bind('tab: complete')
readline.set_completer_delims(' \t\n')
readline.set_completer(None)
yield
# How to unload autocompletion without this hack??
readline.set_completer(no_complete)
def no_complete(text,state):
return None
if __name__ == '__main__':
main()
如何再次停用第二个 raw_input()
的 readline 自动完成功能?
编辑
我现在设法通过设置一个仅执行 return None
的完成器来停用完成(参见上面的代码)。这是真的为了再次停用自动完成的方式吗?感觉像黑客。
调用 readline.parse_and_bind('tab: complete')
后,TAB 被映射到执行完成的函数上。如果未设置自定义完成器,则使用默认系统文件完成。有比定义自定义存根函数来更改完成行为更好的解决方案。
TAB键可以像以前一样插入自身(TAB符号)'tab: complete'
绑定:
readline.parse_and_bind('tab: self-insert')
有关详细信息,请考虑 python readline 模块基于 GNU Readline 库(in case of OS X it may be libedit
). So, the documentation for the library can explain the function parse_and_bind
. Here the most interesting part is "Readline Init File"。函数 parse_and_bind
将其输入字符串作为 Readline Init 文件传递。
可以设置各种变量的值或将不同的功能绑定到键上。
例如,disable-completion
变量应作为 'tab: self-insert'
:
If set to On
, Readline will inhibit word completion. Completion
characters will be inserted into the line as if they had been mapped
to self-insert. The default is off
.
然而,这并不完全正确。在当前的库源码(readline-6.3)中可以看到。如果变量 disable-completion
设置为 on
,则 complete
函数(绑定到 tab
)总是插入按下的键的符号。但是,self-insert
仅在 insert
模式下插入符号。在 overwrite
模式下,它会覆盖光标位置的符号。例如,绑定到 Ctrl-a
键函数切换覆盖模式,set disable-completion on
并保持 complete
绑定到 tab
:
readline.parse_and_bind('tab: complete')
readline.parse_and_bind('set disable-completion on')
readline.parse_and_bind('C-a: overwrite-mode')
起初,Tab 键与 'tab: self-insert'
的作用相同。然而,在按下 Ctrl-a
之后,覆盖模式被启用。现在 Tab 键仍然插入制表符,但在 self-insert
的情况下,Tab 键会覆盖符号。
我试图在使用后停用 readline 自动完成功能。因此我想写一个这样的装饰器:
#!python
from contextlib import contextmanager
import readline
def main():
with readline_autocompletion():
raw_input('first: ')
raw_input('second: ')
@contextmanager
def readline_autocompletion():
readline.parse_and_bind('tab: complete')
readline.set_completer_delims(' \t\n')
readline.set_completer(None)
yield
# How to unload autocompletion without this hack??
readline.set_completer(no_complete)
def no_complete(text,state):
return None
if __name__ == '__main__':
main()
如何再次停用第二个 raw_input()
的 readline 自动完成功能?
编辑
我现在设法通过设置一个仅执行 return None
的完成器来停用完成(参见上面的代码)。这是真的为了再次停用自动完成的方式吗?感觉像黑客。
调用 readline.parse_and_bind('tab: complete')
后,TAB 被映射到执行完成的函数上。如果未设置自定义完成器,则使用默认系统文件完成。有比定义自定义存根函数来更改完成行为更好的解决方案。
TAB键可以像以前一样插入自身(TAB符号)'tab: complete'
绑定:
readline.parse_and_bind('tab: self-insert')
有关详细信息,请考虑 python readline 模块基于 GNU Readline 库(in case of OS X it may be libedit
). So, the documentation for the library can explain the function parse_and_bind
. Here the most interesting part is "Readline Init File"。函数 parse_and_bind
将其输入字符串作为 Readline Init 文件传递。
可以设置各种变量的值或将不同的功能绑定到键上。
例如,disable-completion
变量应作为 'tab: self-insert'
:
If set to
On
, Readline will inhibit word completion. Completion characters will be inserted into the line as if they had been mapped to self-insert. The default isoff
.
然而,这并不完全正确。在当前的库源码(readline-6.3)中可以看到。如果变量 disable-completion
设置为 on
,则 complete
函数(绑定到 tab
)总是插入按下的键的符号。但是,self-insert
仅在 insert
模式下插入符号。在 overwrite
模式下,它会覆盖光标位置的符号。例如,绑定到 Ctrl-a
键函数切换覆盖模式,set disable-completion on
并保持 complete
绑定到 tab
:
readline.parse_and_bind('tab: complete')
readline.parse_and_bind('set disable-completion on')
readline.parse_and_bind('C-a: overwrite-mode')
起初,Tab 键与 'tab: self-insert'
的作用相同。然而,在按下 Ctrl-a
之后,覆盖模式被启用。现在 Tab 键仍然插入制表符,但在 self-insert
的情况下,Tab 键会覆盖符号。