2014-01-28 92 views
0

我使用LaTeX和Emacs,希望能夠將我寫入shell命令的文字傳遞給我。 (作爲例子,我用xargs echo。)物體邊界和AUCTeX字體鎖定

爲此,我定義一個交互式的elisp功能:

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

此方法適用於大多數的緩衝區,而不是LaTeX的緩衝區,使用AUCTeX字體鎖定。大多數單詞再次正常工作,但不會在單詞邊界處帶有引號的單詞。

小例子:

\documentclass{article} 
\usepackage{german} 

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

首先,正如概念證明:如果點是test在我的LaTeX的緩衝區,我盡我的命令(echo)我得到test作爲結果在小緩衝區。 (如預期)

現在的問題:如果點是在Test而不是我用我的命令xargs抱怨不匹配的雙引號。

原因是shell-command-on-region不會將Test傳遞給shell命令,而是Test"'。這可以通過在我的elisp代碼xargs -0中使用來驗證。然後我得到的結果是在迷你緩衝區:

Test"' 

的問題來自AUCTeXs字體鎖定。 (我想用!)如果我設置font-latex-quotesnil,我命令工作正常(它在迷你返回Test),但當然引述內容將不會被fontified的...

任何想法如何我既可以更改我的elisp代碼以與AUCTeX一起工作,或者定製AUCTeX,以便使引用的內容形式化,但保留正確的單詞邊界?

+0

可否請你澄清什麼可行,什麼不可行?應該用''測試「'和''測試」'引用不同的? – Chris

+0

在這兩種情況下,我希望得到沒有任何引號的單詞。這當然適用於「測試」,因爲我最小的例子中沒有引號。它不適用於「測試」,它在我的最小示例中有引號。 (準確來說,它周圍有德國引號的LaTeX代碼,因此最後只有一個簡單的雙引號。) – newtothis

+0

您的描述不清楚。在具體示例文本的不同位置給出使用命令'echo'的具體示例 - 無論您真的想要通信的情況如何。其次,如果這是sexp的話,那麼在點上的sexp會返回一個字符串。如果你不想讓它返回一個字符串,那麼可以考慮在點上找到這個詞或者你想要的任何東西。或者如果你真的想在點上選擇字符串,然後使用其內容的邊界,不包括'''字符,然後調整返回的邊界。沒有人可以幫助你,直到你說出你需要的。 – Drew

回答

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*")))) 
+0

我已經嘗試過''單詞'。但它不能解決問題。但我會在我的問題中改變它,因爲它是更好的代碼。 – newtothis

+0

@newtothis如果這個錯誤出現在'也是'這個單詞中,那就意味着'''有了單詞的語法,所以改變這個。 –

+0

但是怎麼?'''''''''''''我不知道該幹什麼。 (然而引用的內容卻被引用了。) – newtothis