2014-07-07 17 views
4

我有這個在我的文件的頂部:的Vim如何使:與ZS摹正常工作匹配

var server = require('http'); 
var watchr = require('watchr'); 
var io = require('socket.io'); 
var fs = require('fs'); 

我想這個垃圾轉換成適當的VAR列表:

var server = require('http'), 
    watchr = require('watchr'), 
    io = require('socket.io')(server), 
    fs = require('fs'); 

因此,我的第一步是找到中除第一個之外的所有var聲明並縮進它們。所以我搜索每一個字var,在前一行中有另一個var

這裏的,由於某種原因的工作正則表達式:

\vvar\_.{-}\zs<(var)@> 

說明:

\v   Very magic mode (make all special characters special) 
var   The word var 
\_   Spanning multiple lines 
.   Any charaacter 
{-}   Non greedy 
\zs   Actually start higlighting our search here 
<   A word boundary 
(var)  The second occurance of the word var 
@>   Treat the previous thing (var) as the whole match. Otherwise 
       Vim is too stupid to match consecutive lines and only 
       matches every other line 

現在,當我在我的文件時,Vim打ň正確跳轉到每一個var聲明除了第一個。好極了!

現在讓我們使用我們值得信賴的:g命令來運行匹配我們最後的正則表達式的所有行的命令(這將是每一個除了第一個,因爲ñ跳過第一個)

vp則:

'<,'>g//norm>> 

現在我得到:

var server = require('http'); 
    var watchr = require('watchr'); 
    var io = require('socket.io'); 
    var fs = require('fs'); 

什麼給?爲什麼它縮進我的第一行?我如何使gzs@>或任何可怕的Vim正則表達式匹配,我必須弄清楚?

+2

+1爲明確的問題。 –

回答

3

:global除非你給一個偏移量來執行該命令只需要你多線比賽的第一行:

:g/^var/+norm >> 

結果:

var server = require('http'); 
    var watchr = require('watchr'); 
    var io = require('socket.io'); 
    var fs = require('fs'); 

不管怎樣,我的建議是更簡單的方法:

  1. 將段落加入單個l國家統計局:

    vipJ or :'{,'}j<CR> 
    

    結果:

    var server = require('http'); var watchr = require('watchr'); var io = require('socket.io'); var fs = require('fs'); 
    
  2. 拆分線在用正確的字符串正確的地方:

    :s/; var /,\r /g 
    

    結果:

    var server = require('http'), 
        watchr = require('watchr'), 
        io = require('socket.io'), 
        fs = require('fs'); 
    
+0

不錯,你會如何修改它以在已縮進1或更多級別的行上工作? –

+1

以你的答案爲出發點,這是我想出的:':g/^ \ s * var /,'} s /; \ n \(\ s * \)var /,\ r \ 1/ –

+0

我想要'vip'的原因是因爲我可能會在var語句的上面/下面發表評論,這些評論會包含在段落中,使我們大家都失望。 –