Ulangi sisipan teks terakhir

10

Di Vim Anda dapat menekan .untuk mengulangi perubahan terbaru, termasuk memasukkan teks.

Sementara di Emacs C-x zhanya mengulangi perintah terakhir. Saya sadar bahwa makro dapat digunakan di sini, tetapi lebih sering saya menyadari bahwa saya harus memasukkan kembali teks yang sama terlambat. Ketika saya perlu memasukkannya sekali lagi , mendefinisikan makro tidak ada gunanya.

T: Apakah ada cara untuk mengulangi penyisipan teks di dalam Emacs?

ooi
sumber
1
Apa "teks" yang ingin Anda ulangi? Secara teknis, penyisipan terakhir hanyalah karakter terakhir, yang mungkin bukan yang Anda cari. Jadi, bagaimana Anda mendefinisikan "penyisipan teks" untuk tujuan Anda? Mengklarifikasi itu juga dapat membantu Anda menemukan cara untuk mencapainya.
T. Verron
Hmm pertanyaan bagus - bagaimana cara mendefinisikan modifikasi buffer terus menerus terakhir . Mungkin modifikasi buffer antara dua titik pergerakan yang bukan merupakan hasil dari modifikasi buffer ( C-f, pencarian, dll.)? Jika itu masuk akal ...
ooi
Perjelas apa yang Anda inginkan dengan resep. Ada banyak jenis "penyisipan" (cara memasukkan teks). Apakah Anda memasukkan secara interaktif? Jika ya, bagaimana caranya?
Drew
Secara interaktif. Tapi idealnya tidak masalah bagaimana atau apa. Seolah- olah saya lupa mulai mendefinisikan makro . Dalam hal ini masalahnya adalah kapan itu. Mungkin beberapa kait bisa digunakan.
ooi
2
Bagaimana Anda mendefinisikan 'sisipan terakhir' di Emacs? Karena tidak ada saklar mode edit / perintah seperti di vi, seberapa jauh dalam sejarah kita harus pergi? Saya biasanya hanya memilih "sisipan terakhir" ( C-space, pindahkan kursor, M-wuntuk menyalin) dan kemudian C-ytempelkan waktu sebanyak yang diperlukan.
Alain

Jawaban:

7

dot-modeadalah "mode minor untuk mengulang pengetikan atau perintah," dan dapat melakukan apa yang Anda butuhkan. Ini pada dasarnya hanya mengulangi penyisipan / penghapusan terakhir yang Anda lakukan. Ini sangat mirip dengan .di Vi (m).

Bill Benedetto
sumber
2
Apa fungsinya ?
Malabarba
1
Selamat datang di Emacs.SE. Saat ini, jawaban Anda lebih dekat dengan komentar daripada jawaban. Bisakah Anda mengeditnya untuk menjelaskan apa yang dot-modedilakukan dan bagaimana ia menyediakan fungsionalitas yang OP coba dapatkan?
Dan
7

Seolah- olah saya lupa mulai mendefinisikan makro

Anda dapat menggunakan kmacro-edit-lossage( C-x C-k l) untuk itu: memungkinkan Anda melihat 300 penekanan tombol terakhir (termasuk penyisipan sederhana), dan mengeditnya sebagai makro.

Untuk penggunaan sederhana, Anda cukup menemukan awal penyisipan yang ingin Anda ulangi, menghapus semua teks dari "Makro:" ke titik itu, dan tekan C-c C-c. Sekarang Anda memiliki makro yang dapat Anda gunakan untuk melakukan tindakan yang sama, seolah-olah Anda tidak lupa untuk merekamnya sejak awal.

Sayangnya, ini gagal jika 300 penekanan tombol terakhir termasuk klik mouse.

Sunting: Kode berikut mengubahnya sehingga hanya tombol setelah acara mouse terakhir disimpan.

