¿Por qué mi función no identifica correctamente el final de la región?

8

Tengo la siguiente función, adaptada ligeramente desde aquí :

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

Si luego selecciono una región y aplico mi función, la inserta \end{code}en el lugar equivocado:

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

Respuestas:

9

Eso es porque cuando inserta su primer fragmento de código después start, endpermanece constante y ahora apunta en el medio de algo (ya que se han agregado más caracteres antes).

Una solución rápida para su caso de uso es insertar texto al final antes de:

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

Una solución más general implicaría marcadores en lugar de posiciones

Sigma
fuente
3

endes un número, una posición exacta en el búfer. Por lo tanto, cuando va starte inserta texto, el resto del texto se empuja hacia adelante y endya no apunta al final de "hecho", sino a la posición "hecho".

La solución más fácil es simplemente insertar el texto final {code} primero, luego comenzar.

Jordon Biondo
fuente