【问题标题】:Leave region selected after emacs operation在 emacs 操作后保持选中区域
【发布时间】:2013-04-14 16:11:24
【问题描述】:

我的问题建立在this answer by Trey Jacksonthis question from SyntaxT3rr0r 之上。

Trey 提出了以下函数,用于在 Emacs 缓冲区的选定区域中递增每个两位数。

(defun add-1-to-2-digits (b e)
  "add 1 to every 2 digit number in the region"
  (interactive "r")
  (goto-char b)
  (while (re-search-forward "\\b[0-9][0-9]\\b" e t)
    (replace-match (number-to-string (+ 1 (string-to-int (match-string 0)))))))

我想将此功能用于我自己的目的。但是,我想连续多次增加数字。当前形式的函数的问题在于,在每次调用之前,我必须用鼠标再次选择该区域。

我的问题是:如何修改 Trey 的函数,以便在调用后保留选定的区域?(我的最终目标是将此函数分配给键盘快捷键(类似于 ctrl +) 这样如果我按住 ctrl 键,我的所有两位数字所选区域将不断增加。)

顺便说一句,我知道this answer by Brian Campbell,它建议使用exchange-point-and-mark 重新选择以前选择的区域。但是,我试过了,但在这种情况下似乎没有帮助。

【问题讨论】:

  • +1 但请注意,您在此处粘贴的不是宏,而是函数。 elisp 中的 defun 定义了一个函数,而不是宏:)(我编辑了您的问题并将“宏”更改为“函数”)。请注意,Lisp 方言中的宏是完全不同的野兽:)
  • 可能是一个愚蠢的建议,但是......即使在第一次调用快捷方式后看不到所选区域,您不能一次又一次地调用该方法吗?在我的系统上,使用按原样编写的函数不断增加和增加。
  • 哦,真的吗?嗯,这不会发生在我身上。我用鼠标突出显示一个区域,然后我执行M-x add-1-to-2-digits,这会增加数字,然后我再次输入M-x add-1-to-2-digits,这一次没有任何反应。我想知道我们在做什么不同?
  • 如果不添加save-excursion,您的函数将移动指向区域的末尾。因此,如果最初标记位于起点而点位于终点,则可以重复该功能。但是如果点在开头,标记在结尾,那么在第一次调用之后,点和标记都在结尾的同一个字符上,以此类推,下一次调用该区域为空。 save-excursion 规避了这个问题。 (n.b. 用鼠标点击的位置是标记,拖动到的位置是点。)另外请注意,您可以使用M-x add-1-to-2-digits RET C-x z z z z z ...

标签: emacs elisp


【解决方案1】:

您的函数修改为使用 let (deactivate-mark) 包裹在 save-excursion 中,如链接到的答案用户 event_jr 中所建议:

https://stackoverflow.com/a/11080667/903943

(defun add-1-to-2-digits (b e)
  "add 1 to every 2 digit number in the region"
  (interactive "r")
  (save-excursion
    (let (deactivate-mark) 
      (goto-char b)
      (while (re-search-forward "\\b[0-9][0-9]\\b" e t)
        (replace-match (number-to-string (+ 1 (string-to-int (match-string 0)))))))))

【讨论】:

    【解决方案2】:
    猜你喜欢
    • 2010-10-23
    • 1970-01-01
    • 2011-04-23
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多