Generare un codice da Emacs
-
03-07-2019 - |
Domanda
Come posso scrivere rapidamente il seguente codice in emacs?
\newcommand{\cA}{\mathcal A}
\newcommand{\cB}{\mathcal B}
\newcommand{\cC}{\mathcal C}
...
...
\newcommand{\cY}{\mathcal Y}
\newcommand{\cZ}{\mathcal Z}
Esiste un modo più veloce della scrittura
A
B
C
D
.
.
.
Y
Z
e quindi fare macro su ogni riga? (cambiando A in \ newcommand {\ cA} {\ mathcal A})
Soluzione
In generale, la prima volta che ti trovi di fronte a questo tipo di problema, utilizzeresti le macro della tastiera, come già detto da JB.
La seconda volta, dai un'occhiata a questo articolo molto interessante di Steve Yegge: http://steve-yegge.blogspot.com/2006/06/shiny-and-new-emacs-22.html , che contiene soluzioni per problemi esattamente come i tuoi.
Per tua comodità e per la mia illuminazione, in realtà sono andato avanti e l'ho provato:
Vorrei iniziare con
A ... A
26 volte
e fai un
M-x replace-regexp
A \\newcommand{\\c\,(string (+ ?A \#))}{\\mathcal \,(string (+ ?A \#))}
Altri suggerimenti
Sono d'accordo che una macro di tastiera otterrà il risultato il più rapidamente possibile.
Più divertente è un approccio programmatico:
(loop
for n from (string-to-char "A") to (string-to-char "Z")
for c = (char-to-string n)
do (insert (concat "\\newcommand{\\c" c "}{\\mathcal " c "}\n")))
Dalla A alla Z sono solo 26 righe. Sprecheresti più tempo ad automatizzare la generazione che a usare naturalmente le macro della tastiera, imho.
Dipende dal tuo background. Digiterei M-!
e:
perl -e"print map {q(\newcommand{\c). Dipende dal tuo background. Digiterei M-!
e:
<*>.q(}{\mathcal ).qq( Dipende dal tuo background. Digiterei M-!
e:
<*>}\n)} A..Z
Conosci la selezione rettangolo ?
C'è anche string-rectangle
:
- posiziona il punto (il cursore) all'inizio del testo, segna (
C-SPC
) - posiziona il punto all'inizio dell'ultima riga
- digita
M-x string-rectangle
- digita una stringa (\ newcommand {\ c)
Questo inserirà quella stringa prima di ogni riga dal segno.
Non ho abbastanza karma o altro da commentare, ma volevo migliorare un po 'lo stile dell'HD.
Ecco l'originale:
(loop
for n from (string-to-char "A") to (string-to-char "Z")
for c = (char-to-string n)
do (insert (concat "\\newcommand{\\c" c "}{\\mathcal " c "}\n")))
Prima di tutto, Emacs Lisp ha la sintassi del lettore per i caratteri. Invece di (string-to-char " X ")
, puoi semplicemente scrivere ? X
. Quindi, puoi utilizzare il formato
in stile printf invece di char-to-string
e concat
per produrre il risultato finale:
(loop for n from ?A to ?Z
do (insert (format "\\newcommand{\\c%s}{\\mathcal %s}\n" n n)))
Ora è abbastanza conciso digitare senza pensare al prompt M-:
.
Sottolineerò anche che anche TeX ha macro, se questo è davvero TeX.
Modifica: un altro consiglio di stile per Joe Casadonte; (incf foo)
è molto più facile da digitare rispetto a (setq foo (+ foo 1))
.
O il modo interattivo se vuoi farlo uno alla volta
(defun somefun(inputval)
(interactive "sInputVal: ")
(insert ( format "\\newcommand{\\c%s}{\\mathcal %s}" inputval inputval) )
)
solo eval e M-x somefun ogni volta che vuoi il testo
Non esattamente una risposta.
Per le persone che non usano emacs o vim, vorrei aggiungere che è possibile aprire Excel e utilizzare la sua funzione di compilazione automatica e la funzione di concatenazione del testo per generare tale codice.
Mi piace il loop di HD un po 'meglio del mio, ma ecco un approccio alternativo e più generalizzato:
(defun my-append (str)
"Substitute A-Z in STR and insert into current buffer.
Looks for '--HERE--' (without quotes) in string STR, substitutes the
letters A-Z in the string and then inserts the resulting string into
the current buffer."
(interactive "sInput String: ")
(let ((lcv 0)
letter newstr)
(while (< lcv 26)
(setq letter (+ ?A lcv))
(insert (replace-regexp-in-string "--HERE--" (char-to-string letter) str t t) "\n")
(setq lcv (+ lcv 1)))))
Non dovrebbe essere troppo difficile combinare i due.