Windows TerminalのVimで矩形選択(Visual Block)ができない時の対処法
Windows環境におけるターミナルの標準として、Windows Terminalの利用が一般的になっています。PowerShell、WSL、SSHクライアントを一元管理できる利便性がある一方で、Vimユーザにとってはキーバインドの競合という無視できない問題が存在します。
具体的には、Vimで矩形選択(Visual Block)を行う際のショートカット Ctrl+v です。 Windows Terminalのデフォルト設定では、Ctrl+v は「クリップボードからの貼り付け」に割り当てられています。そのため、Vim上で矩形選択を行おうとすると、矩形選択モードには移行せず、クリップボードの内容がペーストされる挙動となります。
Vimには代替キーとして Ctrl+q が用意されていますが、接続先のLinux環境(特にRHELなどのエンタープライズ系OS)によっては、この Ctrl+q すら反応しないケースがあります。WSL上のUbuntuなどでは機能する Ctrl+q が、なぜ特定のSSH接続先では機能しないのか。本稿ではその原因と対策を記述します。
目的:操作スタイルに合わせた環境整備
本記事における解決のゴールは以下の2パターンのいずれかを実現することです。
- 代替キー Ctrl+q を使用する(推奨) Windows Terminalの「貼り付け(Ctrl+v)」は維持し、Linux側の設定を変更して Ctrl+q を確実に機能させる。
- 本家 Ctrl+v を使用する Windows Terminalの「貼り付け」設定を削除し、Ctrl+v をVimに透過させる。
課題:フロー制御とクライアント設定の壁
矩形選択ができない原因は、クライアント(Windows)とサーバ(Linux)のそれぞれに存在します。
- クライアント側の課題(Ctrl+v): Windows Terminalアプリが Ctrl+v を「貼り付け」として優先的に処理してしまうため、SSHセッション内のVimにキーコードが到達しません。
- サーバ側の課題(Ctrl+q): Linuxの端末設定(TTY)において、歴史的な「ソフトウェアフロー制御(XON/XOFF)」が有効になっている場合、Ctrl+q は「通信再開」のシグナルとして処理されます。これにより、Vimにキー入力が到達しません。
以下に、それぞれのアプローチに対する具体的な解決策を記述します。
解決策A:サーバ設定を変更して「Ctrl+q」を使う
Windows標準の操作感(Ctrl+vで貼り付け)を変えたくない場合の対処法です。Linux側のフロー制御を無効化し、Ctrl+q を有効にします。
現状の設定確認
対象のサーバ上で以下のコマンドを実行し、端末設定を確認します。
stty -a
出力結果に ixon と表示されている場合、フロー制御が有効になっています(-ixon と表記されていれば無効です)。有効である場合、Ctrl+q は矩形選択として機能しません。
フロー制御の無効化
以下のコマンドを実行し、フロー制御を無効化します。
stty -ixon
これにより、Ctrl+s および Ctrl+q の特殊機能が解除され、通常のキー入力としてアプリケーションに渡されるようになります。Vim上で Ctrl+q を入力し、矩形選択モード(Visual Block)へ移行できることを確認してください。
設定の恒久化(.bashrcへの記述)
一時的なコマンド実行ではログアウト時に設定がリセットされるため、.bashrc に設定を追記します。 ただし、SCPやSFTPなどの非対話的な接続時にエラーが発生するのを防ぐため、標準入力が端末に接続されている場合のみ実行するよう条件分岐(if [ -t 0 ])を設ける必要があります。
# .bashrc への追記 # 端末(TTY)接続時のみフロー制御(XON/XOFF)を無効化 if [ -t 0 ]; then stty -ixon fi
この記述により、ファイル転送などの自動処理に影響を与えることなく、ターミナル操作時のみ安全に Ctrl+q を有効化できます。
解決策B:Windows Terminal設定を変更して「Ctrl+v」を使う
Vim本来の操作である Ctrl+v を優先したい場合の対処法です。Windows Terminalの設定を変更し、キーの競合を解消します。
設定画面を開く
Windows Terminalを起動し、ショートカットキー Ctrl + ,(カンマ)を押して設定タブを開きます。
「操作」メニューへ移動
左側のサイドバーから「操作」(バージョンによっては「インタラクション」)を選択します。ここにはショートカットキーの一覧が表示されています。
「貼り付け」設定の変更
一覧の中から「貼り付け」という項目を探します。デフォルトでは Ctrl+v が割り当てられています。
- 割り当ての削除: 項目の横にあるゴミ箱アイコン、または右クリックメニューからキーの割り当てを削除します。
- 別のキーへの変更: 必要であれば、Ctrl+Shift+v などの競合しないキーに変更します。
設定変更は即座に反映されます(保存ボタンが必要な場合は押下してください)。 これにより、Windows Terminalは Ctrl+v を横取りしなくなり、キー入力がそのままVimへ送信されます。結果として、Vim上で Ctrl+v による矩形選択が可能になります。
まとめ
Windows TerminalでVimの矩形選択が利用できない問題は、クライアント側とサーバ側、双方の要因が複合しています。
- Ctrl+v: Windows Terminalが「貼り付け」として優先処理している。
- Ctrl+q: Linux側の端末設定(stty)で「フロー制御」として優先処理されている場合がある。
Windows Terminalの設定を変更して Ctrl+v を奪還する方法もありますが、Windows標準の操作性を損なわないためには、Linux側の stty 設定を見直すアプローチが合理的です。 キー入力が反応しない際は、キーバインド設定だけでなく、通信制御レベルの設定(ixon)を確認することが解決への近道となります。


