Komut satırındayken kaydı nasıl durdurabilirim?


20

İle bir makro kaydederken qve işim bittiğinde şunu yazabilirim:

  • q Normal veya görsel moddaysam kaydı durdurmak için.
  • <c-o>q ekleme modundaysanız kaydı durdurmak için.
  • ..

    Makrom komut modunda biterse kaydı nasıl durdurabilirim?


Bunun için kullanım durumunuz nedir? Gerçekten merak ediyorum :)
PhilippFrank

2
@PhilippFrank Sık sık aynı modeli farklı metin bloklarında farklı desenlerle arayacağım ve değiştireceğim. Böyle bir makro ile bloğu seçmek, gerçek arama desenini yazmak ve imleci yedek zinciri yazmak için iyi bir konuma getirmek otomatik olarak yapılabilir. Oynadığımda, bloğu seçer, komut moduna girer, :'<,'>s/toBeReplaced//gsonra imleci ikisinin arasına koyarım, //böylece tek yapmam gereken yazmak newString<cr>ve işim bitti. :)
iago-lito

Yani parametreli bir makro gibi. Çok güzel bir fikir, teşekkür ederim!
PhilippFrank

@PhilippFrank biraz, evet. Beğenmene sevindim. :)
iago-lito

Yanıtlar:


13

Başka bir çözüm komut satırı modundayken, Ctrl-ftuşuna basın qve kaydı durdurmak için tuşuna basın .

Ctrl-fkomutu normal modda düzenleyebileceğiniz komut satırı penceresini açmanızı sağlar. Komutu doğrulamak için enter kullanın.


Bu nedenle, aşağıdaki gibi bir şey ekledikten sonra:

cnoremap <c-q> <c-f>i<c-o>q

, komut modundayken makro kaydetmeyi durdurmak .vimrciçin kullanabilirsiniz <c-q>.


Florent


Yine de ^Fmakronun sonundan <Cf> karakterini ( ) kaldırmanız gerekiyor , değil mi? En azından ben bunu görüyorum.
VanLaser

Neredeyse! Gerçekten yararlı (komut satırı penceresi hakkında bilmiyordum ama harika), ama .. aargh! Bu pencereye ekleme modundan girmek, seçtiğiniz alanı kaybediyor gibi görünüyor. Komut satırı penceresinden başlattığınız komutun seçilen bir alanda çalışmasını sağlamanın bir yolu var mı?
iago-lito

@VanLaser Hayır, çünkü komutunuzu komut satırı penceresine yazarak devam edebilirsiniz. Makronuz gibi olacak qqSTARTMACRO:STARTCOMMANDLINEPART<c-f>i<c-o>qve böylece komut bölümünü yazarken kayıt gerçekten durdu. Makroyu kullanmak için: @qFINISHYOURCOMMAND<cr>ve işiniz bitti: düzenlemenize gerek yok. Ne yazık ki, bu görsel moddan çalışmıyor gibi görünüyor (veya seçimi kaybediyor) .. ya da bir şey kaçırdım mı?
iago-lito

Ah, doğru :) BTW, görsel bir aralık seçebilirim, sonra yapabilir @qve aralık komut başlangıcında eklenir '<,'>- makro başladığı sürece :....
VanLaser

@ lago-lito Aslında seçiminizi görmeseniz bile, belirtilen aralık (yani '<,'>) komutu doğrularken hala seçimle eşleşir.
fflorent

17

Bunu yapmanın bir yolu:

  • makronuzu her zamanki gibi başlatın (örneğin qq... diğer karakterler)
  • cmdline moduna ulaştığınızda, istediğiniz tüm karakterleri yazın
  • makroyu burada sonlandırmak istiyorsunuz. Hit ESC, komut_satırı-modundan çıkmak için qsizin makro sona erdirmek için.
  • kaldırmak ESCiçin gelen qkayıt (*): kaldırmak, bir tampon yapıştırabilirsiniz ^[yine bütün şeyler seçin karakter (karakter-bilge) ve kayıt geri Çekiştirme q.
  • bunu söz konusudur: senin makro çalıştırın: @q.

Temel olarak, bir kayıtta saklandığından makronuzu biraz "post-process" :)

