边界点和AUCTeX字体锁定

时间:2014-01-28 22:42:14

标签: emacs elisp auctex font-lock

我将LaTeX与Emacs一起使用,并希望能够将我写的内容传递给shell命令。 (例如,我使用xargs echo。)

为此,我定义了一个交互式elisp函数:

(defun echo () 
  (interactive)
  (let ((bnds  (bounds-of-thing-at-point 'word)))
    (shell-command-on-region (car bnds) (cdr bnds) "xargs echo")))

这适用于大多数缓冲区,但不适用于使用AUCTeX字体锁定的LaTeX缓冲区。大多数单词再次正常工作,但不是在单词边界带引号的单词。

一个最小的例子:

\documentclass{article}
\usepackage{german}

\begin{document}
test "`Test"'
\end{document}

首先,作为概念的证明:如果我的LaTeX缓冲区中的test上的点和我尝试我的命令(echo),我会在迷你缓冲区中得到test。 (正如预期的那样。)

现在出现问题:如果点在Test上,我使用我的命令xargs抱怨无法匹配的双引号。

原因是shell-command-on-region不会将Test传递给shell命令,而是Test"'。我可以使用我的elisp代码xargs -0进行验证。然后我得到迷你缓冲区的结果:

Test"'

问题来自AUCTeXs字体锁定。 (我想使用它!)如果我将font-latex-quotes设置为nil,我的命令工作正常(它会在迷你缓冲区中返回Test),但当然引用的内容不会被证实。 ..

任何想法如何改变我的elisp代码以使用AUCTeX,或者自定义AUCTeX以便它能够引用引用内容但保留正确的单词边界?

1 个答案:

答案 0 :(得分:0)

(defun echo ()
  (interactive)
  (let ((bnds (bounds-of-thing-at-point 'word)))
    (shell-command-on-region (car bnds) (cdr bnds) "xargs echo")
    (display-buffer "*Shell Command Output*")))

WRT您的评论,暂时使用函数modify-syntax-entry更改语法表或使用另一个如下:

(defun echo ()
  (interactive)
  (with-syntax-table text-mode-syntax-table
    (let ((bnds (bounds-of-thing-at-point 'word)))
      (shell-command-on-region (car bnds) (cdr bnds) "xargs echo")
      (display-buffer "*Shell Command Output*"))))