4

多年来,我一直在为 vim使用https://github.com/vim-scripts/increment.vim--Avadhanula 。

我如何在 emacs 中类似地利用功能?

这个想法是这样的:

给出如下列表:

the_array[0] 
the_array[0] 
the_array[0] 

我希望能够选择所有的零,发出命令,并将文本替换为:

the_array[0] 
the_array[1] 
the_array[2] 

如果重要的话,我正在使用 emacs evil-mode,希望对我想要增加的数字区域进行块选择的等效操作。

谢谢,

4

2 回答 2

6

假设您从缓冲区中的此文本开始:

the_array[0]
the_array[0]
the_array[0]

将光标移动到第一个0并使用C-v 2 j d删除所有零。C-v } F 0 d只要最后the_array[0]一行位于段落的末尾,它将适用于任意数量的行,但请注意它(setq evil-cross-lines t)在您的配置中需要。

不管你如何删除0's,你现在应该在你的缓冲区中有这个:

the_array[]
the_array[]
the_array[]

]以与选择's 相同的方式选择所有结尾' 0s。现在按C-u C-x r N 0 <Enter> <Backspace> <Enter>C-x r Nruns rectangle-number-lines,当使用前缀参数 ( ) 调用时提示输入起始编号和格式字符串C-u。我们指定它应该以 0 开头并只插入数字(<Backspace>在这种情况下删除尾随空格)。

您的缓冲区现在应该包含以下内容:

the_array[1]
the_array[2]
the_array[3]
于 2015-04-05T19:50:11.653 回答
1

一种方法是在要增加的数字上设置一个区域,然后缩小到该区域(通常绑定到C-x n n),然后使用replace-regexp一些 elisp 来生成替换文本。如下所示的内容将起作用,其中显示的文本keyboard font是您输入的内容,这text shown in code font是 emacs 提示您的内容,并且您应该enter在每一行之后点击:

M-x replace-regexp
Replace regexp: [0-9]+
Replace regexp [0-9]+ with: \,(1- (line-number-at-pos (point)))

\,( ... )用于替换的构造是 elisp,它replace-regexp执行以生成替换文本。在这种情况下,elisp 获取要替换的每个匹配项的行号,从中减去 1(因为我们的缩小区域从第 1 行开始),并将结果值作为替换文本返回。如果您希望数组索引以 0 以外的值开头,请相应地修改数学。

于 2015-04-02T20:50:36.627 回答