在 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
我的一个朋友终于让我开始使用 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