python - Python 的 Cmd.cmd 中的文件名制表符补全

标签 python cmd tab-completion

我正在使用 Python 的 Cmd.cmd 制作一个命令行工具,我想添加一个带有文件名参数的“加载”命令,它支持制表符完成。

引用 thisthis , 我疯了这样的代码:

import os, cmd, sys, yaml
import os.path as op
import glob as gb

def _complete_path(path):
    if op.isdir(path):
        return gb.glob(op.join(path, '*'))
    else:
        return gb.glob(path+'*')

class CmdHandler(cmd.Cmd):

    def do_load(self, filename):
        try:
            with open(filename, 'r') as f:
                self.cfg = yaml.load(f)
        except:
            print 'fail to load the file "{:}"'.format(filename)

    def complete_load(self, text, line, start_idx, end_idx):
        return _complete_path(text)

这对 cwd 很有效,但是,当我想进入子目录时,在 subdir/之后,complete_load 函数的“文本”变为空白,因此 _complete_path func 再次返回 cwd。

我不知道如何使用 tab-completion 获取子目录的内容。 请帮忙!

最佳答案

您的主要问题是 readline 库根据它的默认定界符集来定界:

import readline
readline.get_completer_delims()
# yields ' \t\n`~!@#$%^&*()-=+[{]}\\|;:\'",<>/?'

当 Tab 完成文件名时,我会删除除空格以外的所有内容。

import readline
readline.set_completer_delims(' \t\n')

设置分隔符后,完成函数的“文本”参数应该更符合您的预期。

这也解决了制表符完成复制部分文本时经常遇到的问题。

关于python - Python 的 Cmd.cmd 中的文件名制表符补全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16826172/

相关文章:

Linux 上的 Python cmd 不会自动完成特殊字符或符号

bash - Bash 制表符完成脚本可以在 zsh 中使用吗?

python - 完全循环具有不同起始索引的列表

python - 以原始样式打印列表

Python3、Boost-Python 和 Cpp 链接器错误

windows - 从 csv 文件中读取并根据第一列值提取某些数据列

batch-file - 批量比较字符串

linux - 在 shell 中自定义制表符补全

python - 如何创建具有可变数字的 unicode 字符?

java - 使用cmd远程java控制台应用程序控制