🐧

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 を使い、ユーザー vscodeubuntu で作業することを想定しています。
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 ユーザーの表示をするように、~/.bashrcgit_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 を表示することができるようになります。なお、ここでは機能確認のために、単純な処理としています。これを実際に利用しようとすると、いろいろと問題が出てきますから、それに対応するための調整が必要になります。

さて、このように PS1PROMPT_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.jsonmy_fixed_value_segmentanother_fixed_value_segmentgit_usernamegit_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.jsondefault_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

ここでは、gituser.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

そして、~/.bashrceval "$(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