😎

WeztermとStarshipで見た目イケイケなターミナルにしよう

はじめに

テストから解放された瞬間にYouTube Shortsを見てくねくねしてるみなさん、ごきげんよう。
電通大2年生、team411のメイドさん③のむつみんです。

昨日の記事は、とらさんによるVRChat でアバターの動きを取得し、再生をするでした!
VRなどの3Dゲームに大いに役立ちそうな内容で面白かったです。
ちょうど座標変換の処理が必要だったのでありがたく参考にさせていただきます🙏

今日は、私が普段使っているターミナルエミュレータ「Wezterm」と、シェルプロンプトカスタマイザ「Starship」をちょっといじったことを基に、見た目イケイケなターミナルにする方法を紹介します。

Weztermとは

Weztermは、Rust製クロスプラットフォーム対応のターミナルエミュレータです。
GPUアクセラレーションによる描画の速さ、Lua言語での高いカスタマイズ性、tmuxのような柔軟な画面分割機能(ターミナルマルチプレクサ機能)、SSH等のリモート開発との親和性などが特徴で、各OSに標準で備わっているようなターミナルよりもモダンで高機能と言えます。

なお、Luaは高速で軽量なスクリプト言語であり、NeovimやAwesomeWMなどの設定、組み込みシステムにも使われていたりしていて、C言語で開発したものにプラスアルファの機能を追加したいときなどに便利だそうです。

Starshipとは

Starshipは、クロスシェル対応のシェルプロンプトカスタマイザです。
Windows、macOS、Linuxなどの各OSで動作し、Bash、Zsh、Fish、PowerShellなどの様々なシェルに対応しています。
こちらもRust製で、高速かつ軽量に動作することが特徴です。
カスタマイズ性も高く、Gitのブランチ情報やPython,Node等の環境情報など、様々な情報をプロンプトに表示できます。

導入すると何が嬉しいか

プログラミングをする際、みなさんはターミナルを使うことが多いと思います。
今の時代だとVS Codeのターミナルを使うことも多いかもしれませんが、OS標準のターミナルやVS Codeのターミナルは見た目がシンプルすぎて味気ないと感じることがあります。

味気ないと感じていなくても、WeztermとStarshipを導入すればきっと「おおっ!」となるはずです。

WeztermとStarshipを導入することで、以下のようなメリットがあります。

  • 見た目がイケイケになる: カスタマイズ性が高く、自分好みのテーマや背景、フォントを設定できるため、ターミナルの見た目を大幅に改善できます。
  • 情報が一目でわかる: WeztermやStarshipを使うことで、Gitのブランチ情報やPython,Node等の環境情報、CPU・メモリの使用率、その他様々な情報をタブバーやプロンプトに表示できるため、作業効率が向上します。
  • 柔軟な画面分割: Weztermのターミナルマルチプレクサ機能を使うことで、複数のターミナルを一つのウィンドウで管理でき、tmuxのように作業スペースを有効活用できます。
  • クロスプラットフォーム対応: WeztermとStarshipはどちらもクロスプラットフォーム対応であるため、異なるOS間で同じ設定を共有できます。
  • SSH等のリモート開発との親和性: WeztermはSSH等のリモート開発との親和性が高く、MobaXtermやPuTTYの代替としても利用できます。

これでターミナルを使うのが楽しくなりますね!
ヨシ!

導入方法

WeztermとStarshipの導入方法は以下の通りです。

Weztermの導入

Windowsなら先日の記事でも話したWingetでインストールできます。

winget install WezTerm.WezTerm

macOSならHomebrewでインストールできます。

brew install --cask wezterm

Linuxなら諸々のパッケージマネージャでインストールできるので調べてみてください(デキる人であろうという前提の丸投げ)。

Starshipの導入

インストール

Windowsなら先日の記事(2回目)で紹介したCLIツールのインストールに適したScoopを使うのが後々楽です。
セットアップが必要ですが、記事内に説明があるので参考にしてください。

scoop install starship

もしくは単純にWingetで解決もOKです。

winget install Starship.Starship

macOSならHomebrewでインストールできます。

brew install starship

Linuxなら以下略

初期設定

そしてインストールが完了したら、各シェルに設定を反映させるために以下のコマンドを実行します。

starship init <SHELL>

