Apakah ada cara untuk mendeteksi jika saya merekam dalam vimscript?

11

Apakah ada yang seperti itu?

eval("is_recording()")

bahwa saya dapat memanggil vimscript saya untuk mengetahui apakah saya sedang merekam makro? Saya akan berpikir ini bekerja:

eval("mode(1)")

tapi itu baru saja kembali "n".

Tidak yakin apakah itu penting, tapi saya menggunakan neovim, jadi jika itu eksklusif untuk neovim, tidak apa-apa.

James
sumber
3
IMHO itu akan menjadi ide yang buruk - "rekaman", dalam hal ini, akan menjadi nama yang salah :) Tidak tahu apa yang Anda coba lakukan, tapi mungkin menanyakan pertanyaan itu dapat memberikan cara yang berbeda untuk menyelesaikannya.
VanLaser
@ VanLaser Apa maksud Anda dengan nama palsu?
James
1
Jika tindakan Vim berbeda saat Anda merekamnya, itu berarti proses perekaman itu sendiri memengaruhi tindakan tersebut, padahal seharusnya hanya "menyimpan" untuk pengulangan kemudian. Apa yang Anda harapkan terjadi ketika Anda menjalankan makro?
VanLaser

Jawaban:

4

Pertama, saya pikir masalah Anda terutama masalah XY . Anda harus memberi kami informasi lebih lanjut tentang apa yang Anda coba lakukan pada akhirnya dan saya pikir kami bisa menemukan solusi lain.

Sekarang ini adalah solusi, mungkin tidak ideal dan tentu saja tidak terlalu kuat tetapi Anda dapat menambahkan baris ini ke .vimrc:

let g:isRecording = 0
nnoremap Q :call ToggleRecording()<CR>q

function! ToggleRecording()
    let g:isRecording = !g:isRecording
    echo "is recording " . g:isRecording
endfunction

Idenya adalah bahwa "mode perekaman" diaktifkan secara eksklusif ketika Anda menekan qdalam mode normal.

Berdasarkan itu Anda membuat variabel g:isRecordingyang akan diaktifkan setiap kali Anda memulai atau menghentikan rekaman. Dengan cara ini ketika Anda mulai merekam g:isRecordingakan diatur ke 1dan 0ketika Anda berhenti merekam. Anda kemudian dapat mengakses status perekaman melalui nilai variabel.

"Kelemahan" adalah untuk menghindari pemetaan rekursif, Anda harus menggunakan Shit-q untuk memulai dan berhenti merekam q. (Perhatikan bahwa ini bukan masalah besar: Saya telah menggunakan shift-quntuk beralih mode rekaman untuk beberapa waktu karena saya tidak suka shift-qperilaku asli )

Masalah utama dari solusi ini adalah bahwa jika Anda lupa tentang hal itu dan menggunakan qvariabel tidak akan beralih tetapi Anda tidak dapat menonaktifkan q(misalnya dengan nnoremap q <nop>) karena jika Anda tidak shift-qakan bekerja lagi.

statox
sumber
2

Ini adalah permintaan yang cukup aneh karena tidak ada "mode" untuk merekam makro. Setelah menggali beberapa dokumen saya menemukan yang berikut diusr_10

Anda mulai dengan berpindah ke karakter pertama dari baris pertama. Selanjutnya Anda menjalankan perintah berikut:

qa Mulai merekam makro dalam register a .

^ Pindah ke awal baris.

i # include "Masukkan string #include" di awal baris.

$ Pindah ke akhir baris.

a "Tambahkan tanda kutip ganda karakter (") ke akhir baris.

j Pergi ke baris berikutnya.

q Berhenti merekam makro.

Yang menonjol bagi saya adalah baris tentang "Mulai merekam makro di register a"

Karena setiap makro akan disimpan ke register secara default, saya berharap kita dapat melihatnya di :regdaftar. Ternyata itu berfungsi seperti pesona!

Contoh:

Dalam mode normal: qaisomething<Esc>

dan di dalam :regkita melihat entri!

"a   isomething^[

