Bash完成使’cd’命令从其他正在运行的shell中完成工作目录?
我正在尝试编写一个bash完成,它将让我完成其他
shell所在的目录名称.
例如,假设我在/ very / long / path / name中打开了另一个shell,我目前在一个包含子目录foo和bar的目录中.当我输入cd< Tab>时,我想看到: $cd <Tab> foo/ bar/ /very/long/path/name 我有这个命令来生成潜在的完成列表: ps -Cbash -opid= | xargs pwdx | cut -d" " -f2 | sort -u | while read; do echo ${REPLY#$PWD/}; done | grep -v "^$" 为简洁起见,我将其写为……管道…. 在我的系统上有一个_cd函数可以产生常规完成: $complete -p cd complete -o nospace -F _cd cd 我想重用这个_cd函数,因为它非常重要(根据类型_cd,约30行代码).如果解决方案重用已经定义的任何完成,则奖励点,无论它是否基于名为_cd的函数. 我认为-C选项完成听起来很有希望,但我无法让它工作: $complete -C '...pipeline...' cd $cd <Tab>grep: cd: No such file or directory grep: : No such file or directory grep: cd: No such file or directory 为-F编写我自己的包装函数,它附加到COMPREPLY数组,也不是很有效: $function _cd2() { _cd; COMPREPLY=( ${COMPREPLY[@]} $(...pipeline...) ); } $cd <Tab> foo/ bar/ name/ 它剥离除了最后一个之外的所有路径组件.我认为它必须是由_cd设置的,这样做,但我不知道如何抵消它. 如果我从_cd2中删除_cd调用,我确实看到了完成,但它们没有正确完成部分目录名称.如果我输入cd / ve< Tab>,它仍会显示完整路径,而不会实际完成我的命令行. 我怎样才能做到我想要的呢? 附录:_cd的完整定义: $type _cd _cd is a function _cd () { local cur prev words cword; _init_completion || return; local IFS=' ' i j k; compopt -o filenames; if [[ -z "${CDPATH:-}" || "$cur" == ?(.)?(.)/* ]]; then _filedir -d; return 0; fi; local -r mark_dirs=$(_rl_enabled mark-directories && echo y); local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories && echo y); for i in ${CDPATH//:/' '}; do k="${#COMPREPLY[@]}"; for j in $( compgen -d $i/$cur ); do if [[ ( -n $mark_symdirs && -h $j || -n $mark_dirs && ! -h $j ) && ! -d ${j#$i/} ]]; then j+="/"; fi; COMPREPLY[k++]=${j#$i/}; done; done; _filedir -d; if [[ ${#COMPREPLY[@]} -eq 1 ]]; then i=${COMPREPLY[0]}; if [[ "$i" == "$cur" && $i != "*/" ]]; then COMPREPLY[0]="${i}/"; fi; fi; return 0 } 解决方法
您需要根据组合选项列表评估当前匹配.这是一个测试脚本,用于说明移动部件:
#!/bin/bash mkdir -p {my,other}/path/to/{a,b,c} function _cd() { COMPREPLY=( my/path/to/a my/path/to/b ); } complete -o nospace -F _cd cd function _cd2() { local cur opts; cur="${COMP_WORDS[COMP_CWORD]}"; _cd; opts="${COMPREPLY[@]} other/path/to/c"; # here we combine options COMPREPLY=($(compgen -W "${opts}" -- ${cur})); # here is the secret sauce } complete -F _cd2 cd complete -p cd 最重要的一点是_cd2的compgen部分:从组合的选择集中选择最合适的选项(在$opts中). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |