:行の後ではなくカーソルの後に読み取る


11

私は:r !uuidgen頻繁に新しいuuidをバッファーに挿入するために使用します。これは機能しますが、私は通常、引用符の間にuuidを挿入しようとし:r !uuidgen、uuidを新しい行に出力します。

この問題を回避するために、私は現在単純なキーマップを使用しています:

nnoremap <C-u> mm:r!uuidgen<CR>dW"_dd`mp

このマクロは、マークを設定しmm、uuidを挿入しr!uuidgen、挿入されたuuid dWを削除し、余分な行を削除"_ddし、マークBACKTICKmに戻り、最後にuuidを貼り付けpます。

:rレジスターを浪費するこのマクロ/キーバインディングなしでカーソルの直後に行く方法はありますか?


1
SUの質問。このような回避策もあります。
muru

回答:


8

式レジスタ"=system()次を使用できます:

<C-r>=system("uuidgen | tr -d '\n'")<CR>

挿入モードのマッピングでは次のようになります。

inoremap <key> <C-r>=system("uuidgen | tr -d '\n'")<CR>

または、式マッピングで:

inoremap <expr> <key> system("uuidgen \| tr -d '\n'")

5

挿入モードからを押して、次のように入力できますCtrl-R

=system('uuidgen')

これがuuidgen出力であるので、これは末尾の改行を追加することに注意してください。これを修正するには、次を使用できます。

=system('uuidgen')[:-2]

改行を削除します。

から:help i_CTRL-R

レジスターの内容を挿入します。CTRL-Rを入力してから2番目の文字までの間に「」が表示され、レジスターの名前を入力する必要があることを示します。

[..]

'='式レジスタ:式を入力するように求められます(式を参照)

これをCtrl-uあなたの例のようにバインドするには、次を使用できます:

nnoremap <C-u> i<C-r>=system('uuidgen')[:-2]<CR><Esc>

2

もう一つ、と:python

:py import uuid, vim; vim.command(':normal i' + str(uuid.uuid1()))

次のようにマッピングできます:

:inoremap <key> <esc>:py import uuid, vim; vim.command(':normal a' + str(uuid.uuid1()))<cr>a

UUIDは、Python UUIDモジュールによって生成されます


1
ただし、これはかなりねじれた方法です。
muru

0

これは、pure-vimソリューションを使用するよりも望ましいとは言えませんが、Ultisnipsなどのスニペットマネージャーを使用している場合は、次のようなスニペットを追加してみてください。

snippet uuid "insert new uuid" w
`uuidgen`
endsnippet

このようにしてuuid、挿入モードで拡張トリガーを入力してヒットするuuidと、関連するシェルコマンドの出力に置き換えられます。もちろん、これは他のコマンドに簡単に適用でき、Ultisnipsのドキュメントで概説されているように強力な方法で拡張できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.