自分なりに良さげなターミナル&シェル環境を考える in 2024

WindowsTerminal+WSL+Bash

おそらく多くの人が初めて触れたターミナルはconhost.exeではないでしょうか.
Windows10時代まではcmd.exeやPowerShellを呼び出すとConsoleHost(conhost.exe)が使われていました.
私はまだアップデートしていないため分かりませんが, windows11からはWindowsTerminalがデフォルトになるようです.


ConsoleHostからWindowsTerminalに乗り換え

Windows11なら既にインストールされているはずですし, windows10ならMicrosoft Storeからインストールできます.

cmd.exeやPowerShellは勿論, WSLも動きます.

WindowsTerminalではタブやウィンドウの概念があり, ターミナルマルチプレクサのような操作が可能です.
更に, 外観, 操作などを自由で複雑に設定が可能です.

WindowsTerminalの設定

私は以下のような感じでEmacsとWindowsを合わせたような操作設定にしてみました.

操作 キー
フォーカス移動上 alt+shift+p
フォーカス移動下 alt+shift+n
フォーカス移動左 alt+shift+b
フォーカス移動右 alt+shift+f
ウィンドウ分割(下) alt+shift+2
ウィンドウ分割(下) alt+shift+5
ウィンドウを閉じる ctrl+shift+w, alt+shift+d
ウィンドウのサイズを変更(上) alt+shift+up
ウィンドウのサイズを変更(下) alt+shift+down
ウィンドウのサイズを変更(右) alt+shift+right
ウィンドウのサイズを変更(左) alt+shift+left

など

フォントや配色は以下のようになりました.
色んなプログラミング/ターミナル用のフォントを試しましたが, 自分の場合はこれに落ち着きました.

シェルの設定

UNIX系OSだけの話になってしまいますが, 多くのシェルにはbashが使われています.
プロンプト部分を変えるだけでも大分使い勝手が上がるので変えましょう!
色々とコネコネしまして, 出来たプロンプトがこんな感じ. 赤で囲った上が説明で下が実際のプロンプトです.
2行使い, 1行目にステータス, 2行目にプロンプト本体を表示することで長いコマンドを入力しても改行されずらくしています.

私は以下を.bashrcに加えました.(ご自分の環境にコピペする場合は必要に応じてちゃんと書き換えてください)

gitステータス取得処理部分

function parse_git_dirty {
  status=$(git status 2>&1 | tee)
  dirty=$(echo -n "${status}" 2> /dev/null | grep "modified:" &> /dev/null; echo "$?")
  untracked=$(echo -n "${status}" 2> /dev/null | grep "Untracked files" &> /dev/null; echo "$?")
  ahead=$(echo -n "${status}" 2> /dev/null | grep "Your branch is ahead of" &> /dev/null; echo "$?")
  newfile=$(echo -n "${status}" 2> /dev/null | grep "new file:" &> /dev/null; echo "$?")
  renamed=$(echo -n "${status}" 2> /dev/null | grep "renamed:" &> /dev/null; echo "$?")
  deleted=$(echo -n "${status}" 2> /dev/null | grep "deleted:" &> /dev/null; echo "$?")
  bits=''
  if [ "${renamed}" == "0" ]; then
    bits=">${bits}"
  fi
  if [ "${ahead}" == "0" ]; then
    bits="*${bits}"
  fi
  if [ "${newfile}" == "0" ]; then
    bits="+${bits}"
  fi
  if [ "${untracked}" == "0" ]; then
    bits="?${bits}"
  fi
  if [ "${deleted}" == "0" ]; then
    bits="x${bits}"
  fi
  if [ "${dirty}" == "0" ]; then
    bits="!${bits}"
  fi
  if [ ! "${bits}" == "" ]; then
    echo " ${bits}"
  else
    echo ""
  fi
}

function parse_git_branch() {
  BRANCH=$(git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/')
  if [ ! "${BRANCH}" == "" ]; then
    STAT=$(parse_git_dirty)
    echo "[${BRANCH}${STAT}]"
  else
    echo ""
  fi
}

シェル本体

if [ "$color_prompt" = yes ]; then
  PS1='${debian_chroot:+($debian_chroot)}\[\e[01;32m\]\u\[\e[m\]\[\e[01;32m\]@\[\e[m\]\[\e[01;32m\]\h\[\e[m\] \[\e[01;33m\]\H\[\e[m\][$?]\[\e[36m\]$(parse_git_branch)\[\e[m\]:\[\e[01;36m\]\w\n\[\e[00m\]\$ '
else
  PS1='\u@\h \H[$?]$(parse_git_branch):\w\n\\$ '
fi

Powerlineなどを導入すればもっとカッコいいプロンプトにできますが, 私の場合は移植性に重きをおいているので, 敢えて導入していません.
今度, 作業用のデスクトップだけはゴリゴリにカスタムしてみようかな