我编写了一个简单的类shell程序,它使用readline来提供参数的智能完成。我希望该机制支持具有空格的参数,并引用它们作为一个参数(如同提供shell一样)。
我已经看到shlex.split()知道如何解析引用的参数,但是如果用户想要完成中间键入它会失败(例如:'complete'Hello'会导致异常抛出时由于报价不平衡而传递给shlex。
是否有执行此操作的代码?
谢谢!
答案 0 :(得分:2)
我不知道该任务的任何现有代码,但如果我这样做,我会捕获异常,尝试添加假尾随引用,并查看shlex.split如何处理如此修改的字符串。
答案 1 :(得分:0)
GNU Readline允许使用变量rl_completer_quote_characters
的情况。不幸的是,Python不会在标准库的readline
模块上导出该选项(即使在撰写本文时最新的3.7.1上)。
不过,我找到了一种使用ctypes
的方法:
import ctypes
libreadline = ctypes.CDLL ("libreadline.so.6")
rl_completer_quote_characters = ctypes.c_char_p.in_dll (
libreadline,
"rl_completer_quote_characters"
)
rl_completer_quote_characters.value = '"'
请注意,这显然是不可移植的(可能甚至在Linux发行版之间,因为libreadline版本是硬编码的,但是我的计算机上没有普通的libreadline.so
),因此您可能必须针对环境进行调整
另外,就我而言,我仅将双引号设置为完成功能的特殊字符,因为这是我的用例。
参考
答案 2 :(得分:0)
为了让@caxcaxcoatl 的回答更便携一点,readline 硬编码版本可以用 readline.__file__
替换,它将是:
import ctypes
import readline
libreadline = ctypes.CDLL (readline.__file__)
rl_completer_quote_characters = ctypes.c_char_p.in_dll (
libreadline,
"rl_completer_quote_characters"
)
rl_completer_quote_characters.value = '"'