Vim・Neovim コマンド履歴ガイド:q:、:history、viminfo、ShaDa

Normal モードで :qq: と打ち間違えても、Vim が固まったわけではありません。q: は編集可能なコマンドラインウィンドウを開きます。以前の Ex コマンドを探し、修正して再実行するのに便利ですが、ファイル名、検索語、誤入力した機密情報が見えることもあります。このガイドでは、まず履歴の種類を分け、その後に読み取り専用検査、永続化しない演習、プライバシー上の停止条件を示します。

この保守版は 2026 年に書き直しました。2011 年の原文は一つの観察と、現在は失効した HTTP 画像だけです。全文は末尾の不活性アーカイブに保存しています。アーカイブは旧画像を読み込まず、現在の操作手順でもありません。

最初に Vim、Neovim、その他の vi を識別する

q::history、viminfo、ShaDa は、すべての古典的 vi 実装に共通する移植可能なインターフェースではありません。現在のエディター内で、次の読み取り専用識別から始めます。

:version
:echo has('nvim')
:echo has('cmdline_hist')
:set compatible?
:set history?

has('nvim') は Neovim で 1、Vim では通常 0 を返します。has('cmdline_hist') は、そのビルドにコマンドライン履歴機能が含まれるかを示します。起動ラッパー、ディストリビューションのパッチ、マッピング、プラグインが UI を変えることもあるため、最終的には現在のインスタンスの :help cmdline-window:help :history を基準にします。

q:q/q? が開くもの

次のキーは Normal モードから始めます。

キー開く履歴実行時の方向
q:Ex コマンド履歴カーソル行の : コマンドを実行
q/検索履歴選択したパターンを前方検索に使用
q?/ と共有する同じ検索履歴選択したパターンを後方検索に使用

先に :/? のコマンドラインへ入り、'cedit' に設定されたキーを押して同じ種類のウィンドウを開くこともできます。非 compatible の Vim では Ctrl-F が一般的な初期値です。:set cedit? で現在値を確認し、端末や設定がキーを変えていないと仮定しないでください。

コマンドラインウィンドウは Normal モードで開き、一時バッファのように移動と編集ができますが、入れ子にはできません。他の履歴行を編集しても、保存済み履歴を恒久的には書き換えません。Enter で実行した行は、通常入力したコマンドと同様に新しい履歴項目になります。

誤って開いた q: から安全に離れる

目的操作結果
現在行を破棄して Normal モードへ戻る:quit、短縮形は :qカーソル行を実行せずコマンドラインウィンドウを閉じる
確認済みの行を実行するEnterウィンドウを閉じ、そのコマンドまたは検索を実行
選択行をコマンドラインへ戻して確認するCtrl-Cその行を事前入力して Command-line モードへ戻る。破棄ではない

カーソル行が何をするか不明なら、Enter を押さないでください。この小さなウィンドウを閉じるために :qall! も使わないでください。エディター全体を終了し、他のバッファの変更を破棄する可能性があります。Esc だけでは Normal モードの操作にすぎず、確実なクローズ操作ではありません。

マクロ記録も混同しやすい別の状態です。Normal モードの q{register} は記録を開始し、q は停止します。公式ヘルプによると、記録中はこのキー列の q が先に記録を停止するため、コマンドラインウィンドウは開きません。不明なモードでキーを繰り返す前に、ステータス表示を確認します。

ウィンドウを開かずコマンドを呼び戻す

コマンドライン上の UpDown は、すでに入力した接頭辞に一致する古い項目または新しい項目を探します。例えば :set と入力してから Up を押すと、set で始まる以前のコマンドを優先します。Shift-Up/PageUp と対応する下方向キーは接頭辞を使いません。一部の端末はこれらのキー組み合わせを正しく送信できません。

Ctrl-PCtrl-N は通常、現在の接頭辞を無視して古いコマンドと新しいコマンドを取得します。コマンドライン補完がすでに有効な場合は、補完候補の切り替えになることがあります。以下はキー列であり、貼り付けて実行する文字列ではありません。

:set<Up>
:<C-P>
:<C-N>

:history による読み取り専用一覧

Vim と Neovim はコマンドラインデータを五種類の履歴へ分けます。/? は同じ検索履歴を使います。

:history :
:history /
:history =
:history @
:history >
:history all
名前内容
cmd または :Ex コマンド
search/、または ?検索文字列
expr または =式レジスタ履歴
input または @input() で入力した行
debug または >デバッグコマンド

:history は表示だけを行い、履歴項目を実行しません。ただし、出力自体がプロジェクトパス、検索語、資格情報を漏らす場合があります。公開配信中に :history all を実行したり、秘匿化せず issue やログへ貼り付けたりしないでください。

四種類の「履歴」を混同しない

必要なもの正しい入口q: との違い
以前のコマンドまたは検索:historyq:q/q?このガイドの主題
エディターのメッセージ:messages警告と出力であり、Ex コマンド一覧ではない
現在バッファの undo tree:undolist と undo ヘルプテキスト状態であり、コマンドライン履歴ではない
マクロ、削除、コピー内容:registersレジスタデータ。q{register} はマクロ記録

