2009-10-02 14 views
40

Czytałem ten artykuł o tworzeniu makr vi: vi sequence macro i widziałem jedno przydatne makro, aby utworzyć sekwencję w buforze.Makro Emacsa do generowania sekwencji?

1.
2.
...
100.

W VI, sztuką jest to, że może uderzyć Ctrl-A nad liczbą i doda do niej jeden, więc ta sprawił, że makro było łatwe. Chcę móc zrobić to samo w emacs.

Odpowiedz

56

Jeśli używasz Emacs 23 (i może 22?), Użyj kmacro-insert-counter, który jest domyślnie powiązany z C-x C-k TAB. Tak dla przykładu, można zrobić:

C-x (C-x C-k TAB . RET C-x)

więc uruchomić makro, włóż licznik następnie, nowej linii końcowej, makro „”. Następnie C-x e e e e e e e itp. Lub M-1 0 0 C-x e, aby uzyskać 100 z nich.

EDIT:

Zapomniałem wspomnieć można ustawić licznik na wartość początkową również. Na przykład, aby rozpocząć od 1 zamiast 0 do M-1 C-x C-k C-c.

A jeśli nie chcesz, aby licznik zwiększał się w określonym punkcie, należy poprzedzić go numerem C-u. Oczywiście klawisze stają się w tym momencie nieco śmieszne, więc zwykle wiążę klucz, aby wstawić, ale nie zwiększyć.

+1

nadal aktualne: 'kmacro ustawiony licznik Cx Ck Cc' ' kmacro-add -kontrakt Cx Ck Ca' 'kmacro-insert-counter Cx Ck TAB' Pomysł polega na ustawieniu licznika. Następnie zdefiniuj makro, a wewnątrz makra wstaw i zwiększ licznik. Następnie kilkakrotnie uruchom makro. To mogło być oczywiste dla innych czytelników, ale początkowo go nie dostałem. – Cheeso

17

Emacs 23 obsługuje fragmenty elips w tekście zastępującym zamiennie-wyraże.

