Bagaimana cara menyimpan makro keyboard sebagai fungsi Lisp?

41

Sangat sering saya perlu melakukan serangkaian langkah yang membutuhkan beberapa kali penekanan tombol. Untuk sesi yang sama langkah-langkah tersebut dapat direkam dalam makro keyboard.

Contohnya adalah menyimpan operasi pencarian / ganti yang sering dilakukan sebagai makro keyboard. Tapi makro itu hilang ketika saya keluar dari emacs.

Bagaimana saya bisa menyimpan makro keyboard saya yang sering digunakan sebagai fungsi Lisp?

Demi kesederhanaan, saya ingin menyimpan tindakan mengganti "abc" dengan "def" sebagai fungsi sehingga saya dapat menggunakannya kembali di seluruh sesi emacs.

Kaushal Modi
sumber

Jawaban:

48

Berikut langkah-langkah yang bisa Anda ikuti:

  • Pilih wilayah yang ingin Anda lakukan pencarian-ganti.
  • Mulai merekam makro.

    M-x start-kbd-macro

  • Lakukan yang diperlukan M-x query-replace-regexp(ganti "abc" dengan "def") dan gunakan !untuk memaksa pencarian-ganti di seluruh wilayah.
  • Hentikan merekam makro.

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

  • Lakukan M-x kmacro-name-last-macrodan beri makro seperti nama deskriptif replace-abc-with-def. Anda kemudian dapat memanggil makro itu lagi dengan melakukan M-x replace-abc-with-def.
  • Sekarang simpan makro ini sebagai fungsi ke file yang Anda muat selama inisialisasi emacs Anda; misalnya init.el,.
    • M-x insert-kbd-macro
    • Pilih makro nama Anda untuk dimasukkan di sana.

replace-abc-with-defDefinisi fungsi yang dibuat secara otomatis terlihat seperti ini:

(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)))

Sekarang Anda bisa M-x replace-abc-with-defdi semua sesi emacs Anda.

Kaushal Modi
sumber
1
+1 untuk insert-kbd-macro. Itulah jawaban untuk pertanyaan (dan sisa jawaban ini memberikan bantuan tambahan).
Drew
6
Perhatikan juga bahwa Emacs dapat menghasilkan dua format berbeda untuk makro keyboard. Yang mana yang Anda dapatkan saat insert-kbd-macrobergantung pada apakah Anda menamainya menggunakan kmacro-name-last-macro(seperti pada jawaban di atas) atau name-last-kbd-macro.
phils
1
Perhatikan bahwa jika Anda menggunakan name-last-kbd-macroformat (seperti yang disebutkan oleh @phils di atas) Anda berakhir dengan string, bukan fungsi. fsetDengan menggunakan simbol, Anda dapat menjalankan makro menggunakan Mx, tetapi tidak menyebutnya dari lisp ( commandp-> t, functionp-> nil). Anehnya, bahkan menelepon via call-interactivelytidak berfungsi (walaupun Anda bisa menggunakannya execute-kbd-macrountuk menjalankannya).
pyrocrasty
24

elmacro sudah disebutkan oleh @ lunaryorn, tetapi sebagai penulis paket ini saya pikir akan lebih baik untuk memberikan contoh.

Jika Anda merekam makro seperti ini:

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

Kemudian melakukan M-x elmacro-show-last-macro upcase-last-wordmenghasilkan buffer dengan:

(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))
Silex
sumber
17

The elmacro paket memungkinkan Anda melihat rekaman makro terakhir sebagai tepat Emacs Lisp dengan M-x elmacro-show-last-macro.

lunaryorn
sumber
7
Seseorang merekomendasikan paket saya \ o /
Silex