Vimscript'te kayıt yapıp yapmadığımı tespit etmenin bir yolu var mı?


11

Gibi bir şey var mı

eval("is_recording()")

Şu anda bir makro kaydedip kaydetmediğimi öğrenmek için vimscriptimi arayabileceğim Bunun işe yaradığını düşünürdüm:

eval("mode(1)")

ama bu sadece geri dönüyor "n".

Önemli olup olmadığından emin değilim, ama neovim kullanıyorum, bu yüzden neovim'e özelse, sorun değil.


3
IMHO bu kötü bir fikir olurdu - "kayıt", bu durumda, yanlış bir isim olurdu :) Ne yapmaya çalıştığınızı bilmiyorum, ama belki de bu soruyu sormak onu çözmek için farklı yollar sağlayabilir.
VanLaser

@VanLaser Yanlış adla ne demek istiyorsun?
James

1
Bir Vim eylemi kaydederken farklıysa, kayıt işleminin kendisi eylemi etkilediği anlamına gelir, ancak daha sonra tekrarlamak için eylemi "saklaması" gerekir. Makroyu çalıştırdığınızda ne olmasını bekliyorsunuz?
VanLaser

Yanıtlar:


4

İlk olarak, probleminizin temelde bir XY problemi olduğunu düşünüyorum . Sonunda ne yapmaya çalıştığınız hakkında bize daha fazla bilgi vermelisiniz ve bence başka bir çözüm bulabiliriz.

Şimdi bir çözüm var, muhtemelen ideal değil ve kesinlikle çok sağlam değil, ancak şu satırları ekleyebilirsiniz .vimrc:

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

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

Buradaki fikir, qnormal modda düğmesine bastığınızda "kayıt modu" nun değiştirilmesidir .

Buna dayanarak, g:isRecordingbir kaydı her başlattığınızda veya durdurduğunuzda değiştirilecek bir değişken yaratırsınız. Bu şekilde kayda başladığınızda, kaydı durdurduğunuzda ve g:isRecordingolarak ayarlanır . Daha sonra kayıt durumuna değişkenin değeri üzerinden erişebilirsiniz.10

"Dezavantajı" özyinelemeli eşleme önlemek için Shit-q yerine kayıt başlatmak ve durdurmak için kullanmak zorunda olmasıdır q. (Bu kadar büyük bir sorun olmadığını unutmayın: Bir süredir shift-qkayıt modunu değiştirmek için kullanıyorum çünkü orijinal shift-qdavranışı sevmiyorum )

Bu çözümün ana problemi, unutursanız ve qdeğişkeni kullanırsanız değiştirilmez ancak devre dışı bırakamazsınız q(örn. İle nnoremap q <nop>) çünkü shift-qartık yapmazsınız.


2

Bir makro kaydetmek için "mod" olmadığı için bu oldukça ilginç bir istek. Bazı dokümanları inceledikten sonra aşağıdakileri buldum:usr_10

İlk satırın ilk karakterine geçerek başlarsınız. Daha sonra aşağıdaki komutları yürütün:

qa Kayıt defterinde bir makro kaydetmeye başlayın a .

^ Satırın başına git.

i # include satırın başında "#include dizesini ekle".

$ Satırın sonuna git.

a "Satır sonuna karakter çift tırnak işareti (") ekleyin.

j Sonraki satıra git.

q Makroyu kaydetmeyi durdurun.

Göze çarpan şey, "Kayıt defterinde bir makro kaydetmeye başla"

Her makro varsayılan olarak bir kayıt defterine kaydedileceğinden, onu :reglistede görebileceğimizi umuyordum . Bir cazibe gibi çalıştığı ortaya çıkıyor!

Misal:

Normal modda: qaisomething<Esc>

ve içeri :reggiriyoruz!

"a   isomething^[