(*) Kayıtta saklanan bir makrodan son karakteri kaldırmanın hızlı bir yolu q:

:let @q = @q[:-2]

Haha! Bu şimdiye kadar benim hack oldu = D. Bunu yapmanın "kanonik" bir yolu yok mu? (ayrıca daha hızlı )
iago-lito

Birini bilmiyorum, ama çok fazla makro kullanmıyorum (bunun yerine küçük işlevler yazmayı tercih ediyorum). Daha sonra onlara baktığımda makrolar benim için şifreli hissediyorum.
VanLaser

@ VanLaser: :let @q = @q[:-2]Lütfen hat hakkında biraz daha ayrıntı verebilir misiniz ? Özellikle nasıl [:-2]çalışır? :-)
statox

Bu "dilimleme" ve listeler ve dizeler üzerinde çalışır ( @qyukarıdaki erişim / set budur ). Burada
VanLaser

@ VanLaser gerçekten şifreli görünüyorlar. Bununla birlikte, çok özel durumlarda yapmanız gereken yinelenen, sofistike küçük şeyler için yararlıdır. Sadece bir kez görünen ve sadece birkaç dakika süren bu tür problemleri biliyorsunuz. Anında makrolar oluşturarak ve özel bir fonksiyon yazmak ve hata ayıklamak zorunda kalmadan onlarla başa çıkmak sadece .. woo harika! ^ ^
iago-lito

3

Kullanım durumu hakkındaki yorumunuzu okuduktan sonra, makro yerine bir anahtar eşleme kullanabileceğiniz anlaşılıyor.

Benim .vimrc bu satırı var (nerede bulduğumu hatırlamıyorum):

nnoremap <Leader>s :%s/\<<C-r><C-w>\>//g<Left><Left>

Tanımladığınız kullanım senaryosuna benzer bir etkiye sahiptir, sizi komut satırına yerleştirir, böylece yapmanız gereken tek şey değiştirme ve enter tuşuna basmaktır, ancak bu durumda imlecinizin altındaki sözcüğün tüm tekrarlarını değiştirmek .

Sadece mevcut blok içinde değiştirmek için, aşağıdaki gibi bir şeyin çalışması gerektiğini düşünüyorum:

nnoremap <Leader>s m'va{<ESC>``:'<,'>s/\<<C-r><C-w>\>//g<Left><Left>

Tabii ki, istediğiniz herhangi bir anahtarla eşleyebilirsiniz.

Yukarıdakiler ne yapar: adlandırılmamış işaretçiyi kullanarak geçerli konumu işaretleyin, geçerli bloğu görsel olarak seçin, görsel moddan çıkın ve imleci kaydedilen konuma geri getirin (görsel seçim işaretleri hala ayarlanmıştır), komut moduna girin ve yedek komutu yazın , imlecin altındaki kelimeyi yerleştirerek ve <C-r><C-w>imlecinizi değiştirmeyi yazacak şekilde konumlandırabilirsiniz.


Evet, bende de var. Bununla birlikte, özel kullanım durumumda, toBeReplaceddesen "imleç altındaki kelime" kadar basit değil, bu yüzden hareket halindeyken oluşturabileceğim küçük, belirli bir makroya ihtiyacım var. Ve sonra tekrar: bir harita için çok özel: \ neyse yine de :)
iago-lito

2
Belki de deseni bir kayıt defterine koyun, ardından kayıt içeriğini otomatik olarak bir toBeReplacedparça olarak almak için yukarıdaki eşlemeyi uyarlayın (imleç altındaki geçerli kelime yerine, daha sınırlayıcıdır).
VanLaser

1
@VanLaser Doğru, bu genel bir haritalamaya izin verecek ve çok daha basit hale getirecektir: va{:s/<C-r>0//g<Left><Left>Bununla, önceden ihtiyacınız olan deseni istediğiniz gibi sorabilir ve ardından o deseni geçerli bir şeyle değiştirmek için eşlenen tuşa basabilirsiniz. blok.
dhakimian
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.