のようなものはありますか
eval("is_recording()")
vimscriptで呼び出して、現在マクロを記録しているかどうかを確認できますか?私はこれがうまくいくと思ったでしょう:
eval("mode(1)")
しかし、それだけを返します"n"
。
それが重要かどうかはわかりませんが、私はneovimを使用しているので、neovim専用の場合はそれで問題ありません。
のようなものはありますか
eval("is_recording()")
vimscriptで呼び出して、現在マクロを記録しているかどうかを確認できますか?私はこれがうまくいくと思ったでしょう:
eval("mode(1)")
しかし、それだけを返します"n"
。
それが重要かどうかはわかりませんが、私はneovimを使用しているので、neovim専用の場合はそれで問題ありません。
回答:
まず、あなたの問題は主にXY問題だと思います。最終的に何をしようとしているのかについてもっと情報を提供してください。別の解決策が見つかると思います。
これが回避策です。おそらく理想的ではなく、確かにそれほど堅牢ではありませんが、これらの行を以下に追加できます.vimrc
。
let g:isRecording = 0
nnoremap Q :call ToggleRecording()<CR>q
function! ToggleRecording()
let g:isRecording = !g:isRecording
echo "is recording " . g:isRecording
endfunction
アイデアはq、通常モードでを押すと「記録モード」が排他的にトグルされるということです。
これに基づいてg:isRecording
、記録を開始または停止するたびにトグルされる変数を作成します。このようにして、録音を開始するg:isRecording
と、に設定され1
、0
録音を停止します。その後、変数の値を介して記録状態にアクセスできます。
「欠点」は、再帰的なマッピングを避けるために、Shit-q ではなくを使用して記録を開始および停止する必要があるということですq。(それほど大きな問題ではないことに注意してください。shift-q元のshift-q動作が気に入らないため、しばらくの間レコードモードの切り替えに使用しています)
このソリューションの主な問題は、それを忘れqて変数を使用してもトグルされないが、無効にできないq(例:)ことです。これnnoremap q <nop>
を行うと、shift-qもう機能しなくなります。
マクロを記録するための「モード」がないため、これはかなり奇妙な要求です。いくつかのドキュメントを調べた後、私は次のことを見つけましたusr_10
最初の行の最初の文字に移動することから始めます。次に、次のコマンドを実行します。
qa レジスターaにマクロの記録を開始します。
^行の先頭に移動します。
i#include "文字列#include"を行の先頭に挿入します。
$行末に移動します。
a "行末に文字二重引用符(")を追加します。
j次の行に移動します。
qマクロの記録を停止します。
目立ったのは、「レジスタaでマクロの記録を開始する」という行でした。
各マクロはデフォルトでレジスターに保存されるため、:reg
リストに表示されることを望んでいました。それは魅力のように機能することがわかりました!
例:
通常モード: qaisomething<Esc>
中に:reg
はエントリが表示されます!
"a isomething^[
その知識があれば、レジスターを「スパイ」して、マクロが記録されていることを確認できるはずです(すべての記録で名前付きレジスターをq
使用します[マップは常に同じレジスター(またはそのようなもの)を使用します)]
問題が発生した場合は私に知らせて、私があなたを助けようとします(この機能も私にとって新しいので:D)
編集
ヤンク中に使用されるレジスターの問題に対処するには、vimL
書き込み中のユーザーにのみ使用できる特別なタイプのレジスターを調べることをお勧めします(ヤンクがレジスターに関与することはありません("ay
))
:help registers
利用可能なレジスターからの情報の一部です
レジスタには10種類あります。 レジスタ E354
名前のないレジスター ""
10個の番号付きレジスタ "0〜" 9
小さな削除レジスター "-
26の名前付きレジスタ "aから" zまたは "Aから" Z
3つの読み取り専用レジスタ ":、"。、 "%
代替バッファレジスタ "#
式レジスタ "=
選択およびドロップレジスター「*」、「+」、「〜」
ブラックホールレジスター「_
最終検索パターンレジスタ "/
使用するレジスターがあるとすると、「記録が停止したことをどうやって知るのか」という問題になります。見て取ると思います。この私の世話をするautocmd-event
ためにCursorHold
、ヘルプドキュメントのメモはかなり有望に見えます(マクロの目的でレジスタが書き込まれているときに発生する通常のcursorHoldとアイドル/存在しないイベントを区別する方法を理解しようと思います)
カーソルホールド
ユーザーが「updatetime」で指定された時間キーを押さなかった場合。ユーザーがキーを押すまで再トリガーされません(つまり、Vimを離れてコーヒーを飲む場合、「更新時間」ミリ秒ごとに起動しません。)|| CursorHold-example |を参照してください タグのプレビュー用。このイベントは通常モードでのみトリガーされます。コマンド引数が入力されるのを待っているとき、またはオペレーターの後に移動するときは、トリガーされません。CursorHoldイベントの記録中はトリガーされません。| q |
blackhole register
ヒントと何かにつながるかもしれない興味深いvim tidbitとしてのみ言及されました(マクロを記録するときに使用するのは役に立ちません。@ _は使用できないためです)。実際、マクロを保存することすらできません。それに..
CursorHold
ているのが遅れているため、私の直感はありえない夢のようですCursorHold
(これを見るために毎回起こる単純なグローバルな増分を作りました)。まだ信じられない。これを行うには、我々は解決策を持ってまで、キーに対する私の顔を壊し続ける方法を考え出すに興味がある
q
、変数を切り替えて記録を開始/停止する必要があります。autocmdはキーを押してもトリガーされないため、ここでは信頼できません。Vimのモノスレッドの性質上、ポーリング機能を実行することはできません。今後の実験で頑張ってください:-)