0

假设我像这样使用 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

4

1 回答 1

0

这超出了“香草”的能力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您可能希望限制进入完成列表的内容。如果是这样,这就是这样做的方法。

于 2021-10-22T15:30:40.630 回答