zsh の edit-command-line でコマンドをエディタで編集する方法
zsh の edit-command-line ウィジェットを使って、コマンドラインの内容を Vim や VS Code などのエディタで編集する方法を解説します。
はじめに
この記事では、zsh の edit-command-line ウィジェットを使って、コマンドラインの内容を外部エディタで編集する方法を解説します。
この記事を読むと、以下のことができるようになります。
- コマンドラインの内容を Vim や VS Code などのエディタで編集する
- 長いコマンドや複数行のコマンドをエディタ上で快適に書く
前提条件
- zsh がインストールされていること(macOS ではデフォルトのシェルです)
- テキストエディタ(Vim、nano、VS Code など)がインストールされていること
edit-command-line とは
edit-command-line は、zsh に標準で同梱されている機能で、現在のコマンドラインの内容を外部エディタ(Vim、VS Code、nano など)で編集できるようにする ZLE ウィジェットです。
ZLE(Zsh Line Editor)とは、zsh のコマンドライン編集機能のことです。キーバインド(ショートカットキー)に機能を割り当てる仕組みを持っており、edit-command-line はその仕組みを使って動作します。
どんなときに便利か
ターミナルのコマンドラインは 1 行の入力欄なので、長いコマンドを書いたり修正したりするのが大変です。edit-command-line を使うと、以下のような場面でエディタの強力な編集機能を活用できます。
- 長いワンライナー(1 行の長いコマンド)を編集するとき
- 複数行のシェルスクリプトを直接コマンドラインで書くとき
- パイプ
|で繋いだ複雑なコマンドを修正するとき
セットアップ
edit-command-line を使うには、.zshrc(zsh の設定ファイル)に設定を追加します。
基本設定
.zshrc に以下の 3 行を追加してください。
# ステップ 1: edit-command-line 関数をオートロード autoload -Uz edit-command-line # ステップ 2: ZLE ウィジェットとして登録 zle -N edit-command-line # ステップ 3: キーバインドを設定(例: Ctrl+o) bindkey '^o' edit-command-line
設定を追加したら、新しいターミナルを開くか、以下のコマンドで反映します。
# 設定ファイルを再読み込み source ~/.zshrc
それぞれのコマンドの意味を説明します。
autoload -Uz edit-command-line
autoload は、関数を使うときに初めて読み込む(遅延読み込みする)ための zsh のコマンドです。
-U: エイリアス展開を抑制します。zsh に同梱されている関数では、このフラグが推奨されています-z: zsh ネイティブの方式で読み込みます。他のシェルとの互換性オプション(KSH_AUTOLOAD)が設定されていても、zsh の方式を使います
zle -N edit-command-line
zle -N は、シェル関数を ZLE のユーザー定義ウィジェットとして登録するコマンドです。この登録によって、edit-command-line をキーバインドに割り当てられるようになります。
bindkey の設定
bindkey は、キーの組み合わせにウィジェットを割り当てるコマンドです。割り当てるキーは自由に選べます。
# 例: Ctrl+o に割り当てる bindkey '^o' edit-command-line
Vi モードを使っている場合は、-M vicmd でコマンドモードのキーマップに割り当てます。
# 例: Vi コマンドモードの Ctrl+o に割り当てる bindkey -M vicmd '^o' edit-command-line
エディタの指定方法
edit-command-line が起動するエディタは、以下の優先順位で決まります。
| 優先順位 | 設定方法 | 例 |
|---|---|---|
| 1(最優先) | zstyle で明示指定 | zstyle ':zle:edit-command-line' editor vim |
| 2 | VISUAL 環境変数 | export VISUAL=vim |
| 3 | EDITOR 環境変数 | export EDITOR=vim |
| 4(デフォルト) | なし | vi が使われる |
VISUAL と EDITOR はどちらもエディタを指定する環境変数です。歴史的には VISUAL がフルスクリーンエディタ(Vim など)、EDITOR がラインエディタ(ed など)を指すものでした。edit-command-line を含め、git や crontab などのツールは VISUAL → EDITOR の順に参照します。一方、EDITOR しか見ないツールもあるため、実用上は両方に同じ値を設定しておくのが確実です。
環境変数で指定する場合
.zshrc に以下を追加します。
# Vim を使う場合 export VISUAL=vim export EDITOR=vim
zstyle で指定する場合
zstyle を使うと、edit-command-line 専用のエディタを指定できます。VISUAL や EDITOR とは別のエディタを使いたい場合に便利です。
# edit-command-line でのみ Vim を使う zstyle ':zle:edit-command-line' editor vim
使い方
基本的な流れ
edit-command-line の操作は以下の手順で行います。
- コマンドラインに文字を入力する(途中の状態でも構いません)
- 設定したキーバインド(例: Ctrl+o)を押す
- エディタが起動し、現在のコマンドライン内容が表示される
- エディタ上で自由に編集する
- 保存して閉じる(Vim なら
:wq、nano なら Ctrl+o → Ctrl+x) - 編集結果がコマンドラインに反映される
編集後、コマンドは自動的に実行されません。編集結果がコマンドラインに反映された状態でプロンプトに戻るので、内容を確認してから Enter キーを押して実行できます。
具体的な使用例
長いコマンドの編集
以下のような長いワンライナーを書いているとき、途中で修正したくなることがあります。
find /var/log -name "*.log" -mtime -7 -exec grep -l "ERROR" {} \; | xargs -I{} cp {} /tmp/error-logs/
コマンドラインでこのような長い 1 行を編集するのは大変ですが、エディタならカーソル移動や検索・置換などの機能を使って快適に編集できます。
複数行コマンドの作成
空のプロンプトで設定したキー(例: Ctrl+o)を押してエディタを起動し、複数行のコマンドを最初から書くこともできます。
for file in *.csv; do echo "Processing: $file" python3 process.py "$file" > "${file%.csv}_processed.csv" done
エディタ上では改行やインデントが自由に使えるので、複雑なループ処理も読みやすく書けます。
エディタごとの設定例
Vim
Vim はターミナル内で動作するエディタなので、特別な設定は不要です。
export VISUAL=vim export EDITOR=vim
edit-command-line は Vim を使う場合、コマンドラインでのカーソル位置をエディタに引き継ぎます。また、一時ファイルの拡張子が .zsh になるため、Vim のシンタックスハイライトが自動的に適用されます。
VS Code
VS Code を edit-command-line で使うには、--wait フラグが必要です。
export VISUAL="code --wait" export EDITOR="code --wait"
--wait フラグは、VS Code がファイルを閉じるまでコマンドの終了を待つようにするオプションです。このフラグがないと、VS Code はファイルを開いた直後にプロセスを終了してしまい、空の結果が返ってしまいます。
code コマンドを使うには、PATH にコマンドが通っている必要があります。VS Code のコマンドパレット(Cmd+Shift+P / Ctrl+Shift+P)で「Shell Command: Install 'code' command in PATH」を実行してください。
エディタごとの --wait フラグの要否
| エディタ | コマンド | --wait フラグ |
|---|---|---|
| Vim | vim | 不要 |
| nano | nano | 不要 |
| VS Code | code --wait | 必要 |
| Sublime Text | subl --wait | 必要 |
| Cursor | cursor --wait | 必要 |
ターミナル内で動作するエディタ(Vim、nano など)は --wait が不要です。一方、GUI エディタ(VS Code、Sublime Text、Cursor)はバックグラウンドでプロセスが動作するため、--wait フラグでファイルが閉じられるまで待機させる必要があります。
まとめ
この記事では、zsh の edit-command-line ウィジェットの設定方法と使い方を解説しました。
重要なポイント:
- edit-command-line は、コマンドラインの内容を外部エディタで編集できる zsh の標準機能
.zshrcに 3 行(autoload、zle -N、bindkey)を追加するだけで使える- エディタは
zstyle、VISUAL、EDITOR環境変数の順に決定される - GUI エディタ(VS Code など)を使う場合は
--waitフラグが必要 - 編集後はコマンドラインに反映されるだけで、自動実行はされない
参考リンク: