假设我像这样使用 rlwrap: rlwrap --remember sml
。这将启动新泽西标准机器学习:
Standard ML of New Jersey v110.79 [built: Sat Oct 26 12:27:04 2019]
-
如果我Jer
在提示符下输入并按Tab,rlwrap 将完成它到Jersey
. 我只想完成我输入的代码,而不是包含版本信息(和/或版权信息)的行。有没有办法在使用时从 rlwrap 的完成中排除这些行--remember
?
假设我像这样使用 rlwrap: rlwrap --remember sml
。这将启动新泽西标准机器学习:
Standard ML of New Jersey v110.79 [built: Sat Oct 26 12:27:04 2019]
-
如果我Jer
在提示符下输入并按Tab,rlwrap 将完成它到Jersey
. 我只想完成我输入的代码,而不是包含版本信息(和/或版权信息)的行。有没有办法在使用时从 rlwrap 的完成中排除这些行--remember
?
这超出了“香草”的能力rlwrap
。但是,您可以使用过滤器轻松实现您想要的rlwrap
过滤器定义了一个rlwrap
或多个回调(“处理程序”),这些回调(“处理程序”)被包装程序的输入和输出行调用。然后过滤器可以修改这些,或者(在您的情况下)将它们输入“完成列表”(可能的完成列表)。这使得微调要完成的内容成为可能:
#!/usr/bin/env python3
"""A demo filter dat does the same as rlwrap's --remember option
with a few extra bells and whistles
Save this script as 'remember.py' sowewhere in RLWRAP_FILTERDIR and invoke as follows:
rlwrap -z remember.py sml
N.B. Don't use the --remember option in this case!
"""
import sys
import os
if 'RLWRAP_FILTERDIR' in os.environ:
sys.path.append(os.environ['RLWRAP_FILTERDIR'])
else:
sys.path.append('.')
import rlwrapfilter
filter = rlwrapfilter.RlwrapFilter()
filter.help_text = "Usage: rlwrap [-options] -z remember.py <command>\n"\
+ "a filter to selectively add <command>s in- and output to the completion list "
def feed_into_completion_list(message):
for word in message.split():
filter.add_to_completion_list(word)
# Input handler: use everything
def handle_input(message):
feed_into_completion_list(message)
return message
filter.input_handler = handle_input
# Output handler: use every output line not containing "Standard ML ..."
def handle_output(message):
if "Standard ML of New Jersey" not in message:
feed_into_completion_list(message)
return message
filter.output_handler = handle_output
# Start filter event loop:
filter.run()
在许多用例中,--remember
您可能希望限制进入完成列表的内容。如果是这样,这就是这样做的方法。