ja często definiują makra klawiaturowe, które następują ten wzór:

  • Kopiuj blok tekstu
  • przejdź do numeru, który chcę, aby zwiększyć w skopiowanym bloku tekstu z iSearch
  • Aktywuj zaznacz i przesuń punkt, aby zdefiniować region obejmujący liczbę:
  • Mx zamień-wyliczenie
  • Po monicie "Zamień wyrażenie" wpisz \([0-9]+\), aby przechwycić grupę o f jedną lub więcej cyfr
  • w „regexp wymiany ([0-9] +) gdzie:” polecenia wprowadź \,(1+ \#1), gdzie , wskazuje, że elisp postać zastąpić następująco 1+ jest funkcją przyrost i \#1 jest pierwszy przechwycony tekst dopasowania, interpretowany jako liczba.

Po zrobieniu minutę do zdefiniowania makra klawiatury, to pozwala mi mieć prawie wygodę wycinanie i wklejanie do generowania wiele bloków niemal identyczny kod, takich jak na case wypowiedzi.

Należy zauważyć, że tę technikę można łatwo dostosować do np. podwójne liczby (\,(* 2 \#1)) lub cokolwiek innego. Możesz nawet użyć go do zastąpienia następnego elementu w dowolnej kolejności, używając kombinacji 'position i 'nth, ale nie będę się teraz w to zagłębiać :).

+1

dziękuję za demonstrację użycia zamiennika-regexp do zastąpienia licznika dla tekstu –

+0

'\, (eval-expression)' jest bardzo miłe w zapytaniu zamień regexps! Musiałem ponumerować sekwencję numerów indeksu górnego począwszy od 1. Wszystkie były w znacznikach SMF '[sup]', zaczynając od 63. Więc zrobiłem to zapytanie zamień wyrażenie regularne, aby rozpocząć je od 1: '(domyślnie \ [sup \] [0-9] + \ [\/sup \] '→' [sup] \, (kmacro-insert-counter 1) [/ sup] '. Jednak zastąpił je czymś w rodzaju [sup] Nowy licznik makr value: 1 (1) [/ sup] 00 "Jak mogę to naprawić (poza wyrenderowaniem tego dodatkowego tekstu)? – Geremia

+1

@Geremia: Oto co musiałem zrobić:' C'-':' '(setq kmacro- licznik 0) ', a następnie:' \ [sup \] [0-9] + \ [\/sup \] '→' [sup] \, (print (setq kmacro-counter (1+ kmacro-counter))) '. – Geremia

1

Istnieje również:

C-u M-! jot -s '.C-q C-j' 10

To nie jest czysta elisp, ale ma ten sam efekt. Możesz napisać nazwane makro, aby uruchomić go dla ciebie.

+1

gdzie mogę znaleźć polecenie jot? –

+0

'jot' i 'seq' robią to samo dla tych celów.Jeśli jesteś na systemie Unix, prawie na pewno masz co najmniej jeden z nich zainstalowany.q –

51

Ci, którzy czują się zbyt wiele sztuczek, aby zapamiętać może znaleźć pozyskiwania niektóre elisp bardziej opłaca:

 
M-: (dotimes (i 20) (insert (format "%2d.\n" (1+ i)))) 
+6

+1 dla wspominając 'M-:' ('eval-expression'), nigdy o nim nie słyszałem. –

+0

@ TörökGábor' \, (eval-expression) 'jest schludne zapytanie również zastępuje wyrazy regularne. – Geremia

3

Po włączeniu trybu moll CUA (cua-mode), można wybrać kolumny tekstu, a następnie wypełnij go sekwencją liczb, używając domyślnie cua-sequence-rectangle (domyślnie jest to M-n).

Jest to to samo, o czym wspomniałem w filmie Török Gábor, ale teraz jest tutaj napisane, więc nie musisz oglądać całego wideo, chyba że chcesz. To jest dobre wideo.

+4

Warto również zauważyć, że w dzisiejszych czasach nie potrzebujesz 'cua-mode' * do numerowania prostokąta - od 24.1 istnieje operacja prostokąta prostokątnego' prostokąt-liczba-linii' związana z 'C-x r N'. (* lub 'cua-selection-mode', który jest zdecydowanie preferowaną opcją dla tych, którzy nie używają' cua-mode' jako standardu.) – phils

+2

Mogę równie dobrze połączyć się z [wektorami liczb sz ?] (http://stackoverflow.com/a/9932745/324105). – phils

9

Od wersji 24.3 Emacs (wierzę faktycznie od uwolnienia 24,0), o sekwencji klawiszy została uproszczona:

<F3> <F3> . <ENTER> <F4>

Następnie powtarzając <F4> klucz powtórzy makro.

Sztuką jest to, że po uruchomieniu makra z <F3>, drugi <F3> naciśnięcie klawisza spowoduje wstawienie aktualnej wartości licznika makra klawiatury jest w buforze, a zwiększa licznik o 1.

inne sztuczki:

  • <F3> C-u 2 <F3> . <ENTER> <F4> będzie zwiększać się +2 (zamiast +1)
  • C-u 100 <F3> <F3> . <ENTER> C-u 50 <F4> rozpocznie się 100 i kończą się 149
  • C-x C-k C-f %03d <ENTER> <F3> <F3> . <ENTER> <F4> będzie pad z zero jak "000"

Źródło: Keyboard Macro Counter sekcja w podręczniku Emacs.

+2

Aby zaprogramować licznik, wystarczy numeryczny prefiks arg. np .: 'C-u 100 . RET '. Argument przedrostka do '' mówi ile razy powtórzyć makro (włącznie z nagrywaniem), aby od razu odliczać od 100 do 149, można to zakończyć za pomocą 'C-u 50 ' zamiast tylko ''. – phils

+0

Dzięki phils. Ulepszyłem swoją odpowiedź (i wiedzę) swoimi komentarzami. – thdox

+0

'F3 F3 X F4' jest ** ogromnym ** ulepszeniem w porównaniu z' Cx (Cx Ck TAB X Cx) 'pod względem łatwości użycia w makiecie jednorazowym - i teraz nie muszę tu przychodzić, ponieważ zapomniałem o kluczowej kombinacji akrobatów. Mam nadzieję, że ta odpowiedź podbije szczyt, gdzie należy. –

0

Można użyć shell-command-on-region inaczej:

C-u M-! seq 1 100|xargs -I{} echo {}"." 
0

Oto prosty defun na to:

(defun insert-range (START END &optional STEP FORMAT) 
    "Inserts a range of integers from START to END with STEP (default to 1) 
in a given format (default to \"\\n%d\")" 
    (interactive 
    (list (read-number "Start: " 1) 
     (read-number "End: " 10) 
     (read-number "Step: " 1) 
     (read-string "Format (default to \"\\n%d\"): " nil nil "\n%d"))) 
    (dotimes (i (1+ (/ (- END START) STEP))) 
    (insert (format FORMAT (+ START (* i STEP)))) 
) 
)