我希望 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-f
es。
我向你保证它并没有看上去那么乏味。