概要
ターミナルのプロンプト表示でカレントディレクトリ表示
user@host:~/Projects/foo/bar/workspace/src$
を 任意のディレクトリからの相対パス を使って
user@host:workspace/src$
みたいに短くしたい。
背景
ターミナルのプロンプトに表示されるカレントディレクトリが長くなって見辛くなることってあるあるだと思います。Bashであれば PS1
という環境変数の中の \w
を \W
に変更することで、絶対パスではなくカレントディレクトリ名だけにすることができます。しかし、ディレクトリ名だけになってしまうとそれはそれでどこだかわかりにくって問題もあります。
そこで、ワークスペースのルートディレクトリからの相対パスを表示するようにできたらちょうど良さそうと考え、本記事ではその実現方法を記します。
手順
1. 環境変数 PS1
を変更する
~/.bashrc に以下を記述します。 WORKSPACE_FOLDER
は好きな名前に変更可能です。
function rpath() {
if [[ -n "$WORKSPACE_FOLDER" && "$PWD/" == "$WORKSPACE_FOLDER/"* ]]; then
local workspaceBase=${WORKSPACE_FOLDER%/*}
echo -n "${PWD#$workspaceBase/}"
else
# ワークスペース外の場合は絶対パス(ホームディレクトリは~に置き換え)
echo -n "${PWD/$HOME/\~}"
fi
}
PS1='`rpath`\$ ' # プロンプト文字列は個人の好みで調整する
PS1
の中身はシングルクォートで囲った文字列にしてください。これは環境変数 PS1
が評価される度に rpath
が再評価される必要があるからです。もしダブルクォートだと ~/.bashrc が読み込まれるタイミングの1回だけしか評価されず、ディレクトリを移動してもプロンプト表示が最初から変わってくれません。ダブルクォートにする場合は PS1="\
rpath`$ " のようにエスケープしましょう。
2. .bashrc を再読み込みする
以下のコマンドで ~/.bashrc を再読み込みします。
source ~/.bashrc
3. 環境変数 WORKSPACE_FOLDER
を設定する
以下のコマンドで現在のディレクトリをワークスペースのルートディレクトリとして環境変数 WORKSPACE_FOLDER
を設定します。
export WORKSPACE_FOLDER=$(pwd)
Visual Studio Codeのターミナルであれば、ユーザーの settings.json かワークスペースの .vscode/settings.json に以下を設定することで自動でワークスペースのルートディレクトリが環境変数 WORKSPACE_FOLDER
に設定できます。 1
{
"terminal.integrated.env.linux": {
"WORKSPACE_FOLDER": "${workspaceFolder}"
},
}
試すとこんな感じ
手順1を済ませた前提。
~$ source ~/.bashrc
~$ pwd
/home/vscode
~$ mkdir -p foo/bar/workspace/src
~$ cd foo/bar/workspace/
~/foo/bar/workspace$ export WORKSPACE_FOLDER=$(pwd)
workspace$ cd src/
workspace/src$
workspace/src$ cd ../../
~/foo/bar$
WORKSPACE_FOLDER
より親の階層に行ったら \w
と同じように絶対パスになります。
おまけ
WORKSPACE_FOLDER
より親の階層に行っても workspace/..
のように相対パスを貫きたい場合は rpath
関数を以下のように書き換えてみてください。
function rpath() {
local relativePath=$(realpath --relative-to "$WORKSPACE_FOLDER" "$PWD" 2>/dev/null)
if [[ -z "$WORKSPACE_FOLDER" || -z "$relativePath" ]]; then
# WORKSPACE_FOLDERが未設定または不正な場合は絶対パス(ホームディレクトリは~に置き換え)
echo -n "${PWD/$HOME/\~}"
return
fi
local workspaceFolderName=${WORKSPACE_FOLDER##*/}
if [[ "$relativePath" == "." ]]; then
echo -n "$workspaceFolderName"
else
echo -n "$workspaceFolderName/$relativePath"
fi
}
~/.bashrc を編集して再読み込みすると
workspace$ source ~/.bashrc
workspace$ cd src/
workspace/src$ cd ../..
workspace/..$ mkdir -p workspace2/lib
workspace/..$ cd workspace2/lib
workspace/../workspace2/lib$
こんな感じでワークスペースの親、兄弟ディレクトリに行っても相対パスで表示できます。