vimscriptで記録しているかどうかを検出する方法はありますか?


11

のようなものはありますか

eval("is_recording()")

vimscriptで呼び出して、現在マクロを記録しているかどうかを確認できますか?私はこれがうまくいくと思ったでしょう:

eval("mode(1)")

しかし、それだけを返します"n"

それが重要かどうかはわかりませんが、私はneovimを使用しているので、neovim専用の場合はそれで問題ありません。


3
私見それは悪い考えです-その場合、「録音」は偽の名前になります:)あなたが何をしようとしているのかわからないが、おそらくその質問をすることでそれを解決するさまざまな方法が提供される可能性があります。
VanLaser 2016年

@VanLaser偽名とはどういう意味ですか?
ジェームズ

1
記録しているときにVimアクションが異なる場合、それは記録プロセス自体がアクションに影響を与えることを意味します。マクロを実行するとどうなると思いますか?
VanLaser 2016年

回答:


4

まず、あなたの問題は主に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と、に設定され10録音を停止します。その後、変数の値を介して記録状態にアクセスできます。

「欠点」は、再帰的なマッピングを避けるために、Shit-q ではなくを使用して記録を開始および停止する必要があるということですq(それほど大きな問題ではないことに注意してください。shift-q元のshift-q動作が気に入らないため、しばらくの間レコードモードの切り替えに使用しています)

このソリューションの主な問題は、それを忘れqて変数を使用してもトグルされないが、無効にできないq(例:)ことです。これnnoremap q <nop>を行うと、shift-qもう機能しなくなります。


2

マクロを記録するための「モード」がないため、これはかなり奇妙な要求です。いくつかのドキュメントを調べた後、私は次のことを見つけました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

  1. 名前のないレジスター ""

  2. 10個の番号付きレジスタ "0〜" 9

  3. 小さな削除レジスター "-

  4. 26の名前付きレジスタ "aから" zまたは "Aから" Z

  5. 3つの読み取り専用レジスタ ":、"。、 "%

  6. 代替バッファレジスタ "#

  7. 式レジスタ "=

  8. 選択およびドロップレジスター「*」、「+」、「〜」

  9. ブラックホールレジスター「_

  10. 最終検索パターンレジスタ "/

使用するレジスターがあるとすると、「記録が停止したことをどうやって知るのか」という問題になります。見て取ると思います。この私の世話をするautocmd-eventためにCursorHold、ヘルプドキュメントのメモはかなり有望に見えます(マクロの目的でレジスタが書き込まれているときに発生する通常のcursorHoldとアイドル/存在しないイベントを区別する方法を理解しようと思います)

カーソルホールド

ユーザーが「updatetime」で指定された時間キーを押さなかった場合。ユーザーがキーを押すまで再トリガーされません(つまり、Vimを離れてコーヒーを飲む場合、「更新時間」ミリ秒ごとに起動しません。)|| CursorHold-example |を参照してください タグのプレビュー用。このイベントは通常モードでのみトリガーされます。コマンド引数が入力されるのを待っているとき、またはオペレーターの後に移動するときは、トリガーされません。CursorHoldイベントの記録中はトリガーされません。| q |


私はそれがどのように問題を解決するのか本当にわかりません:マクロの記録を完了すると、文字列はレジスターに保存されますが、レジスターにマクロが含まれている場合、または例えばyankコマンドからの何かが含まれている場合にどのように区別しますか?また、記録が終了すると、レジスターはワンショットとして保存されるため、レジスターの内容が変更されたことがわかると、記録モードではなくなります。
statox

私の希望は、ブラックホールレジスター(これまでヤンクされないレジスター)のようなものを使用できることです。そのレジスターがロックダウンされている場合は、録音モードのときに特別な動作をするCursorHoldをチェックアウトできます(回答が更新され、それが役立つかどうかを確認します)
Dan Bradbury

他のレジスターに関するいくつかの情報(ヤンクとの競合を回避する方法)と、マクロの記録中にCursorHoldがアクティブでない状態で「記録」をキャッチする方法に関するヒントを追加しました。これらのメモを試しても問題が解決しない場合はお知らせください。作業が終わった後で実装できるようにいたします。注意として、これはblackhole registerヒントと何かにつながるかもしれない興味深いvim tidbitとしてのみ言及されました(マクロを記録するときに使用するのは役に立ちません。@ _は使用できないためです)。実際、マクロを保存することすらできません。それに..
ダンブラッドバリー

私はこの最後の夜(ポストビールキーボードのスマッシュ)に少し時間を費やしましたが、録音が発生して終了する時期を正確に把握するのは非常に難しいことに気付きました。 実際に起こっCursorHoldているのが遅れているため、私の直感はありえない夢のようですCursorHold(これを見るために毎回起こる単純なグローバルな増分を作りました)。まだ信じられない。これを行うには、我々は解決策を持ってまで、キーに対する私の顔を壊し続ける方法を考え出すに興味がある
ダン・ブラッドベリ

私の意見では、1000の異なるオプションはありません。動作をオーバーライドしq、変数を切り替えて記録を開始/停止する必要があります。autocmdはキーを押してもトリガーされないため、ここでは信頼できません。Vimのモノスレッドの性質上、ポーリング機能を実行することはできません。今後の実験で頑張ってください:-)
statox
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.