Emacs:在标记区域内为每个2位数字加1

Syn*_*r0r 25 emacs elisp

想象一下,我在Emacs下打开的文本文件中有以下内容:

some    34
word    30
another 38
thing   59
to      39
say     10
here    47
Run Code Online (Sandbox Code Playgroud)

我想变成这个,每个2位数字加1:

some    35
word    31
another 39
thing   60
to      40
say     11
here    48
Run Code Online (Sandbox Code Playgroud)

(这是一个简短的例子,我的实际需要是一个更大的列表,而不是我的电话)

我怎么能从Emacs做到这一点?

只要直接从Emacs进行调用并且仅在我想要的标记区域上操作,我不介意调用一些外部Perl/sed /任何魔法.

你会如何从Emacs自动化这个?

我认为我正在考虑的答案包括调用shell-command-on-region并用输出替换该区域......但我不确定如何具体地执行此操作.

hua*_*uan 44

这可以通过使用命令query-replace-regexp(绑定到C-M-%)来解决:

C-M-% \b[0-9][0-9]\b return \,(1+ \#&)

随后的表达式\,将被评估为Lisp表达式,其结果用作替换字符串.在Lisp表达式中,\#&将被匹配的字符串替换,解释为数字.

默认情况下,这适用于从光标开始的整个文档.要在该地区开展这项工作,有以下几个方面:

  1. 如果打开瞬态标记模式,则只需要正常选择区域(使用点和标记);
  2. 如果由于某种原因你不喜欢瞬态标记模式,你可以使用narrow-to-region来限制对特定区域的更改:使用point和mark选择一个区域,C-x n n缩小,执行query-replace-regexp as如上所述,最后C-x n w扩大.(感谢贾斯汀史密斯的暗示.)
  3. 使用鼠标选择区域.

有关详细信息,请参阅" Remaxp替换 Emacs手册" 一节.

  • 我想到的另一个选择:Mx窄到区域,使得区域外的所有内容都不受编辑限制.Mx加宽撤消缩小 - 键绑定是Cx nn和Cx nw (3认同)

Tör*_*bor 12

Emacs的列编辑模式是您所需要的.

  • 激活它打字M-x cua-mode.

  • 转到矩形的开头(将光标留在角色上3),然后按C-RET.

  • 转到矩形的末尾(将光标留在角色上7).您将在突出显示的区域进行操作.

  • 现在按M-i,增加该区域中的所有值.

你完成了.!删除死的ImageShack链接


Tre*_*son 6

它不能防止99-> 100.

(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)))))))
Run Code Online (Sandbox Code Playgroud)

哦,它在该地区运作.如果你想整个文件,然后替换be(point-min)nil.