後の三つにも機密テキストが含まれる場合があります。特に、診断だけを目的に完全な :registers 一覧を公開しないでください。:undolist は読み取り専用ですが、:earlier:later、undo コマンドは選択中のテキスト状態を変えます。使用前に保存またはバックアップします。

セッション間の永続化とプライバシー

'history' は各メモリ内履歴の最大項目数を制御します。Vim はコマンド、検索、入力、レジスタ、マークなどを viminfo へ書き出せます。Neovim で対応する MessagePack ファイルが ShaDa です。他人のオプション文字列で自分の設定を置き換えず、まず読み取り専用で確認します。

Vim:

:set history?
:set viminfo?
:set viminfofile?

Neovim:

:set history?
:set shada?
:set shadafile?

終了時には通常、メモリ内情報が既存の状態ファイルへマージされ、複数インスタンスが異なる時刻に書き込むこともあります。ファイルの直接編集や削除、histdel() の呼び出しは破壊的であり、バックアップ、同期サービス、端末録画、shell 履歴、別のエディターインスタンスへ移った秘密を回収できません。

Ex コマンド、検索パターン、式、input() へパスワード、アクセストークン、秘密鍵を入力しないでください。秘密が現れた場合は、最初に発行元で失効またはローテーションします。その後、承認済みのインシデント対応手順で全インスタンス、viminfo/ShaDa、バックアップ、ログを確認します。可視項目を消すだけでは資格情報の修復になりません。

信頼できない viminfo または ShaDa を読み込まないでください。Vim 公式文書は、信頼できない viminfo の処理に式データが関与し得ると明記しています。Neovim ShaDa も、任意にインポートするテキスト断片ではなく、エディター状態として扱います。

永続化しないセッションで演習する

shell から、個人設定も永続履歴状態ファイルも読み込まない空セッションを起動します。

vim -N -u NONE -U NONE -i NONE
nvim --clean -i NONE

一行目は Vim、二行目は Neovim 用です。インストールされていないプログラムの行は実行しません。-i の後の NONE は大文字で、viminfo または ShaDa を読み書きしないという意味です。この分離は、端末自身のログ、画面録画、OS 監査を無効にはしません。

空セッションで、ファイルへ書き込まない次の演習を行います。

:echo 'history-demo'
:history :
q:

ウィンドウ内で echo 行を探します。確認後なら Enter で再実行できます。離れる練習だけなら :quit と入力します。最後に、ファイルを編集していない状態で通常終了します。個人履歴へ触れず、現在バージョンのキー動作を確認できます。

動作が異なるときに集める証拠

次の診断は読み取り専用です。:verbose nmap q はユーザー名を含む設定パスを表示する場合があるため、共有前に秘匿化します。

:version
:echo has('cmdline_hist')
:set compatible?
:set cedit?
:set history?
:verbose nmap q

証拠から判断します。

  • q: が反応しない:Normal モード、マクロ記録状態、q マッピング、ビルドの +cmdline_hist を確認します。
  • Ctrl-F で開かない:'cedit'、端末のキー伝送、コマンドラインマッピングを確認します。
  • 再起動後に履歴が空:'history'、viminfo/ShaDa 設定、-i NONE/--clean、コンテナの一時 HOME、ファイル権限、終了時エラーを確認します。
  • 履歴が予想と違う:複数エディターインスタンス、プラグイン独自履歴、リモートセッション、別ユーザー環境を確認し、状態ファイルをすぐ上書きしないでください。
  • UI が異なる:Neovim フロントエンドやプラグインがコマンドライン UI を置換している可能性があります。--clean -i NONE で再現し、コア動作と設定動作を分離します。

有界チェックリスト

  1. :version で製品、バージョン、機能を記録し、Vim の動作を標準 vi の動作と仮定しない。
  2. 誤って開いた q::quit で閉じ、実行前にカーソル行を一文字ずつ確認する。
  3. :history {type} で出力を限定し、公開共有前に秘匿化する。
  4. 読み取り専用の :set ...? で永続化を確認し、viminfo/ShaDa の完全なオプション文字列を上書きしない。
  5. マッピングまたはプラグイン問題を、クリーンな -i NONE セッションで再現する。
  6. 履歴へ入った機密値はローテーションする。項目削除は漏えいを取り消さない。

参考資料

歴史的原文アーカイブ

以下は source_export にある 2011 年の可視本文を完全に保存した不活性アーカイブです。原文には行末空白がなく、秘匿化が必要な個人情報や追跡値もないため、置換はありません。失効した HTTP 画像アドレスは出典証拠としてだけ残り、コード囲み内では読み込まれません。


用vi/vim的时候总是会误把命令历史调出来。原来把“:q”打成了“q:”。

![](http://earnfs.sinaapp.com/wp-content/uploads/auto_save_image/2011/09/050406Ae2.jpg)

Leave a Reply