在emacs evil中的可视垂直块选择中增加数字

时间:2015-04-02 04:35:27

标签: emacs elisp evil-mode

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

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

这个想法是这样的:

给出如下列表:

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

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

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

如果重要的话,我正在使用emacs evil-mode,希望为我想要增加的数字区域做一个块选择的等效。

谢谢,

2 个答案:

答案 0 :(得分:4)

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

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,你现在都应该在你的缓冲区中删除它:

the_array[]
the_array[]
the_array[]

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

您的缓冲区现在应包含此内容:

the_array[1]
the_array[2]
the_array[3]

答案 1 :(得分:1)

一种方法是在要增加的数字上设置一个区域,然后缩小到该区域(通常绑定到 Cx nn ),然后将replace-regexp与一些elisp一起使用生成替换文本。类似下面的内容将起作用,其中键盘字体中显示的文本是您输入的内容,text shown in code font是emacs提示您的内容,并且您应该按输入后每行:

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

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