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-linebindkey '^[[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