Mac miniにsshでログインしたときにzshでHomeとEndを効くようにする

WindowsからMac miniへSSHでログインしたときにHomeとEndで移動できなかったので対応したときの覚書。

Windows環境: Windows 11 Pro, Windows Terminal
Mac環境:  Mac mini 2024, Tahoe 26.5.2

この記事はClaude Codeが作成。


1.Windows TerminalでmacOSへSSHログインしたときにHome, Endが効かない訳

原因はシェルではなく行編集ライブラリの違い

Home/Endキーが効かない理由は、macOSのデフォルトシェルがzshであること。
より正確には、zshが使用している行編集ライブラリがbashと異なることに起因。

  • bash → readline(GNU Readline Library)
  • zsh → ZLE(Zsh Line Editor、zsh独自実装)

両者はコードベースが完全に別物。
したがって設定ファイルも記法も互換性なし。


キー入力の実体はエスケープシーケンス

提として、Home/Endキーは「Homeという信号」を送っているわけではない。
端末エミュレータが定められたエスケープシーケンスという文字列を送出し、受け取った側がそれを解釈する仕組み。

Windows Terminal + OpenSSHの組み合わせで送出されるもの。

キー

シーケンス

Home

\e[H

End

\e[F

Delete

\e[3~

\e はエスケープ文字(0x1B)を表す。


zshは対応表を持たずに起動する

zshのZLEは、これらのシーケンスに対するバインドを初期状態でほとんど持っていない。

  • Ctrl+A(行頭)、Ctrl+E(行末)はemacsキーバインドとして最初から有効
  • 一方 Home(\e[H), End(\e[F) は未登録

結果として、Homeキーを押しても「解釈できない文字列が届いただけ」の状態となり、無視されるか意図しない挙動になる。


2.対応策/設定

zshの設定(~/.zshrc)を行う。
# vim .zshrc

# bashと同じemacsキーバインドを明示
bindkey -e

# Home / End (xterm系)
bindkey '^[[H'  beginning-of-line
bindkey '^[[F'  end-of-line

読み込む。
# source .zshrc

macOSにbashをインストールしても結局.bashrcに記述する必要がある。


3.FreeBSD/LinuxへSSH接続したときにHome, Endが効く理由

readlineは設定ファイルが1つも無い状態でも、自前のビルトインキーマップを持って起動する。
bind.c のemacsキーマップ初期化部分にハードコードされている。

FreeBSD 15.1で現在有効なバインド一覧を表示。
# bash -c 'bind -p' | less


▼ 関連記事