Warum identifiziert meine Funktion das Ende der Region nicht richtig?

8

Ich habe die folgende Funktion, die von hier aus leicht angepasst wurde :

;; Insert text around a region. In this case, it's
;; the LaTeX code environment from the listings package 
(defun wrap-code (start end)
  "Insert a \begin{code} and \end{code} around a region."
  (interactive "r")
  (save-excursion
    (goto-char start) (insert "\\begin{code}")
    (goto-char end) (insert "\\end{code}")
    ))
;; Assign its shortcut
(global-set-key (kbd "C-c p") 'wrap-code) 

Wenn ich dann eine Region auswähle und meine Funktion anwende, wird die \end{code}an der falschen Stelle eingefügt:

\begin{code}while :; do
      echo this is\end{code} a test
done
Terdon
quelle

Antworten:

9

Das liegt daran , wenn Sie Ihr erstes Stück Code einfügen nach start, endkonstant bleibt und nun Punkt in der Mitte von etwas (seit mehr Zeichen wurden , bevor sie hinzugefügt).

Eine schnelle Lösung für Ihren Anwendungsfall ist das Einfügen von Text am Ende vor:

;; Insert text around a region. In this case, it's
;; the LaTeX code environment from the listings package 
(defun wrap-code (start end)
  "Insert a \begin{code} and \end{code} around a region."
  (interactive "r")
  (save-excursion
    (goto-char end) (insert "\\end{code}")
    (goto-char start) (insert "\\begin{code}")))
;; Assign its shortcut
(global-set-key (kbd "C-c p") 'wrap-code)

Eine allgemeinere Lösung würde Marker anstelle von Positionen beinhalten

Sigma
quelle
3

endist eine Zahl, eine genaue Position im Puffer. Wenn Sie also zu startText gehen und ihn einfügen, wird der Rest des Textes nach vorne verschoben und endzeigt nicht mehr auf das Ende von "erledigt", sondern auf die Position "erledigt", an der sich früher befand.

Die einfachste Lösung besteht darin, zuerst den Endtext {Code} und dann den Anfang einzufügen.

Jordon Biondo
quelle