编辑同一参数

时间:2016-10-13 17:30:04

标签: vim emacs sublimetext2

我正在使用大型数据集,并且多行需要更改某个参数。像这样的东西:

funct(35, circle, square, triangle);
funct(42, sphere, cube, prism);
funct(74, disc, rhombus, rectangle);

需要成为:

funct(35, circle, my_square, other_triangle);
funct(42, sphere, my_cube, other_prism);
funct(74, disc, my_rhombus, other_rectangle);

我怎么能这样做?

5 个答案:

答案 0 :(得分:1)

另一种vim方法。以可视方式选择要更改的所有行,然后键入:

:norm 2Wimy_<C-v><esc>Wiother_

请注意,<C-v><esc>ctrl-vesc不是文字。或者,如果您想在每一行上执行此操作,请执行以下操作:

:%norm 2Wimy_<C-v><esc>Wiother_

您也可以在特定范围内的线上执行此操作。例如,第3-100行:

:3,100norm 2Wimy_<C-v><esc>Wiother_

答案 1 :(得分:1)

我会谈到emacs因为我喜欢emacs!
在提示中输入命令:Alt + x

对于小型数据集

您可以安装multiple-cursors包。它与SublimeText中的Ctrl+D类似。 Here is the doc

对于具有某些控件的大数据集

您可以使用内置包query-replace。它将用另一个替换你想要的字符串/正则表达式。 Documentation。 这个的优点是你可以选择是否要更换每个出现。

对于没有控制的大数据集

内置包replace-stringreplace-regexp将使用字符串或其他模式替换您选择的模式。

replace-regexp

replace-string

如果您只想重命名某些变量,multiples-cursorsreplace-stringquery-replace都可以。 如果你想要替换庞大的数据集中的模式,replace-regexp很有趣,但没有什么比脚本(bash,js,python ......)更好。

有关于sedawk bash命令(sed & awk, 2nd Edition)的精彩书籍

答案 2 :(得分:0)

使用Vim:

:%s/\vfunct\(([^,]+,\s*){2}\zs/my_/

上面的2是您要跳过的参数数量。

catch:如果某些参数本身是函数调用,则会中断。有插件可以让你应对这种情况。

答案 3 :(得分:0)

使用vim的正则表达式引擎:

:%s/\v(%(\s*\w+,){PARAMETER_NUMBER})(\s+)(\w+)/\1\2NEW_PREFIX\3

PARAMETER_NUMBER替换为您要更改的参数的索引(从0开始),并使用您要添加的前缀NEW_PREFIX替换:%s/\v(%(\s*\w+,){2})(\s+)(\w+)/\1\2my_\3

例如,运行:

funct(35, circle, my_square, triangle);
funct(42, sphere, my_cube, prism);
funct(74, disc, my_rhombus, rectangle);

将您的示例代码更改为:

\1

您可以通过更改命令末尾的反向引用(\2\3\1)的顺序来修改此设置以通过其他方式对其进行自定义。 \2指的是您正在更改的参数之前的参数,\3指的是您正在更改参数之前的空格,@Resource(lookup = "java:jboss/ee/concurrency/executor/customExecutor") private ManagedExecutorService es_; 指的是参数本身。 / p>

答案 4 :(得分:0)

我知道multiple-cursors,他们看起来很酷,但我一直懒得去学习它们。这是一个仅使用Emacs内置的解决方案。

(defun align-regexp-comma (beginning end)
  "Align columns using comma as a delimiter."
  (interactive "*r")
  (align-regexp beginning end
                ",\\(\\s-*\\)" 1 1 t))

(global-set-key (kbd "C-<return>") 'cua-rectangle-mark-mode)

然后选择您感兴趣的区域,执行M-x align-regexp-comma,这应该对齐参数,然后您可以使用C-<return>启动矩形标记,这样您就可以一次编辑多行。如果您想删除对齐空格,请使用query-regexp-replaceM-%)和“,+” - &gt; “,”。