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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top