私の関数がリージョンの終わりを正しく識別しないのはなぜですか?


8

私はここから少し変更した次の機能を持っています:

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

次にリージョンを選択して関数を適用する\end{code}と、が間違った場所に挿入されます。

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

回答:


9

これは、の後に最初のコードチャンクを挿入するとstartendが一定のままになり、何かの途中を指すようになるためです(その前にさらに文字が追加されているため)。

ユースケースの簡単な解決策は、前の最後にテキストを挿入することです。

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

より一般的な解決策には、位置ではなくマーカーが含まれます


3

end数値であり、バッファ内の正確な位置です。したがって、startテキストに移動して挿入すると、残りのテキストは前方に押し出され、endもはや「完了」の終わりを指しているのではなく、「完了」があった位置にとどまっています。

最も簡単な解決策は、最初にend {code}テキストを挿入し、最初に挿入することです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.