1

についてのvimドキュメントを読んだ後*:bar* *:\bar*

'|'コマンドを区切るために使用できるため、1行に複数のコマンドを指定できます。


このコマンドで履歴をクリアしようとしました:

:set history=0 | set history=20

これらの2つのコマンドを1つずつ実行し、履歴をクリアする必要があると思います。
しかし、そうではありませんでした。歴史はまだそこにあり、新しい歴史が追加されました。


それから私は試しました:

:set history=0
:set history=20

できます。


なんで?

4

1 に答える 1

7

コマンドラインを実行すると、次のようになります。

  1. 履歴が初期化されます(ここで切り捨てが発生します)(init_hist()関数呼び出しgetcmdline())。
  2. 実行する文字列を取得します(in getcmdline())。
  3. 履歴に追加されます(add_to_history()呼び出しgetcmdline())。
  4. 実行されます(do_one_cmd()で、呼び出しdo_cmdline()後に発生します(引数として渡されて呼び出されます))。getcmdline()getexline()fgetlinedo_cmdline()

オプション自体は何も設定せず、変数を変更するだけです。 p_hi履歴の実際の変更は、ステップ1で行われます。

次に、両方の場合に何が起こるかを見てみましょう(2番目または3番目の追加コマンドを入力したと仮定します)。

  1. 履歴はp_hi、古い値のときに最初に初期化され、次に2回変更され、次のコマンドを実行すると、すでにに設定されてい20ます。
  2. 履歴はp_hi、古い値のときに最初に初期化され、次に1回変更されて、2回目に初期化されます。このステップで効果的に切り捨てられ、その後、値が再び変更されます。3番目のコマンドを入力し始めるまでに、それはすでに消去されています。

したがって、あなたの仮定(コマンドは1つずつ実行されます)は正しいですが、どの時点で履歴の変更が行われるかを間違えています。@Michaelのアドバイスに従って使用することをhistdel()お勧めします。これは、最初はそれ自体で履歴をクリアし、次に、ハードコードされた「履歴」値を持たないためです。20行の長い履歴でどのように生活しているかはわかりませんが(65535に設定しているので、小さいものは失われませんが、便利です)、この値をハードコーディングすると、履歴サイズが別のものに変更されます。もっと痛い。

于 2012-06-16T20:33:23.137 に答える