如何阻止 rlwrap --remember 在完成列表中包含版本和版权信息?

How do I stop rlwrap --remember from including version and copyright messages in the completion list?

假设我像这样使用 rlwrap:rlwrap --remember sml。这将启动新泽西州标准 ML:

Standard ML of New Jersey v110.79 [built: Sat Oct 26 12:27:04 2019]
- 

如果我在提示符下输入Jer,然后按Tab,rlwrap 会补全到Jersey 。我只想完成我输入的代码,而不是包含版本信息(and/or 版权信息)的行。使用 --remember?

时,有没有办法从 rlwrap 的完成中排除这些行

这超出了“香草”rlwrap 的能力。但是,您可以使用 rlwrap filter

轻松实现您想要的效果

一个 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 的许多用例中,您可能希望限制进入完成列表的内容。如果是这样,这就是做到这一点的方法。