2011-12-16 13 views
12

Podczas gdy to pytanie dotyczy formatowania LaTeXa w Emacs (a może Auctex), wierzę, że można to zastosować do bardziej ogólnych sytuacji w Emacs dotyczących ograniczników takich jak nawiasy, nawiasy i nawiasy klamrowe.Jak można zmodyfikować dwa dopasowane separatory jednocześnie za pomocą Emacsa?

Szukam, aby móc wykonać następujące czynności z Emacs (i elisp), i nie wiem od czego zacząć. Że mam:

(This is in parentheses) 

Z pewnym kombinacja klawiszy w Emacsa, chcę Emacs znaleźć separator pasujący do którykolwiek z nich został przez mojego kursora (coś wiem Emacs może zrobić, ponieważ może podświetlić pasujące ograniczniki w różnych trybach) i być w stanie zmienić ich oboje do

\left(This is in parentheses \right) 

ograniczniki chciałbym to do pracy z to: (...), [...], \lvert ... \rvert, \langle ... \rangle, \{ ... \}. Jaki eliksir byłby potrzebny do wykonania tego zadania?

Bardziej ogólne sposoby radzenia sobie z dopasowanymi ogranicznikami są mile widziane.

+1

+1 Niezły pomysł! Taka rzecz zawsze byłaby przydatna ... –

+0

Proszę wyjaśnić skąd się wzięła modyfikacja? Czy modyfikacja zawsze jest kwestią poprzedzania "\ left" i "\ right" do ograniczników? –

+0

Modyfikacja pochodzi z LaTeXa, ponieważ '\ left' i' \ right' powodują, że te ograniczniki są skalowane do rozmiaru tekstu/matematyki zawartej w nich (czasami nie jestem wystarczająco przekonany, aby zdać sobie sprawę, że będę ich potrzebować). I tak, modyfikacja byłaby kwestią poprzedzania '\ left' i' \ right' ogranicznikami. Jeśli jednak istnieją sposoby na robienie im innych rzeczy (na przykład zmiana nawiasów na nawiasy klamrowe lub nawiasy klamrowe), byłoby to również przyjemne. – qgp07

Odpowiedz

8

Oceń poniższe polecenie w aplikacji Emacs. Po ponownym załadowaniu możesz umieścić punkt (kursor tekstowy) bezpośrednio po okienku zamykającym. Następnie wykonaj M-x replace-matching-parens, aby zastąpić zamknięcie ) za pomocą \right) i zgodną tabelę początkową ( z .

(defun replace-matching-parens() 
    (interactive) 
    (save-excursion 
    (let ((end-point (point))) 
     (backward-list) 
     (let ((start-point (point))) 
     (goto-char end-point) 
     (re-search-backward ")" nil t) 
     (replace-match " \\\\right)" nil nil) 

     (goto-char start-point) 
     (re-search-forward "(" nil t) 
     (replace-match "\\\\left(" nil nil))))) 

interactive bit wskazuje, że chcę „polecenia”, więc to może być wykonywane przy użyciu M-x. Aby uniknąć umieszczenia kursora w dziwnym miejscu po wykonaniu, zawijam logikę w save-excursion. Punkt przeskakuje z powrotem do otworu otwierającego, używając położenia początkowego i końcowego obszaru dopasowanego o podobnej wielkości. Wreszcie, zaczynając od końca i pracując wstecz, zastępuję łańcuchy. Zastępując wstecz, a nie w przód, unikam unieważniania, zanim tego potrzebuję.

Uogólnienie tego, aby obsługiwać różne rodzaje ograniczników, nie powinno być zbyt złe. backward-list powinien pracować z dowolną parą ciągów, które emacs rozpoznaje jako analogi ( i ). Aby dodać więcej par łańcuchów podobnych do nawiasów, sprawdź artykuł set-syntax-table w tym artykule o numerze Parenthesis Matching.

Użyj global-set-key, aby skonfigurować powiązanie klucza z replace-matching-parens.

Ostrzegawcze ostrzeżenie: replace-matching-parens to pierwsze polecenie, które zaimplementowałem, więc może nie być zgodne z najlepszymi praktykami. Dla wszystkich tych guru jestem otwarty na konstruktywną krytykę.

+0

Dokładnie tego chciałem! Działa jak marzenie. – qgp07

+0

Miło to słyszeć!Dziękuję za udzielenie mi dobrego wyzwania. –

Powiązane problemy