2012-01-09 55 views
2

我想映射\ c來評論vim中的當前行(將'//'添加到第一個非空行到行之前)和\ d刪除'//'行首(取消註釋)。在Vim中評論C++代碼

我在我的vimrc加入以下兩行:

imap \c <Esc>:s/^/\/\/ <CR>j$a 

imap \d <Esc>:s/^\/\/ /<CR>j$a 

,但是當我把這種在這一行:

for (int i = 0; i < n; i++) 

然後將其轉換爲:

// for (int i = 0; i < n; i++) 

但我想將其轉換爲:

// for (int i = 0; i < n; i++) 

我想這種情況的原因之一是,當我想vim的縮進這一行,它會在該行的開頭添加一個額外的選項卡並將其轉換爲:

// for (int i = 0; i < n; i++) 

我該怎麼辦?我認爲^指的是第一個非空白字符的行,但它不是真的。

P.S:我發現了這兩個命令,但我不知道他們在做什麼。你能否向我解釋他們(因爲我需要記住他們,當我知道他們是什麼時他們更容易記住)。如果其中的任何一部分是不必要的,請告訴我:

imap \c <ESC>:s,^\(\s*\)[^/ \t]\@=,\1// ,e<CR>j$a 

imap \d <ESC>:s,^\(\s*\)// \s\@!,\1,e<CR>j$a 

回答

2

關於你發現這些命令:

IMAP \ C:S,^(\ S *)[^#\噸] \ @ =,\ 1 //,EJ $一個

讓我們從模式匹配開始,將它與您的:s/^/\/\/ <CR>j$a進行比較。

  • :s,是完全等同於:s/ - 你可以選擇一個非標準的分隔符它使表達更可讀的,所以這裏使用,代替/意味着更少的轉義,和註釋//和分隔符之間沒有混淆
  • ^(\s*)行的開頭(你的一樣)任何前導空格匹配,捕捉空白,所以我們可以重新使用它以後
  • [^# \t]\@=只是需要比空格,製表符或012其他一些字符行結束前,但不會捕捉它(即,字符不會被取代)
  • ,\1// ,替換前導空白匹配的字符串(\1無論是通過(\s*)組捕獲),其次是//

例如:

^ void foo(); 

應該匹配像這樣:^(\s*)[^# \t]\@= - >^( )([email protected]=)void foo();,即,第一組matche是主要的空格,下一個表達式匹配但不會使用void中的v。 然後,\1//擴展爲:

^ // 

,並最終替代的結果是:

^ // void foo();` 

(我已標記線與^開始,因爲壓痕是不明確的,否則)

+0

如果我想向'[^#\ t] \ @ ='組添加'//',以及爲什麼在此組中需要\ t和空格,我應該怎麼做(不是(\ s *)捕獲它們?) – Farzam 2012-01-09 13:33:31

+0

我會在答案中說明替換的結果,但是它現在會在空格之後和第一個非空白字符之前放置'//'...如果這不是您想要的行爲,也許你可以展示想要的結果? – Useless 2012-01-09 13:36:17

3

即使^正常模式命令進入到第一個非空,^在模式(所以在:s:g:v:sort命令)意味着開始行。請參閱:help /^

使用I先插入非空白,然後A追加最後一個字符後面。

用途:

inoremap \c <c-o>I//<esc>jA 
inoremap \d <esc>^2xjA 

有,但是,良好的插件,做的工作。 Tim Pope的commentaryNERD Commenter。查看他們的文檔。

+0

感謝,但是你寫的\ d刪除了行的前兩個字符,即使該行沒有被註釋。 – Farzam 2012-01-09 12:44:14

+1

是的。如果你不想要:'inoremap \ d :s @^\ s * \ zs // @@ e jA'(使用'@'作爲模式分隔符可以更容易在模式中包含'/')。 – Benoit 2012-01-09 12:46:09

+0

我不明白你。 – Farzam 2012-01-09 13:08:47

2

我推薦使用Enhanced Commentify插件。然後,您可以添加到您的~/.vimrc文件:

let g:EnhCommentifyRespectIndent = 'yes' 

,它會給你你所追求的行爲。在可視模式下,選擇您要評論的代碼區域,然後鍵入\c。取消註釋使用\C

+0

我更喜歡[評論](https://github.com/tpope/vim-commentary)或[tocmment](https://github.com/tomtom/tcomment_vim),因爲它們都允許您使用動作發表評論。 '\'是我的註釋前綴鍵,所以我可以用'\ aw'來註釋一個單詞或'\ aB'來註釋掉一個完整的塊。 – 2012-01-09 12:38:51

+0

我不想在這種情況下使用插件,因爲我想在不允許使用插件的比賽中使用它們。 – Farzam 2012-01-09 12:45:15