Son metin eklemesini tekrarla


10

Vim'de .metin eklemek de dahil olmak üzere en son değişikliği tekrarlamak için tuşuna basabilirsiniz .

Emacs iken C-x zsadece son komutu tekrarlar. Makroların burada kullanılabileceğinin farkındayım, ancak çoğu zaman aynı metni çok geç tekrar eklemem gerektiğini anlıyorum. Sadece bir kez daha takmam gerektiğinde , bir makro tanımlamak anlamsızdır.

S: Emacs'ın içine metin eklemeyi tekrarlamanın bir yolu var mı?


1
Tekrarlamak istediğiniz "metin" nedir? Teknik olarak konuşursak, son ekleme sadece son karakterdir, muhtemelen peşinde olduğunuz şey değildir. Peki, amacınız için bir "metin ekleme" nasıl tanımlarsınız? Bunu açıklığa kavuşturmak da başarmanın yollarını bulmanıza yardımcı olabilir.
T. Verron

Hmm iyi soru - son sürekli tampon modifikasyonu nasıl tanımlanır . Belki de bir tampon modifikasyonunun sonucu olmayan iki nokta hareketi arasında bir tampon modifikasyonu ( C-f, arama, vb.)? Bu herhangi bir anlam ifade ediyorsa ...
ooi

Bir tarifle ne istediğini netleştir. Birçok "ekleme" türü vardır (metin ekleme yolları). Etkileşimli olarak ekliyor musunuz? Öyleyse nasıl?
Drew

Etkileşimli. Ama ideal olarak nasıl ya da ne olduğu önemli değil. Sanki bir makro tanımlamaya başlamayı unuttum . Bu durumda sorun tam zamanı . Belki biraz kanca kullanılabilir.
ooi

2
Emacs'ta 'son ekleme' nasıl tanımlanır? Vi'de olduğu gibi düzenleme / komut modu anahtarı olmadığından, geçmişte ne kadar ilerlemeliyiz? Genellikle sadece "son ekleme" yi seçerim ( C-spaceimleci M-wkopyalamak için hareket ettirir ) ve sonra C-yda gerektiği kadar yapıştırırım.
Alain

Yanıtlar:


7

dot-mode"yazmayı veya komutları tekrarlamak için küçük bir mod" dur ve ihtiyacınız olanı yapabilir. Temelde yaptığınız son ekleme / silme işlemlerini tekrarlar. .Vi (m) ' ye oldukça benzer .


2
Ne yapar ?
Malabarba

1
Emacs.SE'ye Hoşgeldiniz. Şu anda, cevabınız bir yoruma bir yanıttan daha yakın. dot-modeOP'nin elde etmeye çalıştığı işlevselliği ne yaptığını ve nasıl sağladığını açıklamak için lütfen düzenleyebilir misiniz ?
Dan

7

Sanki bir makro tanımlamaya başlamayı unuttum

Bunun için kmacro-edit-lossage( C-x C-k l) kullanabilirsiniz : son 300 tuş vuruşunuzu (basit eklemeler dahil) görüntülemenizi ve bunları makro olarak düzenlemenizi sağlar.

Basit kullanım için, tekrarlamak istediğiniz eklemenin başlangıcını bulur, "Makro:" dan o noktaya kadar tüm metni siler ve tuşuna basın C-c C-c. Şimdi, aynı eylemleri gerçekleştirmek için kullanabileceğiniz bir makro var, sanki ilk başta kaydetmeyi unutmamışsınız gibi.

Ne yazık ki, son 300 tuş vuruşunda fare tıklamaları varsa bu başarısız olur.

Düzenle: Aşağıdaki kod, yalnızca son fare olayından sonraki tuşların tutulması için değiştirir.

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

Genellikle fareyi kullanarak kaydırıyorum, makrodan nasıl kaldırılacağını görmek güzel olurdu.
ooi

Vay be, son 300 fare tıklaması dahilinde tamamen başarısız olmazsa bu komut yararlı olacaktır. Belki sadece tıklamaları dahil etmeyin ve yalnızca çalışmayı reddetmek yerine kullanıcıya bildirin.
dadı

@nanny Bir hata mesajıyla başarısız olmaktan (imo) daha iyi bir geri dönüşü etkinleştirmek için bazı elisp'ler ekledim: bu işlevle, yalnızca son fare olayından sonraki tuşlar korunur. Fare olaylarını tamamen bırakmak da mümkün olmalıdır, ancak makronun sonucu biraz tahmin edilemez olacaktır.
T. Verron

@ooi Önceki yoruma otomatik olarak ping attıysanız hiçbir fikrim yok, işte pinginiz de burada.
T. Verron

Teşekkürler, aynı şey üzerinde çalışıyordum. Args filtrelemek mümkün olabilir düşünüyorum edmacro-fix-menu-commands. Fare olaylarını yok sayabilecek isteğe bağlı bir argüman alır. Ama tavsiye sistemi hakkında çalışacak kadar bilgim yok.
dadı

4

Bence dabbrev-expandfonksiyon hile yapabilir. Zaten bazı kelimeler yazdığınızı varsayalım: emacs, duygu, emoji, ... Bir dahaki sefere 'em' ile başlayacak bir kelime yazdığınızda, vurabilir M-/ve emacs size zaten eklenmiş olan kelimelerden birini eklemenizi önerir 'em' ile başlayarak. M-/Vurmaya devam et ve emacs sana 'emoji', sonra 'duygu' gösterecek, sonra ...

Ayrıca, yineleme-karmaşık-komutuna bir göz atabilirsiniz . Bunun en popüler örneği: komutu query-replaceher zaman aynı argümanları kullanan birçok farklı arabellekte tekrarlamak, “pitt” yerine “patt” yazın.

Bir kez çalıştırın, farklı bir pencereye gidin ve C-x ESC ESCtekrar çalıştırmak için yazın .

Ve bitirmek için tekrar ekleme önerebilir miyim ? Bu el dosyası, bir tür mantık kullanarak ekleme yapmanıza yardımcı olacaktır. Daha çok, "son ekleme işlemini tekrarlayın, ancak her yineleme için argümanlar değişecektir.

Bu örnek el dosyasında bulunabilir:

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

Umarım bu yardımcı olur.


1
Belki biraz genişletebilirsiniz ...
T. Verron

@ T.Verron Done :)
Nsukami _

1
Tekrarlama-kompleksi komutu repeat(OP'den bahseder) gibidir, metin eklemek için gerçekten yararlı değildir. Repeat-insertmetni eklemeden önce, tıpkı bir makro gibi düşünülmesi gerekir. Ama dabbrev-expandgüzel bir fikir!
T. Verron
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.