清空vim、regex中文件中的所有方法?
例如,我正在使用vim编辑器,我想清空类中的所有方法清空vim、regex中文件中的所有方法?,regex,vim,keyboard-shortcuts,Regex,Vim,Keyboard Shortcuts,例如,我正在使用vim编辑器,我想清空类中的所有方法 class A { public: int getNumber() const { return number; } void setNumber(int num) { number = num; } }; 我希望有一个正则表达式,我可以替换它,这样的结果就是这样 class A { public
class A {
public:
int getNumber() const {
return number;
}
void setNumber(int num) {
number = num;
}
};
我希望有一个正则表达式,我可以替换它,这样的结果就是这样
class A {
public:
int getNumber() const;
void setNumber(int num};
};
我知道我可以使用%s进行全局子替换,但我正在寻找方法体下的所有内容。我认为最好使用录制的宏,而不是正则表达式。很抱歉,我没有时间为您创建一个案例。要开始,请参阅:
:help q
由于大括号当然可能嵌套在函数中,因此很遗憾,不可能创建与相应的结束大括号匹配的正则表达式 幸运的是,VIM确实可以使用%(我相信大多数键盘布局上的shift-5?)键移动到相应的位置(这将向前移动到下一个大括号/括号等,并跳到相应的打开/关闭位置),因此基本上,站在打开大括号之前,c%;将用分号替换整个身体
找到一个函数的开始括号是一件完全不同的事情,我会看看我是否能为您想出一些东西,但是为了让您继续,请执行它一次,然后继续执行。(句号)为每个函数再次执行它。我不知道正则表达式可以在多行上匹配。彼得推荐一个宏可能是对的。第一种方法中的类似内容可能会起到作用:
[ESC]qa$d%i;0[ESC]q
然后在其他方法的第一行,您可以执行以下操作:
[ESC]@a
以下是它的工作原理:
- [ESC]-逃生钥匙让你进入 正确的模式
- qa-将下一个命令另存为 名为“a”的宏
- $-跳到行的末尾
- d%-删除到匹配的 括号
- i、 -插入分号
- [ESC]-逃生钥匙让你进入 正确的模式
- q-停止录制宏
- @a-再次调用宏(在 下一个方法的行)
我希望这有帮助 正如roe所说,用正则表达式来处理所有可能的输入是不可能的。您的语言需要一个完整的解析器。但下面的正则表达式解决了问题的一个子集,这可能就足够了,只要您的文本非常规则并且遵守一些约束:
- 大括号是方法标题所在行的最后一个字符
- 右大括号的缩进量与左大括号的缩进量相同,它位于自己的行中,并且是行中的最后一个字符
- 行以
或int
开头(您可以展开此列表以包括所有相关类型),忽略前导空格void
:%s/\v((^\s+)(int|void).{-})\s+\{$\_.{-}^\2\}$/\1;/
:“非常神奇”模式(无需反斜杠转义所有内容)\v
:(开始捕获\1);捕获此行的缩进级别((^\s+)
:行中的第一个单词(根据需要添加到此列表)(int | void)
:此行上的非贪婪匹配(结束\1的捕获){-}
:尽可能多的空格,然后是一个\s+{$
,然后是行尾{
:非贪婪匹配所有内容,包括换行符\.{-}
:从一行开始,匹配我们在上面捕获的空格数,然后在该行末尾添加一个结束大括号^\2\}$
(^\s+)
,使其更简单
我保证您可以很容易地想到使这个正则表达式失败的可能输入。我将使用CTAG来构建在头文件中声明和定义的函数列表。该列表将包含内联定义的行,而不是查找该行的正则表达式 然后按相反的顺序转到函数的定义行,搜索其开始括号,并应用d%。只要函数的注释中没有任何不平衡的括号,它就可以正常工作
顺便说一句,为了不丢失定义,我有一个将内联函数定义移动到相关的.cpp的方法。我认为是在“int num”之后你应该有一个闭括号,而不是括号。你有两次相同的错误…;)d%i;应该缩写为c%;从大括号前的空格开始,否则你会在每行的末尾得到一个空格(错误不大,但可能有点不雅),或者你可以使用d%a;