vimでコマンド結果をテキストに挿入するには?

vimでコマンド結果をテキストに挿入するには?

たとえば、:echo strftime(%c)現在の時刻が下部に表示されますが、この時刻文字列をテキスト(カーソルの直後)にどのように挿入できますか?

答え1

:r!date +\%c

バラより:help :r!

これはvimコマンドではなく外部コマンド(シェル内で実行されます)に対するものです。

答え2

あなたはそれを使用することができます式レジスタ"=,,そしてp(またはPノーマルモードまたは<C-R>挿入モードで:

通常モードでは:(
ここでは+を<C-M>意味するか、/を直接押します)ControlMEnterReturn

"=strftime('%c')<C-M>p

挿入モードでは:(
上記と同じ<C-M>、+を<C-R>意味)ControlR

<C-R>=strftime('%c')<C-M>

同じ式の結果を複数回挿入するには、次のキーにマッピングする必要があります.vimrc
<C-M><C-R>

:nmap <F2> "=strftime('%c')<C-M>p
:imap <F2> <C-R>=strftime('%c')<C-M>

答え3

vimの出力を挿入したい場合注文する(シェルのstdoutのように、代わりに関数呼び出しの戻り値または表現する)、キャプチャする必要があります。これは:redir、変数、ファイル、レジスタ、またはその他のターゲットに対応するvimの標準出力をリダイレクトできるコマンドを使用して行われます。

:redir使用が少し不便です。より便利な方法で機能をカプセル化する関数を作成します。

funct! Exec(command)
    redir =>output
    silent exec a:command
    redir END
    return output
endfunct!

これらの関数が宣言されたら、式レジスタ(Chris Johnsenの説明に従って)を使用して、コマンドの出力をカーソル位置に挿入できます。したがって、通常モードでは、クリックして:put =Exec('ls')vimの現在のバッファのリストを挿入します。

コマンドは関数の名前空間で実行されるため、グローバル変数を使用する場合は前に付ける必要がありますg:。また、Exec()上記のように、1行の出力にも終了行の改行が追加されます。substitute()これを防ぐために、関数呼び出しを追加する必要があるかもしれません。

また見てくださいhttps://stackoverflow.com/questions/2573021/vim-how-to-redirect-ex-command-output-into-current-buffer-or-file/2573054#2573054関連コマンドの詳細redirとリンクを確認してください。

答え4

:call append(line('.'), strftime("%c"))

次の行に置いてJShift+ J)を押すと、現在の位置にリンクします。

または、1つのコマンドですべての操作を実行する必要がある場合は、次のことを実行できます。

:call setline(line('.'), getline(line('.')) . strftime("%c"))

または

:call setline(line('.'), getline(line('.')) . " " . strftime("%c"))

日付の前にスペースを挿入するかどうかによって異なります。

関連情報