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

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


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.