문제
EMACS에서 다음 코드를 빠르게 작성하려면 어떻게해야합니까?
\newcommand{\cA}{\mathcal A}
\newcommand{\cB}{\mathcal B}
\newcommand{\cC}{\mathcal C}
...
...
\newcommand{\cY}{\mathcal Y}
\newcommand{\cZ}{\mathcal Z}
글쓰기보다 빠른 방법이 있습니까?
A
B
C
D
.
.
.
Y
Z
그리고 각 줄에서 매크로를 수행합니까? (a newcommand로 변경 { ca} { Mathcal a})
해결책
일반적으로, 처음으로 이런 종류의 문제에 직면 할 때 JB가 이미 말했듯이 키보드 매크로를 사용할 것입니다.
두 번째로 Steve Yegge의 매우 흥미로운 기사를 확인하십시오. http://steve-yegge.blogspot.com/2006/06/shiny-and-new-emacs-22.html, 여기에는 당신과 같은 문제에 대한 솔루션이 포함되어 있습니다.
당신의 편의와 내 자신의 조명을 위해, 나는 실제로 계속해서 그것을 테스트했습니다.
나는 시작할 것이다
A ... A
26 번
그리고 a
MX REPLEC-REGEXP
A \\newcommand{\\c\,(string (+ ?A \#))}{\\mathcal \,(string (+ ?A \#))}
다른 팁
키보드 매크로가 결과를 가장 빠르게 얻을 수 있다는 데 동의합니다.
더 재미는 프로그래밍 방식의 접근 방식입니다.
(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에서 Z는 26 줄에 불과합니다. 키보드 매크로 인 IMHO를 사용하는 것보다 더 많은 시간 자동화 생성을 낭비 할 것입니다.
그것은 당신의 배경에 따라 다릅니다. 난 그냥 입력 할거야 M-!
그리고:
perl -e"print map {q(\newcommand{\c).$_.q(}{\mathcal ).qq($_}\n)} A..Z
당신은 알고 있습니까? 사각형 선택 ?
또한 있습니다 string-rectangle
:
- 텍스트의 시작 부분에 Place Point (커서) Mark (
C-SPC
) - 마지막 줄의 시작 부분에 포인트를 배치하십시오
- 유형
M-x string-rectangle
- 입력 문자열 ( newcommand { c)
마크 이후 각 줄 앞에 해당 문자열이 삽입됩니다.
나는 카르마가 충분하지 않거나 언급 할 것이 없지만 HD의 스타일을 약간 향상시키고 싶었습니다.
다음은 원본입니다.
(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")))
우선, EMACS LISP에는 Chars 용 독자 구문이 있습니다. 대신에 (string-to-char "X")
, 당신은 그냥 쓸 수 있습니다 ?X
. 그런 다음 printf 스타일을 사용할 수 있습니다 format
대신에 char-to-string
그리고 concat
최종 결과를 생성하려면 :
(loop for n from ?A to ?Z
do (insert (format "\\newcommand{\\c%s}{\\mathcal %s}\n" n n)))
이제 생각하지 않고 입력하기에 충분히 간결합니다. M-:
즉각적인.
나는 또한 텍사스가 실제로 텍사스라면 매크로를 가지고 있다고 지적 할 것이다.
편집 : Joe Casadonte의 또 다른 스타일 조언; (incf foo)
보다 입력하기가 훨씬 쉽습니다 (setq foo (+ foo 1))
.
또는 한 번에 하나씩하고 싶다면 대화식 방법
(defun somefun(inputval)
(interactive "sInputVal: ")
(insert ( format "\\newcommand{\\c%s}{\\mathcal %s}" inputval inputval) )
)
텍스트를 원할 때마다 평가하고 mx somefun 만
정확히 답이 아닙니다.
EMAC 또는 VIM을 사용하지 않는 사람들의 경우 Excel을 열고 자동 제외 기능 및 텍스트 연결 기능을 사용하여 그러한 코드를 생성 할 수 있다고 덧붙이고 싶습니다.
나는 HD의 루프를 내 것보다 조금 더 좋아하지만 여기에는 대체적이고 일반화 된 접근 방식이 있습니다.
(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)))))
둘을 결합하기에는 너무 어렵지 않아야합니다.