使用 Emacs+AucTeX 插入自定义命令

使用 Emacs+AucTeX 插入自定义命令

我希望 Emacs 或 AucTeX 执行以下操作:

here's some SELECTED TEXT for testing

然后,我可以按下按键并将突出显示的文本“SELECTED TEXT”转换为

here's some \mycustomcommand{SELECTED}{TEXT} for testing

答案1

有很多方法可以实现这种行为。

一种是专用elisp函数,比如下面这个快丑草稿:

(defun insert-mycustomcommand (beg end)
  (interactive "r") ;; take the region
  (save-excursion
    (goto-char beg)
    (insert "\\mycustomcommand{")
    (forward-word)
    (insert "}{")
    (delete-char 1)
    (goto-char (+ end (length "\\mycustomcommand{") 2))
    (insert "}")))

然后,您可以将其绑定到您喜欢的键并实现所需的行为。但是,它需要为所有命令重写。它可以实现某种程度的自动化,但不太方便。

另一个选择是将其写入样式文件中auctex,但我对这些不太熟悉,不知道这是否会更容易。我认为目前没有任何命令使用这种“自动剪切”。

最后,你还有一个简单的“手动”选项。通常,如果你在序言中定义了你的函数,选择“选定的文本”,按下C-c C-m并输入mycustomcommand即可

\mycustomcommand{SELECTED TEXT}{}

然后只需按几次键即可按预期进行更正:

M-f ;; forward-word, move one word forward
C-d ;; delete-char, delete the space
}   ;; self-insert-command, insert the character
{   ;; self-insert-command
M-f ;; forward-word
C-f ;; forward-char
C-d ;; delete-char
C-d ;; delete-char

作为替代方案,假设您使用电子括号功能(例如智能括号),您可以简化按键顺序:

M-f   ;; forward-word, move one word forward
C-d   ;; delete-char, delete the space
{     ;; insert "{}"
C-t   ;; swaps the next character and the previous one
C-M-u ;; sp-up-sexp
C-d   ;; delete-char
C-d   ;; delete-char

即使在分隔括号后有更多单词,第二个键序列也会起作用,而第一个键序列则需要额外的M-fes。

我向你保证它并没有看上去那么乏味。

相关内容