如何让 bash 尊重我的物理目录结构?(Emacs 也一样吗?)

如何让 bash 尊重我的物理目录结构?(Emacs 也一样吗?)

如果在 bash 中我执行“ ”,那么在执行“ ”和“ ”等时, set -Pbash 将遵循“物理目录结构” ,而不是通过符号链接定义的“逻辑目录结构”。不幸的是,bash 仍然不遵循文件名补全的物理目录结构。我怎样才能让 bashpwdcd ..尊重我的权威在这个问题上?

谢谢!
|>ouglas

PS 不幸的是,同样的问题现在也困扰着 Emacs 打开文件等等。如果有人也知道如何告诉 Emacs 尊重我的物理目录结构,那么我也想知道答案。

PPS 我不知道是谁决定让一些程序尝试理解你的“逻辑目录结构”是个好主意,但事实并非如此!除非你能说服世界上每个程序都这样做,因为让一些程序使用你的物理目录结构,而让其他程序使用你的逻辑目录结构,这会引起混乱和烦恼。

答案1

感谢之前的回答。但事实上,“ set -P”本身就可以很好地完成工作,这与我最初对这个问题的疑问相反。

当我最初尝试这个时,我一定是以某种方式让 bash 陷入混乱状态,文件名补全不遵守“ set -P”设置。但现在有了新的 bash,一切正常。“ set -P”似乎在整个 bash 过程中始终将 bash 置于“物理目录结构”模式。

答案2

这可能会帮助你部分实现目标。

使用type -a _expand并将其输出与下面的函数进行比较。现有函数应与下面第一个函数之后的部分匹配。如果不匹配,您可以像这里看到的else那样将已有的内容包装在外部。if...else

将其粘贴到 Bash 提示符下进行测试。然后,如果您满意,请将其放入文件~/.bashrc中以覆盖函数定义/etc/bash_completion(而不是直接编辑它)。

_expand ()
{
    if [[ $- == *P* && -L "$cur" && -d "$cur" ]]; then
        cd "$cur";
        eval cur="$PWD";
        cd - > /dev/null;
    else
        if [[ "$cur" == \~*/* ]]; then
            eval cur=$cur;
        else
            if [[ "$cur" == \~* ]]; then
                cur=${cur#\~};
                COMPREPLY=($( compgen -P '~' -u $cur ));
                [ ${#COMPREPLY[@]} -eq 1 ] && eval COMPREPLY[0]=${COMPREPLY[0]};
                return ${#COMPREPLY[@]};
            fi;
        fi;
    fi
}

这是利用了 Bash 的制表符补全的波浪号扩展功能。

现在你可以做

ls -l symdir<TAB>

你会看到

ls -l /dest/dir<CURSOR>

相关内容