<SHELL>の部分には、使用しているシェルの名前を入れてあげてください。
これで各シェルの設定ファイルにStarshipの初期化コードが追記されます。

カスタマイズ方法

それでは私が実際に行っているWeztermとStarshipのカスタマイズ方法を簡単に紹介します。

Weztermのカスタマイズ

Weztermの設定ファイルはLua言語で記述されており、WindowsやmacOS、Linuxなどの各OSでホームディレクトリ配下に~/.config/wezterm/というディレクトリ内にwezterm.luaという名前で保存すればOKです。

また、設定を分割したい場合は同じディレクトリ内にhogehoge.luaという形式でファイルを作成し、wezterm.lua内でlocal hoeghoge = require("hogehoge")のように読み込むこともできます。

以下は私のWeztermのスクリーンショットです。

画面上半分にNeovimを起動、左下にpnpm zenn previewでZennの記事プレビューのサーバーを起動、右下にシェルを表示していますね。

wezterm.luaは以下のようになっています。

wezterm.lua
-- Pull in the wezterm API
local wezterm = require("wezterm")
-- Pull Nerd  font
local nerd_font = require("wezterm").font("Moralerspace Neon")

-- This table will hold the configuration.
local config = {}

-- Pull files
local keybinds = require("keybinds")
require("format")
-- require 'status'
require("event")
require("tabline")

-- In newer versions of wezterm, use the config_builder which will
-- help provide clearer error messages
if wezterm.config_builder then
 config = wezterm.config_builder()
end

if wezterm.target_triple:find("windows") ~= nil then
 -- Windows の場合は PowerShell を指定
 config.default_prog = { "pwsh.exe", "-NoLogo" }
else
 -- 他の OS (例: Linux/macOS) の場合は fish を指定
 config.default_prog = { "/usr/sbin/fish" }
end

-- WSLだけで使いたい場合は以下のコメントを外す
-- config.default_prog = { 'wsl', '-d', 'Arch' }

config.color_scheme = "Catppuccin Frappe"
config.font = nerd_font
config.font_size = 20.0
-- 設定中
-- config.window_decorations = 'RESIZE'
-- config.window_frame = {
--   font = wezterm.font { family = 'Roboto', weight = 'Bold' },
--   font_size = 10.0,
-- }

-- 背景の不透過度
config.window_background_opacity = 0.85

-- Tab Bar
config.use_fancy_tab_bar = false
config.enable_tab_bar = true
config.hide_tab_bar_if_only_one_tab = false
config.tab_bar_at_bottom = true
config.tab_max_width = 30

config.status_update_interval = 1000

config.disable_default_key_bindings = true
config.leader = { key = ",", mods = "CTRL", timeout_milliseconds = 1500 }
config.keys = keybinds.keys
config.key_tables = keybinds.key_tables

-- 設定中
-- config.mouse_bindings = require('mousebinds').mouse_bindings

return config

この設定ファイルでは、フォントの設定、背景の不透過度、タブバーの表示設定、キーバインドのカスタマイズなどを行っています。

他にもキーバインドやタブバーの設定などを別ファイルに分割して読み込んでいるので、詳細は私のDotFilesを参照してみてください。

また、Weztermのカスタマイズの参考になりそうなサイトも一覧で載せておきます。

↑このサイトはWeztermの設定例が豊富なだけでなくNeovimもゴリゴリに設定しているので、昔大変お世話になりました。

カラースキームについて

設定コード内にconfig.color_scheme = "Catppuccin Frappe"という部分があると思いますが、ここでカラースキームを設定しています。

私の場合はパステルカラーのかっこかわいい系テーマであるCatppuccin Frappeというカラースキームを使っています。

Weztermにはデフォルトでいくつかのカラースキームが用意されているので、公式サイトのカラースキームギャラリーから好みのものを探してみてください。

自分好みのテーマに設定するとターミナルの見た目がガラッと変わって気分がアガりますよ。

Nerd Fontについて

Nerd Fontは開発者向けにデザインされたフォントで、プログラミングに適した文字が多く含まれています。
読みやすいNerd Fontを選ぶことで単純にターミナルの見た目が良くなるだけでなく、プログラミングでの可読性も向上します。

