3

每次进入新目录(使用 cd 时)时,我都想更改标题,但只显示最后 2 个目录。我tcsh在工作和bash家里使用。例如:如果我在文件夹中~/work/stuff并写:cd 1.1,我希望我的新标题是stuff/1.1

我已经知道每次更改文件夹时如何更改标题:

alias cd 'cd \!*; echo "\033]0;`pwd`\a"'

而且我知道如何只获取最后两个目录:

pwd | awk -F / -v q="/" '{print $(NF-1)q$NF}'

问题是如何将这两者结合起来,或者如何以不同的方式做到这一点?它不必通过 cd 的别名。

4

2 回答 2

2

我所做的是使用以下代码创建一个名为 titleRename.tcsh 的脚本文件:

#!/bin/tcsh -f

set fullpath = "`pwd`\a"
set newTitle = `echo $fullpath | awk -F / '{OFS="/"; if(NF > 2){printf $(NF-2);printf "/"; printf $(NF-1); printf "/"; print $NF;}else print $0}'`
echo "\033]0;$newTitle"

它用 awk 拆分 pwd,只获取最后 3 个目录,然后打印到选项卡名称。然后我在 .alias 文件中添加了以下内容:

alias cd    'cd \!*; <dir of script file>/titleRename.tcsh'

现在,每当我 cd 到不同的目录时,标题名称都会自动更改:)

于 2013-12-01T14:07:21.877 回答
1

我最初认为您应该能够在别名中有反引号的地方使用完整的命令,即:

alias cd 'cd \!*; echo "\033]0;`pwd | awk -F / -v q="/" '{print $(NF-1)q$NF}'`\a"'

但现在我意识到嵌套引用可能存在问题。无论如何,这在 bash 中是行不通的;我认为没有办法访问别名中的命令参数。

而不是别名 cd 您应该使用提示更新标题。我不知道 tcsh,但在 bash 中,做这种事情的正常方法是使用特殊的伪变量 PS1:

# Minimalist prompt
PS1="\$ "
# Additionally set terminal title to cwd
case "$TERM" in
xterm*|rxvt*)
    PROMPT_DIRTRIM=2
    PS1="\033]0;\w\a$PS1"
    ;;
*)
    ;;
esac

这不会像您那样修剪目录名称,但不幸的是,我无法获得能够在 PROMPT_COMMAND 中使用转义序列的引用权。

于 2013-09-11T15:50:56.547 回答