(defadvice recent-keys (after tv/recent-keys-no-mouse first ())
  "Return only the keys since the last mouse event"
  (let* ((vec ad-return-value)
         (lst (append vec nil))
         (nmax (length vec))
         (i (- nmax 1)))
    (while
        (and
         (>= i 0)
         (not
          (let ((mod (event-modifiers (elt vec i))))
            (or (memq 'click mod)
                (memq 'double mod)
                (memq 'triple mod)
                (memq 'drag mod)
                (memq 'down mod)))))
      (setq i (- i 1)))
    (setq ad-return-value (vconcat (nthcdr (+ i 1) lst) nil))))

(defun tv/kmacro-edit-lossage-no-mouse ()
  "Same as `kmacro-edit-lossage', but fallback if the keys contain mouse events.

Source: http://emacs.stackexchange.com/a/4071/184"
  (interactive)
  (ad-activate-regexp "tv/recent-keys-no-mouse")
  (call-interactively #'kmacro-edit-lossage)
  (ad-deactivate-regexp "tv/recent-keys-no-mouse"))

;; If you want this function to replace the default one, uncomment this line:
; (global-set-key (kbd "C-x C-k l") 'tv/kmacro-edit-lossage-no-mouse)
T. Verron
sumber
Saya sering menggulir menggunakan mouse, itu akan keren untuk melihat cara menghapusnya dari makro.
ooi
Wow, perintah ini akan berguna jika tidak sepenuhnya gagal jika 300 terakhir termasuk klik mouse. Mungkin saja jangan memasukkan klik dan beri tahu pengguna alih-alih hanya menolak untuk bekerja.
pengasuh
@nanny Saya menambahkan beberapa elisp untuk mengaktifkan fallback (imo) yang lebih baik daripada hanya gagal dengan pesan kesalahan: dengan fungsi ini, hanya tombol setelah acara mouse terakhir yang akan disimpan. Menjatuhkan peristiwa mouse sepenuhnya harus dimungkinkan juga, tetapi hasil makro akan agak tidak dapat diprediksi.
T. Verron
@ooi Tidak tahu apakah Anda secara otomatis di-ping oleh komentar sebelumnya, jadi ini ping Anda juga.
T. Verron
Terima kasih, saya mengerjakan hal yang sama. Saya pikir mungkin untuk menyaring argumen edmacro-fix-menu-commands. Dibutuhkan argumen opsional yang dapat mengabaikan acara mouse. Tetapi saya tidak cukup tahu tentang sistem saran untuk membuatnya bekerja.
pengasuh
4

Saya pikir dabbrev-expandfungsi bisa melakukan trik. Misalkan Anda telah mengetik beberapa kata: emacs, emotion, emoji, ... Lain kali Anda mengetik kata yang dimulai dengan 'em', Anda dapat menekan M-/dan emacs akan mengusulkan Anda untuk memasukkan salah satu kata yang sudah dimasukkan. dimulai dengan 'em'. Tetap memukul M-/dan emacs akan menunjukkan 'emoji', lalu 'emosi, lalu ...

Anda mungkin juga memiliki pandangan untuk mengulang-kompleks-perintah . Contoh yang populer adalah: Anda ingin mengulangi perintah query-replacedi banyak buffer yang berbeda selalu menggunakan argumen yang sama, ganti "pitt" dengan "patt".

Anda menjalankannya sekali, pergi ke jendela yang berbeda, dan ketik C-x ESC ESCuntuk menjalankannya lagi.

Dan untuk menyelesaikannya, bolehkah saya menyarankan insert-repeat ? File el ini akan membantu Anda melakukan penyisipan, menggunakan semacam logika. Ini lebih seperti, "reapeat penyisipan terakhir, tetapi untuk setiap iterasi, argumen akan berubah.

Contoh ini dapat ditemukan di file el :

;; You can also iterate over lists:
;;   My desk is cluttered
;;   My desk is a real mess
;;   My desk is very hard to see
;;   My desk is buried
;;
;; from m-x insert-patterned
;;    ";;   My desk is %s"
;;    (cluttered "a real mess" "very hard to see" buried)

Saya harap itu akan membantu.

Nsukami _
sumber
1
Mungkin Anda dapat mengembangkan sedikit ...
T. Verron
@ T. Veron Selesai :)
Nsukami _
1
Ulangi-kompleks-perintah seperti repeat(yang OP sebutkan), tidak benar-benar berguna untuk penyisipan teks. Repeat-insertperlu dipikirkan sebelum memasukkan teks, seperti makro. Tapi dabbrev-expanditu ide yang bagus!
T. Verron