Powtórz ostatnią wstawkę tekstu

10

W Vimie możesz nacisnąć, .aby powtórzyć ostatnią zmianę, w tym wstawienie tekstu.

Podczas gdy w Emacs C-x zpowtarza tylko ostatnie polecenie. Wiem, że można tutaj używać makr, ale częściej niż zdaję sobie sprawę, że muszę zbyt późno wstawiać ten sam tekst. Kiedy muszę ponownie wstawić go tylko raz , zdefiniowanie makra jest wtedy bezcelowe.

P: Czy istnieje sposób na powtórzenie wstawiania tekstu w Emacsie?

ooi
źródło
1
Jaki „tekst” chcesz powtórzyć? Technicznie rzecz biorąc, ostatnia wstawka to tylko ostatnia postać, co prawdopodobnie nie jest tym, czego szukasz. Jak więc zdefiniowałbyś „wstawianie tekstu” do swoich celów? Wyjaśnienie tego może również pomóc w znalezieniu sposobów na osiągnięcie tego.
T. Verron,
Hmm dobre pytanie - jak zdefiniować ostatnią ciągłą modyfikację bufora . Być może modyfikacja bufora między dwoma ruchami punktowymi, które nie są wynikiem modyfikacji bufora ( C-fwyszukiwania itp.)? Jeśli ma to jakiś sens ...
ooi
Wyjaśnij, czego chcesz, dzięki przepisowi. Istnieje wiele rodzajów „wstawiania” (sposoby wstawiania tekstu). Czy wstawiasz interaktywnie? Jeśli tak to jak?
Drew
Interaktywnie. Ale idealnie nie miałoby znaczenia, jak i co. To tak, jakby zapomniałem zacząć definiować makro . W takim przypadku problem polega na tym, kiedy to jest. Może przydałby się jakiś haczyk .
ooi
2
Jak definiujesz „ostatnią wstawkę” w Emacsie? Ponieważ nie ma przełącznika trybu edycji / polecenia, jak w vi, jak daleko w historii powinniśmy się posunąć? Zazwyczaj po prostu wybieram „ostatnią wstawkę” ( C-spaceprzesuń kursor, M-waby skopiować), a następnie C-ywklej tyle razy, ile potrzeba.
Alain,

Odpowiedzi:

7

dot-modeto „mniejszy tryb powtarzania pisania lub poleceń” i może robić to, czego potrzebujesz. Zasadniczo po prostu powtarza ostatnie wstawienia / usunięcia. Jest bardzo podobny do .Vi (m).

Bill Benedetto
źródło
2
Co ma zrobić?
Malabarba,
1
Witamy w Emacs.SE. W tej chwili Twoja odpowiedź jest bliższa komentarzowi niż odpowiedzi. Czy możesz go edytować, aby wyjaśnić, co dot-moderobi i jak zapewnia funkcjonalność, którą OP chce uzyskać?
Dan
7

To tak, jakby zapomniałem zacząć definiować makro

Możesz do tego użyć kmacro-edit-lossage( C-x C-k l): pozwala wyświetlić 300 ostatnich naciśnięć klawiszy (w tym proste wstawienia) i edytować je jako makro.

Dla prostego użycia wystarczy zlokalizować początek wstawiania, który chcesz powtórzyć, usunąć cały tekst z „Makro:” do tego miejsca i nacisnąć C-c C-c. Teraz masz makro, którego możesz użyć do wykonania tych samych czynności, jakbyś nie zapomniał go najpierw nagrać.

Niestety nie powiedzie się to, jeśli ostatnie 300 naciśnięć klawiszy obejmuje kliknięcia myszą.

Edycja: Poniższy kod zmienia go tak, że zachowane są tylko klucze po ostatnim zdarzeniu myszy.

(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
źródło
Często przewijam za pomocą myszy, fajnie byłoby zobaczyć, jak usunąć je z makra.
ooi
Wow, to polecenie byłoby przydatne, gdyby nie zawiodło całkowicie, jeśli 300 ostatnich kliknięć myszą. Może po prostu nie uwzględniaj kliknięć i powiadom użytkownika, zamiast odmawiać pracy.
niania
@nanny Dodałem trochę elisp, aby umożliwić (imo) lepszą pracę zastępczą niż po prostu błąd z komunikatem o błędzie: dzięki tej funkcji zachowane zostaną tylko klucze po ostatnim zdarzeniu myszy. Całkowite upuszczenie zdarzeń myszy również powinno być możliwe, ale wynik makra byłby nieco nieprzewidywalny.
T. Verron,
@ ooi Nie mam pojęcia, czy zostałeś pingowany automatycznie przez poprzedni komentarz, więc tutaj też jest twój ping.
T. Verron,
Dzięki, pracowałem nad tym samym. Myślę, że można filtrować argumenty edmacro-fix-menu-commands. Przyjmuje opcjonalny argument, który może ignorować zdarzenia myszy. Ale nie wiem wystarczająco dużo o systemie porad, aby go uruchomić.
niania
4

Myślę, że dabbrev-expandfunkcja może załatwić sprawę. Załóżmy, że już wpisałeś kilka słów: emacs, emocje, emoji, ... Następnym razem, gdy wpiszesz słowo zaczynające się od „em”, możesz nacisnąć, M-/a emacs zaproponuje Ci wstawienie jednego z już wstawionych słów zaczynając od „em”. Wciąż uderzaj, M-/a emacs pokaże Ci „emoji”, potem „emocje, a potem ...

Możesz także zajrzeć do polecenia repeat-complex-complex . Popularnym przykładem jest: chcesz powtórzyć polecenie query-replacew wielu różnych buforach, zawsze używając tych samych argumentów, zamień „pitt” na „patt”.

Uruchom go raz, przejdź do innego okna i wpisz, C-x ESC ESCaby uruchomić ponownie.

I na koniec, czy mogę zasugerować powtórzenie ? Ten plik el pomoże ci wstawiać, używając pewnego rodzaju logiki. To jest bardziej jak „powtórz ostatnie wstawianie, ale dla każdej iteracji argumenty się zmienią.

Ten przykład można znaleźć w pliku 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)

Mam nadzieję, że to pomoże.

Nsukami _
źródło
1
Może uda ci się trochę rozwinąć ...
T. Verron
@ T.Verron Gotowe :)
Nsukami _
1
Komenda Repeat-complex-like repeat(o której wspomina OP), nie jest tak naprawdę przydatna do wstawiania tekstu. Repeat-insertnależy pomyśleć przed wstawieniem tekstu, podobnie jak makro. Ale dabbrev-expandto fajny pomysł!
T. Verron,