我有同样的愿望,我使用了一段时间的解决方案是通过gnome-terminal --tab --working-directory="$FOLDER"从command_not_found句柄内部发出命令在 gnome 终端中打开一个新选项卡。
但是今天我提出了一个解决方案,它不依赖于特定的终端应用程序,但具有完全预期的行为。
该解决方案使用PROMPT_COMMAND, 在每个提示之前运行。绑定到一个函数,该PROMPT_COMMAND函数负责检查与当前 shell 相关的文件,并 cd'ing 进入该文件中指定的目录。
然后,command_not_found_handle当需要更改目录时填充文件。command_not_found_handle如果当前目录是 git 存储库并且名称与现有分支匹配,我的原始版本也会签出 git 分支。但是为了继续专注于回答当前的问题,我已经剥离了那部分代码。
command_not_found_handle用于搜索与给定名称匹配的find目录,并且从配置的列表开始,在目录树中仅深入 2 级。
要添加的代码bash_rc如下:
PROMPT_COMMAND=current_shell_cd
CD_FILE="${XDG_CACHE_HOME:-$HOME/.cache}/bash-cd/$$.cd"
current_shell_cd() {
if [ -r "$CD_FILE" ]; then
local CD_TARGET="$( cat "$CD_FILE" )"
[ ! -z "$CD_TARGET" ] && cd "$CD_TARGET" 2>/dev/null
rm "$CD_FILE"
fi
}
command_not_found_handle () {
local COMMAND="$1";
# List folders which are going to be checked
local BASE_FOLDER_LIST=(
"$HOME/Desenvolvimento"
"/var/www/html"
"$HOME/.local/opt/"
)
local FOLDER=$(
find "${BASE_FOLDER_LIST[@]}" \
-maxdepth 2 -type d \
-iname "$COMMAND" -print -quit )
if [ ! -z "$FOLDER" -a -d "$FOLDER" ]
then
mkdir -p "$( dirname "$CD_FILE" )"
echo "$FOLDER" > "$CD_FILE"
else
printf "%s: command not found\n" "$1" 1>&2
return 127
fi
}