Mengapa fungsi saya tidak mengidentifikasi akhir wilayah dengan benar?

8

Saya memiliki fungsi berikut, sedikit beradaptasi dari sini :

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

Jika saya kemudian memilih suatu daerah dan menerapkan fungsi saya, itu menyisipkan \end{code}di tempat yang salah:

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

Jawaban:

9

Itu karena ketika Anda memasukkan potongan kode pertama setelahnya start, endtetap konstan dan sekarang menunjuk ke tengah-tengah sesuatu (karena lebih banyak karakter telah ditambahkan sebelumnya).

Solusi cepat untuk kasus penggunaan Anda adalah dengan memasukkan teks di akhir sebelum:

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

Solusi yang lebih umum akan melibatkan penanda alih-alih posisi

Sigma
sumber
3

endadalah angka, posisi tepat di buffer. Jadi, ketika Anda pergi ke startdan menyisipkan teks, sisa teks akan didorong ke depan, dan endtidak lagi menunjuk ke akhir "selesai" melainkan posisi "selesai" dulu.

Solusi termudah adalah dengan hanya menyisipkan teks {code} akhir terlebih dahulu, awal.

Jordon Biondo
sumber