在 Fish Shell 中获取当前目录(没有完整路径)

Get current directory (without full path) in Fish Shell

我的一个朋友终于让我开始使用 Fish Shell,我正在尝试将其设置为类似于 Bash 的方式。我的 .bash_profile 中的 PS1 列出了我所在的当前目录,后跟 >。但是,它不是绝对路径(例如 /Users/me/Documents/...~/Documents/...)。如果我在 /Users/me/Documents/projects/Go/project1/,提示只会说 project1 >.

Bash 是否有鱼 Shell 替代 \W 替代品?同样,我只想要我所在的文件夹,而不是完整路径。我知道你可以使用 echo (pwd) 来完成所有这些。

我查看了 basename 程序和 echo "${PWD##*/}",但它们似乎只适用于 Bash。

摘自@Jubobs 的回答: basename 只是一个 Unix 实用程序;它与特定的 shell 无关,在 Bash 和 Fish.

中应该同样有效

看来我在错误的上下文中使用了 basename,而且没有后缀。

已使用以下方法解决此问题:

function fish_prompt
    echo (basename $PWD) "><> "
end

替代方案:fish ships 带有一个名为 prompt_pwd 的函数,它将 /Users/me/Documents/projects/Go/project1/ 显示为 ~/D/p/G/project1

function fish_prompt
    echo (prompt_pwd) "><> "
end

prompt_pwd.fish的完整代码如下。您必须将其放在目录 ~/.config/fish/functions/

function prompt_pwd --description "Print the current working directory, shortened to fit the prompt"
    set -q argv[1]
    and switch $argv[1]
        case -h --help
            __fish_print_help prompt_pwd
            return 0
    end

    # This allows overriding fish_prompt_pwd_dir_length from the outside (global or universal) without leaking it
    set -q fish_prompt_pwd_dir_length
    or set -l fish_prompt_pwd_dir_length 1

    # Replace $HOME with "~"
    set realhome ~

    # @EDITED by Thiago Andrade
    set tmpdir (basename $PWD)
    set -l tmp (string replace -r '^'"$realhome"'($|/)' '~' $tmpdir)
    # ORIGINAL VERSION
    # set -l tmp (string replace -r '^'"$realhome"'($|/)' '~' $PWD)

    if [ $fish_prompt_pwd_dir_length -eq 0 ]
        echo $tmp
    else
        # Shorten to at most $fish_prompt_pwd_dir_length characters per directory
        string replace -ar '(\.?[^/]{'"$fish_prompt_pwd_dir_length"'})[^/]*/' '/' $tmp
    end
end

然后你会看到这样的东西

这是我在

中的功能

~/.config/fish/functions/prompt_pwd.fish

这似乎工作正常

function prompt_pwd 
    set -q argv[1]
    and switch $argv[1]
        case -h --help
            __fish_print_help prompt_pwd
            return 0
    end

    set -q fish_prompt_pwd_dir_length
    or set -l fish_prompt_pwd_dir_length 1
    set ttmp $PWD
    set ttmp (string replace -r '^'$HOME'($|/)' '~' $PWD)
    set -l tmp (basename $ttmp)

    if [ $fish_prompt_pwd_dir_length -eq 0 ]
        echo $tmp
    else
        string replace -ar '(\.?[^/]{'"$fish_prompt_pwd_dir_length"'})[^/]*/' '/' $tmp
    end
end