INCOMPLETE klavye makro kaydına nasıl devam edilir?


10

Klasik kullanım çantası:

  1. Bir makro kaydetmeye başlarsınız: C-x (
  2. Diyelim ki bazı şeyler yapıyorsunuz hello.
  3. Bir hata veren bir komut çalıştırıyorsunuz, diyelim C-g(örneğin yanlışlıkla çalıştırıyorsunuz C-sve bunu iptal etmek zorundasınız C-g, şimdi işiniz kayboldu).

Şimdi kaydınız kayboldu.

Kaydımı kesintiye uğratan bir komutu çalıştırmadan önce kaldığım yerden devam etmek istiyorum. Baktım C-h f start-kbd-macro, ama C ile yazılmış, bu yüzden ayarlayamıyorum. Ben de benzer bir değişken için avlanmış current-kbd-macro, ama şimdiye kadar hiçbiri bulunamadı.

Kurtarılabilir mi?

Güncelleme:

Benim için neden C-u C-x (işe yaramadığını anlayamadım , ama bununla test ettiğim için keşfettim C-g.

C-gÖzel olduğu ortaya çıkıyor - farklı bir hata türünü tetiklerseniz, örn.

C-x ( M-: (signal 'quit nil) 

Daha sonra bu kaydı durduracak, ancak last-kbd-macroiçerecektir "M-: M-( signal 'quit nil", ancak

C-x ( C-g

Bu kaydı durdurur ve kaydedilen her şeyi atar. Cg mutlu bir kullanıcı olarak (en az iki arkadaşım gibi), bu oldukça talihsiz bir ayrımdır. Düzenlemeyi denedim keyboard-quit, ama orada yapabileceğim bir şey yok.

Bunu kurtarmanın tek yolu, olduğu gibi recent-keysve bir start-kbd-makrosunun (veya benzeri) nerede çağrıldığını otomatik olarak bulmaktır kmacro-edit-lossage.

Yanıtlar:


8

Başladığım burada bir uygulama size rebind sağlayan C-x (To resmacro-start-macro.

Şimdi, bir makroda yarı yolda olduğunuzu ve bir hata yapıp vurduğunuzu varsayalım C-g, örneğin C-syanlışlıkla çalıştırın ve C-giptal etmek için vurdunuz veya w / e.

C-x ( hello C-s C-g 

Şimdi C-u C-x (hangi minibuffer ile sormak çalışın:

Makroyu (RET: devam, DEL: sonuncuyu kaldır) ile devam ettir: h e l l o C-s

Bu yüzden DELsilmek için geri tuşuna ( ) basın C-sve sonra RETdevam edin. Şimdi diyor ki:

Kbd makrosuna ekleniyor ...

Ve devam edebilirsiniz.

Toplamda:

C-x (      -- start macro
hello
C-s        -- mistake
C-g        -- cancel mistake (and macro)
C-u C-x (  -- recover lost macro
DEL        -- remove mistake
RET        -- continue recording
world!

Kullanışlı, bağlam anahtarı yok, görevi gerçekleştirmek için minimum tuş bağlantıları, makronuzun nereden başladığını (at C-x () otomatik olarak bulur (recent-keys).


1
Hey, kulağa hoş geliyor. Emacs'a bir yama olarak göndermeyi ister misiniz?
Stefan

İstediğiniz gibi yapabilirsiniz / relicense istediğiniz gibi! Herhangi bir yerde duyuru yapmadan önce yerel olarak bir süreliğine deneyeceğim, böylece güvenilir olduğunu bilebilirim. Emacs destekçileri bunun çok acayip olduğunu düşünebilir. ;-)
Christopher Bitti

Emacs'a dahil etmek için yazarın telif hakkı evraklarını imzalaması gerekiyor (aynı evrak da elbette tanrı-modunu da kapsayacaktı).
Stefan

Bağlantı şimdi kesildi :(
DirtY iCE

2

Önceki makroya eklemek için kmacro-start-macro-or-insert-counterönek ( C-u) ile yürütün .


2
Docstring'ini bunu söylemek ama bir çift önek arg (gelmez C-u C-u) kümeleri hemAPPEND ve NO-EXECargümanlar için start-kbd-macroekleyin.Yani olanak sağlayan olmadan makro-so-far başlangıç replay. Bu davranış olduğu kılavuzda belgelenmiştir, ancak:(emacs) Basic Keyboard Macro
Phil'ler

Benim sorum örnek ile deneyin, çalışmıyor.
Christopher Yapıldı

2

Stsquad ve artagnon'dan gelen iyi cevapları birleştirmek, (aklıma), tamamen makul olan soruna tam bir çözüm sağlar:

  • C-xC-keC-hl oluşturulan bir makro düzenleme
  • makroyu orijinal kayda düşürmek için düzenleyin
  • C-cC-c düzenlenen makroyu saklamak için
  • Ya C-u<f3>ilk olarak bu makro tekrar ve makro tanımına eklenir daha sonra tuş vuruşlarını kayıt devam
  • ... ya da şimdiye kadar olan makronun ilk tekrarlaması olmadanC-uC-u<f3> kayda devam etmek

Belki de makro olarak kaybetmeyi düzenleme ihtiyacı ideal değildir , ancak (a) kaydı iptal etseniz de , makroyu düzenlemeniz gerekiyordu ve (b) bu ​​çok sık olmamalı, sadece makroyu normal olarak nasıl durduracağınızı hatırlarsanız (örneğin, <f4>yerine C-g).

Bunların hiçbiri, iptal edilen makronun bir yerde saklanmasının yararlı olmayacağını söylemez; sadece bunun gerçekte olduğunu sanmıyorum. Muhtemelen M-x report-emacs-bugbu özelliği önermeye değer .


Bu sorunu ele almaz. Çözümünüzün yarısı ile makroyu tekrar başlatmak daha kolay olacaktır. Sorunu güzelce çözen başka bir yerde bir cevap gönderdim.
Christopher Yapıldı

1
Elbette, basit vakalar için baştan başlamak daha kolay olurdu. Yine de geri kalanlar için yararlıdır, bu da bazı insanların yararlı bulacağı anlamına gelir; özellikle varsayılan olarak kullanılabilir. Belirttiğim gibi, daha otomatik bir yaklaşım fikri iyi bir fikir, bu yüzden bir çözüm üzerinde çalıştığınızı gördüğüme sevindim ve cevabınızı kesinlikle oyladınız.
phils

0

Standart çözüm C-x C-k C-e( kmacro-edit-macro) her tuşa basmanıza ve istediğiniz her şeyi girmenize / silmenize olanak tanıyacak olan ( ) yöntemidir . Editör için komut sözdizimi biraz kesiktir, ancak ?bir kılavuz getirecektir. C-x C-k e( edit-kbd-macro) 'A bağlı daha doğal bir editör var, bu da yorumlu düz metin makro editörü veriyor.

Başka bir seçenek, M-x insert-kbd-macromakroyu Lisp olarak düzenlemenize izin verecek, ancak dünyadaki en okunabilir şey değil.

Değişkenler söz konusu olduğunda, aradığınız last-kbd-macrove kmacro-ring.

Bahsettiğiniz gibi makronuzu tamamlamadınız, sadece hesabınızdan oluşturabilirsiniz. C-x C-k e C-h lve önceki 300 karaktere kadar silin.


Bu, yapabilseydim aşağıya vuracağım kötü bir cevap. Soruyu okumadınız ya da görmezden geliyorsunuz. Daha önce basılan tuşları last-kbd-macroda kmacro-ringiçermez C-gveya bir hata meydana gelir. Özellikle bu kadar kötü cevaplar beklerken, INCOMPLETE'ı tamamen büyük harflerle yazdım. Yine de yardım etmeye çalıştığın için teşekkürler.
Christopher Done

1
@ChristopherDone: emin olabilirsiniz - alt bölüme kaybeden bahsetmek için bir not ekledim. Önceden yazdığınız 300 karaktere kadar bir makro oluşturabilirsiniz.
stsquad

Evet, birisi #emacs'den ayrılmadan bahsetti. Sadece kaldığım yerden devam etmek istiyorum. Bir şey yapmanın ortasındayken editörü açmak ve bundan bir şeyler silmeye başlamak istemiyorum.
Christopher Done

2
Bu ve artagnon cevaplarının kombinasyonu iyi bir çözüm sağlar:, C-x C-k e C-h ldüzenleme, C-c C-csonra C-u f3kayıt yapmaya devam etmek ( sonuncunun f3ilk olarak daha fazla girişi beklemeden önce makroyu çalacağını belirterek ). Belki de makro olarak kaybetmeyi düzenleme ihtiyacı ideal değildir , ancak (a) kaydı iptal etseniz de , makroyu düzenlemeniz gerekiyordu ve (b) bu ​​çok sık olmamalı, sadece makroyu nasıl durduracağınızı hatırlarsanız.
phils

1
@phils +1 Belki bunu ayrı bir cevaba dönüştürmelisiniz.
itsjeyd
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.