Perché la mia funzione non identifica correttamente la fine della regione?


8

Ho la seguente funzione, leggermente adattata da qui :

;; 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 poi seleziono una regione e applico la mia funzione, inserisce \end{code}nel posto sbagliato:

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

Risposte:


9

Questo perché quando inserisci il tuo primo pezzo di codice dopo start, endrimane costante e ora punta nel mezzo di qualcosa (poiché prima sono stati aggiunti più caratteri).

Una soluzione rapida per il tuo caso d'uso è inserire il testo alla fine prima di:

;; 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 soluzione più generale coinvolgerebbe i marker anziché le posizioni


3

endè un numero, una posizione esatta nel buffer. Quindi quando vai starte inserisci il testo, il resto del testo viene spinto in avanti, e endnon punta più alla fine di "fatto", ma piuttosto alla posizione "fatto" era prima.

La soluzione più semplice è inserire prima il testo {code}, l'inizio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.