Emacs中的Regexp预测

时间:2013-10-06 02:32:39

标签: regex emacs auctex

我有以下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

此外,正则表达式还有其他问题,例如,如果附近有其他括号则会变得贪婪。

感谢

1 个答案:

答案 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")