また、Nerd Fontの種類によってはリガチャ(特定の文字の組み合わせを一つの文字として表示する機能)に対応しているものもあり、より美しさを極めることもできたりします。

フォントは奥が深いぞぉ

背景について

また、config.window_background_opacityで背景の不透過度を設定してあげると、Weztermのウィンドウ背景が半透明になり、デスクトップの壁紙や他のウィンドウが透けて見えるようになります。
これにより、ターミナルの見た目がよりスタイリッシュになり、デスクトップ全体の美観を損なうことなくターミナルを使用できます。

ただ見えすぎると逆に見づらくなるので、適度な不透過度に設定したり、macOS限定にはなりますがconfig.macos_window_background_blur = 10のように背景をぼかす設定をするのもおすすめです。

Starshipのカスタマイズ

Starshipの設定ファイルはstarship.tomlという名前で、Windows、macOS、Linuxに関わらず~/.config/starship.tomlに保存すればOKです。

公式サイトのプリセットページにデフォルトで色々とサンプルが用意されてあるので、そちらを参考にしつつ自分好みにカスタマイズしていきましょう。

スタイリッシュでカッコイイ系のプリセットならTokyo NightやJetpackあたりを基にカスタマイズするのがおすすめです。

また、カワイイ系が好きな人はCatppuccinやNordicあたりを基にカスタマイズするのも良いでしょう。

以下は私のStarshipのスクリーンショットです。

OS情報、カレントディレクトリ、Gitブランチ情報、各種言語のバージョン情報、ユーザー名、プロンプト記号などが表示されていますね。
また背景もWeztermのカラースキームに合わせてCatppuccin Frappeのパステルカラーで統一しています。

starship.tomlは以下のようになっています。

starship.toml
# Starship Prompt Configuration File
# https://starship.rs/config/
# This configuration uses the Catppuccin Frappe color scheme and customizes various modules.

# 全体のプロンプトフォーマット設定
format = """
[](fg:yellow)\
$os\
[](fg:yellow bg:green)\
$directory\
[](fg:green bg:sky)\
$git_branch\
$git_status\
[](fg:sky bg:sapphire)\
$c\
$dart\
$gcloud\
$golang\
$gradle\
$java\
$kotlin\
$lua\
$nodejs\
$php\
$python\
$typst\
$ruby\
$rust\
[](fg:sapphire bg:blue)\
$conda\
$docker_context\
$package\
$aws\
[](fg:blue bg:surface0)\
$cmd_duration\
[](fg:surface0)\
$line_break\
$username\
$character\
"""

# コマンドラインに1行分のスペースを入れない
add_newline = false
Command_timeout = 1200

# catppuccin-frappeのcolor schemes
palette = "CatppuccinFrappe"

# left_promptとright_promptの間を何で埋めるか設定
[fill]
symbol = ' '

[os]
format = "[$symbol ]($style)"
style = "fg:surface0 bg:yellow"
disabled = false

[os.symbols]
Windows = "  "        # nf-dev-windows
Macos = "  "          # nf-fa-apple
Fedora = "󰣛 "          # nf-linux-fedora
Alpine = " "          # nf-linux-alpine
Ubuntu = "  "         # nf-linux-ubuntu
Debian = "  "         # nf-linux-debian
Arch = "  "           # nf-linux-archlinux
Artix = "󰣇 "           # nf-linux-artixlinux
CentOS = " "          # nf-linux-centos
Redhat = "󱄛 "          # nf-linux-redhat
RedHatEnterprise = "󱄛" # nf-linux-redhat

[directory]
truncation_length = 3
truncate_to_repo = false
truncation_symbol = "…/"
home_symbol = "󰠦 "
read_only = "󰌾 "
format = "[ $symbol $path ]($style)([$read_only ]($read_only_style))"
style = "fg:surface0 bg:green"
read_only_style = "fg:red bold bg:green"
repo_root_format = """
[ $before_root_path]($before_repo_root_style)\
[$repo_root]($repo_root_style)\
[$path]($style)\
[$read_only ]($read_only_style)\
"""
repo_root_style = "fg:surface0 bold bg:green"
before_repo_root_style = "fg:overlay0 bg:green"

[directory.substitutions]
"Documents" = "󰈙 "
"Downloads" = " "
"Music" = " "
"Pictures" = " "

[character]
success_symbol = "[❯](green)"
error_symbol = "[❯](red)"

