Powerline、Oh My Posh、Starship、あなたに合うプロンプトはどれ?
はじめに
Linux や macOS のターミナルを開くと、コマンドを入力するための文字列が表示されます。これが「プロンプト」です。デフォルトのプロンプトは、ユーザー名やホスト名、カレントディレクトリなどが表示されるシンプルなものが多いですが、これをカスタマイズすることで、作業効率を大幅に向上させることができます。
プロンプトをカスタマイズするメリットは次のとおりです。
- 情報の追加: Git のブランチ名、実行中のジョブの数、コマンドの終了コードなど、開発に役立つ情報を表示できます。
- 視認性の向上: 色やアイコンを使って情報を整理し、重要な情報を一目で把握できるようにします。
- モチベーションの向上: 自分好みのデザインにすることで、ターミナル作業が楽しくなります。
この記事では、伝統的な PS1
変数を使ったカスタマイズから、Starship、Oh My Posh、Powerline といったモダンなツールを使った高度なカスタマイズまで、Linux プロンプトの世界を掘り下げていきます。
開発用 Docker イメージの用意
最初に 開発用 Docker イメージを用意します。本記事ではこの環境で動作確認をしています。動作確認用の環境が必要ない場合は飛ばして先に進んでください。
Docker を使うと、現在使っている環境と隔離した環境で動作確認ができます。ベースイメージとしては ubuntu:24.04
を使います。必要なファイルは次のとおりです。
ubuntu2404-prompt/
├── Dockerfile ... 開発用 Docker イメージビルド用
├── compose.yaml ... 開発用 Docker のイメージビルドとコンテナ起動用
├── init-proj001.sh ... リポジトリ初期化用スクリプト
└── init.sh .. 初期化用スクリプト
開発用 Docker のイメージビルドとコンテナ起動用の compose.yaml
ファイルは次のようになります。
name: ubuntu2404-prompt
services:
ubuntu2404-prompt:
build: .
image: ubuntu2404-prompt:0.1
container_name: ubuntu2404-prompt
hostname: ubuntu2404-prompt
# vscode ユーザーは 1001. ubuntu ユーザーを使う場合は 1000
user: ${USER_ID:-1001}:${GROUP_ID:-1001}
# vscode ユーザーを使う場合は /home/vscode、ubuntu ユーザーを使う場合は /home/ubuntu
working_dir: ${USER_HOME_DIR:-/home/vscode}
tty: true
Docker イメージは ubuntu2404-prompt:0.1
を使い、ユーザー vscode
か ubuntu
で作業することを想定しています。
compose.yaml
と同じフォルダにある Dockerfile
にビルド方法が記載されていて、次のようになります。
FROM ubuntu:24.04
# root ユーザーで実行する処理
COPY ./init.sh /root/ws/script/init.sh
RUN bash /root/ws/script/init.sh
# vscode ユーザーで実行する処理
COPY ./init-proj001.sh /home/vscode/init-proj001.sh
RUN sudo -u vscode bash /home/vscode/init-proj001.sh
初期化用スクリプト init.sh
は次のとおりです。スクリプトの内容については詳しい説明はしませんが、開発用の Docker イメージにあると便利なパッケージのインストールと sudo 権限のある vscode
ユーザーを追加しています。
#!/usr/bin/env bash
cat << EOS > /etc/apt/sources.list.d/ubuntu.sources
Types: deb
URIs: http://ftp.udx.icscoe.jp/Linux/ubuntu/
Suites: noble noble-updates noble-backports
Components: main universe restricted multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
## Ubuntu security updates. Aside from URIs and Suites,
## this should mirror your choices in the previous section.
Types: deb
URIs: http://security.ubuntu.com/ubuntu/
Suites: noble-security
Components: main universe restricted multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
EOS
apt-get update
apt-get upgrade -y
DEBIAN_FRONTEND=noninteractive \
apt-get install -y curl git gpg openssh-server sudo unzip wget zip
DEBIAN_FRONTEND=noninteractive \
apt-get -y install byobu sysstat autossh
DEBIAN_FRONTEND=noninteractive \
apt-get -y install openssh-server
USERNAME="${USERNAME:-vscode}"
group_name="${USERNAME}"
groupadd "${group_name}"
useradd -s /bin/bash --gid "$USERNAME" -m "$USERNAME"
# sudoers
## ${USERNAME} 用
echo "$USERNAME ALL=(root) NOPASSWD:ALL" > "/etc/sudoers.d/$USERNAME"
chmod 0440 "/etc/sudoers.d/$USERNAME"
## ubuntu ユーザー用
echo "ubuntu ALL=(root) NOPASSWD:ALL" > "/etc/sudoers.d/ubuntu"
chmod 0440 "/etc/sudoers.d/ubuntu"
# Shell customization
user_home="/home/${USERNAME}"
if [ ! -d "${user_home}" ]; then
mkdir -p "${user_home}"
chown "${USERNAME}":"${group_name}" "${user_home}"
fi
## Restore user .bashrc / .profile
possible_rc_files=( ".bashrc" ".profile" )
for rc_file in "${possible_rc_files[@]}"; do
if [ -f "/etc/skel/${rc_file}" ]; then
if [ ! -e "${user_home}/${rc_file}" ] || [ ! -s "${user_home}/${rc_file}" ]; then
cp "/etc/skel/${rc_file}" "${user_home}/${rc_file}"
chown "${USERNAME}":"${group_name}" "${user_home}/${rc_file}"
fi
fi
done
# openssh-server
if [ ! -e /root/ws ]; then
mkdir /root/ws/;
fi
cp /etc/ssh/sshd_config /root/ws/sshd_config
cat << EOS | tee -a /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
X11Forwarding no
ClientAliveInterval 30
ClientAliveCountMax 3
AllowUsers ${USERNAME}
EOS
sed -i "s/^X11Forwarding yes/#X11Forwarding yes/" /etc/ssh/sshd_config
# ${USERNAME} 用
sudo -u "${USERNAME}" sh -c "mkdir -p ~/.local/bin && mkdir ~/.config"
# 通常は下記を実行するが、このあとプロンプトの動作確認をするのでコメント
# apt-get -y autoremove
# apt-get -y clean
# rm -rf /var/cache/apt /var/lib/apt/lists
リポジトリ初期化用スクリプトの init-proj001.sh
は次のとおりです。コンテナに用意されている vscode ユーザーで ~/workspace/proj001
に Git リポジトリを用意します。実際にプロンプトカスタマイズツールを使用する前に、表示確認用にローカルに Git リポジトリを用意しておくことで、動作確認作業がしやすくなります。
#!/bin/bash
if [ ! -e ~/workspace/proj001 ]; then
mkdir -p ~/workspace/proj001
fi
cd ~/workspace/proj001 || exit 1
git init -b main
echo "proj001" > README.md
git add .
git config user.name user001
git config user.email user001@dev.internal
git commit -m "init"
ファイルを用意したら、ubuntu2404-prompt
フォルダをカレントにしてビルドします。このフォルダを ~/workspace/ubuntu2404-prompt
に用意してある場合は次のようにコマンド実行します。
cd ~/workspace/ubuntu2404-prompt
docker compose build
ビルドが成功したら、起動します。
docker compose up -d
VS Code に、次の拡張機能をインストールしてあれば、ここで起動したコンテナへ VS Code をアタッチできます。
VS Code でコンテナの一覧を表示して、ubuntu2404-prompt のコンテナのコンテキストメニューを表示したら、「Visual Studio Code をアタッチ」をクリックします。
すると、ubuntu2404-prompt に VS Code をアタッチした画面が表示されるので、その画面で作業をすると、プロンプトの変更について確認ができます。
Bash プロンプトの基本:PS1
Bash のプロンプトは、主に PS1
という環境変数によって定義されています。この PS1
に特定のシーケンス(バックスラッシュ \
で始まる特殊文字)を組み合わせることで、表示する情報をカスタマイズできます。
たとえば、ターミナルで次のように PS1
を指定しながら bash
コマンドを実行すると、プロンプトが指定したものになります。
export PS1='[\u@\h \W]\$ ' bash
このシーケンスはプロンプトを [ユーザー名@ホスト名 カレントディレクトリ] $
という形式にするものです。
今回使用しているコンテナでの実行例は次のようになります。[]
で囲まれた表示になって指定が反映されていることがわかります。
vscode@ubuntu2404-prompt:~$ export PS1='[\u@\h \W]\$ ' bash
[vscode@ubuntu2404-prompt ~]$
主なシーケンスには次のようなものがあります。
シーケンス | 説明 |
---|---|
\u |
ユーザー名 |
\h |
ホスト名(ドメインは含まない) |
\H |
完全なホスト名 |
\w |
カレントワーキングディレクトリ |
\W |
カレントワーキングディレクトリのベース名 |
\d |
日付 (例: "Tue May 26") |
\t |
時刻 (HH:MM:SS) |
\$ |
ユーザーが root なら # 、それ以外なら $
|
\n |
改行 |
このプロンプトを bash
起動時に自動設定するには、~/.bashrc
ファイルに次のように記述します。
export PS1='[\u@\h \W]\$ '
ここでは、~/.bashrc
ファイルの最終行に、これを少し修正した次のものを追加してみましょう。
export PS1='[\u@\h \W]\$ > '
~/.bashrc
を変更した後は、source ~/.bashrc
を実行します。もしくは、exec $SHELL
を実行するなど、ターミナルを再起動すると変更が反映されます。実行すると次のようになります。
[vscode@ubuntu2404-prompt ~]$ exec $SHELL
[vscode@ubuntu2404-prompt ~]$ >
プロンプトに >
が追加されました。
確認ができたら、~/.bashrc
を戻します。それからターミナルを再起動すると、当初のプロンプトに戻ります。
ちなみに、echo $PS1
を実行すると、現在の設定を確認できます。今回使用しているコンテナでは、次のような結果になります。
$ echo $PS1
\[\]\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ \[\]
この $PS1
は、Linux の bash シェルで表示されるプロンプトの形式を定義する変数です。非常に多くの情報が含まれており、色や特殊な制御シーケンスが使われています。一つずつ分解して説明します。
この $PS1
の構成は大きく分けて 4 つの部分から成り立っています。
タイトルバーの設定
タイトルバーの設定として \[\e]0;\u@\h: \w\a\]
が指定されています。これにより、ターミナルのタイトルバーにこれらの情報が表示されるようになります。
-
\e]0;
は、ウィンドウのタイトルや端末のエントリに文字列を設定する制御シーケンス -
\u@\h: \w
は、ユーザー名 (\u
)、ホスト名 (\h
)、現在の作業ディレクトリ (\w
) を表示 -
\a
は、ベルを鳴らす制御シーケンスでウィンドウタイトル設定の終端
VS Code のターミナルでは、タイトルバーは表示されないので、これについての表示確認はできません。
chroot 環境の表示
chroot 環境にいる場合の表示設定として ${debian_chroot:+($debian_chroot)}
が指定されています。
これは bash のパラメータ展開という機能を使っており、もし $debian_chroot
という変数が設定されていれば、その値が括弧 ()
で囲まれて表示されます。
たとえば、chroot 環境に入っている場合、プロンプトの先頭に (chroot)
のような文字列が表示されます。
プロンプトにユーザー名とホスト名を表示
プロンプトに [ユーザー名@ホスト名]
と表示するために \[\033[01;32m\]\u@\h\[\033[00m\]
が指定されています。
-
\[
と\]
は、ターミナルに[
と]
を表示するための指定 -
\033[01;32m
は、文字の色を緑色 (32) に、かつ太字 (01) に設定するエスケープシーケンス -
\u@\h
は、現在のユーザー名とホスト名を表示 -
\033[00m
は、文字の色をデフォルトに戻すためのリセットシーケンス
これらの指定により、[]
内の文字列は緑色となります。
プロンプトにフォルダ名とプロンプト記号を表示
プロンプトにフォルダ名とプロンプト記号を表示するために、:\\[\033[01;34m\\]\w\\[\033[00m\\]\$
が指定されています。
-
:
は、ユーザー名とカレントディレクトリを区切るための文字 -
\033[01;34m
は、文字の色を青色 (34) に、かつ太字 (01) に設定するエスケープシーケンス -
\w
は、現在の作業ディレクトリを省略した形で表示 -
\033[00m
は、文字の色をデフォルトに戻すためのリセットシーケンス -
\$
は、プロンプトの終端を示す記号
\w
の例としては、/home/vscode/workspace
が ~/workspace
のように表示されます。
\$
については少し注意が必要で、通常のユーザーであれば $
が表示され、root ユーザーであれば #
が表示されます。
全体としてどう表示されるか
たとえば、次のような環境では、全体としてどう表示されるか説明します。
-
ユーザー:
vscode
-
ホスト名:
ubuntu2404-prompt
-
カレントフォルダ:
/home/vscode/workspace
この場合、実際のターミナルでは次のようにプロンプトが表示されます。
vscode@ubuntu2404-prompt:~/workspace$
このうち、vscode@ubuntu2404-prompt
が緑色で、~/workspace
が青色で表示されます。また、ターミナルのタイトルバーには vscode@ubuntu2404-prompt: ~/workspace
が表示されるようになります。
この $PS1
の設定は、視覚的に現在のユーザーや場所を把握しやすくするために非常に便利です。
PROMPT_COMMAND を使って Git ユーザーの表示
bash では、プロンプトのカスタマイズにあたっては PS1
変数を使う以外にも、プロンプト更新用のコマンドを PROMPT_COMMAND
変数へ指定する方法があります。
ここではプロンプトへ、Git ユーザーの表示をするように、~/.bashrc
に git_user_info()
関数を登録して、これを PROMPT_COMMAND
変数で使うようにしてみます。
cat << EOS >> ~/.bashrc
function git_user_info() {
if git rev-parse --is-insid-work-tree > /dev/null 2>&1; then
local git_user=\$(git config --get user.name)
if [ -n "\$git_user" ]; then
echo -n "\${git_user} "
fi
fi
}
PROMPT_COMMAND="git_user_info; \$PROMPT_COMMAND"
EOS
これで、Git リポジトリの user.name
を表示することができるようになります。なお、ここでは機能確認のために、単純な処理としています。これを実際に利用しようとすると、いろいろと問題が出てきますから、それに対応するための調整が必要になります。
さて、このように PS1
や PROMPT_COMMAND
を指定すれば、かなりのカスタマイズが可能です。ただし、Git のステータス表示などを自力でやろうとすると、シェルスクリプトが複雑になりがちです。そこで登場するのが、次に紹介するモダンなプロンプトカスタマイズツールです。
モダンなプロンプトカスタマイズツール
PS1
の手動設定は自由度が高い反面、設定が複雑になりがちです。特に、Git 連携や Python の仮想環境表示などの高度な機能を追加するのは大変です。ここでは、そうした問題を解決してくれるモダンなツールを 3 つ紹介します。
これらのツールを利用するには、Nerd Fonts のような、アイコンや特殊記号を収録したフォントをターミナルに設定する必要があります。
Powerline
Powerline は、Vim のステータスラインプラグインとして生まれ、その後、zsh、bash、fish などのシェルプロンプトにも対応したツールです。セグメント指向で、三角形の区切り記号を使った独特なデザインが特徴です。
Python で書かれており、設定は JSON ファイルで行います。比較的古くからあり、根強い人気があります。著者も初めてプロンプトカスタマイズツールとして知ったのは、Powerline でした。ソースコードは下記の GitHub ページで公開されています。
Powerline 設定方法
Ubuntu の場合は、次のコマンドでインストールできます。
sudo apt install -y powerline fonts-powerline powerline-gitstatus
そして、~/.bashrc
に Powerline 用の設定を追記するために、次のコマンドを実行します。
cat << EOS >> ~/.bashrc
if [ -f /usr/share/powerline/bindings/bash/powerline.sh ]; then
powerline-daemon -q
POWERLINE_BASH_CONTINUATION=1
POWERLINE_BASH_SELECT=1
source /usr/share/powerline/bindings/bash/powerline.sh
fi
EOS
現在のターミナルへ設定を反映するには exec $SHELL
を実行するなどして、ターミナルを再起動します。
exec $SHELL
Powerline のカスタマイズ
Powerline のカスタマイズをするのは、Python のプログラムについての知識が必要だったりするので、少し大変です。
今回は、Ubuntu 24.04 の powerline パッケージを使っていて、バージョンは 2.8.3-5 です。バージョンによってカスタマイズ方法がちがうようなので注意が必要です。
Powerline のカスタマイズをするには、~/.config/powerline
へ /usr/share/powerline/config_files
にあるファイルをコピーして編集します。
ここでは、Git ユーザーを表示する自作セグメントを用意することにします。そのためには、~/.config/powerline/segments/
に Python プログラムを配置する必要があります。
mkdir -p ~/.config/powerline
cp -R /usr/share/powerline/config_files/* ~/.config/powerline/
mkdir -p ~/.config/powerline/segments/
今回は、次のような ~/.config/powerline/segments/my_custom_segment.py
を用意しました。動作確認用の関数として my_fixed_value_segment()
、another_fixed_value_segment()
、git_username()
、git_username0()
を使えるようにしてあります。
import subprocess
from powerline.theme import requires_segment_info
@requires_segment_info
def my_fixed_value_segment(pl, segment_info, **kwargs):
"""
固定文字を表示するセグメント用
"""
return 'Hello Powerline!'
@requires_segment_info
def another_fixed_value_segment(pl, segment_info, **kwargs):
"""
my_fixed_value_segment とは別の固定文字を表示するセグメント用
"""
return 'Custom Segment!'
@requires_segment_info
def git_username(pl, segment_info, **kwargs):
"""
Gitユーザー名を表示するセグメント
"""
try:
current_dir = segment_info['getcwd']()
# Gitユーザー名を取得
username = subprocess.check_output(
['/usr/bin/git', 'config', '--get', 'user.name'],
cwd=current_dir,
stderr=subprocess.STDOUT
).decode('utf-8').strip()
return username
except (subprocess.CalledProcessError, FileNotFoundError):
return None
@requires_segment_info
def git_username0(pl, segment_info, **kwargs):
"""
Gitユーザー名を表示するセグメントのデバッグ用
"""
try:
current_dir = segment_info['getcwd']()
# Gitユーザー名を取得
username = subprocess.check_output(
['/usr/bin/git', 'config', '--get', 'user.name'],
cwd=current_dir,
stderr=subprocess.STDOUT
).decode('utf-8').strip()
if not username:
# ユーザー名が空文字列の場合
return {
'contents': 'Git User: (Not configured)',
'highlight_groups': ['user', 'hostname'],
}
return {
'contents': username,
'highlight_groups': ['user', 'hostname'],
}
except subprocess.CalledProcessError as e:
# コマンドが失敗した場合
pl.error("Git command failed: {0}".format(e.output.decode('utf-8').strip()))
return {
'contents': 'Git User: (Command failed)',
'highlight_groups': ['user', 'hostname'],
}
except FileNotFoundError:
# gitコマンドが見つからない場合
return {
'contents': 'Git User: (git not found)',
'highlight_groups': ['user', 'hostname'],
}
関数では単純な文字列を返すようにしてあります。git_username0()
だけはデバッグ用に用意したものなので、特別に辞書型({}
)の値を返すようにしてあります。ネット上のドキュメントでは、文字列型ではなく辞書型を関数の返り型にするようになっているのですが、実際に動かしてみると辞書型を文字列形式にした値が表示されます。
当初、git_username()
がうまく動作しなかったので、このようにして git_username0()
の処理がどこまで正しく実行されたか確認できるようにして調べました。
表示スタイルについては ~/.config/powerline/colorschemes/shell/default.json
へ my_fixed_value_segment
、another_fixed_value_segment
、git_username
、git_username0
を追加します。
{
"name": "Default color scheme for shell prompts",
"groups": {
"hostname": { "fg": "brightyellow", "bg": "mediumorange", "attrs": [] },
"environment": { "fg": "white", "bg": "darkestgreen", "attrs": [] },
"mode": { "fg": "darkestgreen", "bg": "brightgreen", "attrs": ["bold"] },
"attached_clients": { "fg": "white", "bg": "darkestgreen", "attrs": [] },
"my_fixed_value_segment": { "fg": "white", "bg": "brightgreen", "attrs": [] },
"another_fixed_value_segment": { "fg": "white", "bg": "darkestgreen", "attrs": [] },
"git_username": { "fg": "white", "bg": "brightgreen", "attrs": [] },
"git_username0": { "fg": "white", "bg": "brightgreen", "attrs": [] }
},
"mode_translations": {
"vicmd": {
"groups": {
"mode": {"fg": "darkestcyan", "bg": "white", "attrs": ["bold"]}
}
}
}
}
デフォルトで使用するテーマは、後で説明する config.json
で default_leftonly
が指定されています。これは ~/.config/powerline/themes/shell/default_leftonly.json
と対応しています。
このファイルを編集することで、プロンプトに表示されるセグメントを追加することができます。ここでは、"function":
で my_custom_segment
モジュールの関数を指定している要素を追加しました。
"function": "my_custom_segment.git_username",
を "function": "my_custom_segment.git_username0",
とするとデバッグ用の表示になります。
{
"segments": {
"left": [
{
"function": "my_custom_segment.my_fixed_value_segment"
},
{
"function": "my_custom_segment.another_fixed_value_segment",
"before": " ⭐️ "
},
{
"function": "powerline.segments.common.net.hostname",
"priority": 10
},
{
"function": "powerline.segments.common.env.user",
"priority": 30
},
{
"function": "powerline.segments.common.env.virtualenv",
"priority": 50
},
{
"function": "my_custom_segment.git_username",
"args": {},
"before":" 👤 "
},
{
"function": "powerline_gitstatus.gitstatus",
"priority": 40
},
{
"function": "powerline.segments.shell.cwd",
"priority": 10
},
{
"function": "powerline.segments.shell.jobnum",
"priority": 20
},
{
"function": "powerline.segments.shell.last_pipe_status",
"priority": 10
}
]
}
}
使用するテーマの指定や、モジュールパスの指定は ~/.config/powerline/config.json
にします。
ここでは、"common:"
に "paths":
と "log_file":
の指定を追加しました。"log_file":
は動作確認時にログを取得するために指定したものなので、動作確認が済んだら削除して良いです。
シェル用のレイアウトは、"ext":
の "shell":
の "theme":
に指定します。確認するとわかりますが、"default_leftonly"
となっています。この指定を変更する場合は、~/.config/powerline/themes/shell/
に対応する JSON ファイルが必要になります。
{
"common": {
"term_truecolor": false,
"paths": [
"~/.config/powerline/segments"
],
"log_file": "/home/vscode/log.txt"
},
"ext": {
// 略
"shell": {
"colorscheme": "default",
"theme": "default_leftonly",
"local_themes": {
"continuation": "continuation",
"select": "select"
}
},
// 略
}
準備ができたら、powerline-daemon
の停止と起動をします。停止は --kill
(-k
) のオプションをつけます。起動時はサイレントモードの --quiet
(-q
) のオプションをつけると実際に使うときと同じように起動できます。
powerline-daemon --kill
powerline-daemon --quiet
これでプロンプトが意図したとおりの内容になっていたら成功です。手元では使ってみたときの様子は、次のようになりました(Nerd フォント未使用時の表示)。
Hello Powerline! ⭐️ Custom Segment! vscode ~ cd ~/workspace/proj001/
Hello Powerline! ⭐️ Custom Segment! vscode 👤 user001 main ~ workspace proj001
Hello Powerline! ⭐️ Custom Segment! vscode ~
の部分がプロンプトです。
cd
コマンドで ~/workspace/proj001/
の Git リポジトリのフォルダへ移動すると、プロンプトに 👤 user001 main
が追加されて、Git ユーザー名とブランチが確認できることがわかります。フォルダのパス ~ workspace proj001
もプロンプトに追加されます。
また、/home/vscode/log.txt
の内容を表示して、エラーが出ていないことを確認します。エラーが出ていたら直します。
Powerline の動作確認ができたら、必要なファイルのバックアップをしてから、コンテナを再起動するなどして ~/.bashrc
を初期化します。
Oh My Posh
Oh My Posh は、Go で書かれたプロンプトカスタマイズツールです。Windows Terminal での人気がきっかけで広く知られるようになりましたが、Linux、macOS でも問題なく利用できます。
豊富なテーマが標準で用意されており、設定ファイル (JSON/YAML/TOML) を少し編集するだけで、自分好みのプロンプトを簡単に作れるのが魅力です。
次の URL で公式サイトが公開されています。
Oh My Posh 設定方法
公式サイトの指示に従ってインストールします。
curl -s https://ohmyposh.dev/install.sh | bash -s
Oh My Posh では、Nerd フォントのインストールができます。フォントについては、次の URL に説明があります。
説明にあるとおり、oh-my-posh font install
のコマンドでフォントをインストールできます。
oh-my-posh font install
コマンド実行をすると、フォントの選択画面になります。フォントの表示サンプルは次の URL にあります。使用したいものをインストールすると良いでしょう。
ちなみに、一覧にある Meslo は MesloLG Nerd Font を含むフォントで、これを直接インストールすることもできます。その場合は次のように meslo
を指定します。
oh-my-posh font install meslo
次に、~/.bashrc
のバックアップをとっておきます。ここでは使用するテーマを変更してみるので、もとのファイルをバックアップしておいた方が作業しやすいからです。
cp ~/.bashrc ~/.bashrc.original
それから、このファイルに eval "$(oh-my-posh init bash)"
を追記するために、次のコマンドを実行します。
echo 'eval "$(oh-my-posh init bash)"' >> ~/.bashrc
現在使用中のシェルへ反映するにはシェルを再起動します。
exec $SHELL
Oh My Posh では、次の URL でテーマが公開されていて、--config
オプションで指定できます。
テーマ名に minimal
がついているテーマは Nerd フォントを必要としないものです。
Powerline と似た印象となるプロンプトのテーマ powerline
があります。その場合、~/.bashrc
には次のコマンドを指定します。
eval "$(oh-my-posh init bash --config powerline)"
バックアップをリストアしてから、この指定を追加します。
cp ~/.bashrc.original ~/.bashrc
echo 'eval "$(oh-my-posh init bash --config powerline)"' >> ~/.bashrc
この後に説明する Starship と似た印象となるプロンプトのテーマ spaceship
もあります。その場合は、次の指定へ変更します。
eval "$(oh-my-posh init bash --config spaceship)"
Oh My Posh カスタマイズ
Oh My Posh カスタマイズは、既存のテーマの設定を書き出し、それを編集することで可能です。
既存のテーマの設定を書き出すには次のようにコマンド実行します。
oh-my-posh config export --config powerline --output ~/.mytheme.omp.json
~/.bashrc
で、用意したテーマファイルを使用するようにします。
cp ~/.bashrc.original ~/.bashrc
echo 'eval "$(oh-my-posh init bash --config /home/vscode/.mytheme.omp.json)"' >> ~/.bashrc
ここでは、git
の user.name
を表示するコマンドを挿入するために、次の設定を ~/.mytheme.omp.json
へ追加します。"type": "git"
のセグメントの前に、これを挿入しました。
{
"type": "command",
"style": "powerline",
"template": " {{ .Output }} ",
"powerline_symbol": "\ue0b0",
"background": "#6A0DAD",
"foreground": "#F0EAD6",
"properties": {
"command": "git config --get user.name"
}
},
設定を反映し、表示を確認します。
exec $SHELL
cd ~/workspace/proj001
Powerline と比較すると、簡単にカスタマイズができることがわかります。
Oh My Posh の動作確認ができたら、コンテナを再起動するなどして ~/.bashrc
を初期化します。
Starship
Starship は、Rust で書かれた、高速でクロスプラットフォーム対応のプロンプトです。初期設定で、多くのプログラミング言語やツールを自動で認識し、コンテキストに応じた情報を表示してくれます。
「Just works」を目指しており、デフォルト設定のままでも十分に高機能なので、カスタマイズをしなくても済むのが大きなメリットです。カスタマイズしたい場合は、TOML ファイルで設定を行います。
次の URL で公式サイトが公開されています。
Starship 設定方法
公式サイトの指示に従ってインストールします。
curl -sS https://starship.rs/install.sh | sh
そして、~/.bashrc
に eval "$(starship init bash)"
を追記します。
echo 'eval "$(starship init bash)"' >> ~/.bashrc
Starship ではプリセットと呼ばれる事前に用意されたプロンプト設定があり、次の URL で公開されています。
Nerd フォントを使わないプリセットである no-nerd-font
を使うには、次のようにして設定ファイルを ~/.config/starship.toml
へ書き出しておきます。
starship preset no-nerd-font -o ~/.config/starship.toml
プリセット plain-text-symbols を使うとプレーンテキストによる表示になります。
starship preset plain-text-symbols -o ~/.config/starship.toml
Starship カスタム設定
Starship でカスタム設定をすることもできます。書き出した ~/.config/starship.toml
を修正します。
たとえば、Git ユーザーを Git 用プロンプト周辺に表示したい場合は、次の指定を ~/.config/starship.toml
に追記します。
[custom.git_user]
command = 'git config --get user.name'
when = ''' git rev-parse --is-insid-work-tree '''
format = """
@ [$output]($style)"""
plain-text-symbols のプリセットをここの例でカスタマイズして、~/workspace/proj001
をカレントフォルダすると、次のような表示となりました。
container [Docker] > cd ~/workspace/proj001/
proj001 on git main @ user001
container [Docker] >
なお、プロンプトのフォーマットについては次の URL に説明があります。
これを参考にして、好きな位置に ${custom.git_user}
を配置することもできます。注意点としては、format
の指定は ~/.config/starship.toml
ファイルの先頭の方でします。[custom.git_user]
などの各セクションでも format
の指定ができるため、それと混ざらないようにする必要があるからです。
各ツールの比較
ここで紹介した 3 つのツールは、それぞれに特徴があります。
観点 | Powerline | Oh My Posh | Starship |
---|---|---|---|
言語 | Python | Go | Rust |
設定 | JSON | JSON, YAML, TOML | TOML |
テーマ | 少ない | 豊富 | 普通 |
動作 | やや遅い | 高速 | 高速 |
カスタマイズ | 大変 | しやすい | ややしにくい |
- Powerline: 安定性と伝統的なデザインを求めるユーザー向け。
- Oh My Posh: 見た目を重視し、手軽に様々なテーマを試したいユーザー向け。
- Starship: 複雑な設定なしでモダンなプロンプトを使いたいユーザー向け。
まとめ
Linux のプロンプトカスタマイズは、単なる見た目の変更以上に、日々の作業効率を向上させる力を持っています。
- 手軽に始めたい、速さが欲しいなら → Starship
- 豊富なテーマで見た目を楽しみたいなら → Oh My Posh
- 伝統的なスタイルが好きなら → Powerline
これまでプロンプトのカスタマイズをしたことがないなら、一番のおすすめは Starship です。Rust 製で非常に高速に動作し、設定ファイルなしでも良い感じに情報を表示してくれるため、導入のハードルが最も低いからです。
開発コンテナーを使っていると Oh My Posh 系のプロンプトになるので、これに慣れてくると Oh My Posh が使いやすいと感じることでしょう。自分は、リモートで管理するマシンの区別が簡単につくように、サーバマシンのプロンプト表示をこれで変えています。テーマの選択肢が多いので、マシンごとに別のテーマにすることができて便利です。
個人的には Powerline 系の表示が好きなので、メインのマシンでは Powerline を使っています。性能面で少し問題がでることがあるので、最近は Go で実装された Powerline 系のプロンプトツールである powerline-go-linux-amd64
も使っています。公式サイトは下記の URL になります。
ぜひ、この記事を参考に、あなただけの最強のプロンプトを育ててみてください。
Discussion