たとえば:echo strftime(%c)
、現在の時刻を下部に表示しますが、この時刻文字列をテキスト(カーソルの直後)に挿入する方法は?
たとえば:echo strftime(%c)
、現在の時刻を下部に表示しますが、この時刻文字列をテキスト(カーソルの直後)に挿入する方法は?
回答:
あなたは使用することができ、表現のレジスタを"=
、とp
(またはP
)ノーマルモードまたは<C-R>
挿入モードで:
通常モードでは:
(<C-M>
ここでは意味Control+ M、または押すだけをEnter/ Return)
"=strftime('%c')<C-M>p
挿入モードでは:
(<C-M>
上記と同じ意味を有する<C-R>
手段Control+ R)
<C-R>=strftime('%c')<C-M>
同じ式の結果を何度も挿入したい場合は、それらを.vimrc
:のキーにマッピングすることをお勧めします
(ここで<C-M>
and <C-R>
は文字どおりに入力する必要があります(5つの印刷可能な文字のシーケンス。Vimはそれらを内部で変換します))
:nmap <F2> "=strftime('%c')<C-M>p
:imap <F2> <C-R>=strftime('%c')<C-M>
"=
レジスタ。:-/
<C-R>=&sessionoptions
-ワイルドモードタブ補完も行います!
<c-r>=
は、大量の出力があり、インデントが壊れて出力テキストが読めなくなる可能性のあるコマンドの使用が遅くなります。たとえば<c-r>=execute('nmap')
、出力は1行ずつ書き込まれますが、非常に遅いです。
これらのコマンドはstrftime("%c")
、カーソルがある場所に右の出力を挿入します。
:exe ":normal i" . strftime("%c")
そして
:call feedkeys("i". strftime("%c"))
あなたがしたいことをする他の方法があります(例えば、Mikelの答えにあるような)。
編集:さらに良いことに、インプレース挿入には、Chris Johnsenが説明する=
レジスタを使用します
(関数呼び出しの戻り値ではなく)vim コマンドの出力を挿入する場合、キャプチャする必要があります。これは、vimの標準出力に相当するものを変数、ファイル、レジスタ、またはその他のターゲットにリダイレクトできるコマンドを介して実現されます。:redir
:redir
使用するのは非常に不便です。私はそのような機能をより便利な方法でカプセル化する関数を書きます。
funct! Exec(command)
redir =>output
silent exec a:command
redir END
return output
endfunct!
このような関数を宣言したら、式レジスタ(Chris Johnsenによる説明)を使用して、カーソル位置にコマンドの出力を挿入できます。そのため、通常モードからヒットi^R=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をよりについてのblatheringためredir
とリンクへ関連コマンド。
set paste
出力を返す前と後にコマンドを追加しましたset nopaste
。実際、現在の貼り付けオプションの値を保存して返したいと思っていましたが、保存できませんでした。
set nopaste
後return output
では機能しません。このページの別の回答として、この問題の解決策を示しました。
@intuitedの回答を改善して、先頭の空白やインデントの増加に関する問題を回避します。
"Examples:
":call Exec('buffers')
"This will include the output of :buffers into the current buffer.
"
"Also try:
":call Exec('ls')
":call Exec('autocmd')
"
funct! Exec(command)
redir =>output
silent exec a:command
redir END
let @o = output
execute "put o"
return ''
endfunct!
これは:call Exec('command')
、通常モードからファイルをコピーするときに、ファイルの現在の場所に挿入するだけです。コメントに記載されているように、文字列=Exec('command')
をExec(..)
返す元の(挿入モード)Ctrl + R アプローチはを使用して部分的に修正できますset paste
が、set nopaste
どこにでも配置する機会は提供しません。
let @o = output
構文は、レジスタを設定し、o
変数の内容をoutput
ここで説明したように、:https://stackoverflow.com/a/22738310/1143274
このreturn ''
行は、デフォルトの戻り値が0
バッファに挿入されないようにするためのものです。