Klavye makrosu Lisp işlevi olarak nasıl kaydedilir?


41

Çok sık, birden fazla tuş darbesi gerektiren bir dizi adım yapmam gerekecekti. Aynı oturum için bu adımlar bir klavye makrosuna kaydedilebilir.

Bir örnek, sık gerçekleştirilen bir arama / değiştirme işlemini klavye makrosu olarak kaydetmektir. Ancak emacs'ı bıraktığımda bu makro kayboluyor.

Sık kullanılan klavye makromu bir Lisp işlevi olarak nasıl kaydederim?

Basitlik uğruna, "abc" 'yi "def" ile değiştirme eylemini bir işlev olarak kaydetmek istiyorum, böylece onu emacs oturumlarında tekrar kullanabilirim.

Yanıtlar:


48

İşte izleyebileceğiniz adımlar:

  • Arama yapmak istediğiniz bölgeyi seçin.
  • Makroyu kaydetmeye başla.

    M-x start-kbd-macro

  • Gerekli M-x query-replace-regexp("abc" yerine "def" yazın) yapın ve !tüm bölgede arama-değiştirmeye zorlamak için kullanın .
  • Makroyu kaydetmeyi durdur.

    M-x kmacro-end-or-call-macro.

  • Do M-x kmacro-name-last-macrove Makroya gibi açıklayıcı bir ad verin replace-abc-with-def. Daha sonra bu makroyu tekrar arayabilirsin M-x replace-abc-with-def.
  • Şimdi bu makroyu emacs başlatma sırasında yüklediğiniz bir dosyaya bir fonksiyon olarak kaydedin; örneğin init.el,.
    • M-x insert-kbd-macro
    • Eklemek için adlandırılmış makronuzu seçin.

Otomatik oluşturulan replace-abc-with-defişlev tanımı şöyle görünür:

(fset 'replace-abc-with-def
   (lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ([59 39 return 97 98 99 return 100 101 102 return 33] 0 "%d")) arg)))

Şimdi M-x replace-abc-with-deftüm emacs seanslarınızda yapabilirsiniz.


1
İçin +1 insert-kbd-macro. Sorunun cevabı budur (ve bu cevabın geri kalanı ek yardım sağlar).
Drew

6
Ayrıca Emacs'in klavye makroları için iki farklı format üretebileceğini unutmayın. Hangisi aldığınız insert-kbd-macrokullanmakta adını verdi olmadığına bağlıdır kmacro-name-last-macro(yukarıdaki cevap gibi) veya name-last-kbd-macro.
phils

1
name-last-kbd-macroBiçimi kullanırsanız (yukarıdaki @ phils tarafından belirtildiği gibi) bir işlev değil, bir dizge ile bitirdiniz. fsetting bir sembole Eğer Mx kullanarak makro çalıştırmak, ancak olanak veren değil lisp onu aramak ( commandp-> t, functionp-> nil). Garip, hatta aracılığıyla çağırmak call-interactively(eğer rağmen çalışmıyor olabilir kullanmak execute-kbd-macroçalıştırmak için).
pirorasty

24

elmacro , @lunaryorn tarafından zaten anılmıştı, ama bu paketin yazarı olarak, bir örnek vermenin iyi olacağını düşündüm.

Böyle bir makro kaydederseniz:

F3 C-e M-b M-u C-a C-n F4

Sonra yapmak M-x elmacro-show-last-macro upcase-last-wordile bir tampon üretir:

(defun upcase-last-word ()
  "Change me!"
  (interactive)
  (move-end-of-line 1)
  (backward-word 1)
  (upcase-word 1)
  (move-beginning-of-line 1)
  (next-line 1 1))

17

Elmacro paket ile uygun Emacs Lisp olarak son kaydedilen makro görüntülemenizi sağlar M-x elmacro-show-last-macro.


7
Paketimi öneren biri \ o /
Silex
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.