Dengan pengetahuan itu Anda harus dapat "memata-matai" register untuk mengkonfirmasi bahwa makro sedang direkam (gunakan register bernama pada setiap rekaman [peta quntuk selalu menggunakan register yang sama (atau sesuatu seperti itu)]

Jika Anda mengalami masalah, beri tahu saya dan saya akan mencoba membantu Anda (karena fungsi ini juga baru bagi saya: D)

sunting Untuk mengatasi masalah register yang digunakan selama penarikan, saya sarankan untuk melihat jenis register khusus yang hanya dapat Anda gunakan untuk vimLtulisan yang Anda tulis (tidak ada yank yang akan terlibat dalam register ( "ay))

Berikut adalah sedikit info dari :help registersregister yang tersedia

Ada sepuluh jenis register: register E354

  1. Daftar tanpa nama ""

  2. 10 register bernomor "0 hingga" 9

  3. Register hapus kecil "-

  4. 26 bernama register "a to" z atau "A to" Z

  5. tiga register baca-saja ":,"., "%

  6. register buffer alternatif "#

  7. daftar ekspresi "=

  8. Pilihan dan jatuhkan register "*," + dan "~

  9. Daftar lubang hitam "_

  10. Daftar pola pencarian terakhir "/

Dengan asumsi bahwa Anda memiliki register yang akan Anda gunakan sekarang masalah menjadi "bagaimana saya tahu ketika rekaman telah berhenti?". Untuk mengatasi ini, saya akan melihat autocmd-eventuntuk CursorHold; catatan dalam dokumen bantuan terlihat cukup menjanjikan (saya akan mencoba mencari tahu bagaimana saya bisa membedakan kursor normalHold vs peristiwa idle / tidak ada yang terjadi ketika register Anda sedang ditulis untuk keperluan makro)

CursorHold

Ketika pengguna tidak menekan tombol untuk waktu yang ditentukan dengan 'updatetime'. Tidak dipicu kembali sampai pengguna menekan tombol (yaitu tidak memecat setiap 'waktu pembaruan' ms jika Anda meninggalkan Vim untuk membuat kopi. :) Lihat | CursorHold-example | untuk melihat pratinjau tag. Acara ini hanya dipicu dalam mode Normal. Itu tidak dipicu saat menunggu argumen perintah yang akan diketik, atau gerakan setelah operator. Saat merekam acara CursorHold tidak dipicu. | q |

Dan Bradbury
sumber
Saya tidak benar-benar melihat bagaimana menyelesaikan masalah: ketika Anda selesai merekam makro Anda sebuah string disimpan dalam register tetapi bagaimana Anda membedakan ketika register berisi makro atau ketika itu berisi sesuatu yang berasal dari perintah yank misalnya. Juga register disimpan sebagai satu bidikan ketika Anda selesai merekam sehingga ketika Anda melihat bahwa konten register telah mengubah Anda tidak dalam mode perekaman lagi.
statox
Harapan saya adalah bahwa Anda akan dapat menggunakan sesuatu seperti register lubang hitam (register yang tidak akan pernah diraih sebelumnya). Jika Anda memiliki register yang dikunci maka Anda dapat checkout CursorHold yang memiliki perilaku khusus ketika dalam mode perekaman (akan memperbarui jawaban saya dengan beberapa info lebih lanjut untuk melihat apakah itu membantu ya)
Dan Bradbury
menambahkan beberapa info tentang register lain (cara untuk menghindari konflik dengan yank) dan petunjuk tentang bagaimana kita dapat menangkap "perekaman" dengan CursorHold tidak aktif selama perekaman makro. Jika Anda masih memperjuangkan ini setelah catatan itu beri tahu saya dan saya dapat mencoba menerapkannya setelah pekerjaan selesai. Sebagai catatan, blackhole registeritu hanya disebutkan sebagai petunjuk dan berita menarik vim yang mungkin mengarah ke sesuatu (itu tidak akan berguna untuk digunakan saat merekam makro; karena @_ tidak dapat digunakan.) Bahkan Anda bahkan tidak dapat mencoba untuk menyimpan makro untuk itu ..
Dan Bradbury
Saya menghabiskan beberapa waktu pada malam terakhir ini (menghancurkan keyboard bir) dan merasa sangat sulit untuk mengetahui dengan tepat kapan perekaman sedang terjadi dan berakhir. Firasat saya CursorHoldtampaknya menjadi mimpi yang mustahil karena keterlambatan yang CursorHold sebenarnya terjadi (membuat kenaikan global sederhana terjadi setiap kali menonton ini). Masih sangat tertarik untuk menemukan cara untuk melakukan ini dan akan terus membenturkan wajah saya ke tombol sampai kami punya solusi ..
Dan Bradbury
Menurut pendapat saya, Anda tidak memiliki seribu opsi berbeda: Anda harus mengganti perilaku qdan membuatnya beralih variabel dan mulai / berhenti merekam. Autocomand tidak dapat diandalkan di sini karena tidak ada autocmd yang dipicu pada penekanan tombol, dan tidak mungkin membuat fungsi polling karena sifat monothread Vim. Semoga berhasil dengan eksperimen Anda di masa depan :-)
statox