Bagaimana cara melanjutkan perekaman makro keyboard INCOMPLETE?

10

Kasus penggunaan klasik:

  1. Anda mulai merekam makro: C-x (
  2. Anda melakukan beberapa hal, katakanlah hello.
  3. Anda menjalankan perintah yang melempar kesalahan, katakanlah C-g(mis. Anda salah menjalankan C-sdan Anda harus membatalkannya dengan C-g, sekarang pekerjaan Anda hilang).

Sekarang rekaman Anda sejauh ini hilang.

Saya ingin melanjutkan di mana saya tinggalkan sebelum saya menjalankan perintah yang mengganggu rekaman saya. Saya melihat C-h f start-kbd-macro, tapi itu ditulis dalam C, jadi saya tidak bisa men-tweak itu. Saya juga mencari-cari variabel suka current-kbd-macro, tetapi sejauh ini tidak menemukan.

Bisakah itu dipulihkan?

Memperbarui:

Saya tidak tahu mengapa C-u C-x (tidak bekerja untuk saya, tetapi saya menemukan itu karena saya mengujinya C-g.

Ternyata itu C-gistimewa - jika Anda memicu jenis kesalahan yang berbeda misalnya

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

Maka ini akan menghentikan rekaman, tetapi last-kbd-macroakan berisi "M-: M-( signal 'quit nil", tetapi dengan

C-x ( C-g

Ini berhenti merekam dan membuang apa pun yang direkam. Sebagai pengguna Cg-happy (seperti setidaknya dua dari teman saya), ini adalah perbedaan yang agak disayangkan. Saya mencoba mengedit keyboard-quit, tetapi tidak ada yang bisa saya lakukan di sana.

Sepertinya satu-satunya cara untuk memulihkan ini adalah melalui recent-keysdan secara otomatis mencari tahu di mana start-kbd-macro (atau serupa) dipanggil, seperti pada kmacro-edit-lossage.

Christopher Done
sumber

Jawaban:

8

Aku mulai implementasi di sini yang memungkinkan Anda rebind Anda C-x (untuk resmacro-start-macro.

Sekarang, misalkan Anda mendapatkan setengah jalan melalui makro dan membuat kesalahan dan memukul C-g, misalnya Anda menjalankan C-ssecara tidak sengaja dan Anda menekan C-guntuk membatalkannya, atau w / e.

C-x ( hello C-s C-g 

Sekarang jalankan C-u C-x (yang akan meminta minibuffer dengan:

Lanjutkan makro dengan (RET: lanjutkan, DEL: hapus yang terakhir): h e l l o C-s

Jadi, Anda menekan backspace ( DEL) untuk menghapus C-sdan kemudian RETmelanjutkan. Sekarang dikatakan:

Menambahkan ke kbd makro ...

Dan Anda bisa melanjutkan.

Secara keseluruhan:

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!

Nyaman, tanpa pergantian konteks, pengikatan kunci minimum untuk mencapai tugas, secara otomatis menentukan dari mana makro Anda dimulai (pada C-x () (recent-keys).

Christopher Done
sumber
1
Hei, kedengarannya sangat bagus. Ingin mengirimkannya sebagai tambalan ke Emacs?
Stefan
Anda dapat melakukannya / relicense sesuka Anda! Saya akan mencoba untuk sementara waktu secara lokal sebelum mengumumkannya di mana saja, sehingga saya bisa tahu itu dapat diandalkan. Pemelihara Emacs mungkin berpikir itu terlalu gila. ;-)
Christopher Selesai
Untuk memasukkannya ke dalam Emacs kita perlu penulis untuk menandatangani dokumen hak cipta (dokumen yang sama juga akan mencakup mode dewa, tentu saja).
Stefan
Tautan rusak sekarang :(
Kotor iCE
2

Jalankan kmacro-start-macro-or-insert-counterdengan awalan ( C-u) untuk menambahkan ke makro sebelumnya.

artagnon
sumber
2
Docstring tidak mengatakan begitu, tapi awalan arg ganda ( C-u C-u) set kedua dengan APPENDdan NO-EXECargumen untuk start-kbd-macro, yang memungkinkan Anda menambahkan tanpa replay awal dari makro-begitu-jauh. Perilaku ini didokumentasikan dalam manual, namun:(emacs) Basic Keyboard Macro
phils
Coba ini dengan contoh di pertanyaan saya, tidak berfungsi.
Christopher Done
2

Menggabungkan jawaban yang baik dari stsquad dan artagnon memberikan (dalam pikiran saya) solusi total untuk masalah yang sepenuhnya masuk akal:

  • C-xC-keC-hl untuk mengedit makro yang dihasilkan dari kerugian
  • edit makro, untuk menguranginya ke rekaman asli
  • C-cC-c untuk menyimpan makro yang diedit
  • Entah C-u<f3>untuk pertama memutar ulang makro itu, dan kemudian melanjutkan merekam penekanan tombol berikutnya yang akan ditambahkan ke definisi makro
  • ... atau C-uC-u<f3>untuk melanjutkan perekaman tanpa pemutaran ulang makro sejauh ini.

Mungkin kebutuhan untuk mengedit kerugian-sebagai-makro tidak ideal , tetapi (a) Anda harus mengedit makro terlepas, jika Anda membatalkan rekaman, dan (b) ini seharusnya tidak terlalu sering terjadi, jika Anda hanya ingat bagaimana cara menghentikan makro secara normal (misalnya dengan <f4>daripada C-g).

Tidak ada yang mengatakan bahwa itu tidak akan berguna jika makro yang dibatalkan dibatalkan di suatu tempat; hanya saja saya tidak berpikir ini benar-benar terjadi. Mungkin layak M-x report-emacs-buguntuk menyarankan fitur ini.

phils
sumber
Ini tidak mengatasi masalah. Dengan separuh solusi Anda, akan lebih mudah untuk memulai makro lagi. Saya telah mengirim jawaban di tempat lain yang menyelesaikan masalah dengan baik.
Christopher Selesai
1
Tentu, untuk kasus-kasus sederhana memulai dari awal akan lebih mudah. Ini masih berguna untuk sisanya, yang berarti beberapa orang akan merasa terbantu; terutama karena tersedia secara default. Seperti yang saya sebutkan, saya pikir ide pendekatan yang lebih otomatis adalah yang bagus, jadi saya senang melihat Anda bekerja pada solusi, dan tentu saja memilih suara Anda.
phils
0

Solusi kanonik adalah C-x C-k C-e( kmacro-edit-macro) yang akan memungkinkan Anda untuk melangkah melalui setiap tombol-tekan dan masukkan / hapus apa pun yang Anda inginkan. Sintaks perintah untuk editor sedikit singkat tetapi ?akan memunculkan panduan. Ada editor yang lebih alami terikat ke C-x C-k e( edit-kbd-macro) yang memberikan editor makro teks biasa dengan komentar.

Opsi lain adalah M-x insert-kbd-macroyang akan memungkinkan Anda untuk mengedit makro sebagai Lisp tetapi itu bukan hal yang paling mudah dibaca di dunia.

Sejauh variabel yang Anda cari last-kbd-macrodan kmacro-ring.

Seperti yang Anda sebutkan Anda belum menyelesaikan makro Anda, Anda bisa membuatnya dari kerugian Anda. C-x C-k e C-h ldan hapus hingga 300 karakter sebelumnya.

stsquad
sumber
Ini adalah jawaban buruk yang akan saya turunkan jika saya bisa. Anda tidak membaca pertanyaan atau mengabaikannya. Baik last-kbd-macroatau kmacro-ringmengandung tombol ditekan sebelum C-gatau kesalahan terjadi. Saya secara khusus menempatkan INCOMPLETE dalam huruf kapital semua dalam judul saya mengantisipasi jawaban buruk seperti itu. Terima kasih telah mencoba membantu.
Christopher Done
1
@ChristopherDone: yakin Anda bisa - Saya telah menambahkan catatan di bagian bawah untuk menyebutkan kerugiannya. Anda dapat membuat makro dari hingga 300 karakter yang sebelumnya Anda ketik.
stsquad
Ya, seseorang menyebutkan kehilangan di #emacs. Saya hanya ingin melanjutkan di mana saya tinggalkan. Saya tidak mau harus membuka editor dan mulai menghapus sesuatu dari itu ketika saya sedang melakukan sesuatu.
Christopher Done
2
Kombinasi dari ini dan jawaban artagnon memberikan solusi yang baik:, C-x C-k e C-h ledit,, C-c C-ckemudian C-u f3untuk melanjutkan perekaman (mencatat bahwa yang terakhir f3akan pertama-tama memutar makro sejauh ini sebelum menunggu masukan lebih lanjut). Mungkin kebutuhan untuk mengedit kerugian-sebagai-makro tidak ideal , tetapi (a) Anda harus mengedit makro terlepas, jika Anda membatalkan rekaman, dan (b) ini seharusnya tidak terlalu sering terjadi, jika Anda hanya ingat bagaimana menghentikan makro secara normal.
phils
1
@ phils +1 Mungkin Anda harus mengubahnya menjadi jawaban yang terpisah.
itsjeyd