Pourquoi ma fonction n'identifie-t-elle pas correctement la fin de la région?

8

J'ai la fonction suivante, légèrement adaptée d' ici :

;; 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 je sélectionne ensuite une région et applique ma fonction, cela insère \end{code}le mauvais endroit:

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

Réponses:

9

En effet, lorsque vous insérez votre premier morceau de code après start, endreste constant et pointe maintenant au milieu de quelque chose (puisque plus de caractères ont été ajoutés avant).

Une solution rapide pour votre cas d'utilisation consiste à insérer du texte à la fin avant:

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

Une solution plus générale impliquerait des marqueurs plutôt que des positions

Sigma
la source
3

endest un nombre, une position exacte dans le tampon. Ainsi, lorsque vous accédez à startet insérez du texte, le reste du texte est poussé vers l'avant et endne pointe plus vers la fin de "terminé", mais plutôt vers la position "terminé".

La solution la plus simple consiste à insérer simplement le texte {code} de fin en premier, le début.

Jordon Biondo
la source