2016-01-13 68 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