Bu bilgi ile bir makronun kaydedildiğini doğrulamak için kayıtlarda "casusluk" yapabilmeniz gerekir (her kayıtta adlandırılmış bir kayıt kullanın [harita qher zaman aynı kaydı (veya bunun gibi bir şeyi kullanmak için)]

Sorun yaşarsanız bana bildirin ve size yardımcı olmaya çalışacağım (çünkü bu işlev benim için de yeni: D)

edit Yank sırasında kullanılan bir kayıt sorununu gidermek için, yalnızca vimLsizin yazarken kullanabileceğiniz özel bir kayıt türüne bakmanızı öneririm (kayıtta hiçbir yank devreye girmez "ay)

İşte :help registersmevcut kayıtlardan biraz bilgi

Kayıtları on tipi vardır: kaydeder E354

  1. Adsız kayıt ""

  2. "0 -" arası 10 numaralı kayıt 9

  3. Küçük silme kaydı "-

  4. 26, "a'dan" z'ye veya "A'dan" Z'ye kadar olan kayıtlar

  5. üç salt okunur kayıt ":,"., "%

  6. alternatif arabellek yazmacı "#

  7. ifade yazmacı "=

  8. Seçim ve bırakma kayıtları "*," + ve "~

  9. Kara delik kaydı "_

  10. Son arama düzeni kaydı "/

Şimdi kullanacağınız bir kaydınız olduğunu varsayarsak, sorun "kayıt durduğunda nasıl bilebilirim?" Bakmak istiyorum bu I özen göstermek autocmd-eventiçin CursorHold; yardım belgelerindeki not oldukça ümit verici görünüyor (normal imleci nasıl ayırt edebileceğimi anlamaya çalışacağım)

CursorHold

Kullanıcı 'updatetime' ile belirtilen süre boyunca bir tuşa basmadığında. Kullanıcı bir tuşa basana kadar yeniden tetiklenmez (yani, Vim'den kahve yapmak için ayrılırsanız her 'updatetime' msnı ateşlemez. :) Bkz. | CursorHold-example | önizleme için. Bu olay yalnızca Normal modda tetiklenir. Bir komut bağımsız değişkeninin yazılması veya bir işleçten sonraki bir hareket beklenirken tetiklenmez. CursorHold olayı kaydedilirken tetiklenmez. | Q |


Sorunu nasıl çözdüğünü gerçekten görmüyorum: makronuzu kaydetmeyi bitirdiğinizde bir dize kayıt defterine kaydedilir, ancak kayıt bir makro içerdiğinde veya örneğin bir yank komutundan gelen bir şey içerdiğinde nasıl ayırt edersiniz. Ayrıca kayıt işlemini bitirdiğinizde kayıt tek çekim olarak kaydedilir, böylece kayıt içeriğinin değiştiğini gördüğünüzde artık kayıt modunda olmazsınız.
statox

Umudum, kara delik kayıt defteri (şimdiye kadar çekilmeyecek bir kayıt) gibi bir şey kullanabilmenizdi. Bu kayıt kilitliyse, kayıt modundayken bazı özel davranışları olan CursorHold'a göz atabilirsiniz (bunun size yardımcı olup olmadığını görmek için cevabımı biraz daha bilgi ile güncelleyecektir)
Dan Bradbury

diğer kayıtlara bazı bilgiler ekledi (yank ile çakışmaları önlemenin yolu) ve CursorHold'un makro kaydı sırasında aktif olmamasıyla nasıl "kayıt" yakalayabileceğimize dair bir ipucu ekledi. Bu notlardan sonra hala bununla mücadele ediyorsanız bana bildirin ve iş bittikten sonra uygulamayı deneyebilirim. Bir not olarak blackhole register, sadece bir şeye yol açabilecek bir ipucu ve ilginç bir vim tidbit olarak bahsedildi (makroları kaydederken kullanmak yararlı olmaz; _'in kullanılamadığı için.) Aslında makroyu bile kaydetmeye çalışamazsınız. ona ..
Dan Bradbury

Ben bu dün gece (post bira klavye smashing) biraz zaman geçirdim ve kayıt meydana geldiğinde ve sona erdiğinde tam olarak anlamaya inanılmaz zor buldum. Benim önsezim aslında CursorHoldolanların gecikmesi nedeniyle imkansız bir rüya gibi görünüyor CursorHold(bunu izlemek için her zaman basit bir küresel artış yaptı). Hala inanılmaz bir şekilde bunu yapmak için bir yol bulmak ve bir çözüm bulana kadar yüzlerimi anahtarlara karşı şut devam edecek ..
Dan Bradbury

Bence bin farklı seçeneğiniz yok: davranışını geçersiz qkılmalı ve bir değişkeni değiştirmeli ve kaydı başlat / durdurmalısınız. Bir autocomand burada güvenilir olamaz çünkü herhangi bir tuşa basarken autocmd tetiklenmez ve Vim'in tekli doğası nedeniyle bir yoklama işlevi yapmak mümkün değildir. Gelecekteki deneylerinizde iyi şanslar :-)
statox
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.