回答:
" :read
"を使用すると、Vimは常に新しい行に出力を挿入します。解決策は残念ながら簡単ではありません。
を押してControlRから入力することにより、挿入モードのときに現在のカーソル位置にコマンドの出力を挿入できます=system('command')
Enter。残念ながら、コマンドの出力に(ほとんどの場合と同様に)末尾に改行が含まれていると、その改行も挿入されるため、行が壊れます。
これはsubstitute()
、末尾の改行を削除する呼び出しを追加することで修正できますが、手動で入力するよりもコマンドが面倒になります。
究極の解決策は、ある種のマッピングを作成することですが、Vimが「タイプ・アヘッド」と呼んでいるものを処理する方法により、さらに複雑になります。次のようなことができます:
:nmap \e i<c-r>=substitute(system('date'),'[\r\n]*$','','')<cr><esc>
マッピングでコマンドが「ハードワイヤード」されている場合、次のようなことはできません。
:nmap \e i<c-r>=substitute(system(input('Command: ')),'[\r\n]*$','','')<cr><esc>
Vimは混乱し、ビープ音を発し、挿入モードに入るため、コマンドを実行するようユーザーにプロンプトを表示しようとします。
そのため、最初に実行するコマンドのプロンプトを表示し、変数に保存してから、処理された出力を挿入する必要があります。この時点で、マッピング自体が手に負えないほど乱雑にならないようにするために、おそらくヘルパー関数が必要になるため、次のような結果になります。
function InlineCommand()
let l:cmd = input('Command: ')
let l:output = system(l:cmd)
let l:output = substitute(l:output, '[\r\n]*$', '', '')
execute 'normal i' . l:output
endfunction
nmap <silent> \e :call InlineCommand()<CR>
nmap
通常モードで入力した場合にのみ実行されるマッピングを作成することに注意してください。
ちなみに、日付または現在の作業ディレクトリのみを挿入する場合は、最初に答えた方が適切です。挿入モードに入り、ControlR=strftime('%c')
Enterまたはを入力するだけControlR=getcwd()
Enterです。
現在の行でそれが必要な場合は、試してみてください。ただし、行の古いコンテンツは消去されます。
:.!date
正確なカーソル位置が必要な場合は、次のことができます。
:let a=system("date") | let b=substitute(a,"[\r\n]*$","","g") | exec 'normal i'.b
簡単に言えば、^ @(ヌル文字)を削除したいので、.s / \%x00 // gに置き換えることもできます。これは、パイプが少ない短いバージョンです。
:exec 'normal i'.substitute(system("date"),"[\n]*$","","")
また、同じ行のさまざまなポイントで置き換える場合は、タグを設定することもできます。
この行1を考えます:
1 Date: <datehere> and also <datehere>
実行:
:let a=system("date") | exec ".s/<datehere>/".a."/g" | .s/\%x00//g
交換後:
1 Date: jue ago 9 02:34:52 ART 2012 and also jue ago 9 02:34:52 ART 2012
Vim 7.2でテスト済み
このようなものを.vimrcに追加できます。
" Insert the date in YYYY-MM-DD format inline just before cursor position (normal mode)
nnoremap <Leader>di me:r !date +\%F<CR>A <Esc>0D`ePJx
me
現在の位置をマークします。:r !date +\%F<CR>
次の行に日付をYYYY-MM-DD形式で配置します(好きなように変更できますが、それぞれ%
でエスケープします\
)。A <Esc>
日付出力の最後にスペースを追加します。0D
日付を削除`e
し、マークされた位置に戻りPJx
、日付をカーソルの前に置き、行を結合して(下の空の行を削除する)、末尾のスペースを削除します。必要に応じてマッピングを変更します。挿入モードから実行したい場合は、https: //vimways.org/2018/the-mapping-business/で今日このgemを読みます。
inoremap <C-g><C-t> <C-r>=strftime("%F")<CR>
日付出力をニーズに合わせて変更できます(man date
これを支援できます)。
通常モード(エスケープ/ブリープモード)で貼り付け
:exec 'normal i'.system("date \| tr '\n' ' '")
現在の位置に挿入された日付を取得します。その行を改行でコピーすると、Shift + InsertがDateTime-Hereコマンドになります。
さらに、F12をコマンドにバインドできます
:inoremap <F12> <C-r>=system("date \| tr '\n' ' '")<CR>
挿入モードがアクティブなときに、ファンクションキー-12で日付を挿入できます。私が使う
:inoremap DHRE <C-r>=system("date \| tr '\n' ' '")<CR>
(既にADHEREの貼り付けがトリガーされていることに気付いたので、DHEREから変更しました)他のことにF12を既に使用しているためです。
私が使う
grep -iE "dhere" /usr/share/dict/words
既存の単語との明らかな衝突をチェックします。これは、比較的安全に使用できることを示しています。
:inoremap PWD <C-r>=system("pwd \| tr '\n' ' '")<CR>
(特定のドキュメントを書いている場合を除きます。)