我有以下Emacs宏,它评估所选文本的AucTex命令TeX-insert-macro
:
(eval-after-load "latex"
'(progn
(define-key LaTeX-mode-map (kbd "C-c (")
(lambda ()
(interactive)
(TeX-insert-macro "command")))))
但是,如何对所选文本执行regexp并将其传递给TeX-insert-macro
?
See this question for more details.
例如: 假设我有以下文字:
......如图(24)所示。
现在,假设我选择“(24)”。然后,我想要一个命令将其转换为:
...如图\ command {eq:24}所示。
即,我如何定义一个新的Emacs命令,我可以放在~/.emacs
中,在所选文本的正则表达式版本上运行C-C RET command RET
?
为什么以下regexp不起作用?
(eval-after-load "latex"
'(progn
(define-key LaTeX-mode-map (kbd "C-c )")
(lambda ()
(interactive)
(query-replace-regexp "\(([0-9]+)\)" "\1")
(TeX-insert-macro "eq")
))))
小改进:
如果我从左到右选择“(45)”然后输入 C-c
运行代码,这种方法效果很好(eval-after-load "latex"
'(progn
(define-key LaTeX-mode-map (kbd "C-c )")
(lambda ()
(interactive)
(exchange-point-and-mark)
(replace-regexp "[\(\)]" "")
(TeX-insert-macro "eq")
))))
但是,如果我从右到左选择“(45)”,则它不起作用,因为点和标记被翻转。有没有办法确保点和标记没有被翻转,例如在翻转时运行exchange-point-and-mark
?
此外,正则表达式还有其他问题,例如,如果附近有其他括号则会变得贪婪。
感谢
答案 0 :(得分:1)
我没有安装必需的库,或者知道TeX功能是如何工作的,但是这样的事情可能会起作用。
(eval-after-load "latex"
'(progn
(defun my-insert-latex-command-macro (beginning end)
(interactive "r")
(goto-char beginning)
(when (not (looking-at "(\\(.+?\\))"))
(error "Region does not match expected pattern."))
(push-mark)
(replace-match "eq:\\1")
(exchange-point-and-mark)
(TeX-insert-macro "command")
(goto-char (mark))
(pop-mark))
(define-key LaTeX-mode-map (kbd "C-c (") 'my-insert-latex-command-macro)))
使用"r"
参数进行交互式方便地为您提供按升序排列的区域边界,无论您在哪个方向上标记它。
要避免在正则表达式中进行贪婪匹配,请使用非贪婪运算符(*?
,+?
,??
)。
请注意,regexp中没有足够的反斜杠转义符。为了首先在反正则字符串中获得反斜杠,首先需要考虑字符串转义。基本上,双反斜杠。例如:这:
(query-replace-regexp "\(([0-9]+)\)" "\1")
需要这样:
(query-replace-regexp "\\(([0-9]+)\\)" "\\1")