vim: Makroda hatadan sonra makro devam edilsin mi?


15

Vim kullanarak bazı kaynak kodlarını güzelleştirme sürecinde bulunuyorum. {1}

Tek tek adımları gerçekleştiren birkaç vim makro oluşturdum: sondaki boşlukları kaldırmak {, sonra boş satırları kaldırmak {, daha önce boş satırları kaldırmak , bu tür şeyler.

Şimdi, tüm ayrı makroları sırayla yürüten bir makro oluşturmak istiyorum. Ancak, ilk özyinelemeli makro sona erdiğinde (artık eşleşme -> eşleme hatası bulamadığı için), benim "sarmalayıcı" makam da sona erer.

Bir submacro hata ürettikten sonra vim makrosunun devam etmesinin bir yolu var mı?

{1} ben biliyorum otomatik reformatters hakkında. Onları şimdiki problemimde bile kullanabilirim. Sadece örnek uğruna kaynak yeniden biçimlendirmeden bahsettim. Etmeyin bu kaynak beautifier veya bu konuda herhangi bir cevap gönderebilir. Soru, kodun kendi başına yeniden biçimlendirilmesi değil , vim makroları ile ilgilidir.

Misal:

  • Makro 1 - sondaki boşlukları düzeltme - qw/\s\+$d$@wq
  • Makro 2 - öncesi boş satırları silme} - qe/\n\n *}dd@eq
  • Sarıcı Makro - yeniden oluşturma, Makro 1, Makro 2 - qr:retab@w@eq

I sarıcı yürütmek zaman - @r- bu (daha sonra sona erdirmek, bulunan boşluk daha fazla takip eden kadar Makro 1 çalıştırmak retab olacak olmayan makro 2 yürütme).

Açıklama:

Aradığım şey, bir submacro nasıl çağırılır, böylece bu submacro sona erdiğinde, çağıran makro devam eder?

Yanıtlar:


12

:trySubmacro'nun hatasını "emmek" için kullanmanızı öneririm .

İşte aptal bir örnek:

:let @a='f|dt|@a'
:let @q=':try|exe "norm! @a"|endtry^Mj0@q'
@q

Sarıcı makronuz şöyle görünecektir:

let @r=':retab^M:try|exe "norm! @w"|endtry|try|exe "norm! @e"|endtry^M'

Garyjohn değil geçici bir çözüm sunulmaktadır iken sahip bir submacro bir hata, bu aslında olmadığını tek cevap işlemek böyle bir hata. Yine de özür dilemeliyim; (Artık süresi dolmuş)
ödülünüzü

26

Başarısız komut, desenini bulamayan bir ikame ise, ör.

:%s/foo/bar/

zaman footamponu içinde yok, ekleyebilir ehatayı görmezden bayrak, örneğin,

:%s/foo/bar/e

Görmek

:help :s_flags

Vim'e, onlardan önce gelen bazı: ex komutlarındaki hataları yoksaymasını söyleyebilirsiniz :silent!. Görmek

:help :silent


Soruya Örnek Eklendikten Sonra Düzenle

Makro 1 ve Makro 2'nin her ikisi de özyinelemelidir ve özyinelemeyi sonlandırmak için açık bir mekanizması yoktur. Tahminimce, Vim'in sınırsız özyineleme için dahili testlerinden biri tetikleniyor, bu da bir hata oluşturuyor. Makro 1 böyle bir hata oluşturuyorsa, bu hata Sarıcı Makronun yürütülmesini hemen sonlandıracaktır @w.

Benim önerim, makrolarınızı şu şekilde yeniden yazarak kaç kez çalıştırılacağını sınırlamak: ex komutları ve üzerinde çalıştıkları satır aralığını sınırlamak. Örneğin:

qw:%s/\s\+$//^Mq
qe:%s/\n\n *}/\r}/^Mq

burada ^MEnter veya Return tuşunu yazmak anlamına gelir. Bunları Wrapper Macro'unuzda birlikte test etmedim, ancak yaptığım hataları düzeltebileceğinizi düşünüyorum.


Benim durumumda bir ikame değil, basit bir bulgu (yani /foo). İken :silent!gerçekten de sarıcı makro durduruluyor değil özyinelemeli submacro hile yaptı, şimdi submacro hiç sonlandırmak değil ... ve her nasılsa tekrar sonlandırmak yapma yine çok sarıcı makro sona olacağını sanıyorum. Sıkışmışım gibi görünüyor. : - \
DevSolar

Kullandığınız makroları görmeden neyin yanlış olabileceğini veya aynı sorunu gösteren basit bir örneği söylemek zor.
garyjohn

Bir örnek eklendi.
DevSolar

2

Benim için işe yarayan, @Peter Rincker ve @garyjohn cevaplarının bir kombinasyonuydu. Ayrı ayrı tuhaf sorunlar almaya devam ettim.

nnoremap <leader>rt :silent! %s/\s\+$//e<CR>
let @r='\rt'
let @t=':try|silent! exe "norm! @r"|endtry|w^M'

Bence silent!de <leader>rtve arasındaki boru karakterleri endtryve wanahtarlarıydı - basitçe sonra satır sonu olan endtrybaşarısız oldu. tryS Ben sadece onları girmek istiyorum ne zaman çalıştı, ama makro olarak çalıştırdığınızda arama metni hakkında hata verecek tutacak bulunamadı.


1

Birçok dosya arasında tekrarlayan bir görev yapmam gerektiğinde rutin olarak anında makrolar oluşturuyorum. Benim durumumda, VIM'de bir pencere oluşturan NERDtree ( http://www.vim.org/scripts/script.php?script_id=1658 ) yüklü vsplitve solda, tüm dosyaların bir listesi var geçerli dizin. Bir örnekte, MY_TESTdosyadaki dizenin ilk örneğini bulmam ve sonra varsa CUSTOM_PREFIX-, bu satırdan etiketli bir öneki silmem , dosyayı kaydetmem ve sonra bir sonrakine geçmem gerekir.

Bu makroyu geçerli dizinde yaklaşık 2000 dosya üzerinde çalışmak nasıl. Bunu yapmak için bir bash betiği yazabilirdim, ama benim durumumda VIM'de daha hızlı. +O anlamına gelir anahtarlar Simul basılmasını

# Start recording a macro sequence to register 'A'

q,a

# Search silently for the string "MY_TEST"; DO NOT report an error
# if the string could not be found.
:silent! /MY_TEST


# Replace, on just the current line, the string "CUSTOM_PREFIX-", with
# nothing (ie: delete it), and suppress any warning messages if the
# string could not be found on the current line.
:s/CUSTOM_PREFIX-//e


# Now issue some UI commands. CTRL-W then and arrow key lets you hope
# between tabs/splits/windows within vim.

CTRL+ W,

# Scroll down to the next file in the list in NERDtree



# Open the next file

ENTER

# End the macro

q

# Run the macro a thousand times in VIM

1000 @,,a

Bu yardımcı olur umarım!

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.