Tại sao chức năng của tôi không xác định chính xác kết thúc của khu vực?


8

Tôi có chức năng sau đây, thích nghi một chút từ đây :

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

Nếu sau đó tôi chọn một khu vực và áp dụng chức năng của mình, nó sẽ chèn \end{code}sai vị trí:

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

Câu trả lời:


9

Đó là bởi vì khi bạn chèn đoạn mã đầu tiên của mình sau đó start, endvẫn không đổi và bây giờ chỉ vào giữa một cái gì đó (vì nhiều ký tự đã được thêm vào trước nó).

Một giải pháp nhanh chóng cho trường hợp sử dụng của bạn là chèn văn bản vào cuối trước:

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

Một giải pháp tổng quát hơn sẽ liên quan đến các điểm đánh dấu thay vì các vị trí


3

endlà một con số, một vị trí chính xác trong bộ đệm. Vì vậy, khi bạn đi đến startvà chèn văn bản, phần còn lại của văn bản sẽ được đẩy về phía trước và endkhông còn chỉ đến phần cuối của "xong" mà thay vào đó là vị trí "đã hoàn thành" được sử dụng.

Giải pháp đơn giản nhất là chỉ cần chèn văn bản {code} kết thúc trước, bắt đầu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.