# コマンドの実行時間
[cmd_duration]
min_time = 0
show_milliseconds = false
format = '[ $duration ](fg:blue bold bg:surface0)'

# 現在時刻
[time]
disabled = true                # 時間表示はWezTermのステータスバーで代用するため無効化
time_format = "%R"             # Hour:Minute Format
style = "fg:surface0 bg:blue"
format = '[  $time ]($style)'

# ユーザー名の表示
[username]
style_user = 'sapphire bold'
style_root = 'red bold'
format = '[  $user]($style) '
disabled = false
show_always = true
aliases = { "my_name" = "おいら" }  # ユーザー名の別名設定

# Git関連の設定
[git_branch]
symbol = ""
style = "fg:surface0 bg:sky"
format = '[ $symbol $branch]($style)'

[git_status]
style = "fg:surface0 bg:sky"
format = '[($all_status $ahead_behind) ]($style)'

# 各種開発環境の設定
[aws]
style = "fg:surface0 bg:blue"
format = '[[ $symbol ](fg:yellow bg:blue)($profile $region) ]($style)'

[conda]
symbol = ""                                                                # nf-dev-anaconda
style = "fg:surface0 bg:blue"
format = '[[ $symbol $environment ](fg:yellow bg:blue)($version) ]($style)'
ignore_base = false

[docker_context]
style = "fg:surface0 bg:blue"
format = '[[ $symbol ](fg:yellow bg:blue)($context) ]($style)'

[package]
symbol = ""                                                                # nf-oct-package
format = '[[ $symbol ](fg:yellow bg:blue)($version) ](fg:surface0 bg:blue)'

# 各言語の設定
[c]
symbol = ""                                                      # nf-custom-c
style = "fg:surface0 bg:sapphire"
format = '[[ $symbol ](fg:yellow bg:sapphire)($version)]($style)'

[dart]
symbol = " "                                                     # nf-seti-dart
style = "fg:surface0 bg:sapphire"
format = '[[ $symbol ](fg:yellow bg:sapphire)($version)]($style)'

[gcloud]
disabled = true

[golang]
symbol = ""
style = "fg:surface0 bg:sapphire"
format = '[[ $symbol ](fg:yellow bg:sapphire)($version) ]($style)'

[gradle]
symbol = " "                                                      # nf-dev-gradle
style = "fg:surface0 bg:sapphire"
format = '[[ $symbol ](fg:yellow bg:sapphire)($version) ]($style)'

[java]
symbol = " "
style = "fg:surface0 bg:sapphire"
format = '[[ $symbol ](fg:yellow bg:sapphire)($version) ]($style)'

[kotlin]
symbol = " "
style = "fg:surface0 bg:sapphire"
format = '[[ $symbol ](fg:yellow bg:sapphire)($version) ]($style)'

[lua]
symbol = "󰢱"
style = "fg:surface0 bg:sapphire"
format = '[[ $symbol ](fg:yellow bg:sapphire)($version) ]($style)'

[nodejs]
symbol = ""
style = "fg:surface0 bg:sapphire"
format = '[[ $symbol ](fg:yellow bg:sapphire)($version) ]($style)'

[php]
symbol = ""
style = "fg:surface0 bg:sapphire"
format = '[[ $symbol ](fg:yellow bg:sapphire)($version) ]($style)'

[python]
symbol = " "
style = "fg:surface0 bg:sapphire"
python_binary = ["python", "python3"]
format = '[[ $symbol ](fg:yellow bg:sapphire)($version) ]($style)'

[typst]
symbol = ""                                                       # nf-linux-typst
style = "fg:surface0 bg:sapphire"
format = '[[ $symbol ](fg:yellow bg:sapphire)($version) ]($style)'

[ruby]
symbol = ""                                                       # nf-seti-ruby
style = "fg:surface0 bg:sapphire"
format = '[[ $symbol ](fg:yellow bg:sapphire)($version) ]($style)'

[rust]
symbol = ""
style = "fg:surface0 bg:sapphire"
format = '[[ $symbol ](fg:yellow bg:sapphire)($version) ]($style)'


