Por que minha função não está identificando o final da região corretamente?

8

Eu tenho a seguinte função, adaptada um pouco daqui :

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

Se eu selecionar uma região e aplicar minha função, ela será inserida \end{code}no local errado:

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

Respostas:

9

Isso ocorre quando você insere seu primeiro pedaço de código depois start, endpermanece constante e agora aponta no meio de algo (já que mais caracteres foram adicionados antes dele).

Uma solução rápida para o seu caso de uso é inserir texto no 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)

Uma solução mais geral envolveria marcadores em vez de posições

Sigma
fonte
3

endé um número, uma posição exata no buffer. Portanto, quando você vai starte insere texto, o restante do texto é empurrado para a frente e endnão está mais apontando para o final de "pronto", mas ainda assim a posição "pronto" costumava estar.

A solução mais fácil é apenas inserir o texto final {code} primeiro, o começo.

Jordon Biondo
fonte