2016-01-13 47 views
3
/** 
* Definition for an interval. 
* struct Interval { 
*  int start; 
*  int end; 
*  Interval() : start(0), end(0) {} 
*  Interval(int s, int e) : start(s), end(e) {} 
* }; 
*/ 

我有这样的格式代码,并希望在vim的结构取消注释,像这样:从所选行删除前N个字符在vim

/** 
* Definition for an interval. 
*/ 
struct Interval { 
    int start; 
    int end; 
    Interval() : start(0), end(0) {} 
    Interval(int s, int e) : start(s), end(e) {} 
}; 

现在我只是用这样的:%s/\ s * \ s // gc删除'*',但它也会影响'*间隔的定义'行,'不确定vim是否有办法选择我要替换的行。或者如果有另一种更好的方法来移动*作评论。

回答

1

您可以标记与视线模式的线v,然后用类似于下列之一:

" Remove leading space, asterisk, space 
:s/\s\*\s// 

" Remove leading 3 characters on line, whatever they are 
:s/^...// 

然后关闭移动评论*/起来,到注释现在应该结束。

4

还有正好 47.337方式做你想做的。这里是一个...

移动 - :m - 第一行匹配*/ - /\*\/ - ?struct? - - 匹配struct第一线之上:

:/\*\//m?struct?- 

结果:

/** 
* Definition for an interval. 
*/ 
* struct Interval { 
*  int start; 
*  int end; 
*  Interval() : start(0), end(0) {} 
*  Interval(int s, int e) : start(s), end(e) {} 
* }; 

切三个第一字符 - :normal 3x - 位于当前行之下的行之间的每条线 - + - 与匹配的第一行}; - /};/ - :

:+,/};/norm 3x 

结果:

/** 
* Definition for an interval. 
*/ 
struct Interval { 
    int start; 
    int end; 
    Interval() : start(0), end(0) {} 
    Interval(int s, int e) : start(s), end(e) {} 
}; 
1

另外的47.337方式...使用可视块模式。

首先将光标移至行3(3G),然后

<ctrl-v>6jlldO */<esc> 

或更便携的方式:

<ctrl-v>/*\/<cr>ldO */<esc> 

顺便说一句:您可以轻松地找出你有多少行向下移动(6j - 部分)如果您启用相对行号:set relativenumber