# Color palette definition
[palettes.CatppuccinFrappe]
rosewater = "#f2d5cf"
flamingo = "#eebebe"
pink = "#f4b8e4"
mauve = "#ca9ee6"
red = "#e78284"
maroon = "#ea999c"
peach = "#ef9f76"
yellow = "#e5c890"
green = "#a6d189"
teal = "#81c8be"
sky = "#99d1db"
sapphire = "#85c1dc"
blue = "#8caaee"
lavender = "#babbf1"
text = "#c6d0f5"
subtext1 = "#b5bfe2"
subtext0 = "#a5adce"
overlay2 = "#949cbb"
overlay1 = "#838ba7"
overlay0 = "#737994"
surface2 = "#626880"
surface1 = "#51576d"
surface0 = "#414559"
base = "#303446"
mantle = "#292c3c"
crust = "#232634"

この設定ファイルでは、プロンプトのフォーマット、各種モジュールの表示設定、カラーパレットの定義などを行っています。

プロンプトフォーマットについて

設定コード内にあるformat部分では、プロンプトの全体的なフォーマットを定義しています。
ここでは、各モジュール(例: os, directory, git_branchなど)をどの順番で表示するかや、各モジュール間の区切り文字を指定しています。

シェルプロンプトの見た目を大きく左右する部分なので、どの順番で情報を表示したいか、どんなフォーマットなら見やすいかを考えながらカスタマイズしてみてください。

また、right_format を使うことで右側のプロンプトのフォーマットも設定できます。
右側に現在時刻やシステム情報を表示したい場合などに便利です。

ただ残念なことにPowerShellは右側プロンプトに対応していないので、WindowsユーザーはWeztermのタブバーに情報を表示するか、cmd.exeの方を使う必要があります。

悔しい……

モジュールのカスタマイズについて

各モジュール(例: aws, docker_context, pythonなど)ごとに設定をカスタマイズできます。
例えば、[python]セクションでは、Pythonのバージョン表示やシンボル、スタイルなどを設定しています。
自分がよく使う言語やツールのモジュールを重点的にカスタマイズすることで、必要な情報を効率よく取得できるので、ぜひ試してみてください。

また、directoryosといった基本的なモジュールもカスタマイズしてあげると、自分が使う情報を優先的に表示できるようになり、生産性が爆上がりします。

私はGitディレクトリにいるときにディレクトリのルートを太文字にしたり、Gitのブランチ名やステータスを色付きで表示するようにしています。

カラーパレットの定義について

最後に、[palettes.CatppuccinFrappe]セクションでは、カラーパレットを定義しています。
toml形式なので少し特殊な書き方をしていると思いますが、ここで定義した色を各モジュールのスタイル設定で使用できます。
例えば、style = "fg:surface0 bg:green"のように、fg:で前景色(文字色)、bg:で背景色を指定しています。

自分好みのカラースキームを作成したい場合は、ここで色を定義してから各モジュールで使用してみてください。
設定が面倒な場合は公式サイトのプリセットのコードからパクって来ましょう。

ちょっとWeztermを使った連携

WeztermではコマンドとしてCTRL+SHIFT+Uで好きな記号をターミナルに入力できる機能があります。
これ実はNerd Fontで追加されたアイコンも入力できるんですよ。
ナ、ナンダッテー!?

ちなみに記事を書いている途中で気づきました😇

これを利用してあげると、Starshipのプロンプトに表示したい記号を簡単に入力できるようになるので、WeztermとStarshipを組み合わせて使う場合はぜひ活用してみてください。

Nerd Font公式サイトでもアイコンを検索することはできるので、使いやすい方を使って気に入ったアイコンを探してあげてください。

おわりに

このように、WeztermとStarshipを導入・カスタマイズすることで、見た目イケイケなターミナルを手に入れることができます。
プログラミング作業がより楽しくなり、生産性も向上することでしょう。

またターミナルだけでなく任意のエディタやIDEのカラースキーム、さらにはWebブラウザもWeztermやStarshipに合わせて統一感を出すと、より一層イケイケな開発環境が完成しますよ。

実はChrome拡張機能にもCatppuccinテーマがあったりするのでブラウザもカラースキームを変更できるのです。

去年のAdevnt Calendarの記事でも紹介されているのでぜひそちらも参照してみてください。

ぜひ皆さんも試してみてくださいね!

明日はundefinedさんによるnullです!
楽しそうですの!

Discussion