Frage

Wie kann ich den folgenden Code schreiben schnell in Emacs?

\newcommand{\cA}{\mathcal A}
\newcommand{\cB}{\mathcal B}
\newcommand{\cC}{\mathcal C}
...
...
\newcommand{\cY}{\mathcal Y}
\newcommand{\cZ}{\mathcal Z}

Gibt es eine Möglichkeit schneller als das Schreiben

A
B
C
D
.
.
.
Y
Z

und dann auf jeder Zeile zu tun Makro? (A Wechsel \ newcommand {\ cA} {\ mathcal A})

War es hilfreich?

Lösung

Im Allgemeinen ist das erste Mal, wenn Sie mit dieser Art von Problem konfrontiert sind, dann werden Sie Tastaturmakros verwenden, wie JB schon gesagt.

Das zweite Mal, lesen Sie in diesen sehr interessanten Artikel von Steve Yegge: http://steve-yegge.blogspot.com/2006/06/shiny-and-new-emacs-22.html , die genau Lösungen für Probleme enthalten Sie gerne.

Für Ihre Bequemlichkeit und meine eigene Beleuchtung, ging ich tatsächlich vor und getestet:

Ich würde beginnen mit

A
...
A

26 mal

und tun a

M-x replace-regexp

A
\\newcommand{\\c\,(string (+ ?A \#))}{\\mathcal \,(string (+ ?A \#))}

Andere Tipps

Ich bin damit einverstanden, dass eine Tastatur Makro das Ergebnis erhalten wird die schnellste.

Mehr Spaß ist ein programmatischer Ansatz:

(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")))

A bis Z sind nur 26 Zeilen. Sie würden mehr Zeit Automatisierung Generation verschwenden als nur natürlich Tastatur-Makros, imho.

Es hängt von Ihrem Hintergrund. Ich würde nur geben M-! und:

perl -e"print map {q(\newcommand{\c).$_.q(}{\mathcal ).qq($_}\n)} A..Z

Haben Sie die Rechteck Auswahl wissen?

Es gibt auch string-rectangle:

  • Ort Punkt (der Cursor) am Anfang des Textes markieren (C-SPC)
  • Ort Punkt am Anfang der letzten Zeile
  • Typ M-x string-rectangle
  • Geben Sie eine Zeichenfolge (\ newcommand {\ c)

Dies wird die Zeichenfolge einfügen vor jeder Zeile, da die Marke.

Ich habe nicht genug Karma oder was auch immer zu kommentieren, aber ich wollte HD Stil ein wenig verbessern.

Hier ist das Original:

(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")))

Zunächst einmal, Emacs Lisp hat Leser Syntax für Zeichen. Statt (string-to-char "X"), können Sie einfach ?X schreiben. Dann können Sie den printf-Stil format anstelle von char-to-string und concat um das Endergebnis zu erzeugen:

(loop for n from ?A to ?Z
      do (insert (format "\\newcommand{\\c%s}{\\mathcal %s}\n" n n)))

Jetzt ist es prägnant genug, ohne zu geben in die M-: prompt zu denken.

Ich will auch darauf hinweisen, dass TeX-Makros auch hat, wenn dies in der Tat ist TeX.

Edit: Noch ein bisschen Stil Beratung für Joe Casadonte; (incf foo) ist viel einfacher als (setq foo (+ foo 1)) eingeben.

oder die interaktive Art und Weise, wenn Sie wollen, dass sie einer nach dem anderen tun

(defun somefun(inputval)
  (interactive "sInputVal: ")
  (insert ( format "\\newcommand{\\c%s}{\\mathcal %s}" inputval inputval) )
)

nur eval und M-x somefun jedes Mal, wenn der Text

Nicht gerade eine Antwort.

Für Menschen, die Emacs oder Vim nicht verwenden, ich möchte hinzufügen, dass Sie Excel öffnen und verwenden seine Funktion zum automatischen Ausfüllen und Textverkettungsfunktion, Code zu generieren.

Ich mag HD Schleife ein wenig besser als meine, aber hier ist eine alternative, allgemeineren Ansatz:

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

Sollte nicht zu schwer sein, die beides miteinander zu verbinden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top