2012-01-27 58 views
1

我想制定一個正則表達式,匹配一組文件的名稱,我想在Vim中批處理,但我發現我似乎無法使用\如預期(正則表達式OR)...Vim正則表達式或在Windows上的文件名模式

具體來說,我想創建一個包含在當前目錄下文件的參數列表:

f0148.e, f0149.e, f0150.e ... f0159.e (i.e., 12 files total) 

我輸入的Vim命令去如下:

:arg f01\(\(4[89]\)\|\(5[0-9]\)\).e 

Vim完成此命令時沒有任何明顯的結果 - 沒有消息,輸出:args保持不變(不會生成所需的文件名列表)。

如果我分手了正則表達式: :arg f01\(\(4[89]\)\).e(注:這裏留下括號在上面充分體現)
......還有......

:arg f01\(\(5[0-9]\)\).e 

...然後:args產生f0148.e f0149.ef0150.e ... f0159.e(根據需要)。另外,如果我在文本文件中輸入上述文件名列表並且使用上述正則表達式作爲搜索模式(即,/f01\(\(4[89]\)\|\(5[0-9]\)\).e),它就按照需要工作。

因此,我確定交替(\|)在某種程度上導致表達失敗。請注意,我在Windows 7上使用Vim,如果這是相關的(因爲反斜槓和管道在Windows命令提示符下都是有效的符號)。

一個快速的解決方法是使用:

:arg f014[89].e 
:argadd f015[0-9].e 

...但我真的想弄清楚如何使上述正則表達式的工作。

感謝您的幫助!

+0

請閱讀[如何在Stack Exchange網站上發佈代碼片段](http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks)。簡而言之:突出顯示並按下CTRL-K。 – Benoit 2012-01-27 12:30:17

+0

感謝您指出 - 而且這麼快! – Mesagoma 2012-01-27 13:56:00

回答

2

我可以建議:

:let file_list = filter(split(globpath('.','**'),nr2char(10)), 'v:val =~ ''f01\(\(4[89]\)\|\(5[0-9]\)\)\.e'' ') 
:execute 'args ' . join(map(file_list,'fnameescape(v:val)'),' ') 

這是如何工作:

  • globpath('.','**')使得在當前目錄下的所有文件和所有子目錄的列表。 :help globpath()
  • split(..., nr2char(10))將列出它,因爲分隔符是換行
  • filter(..., 'v:val =~ ''pattern'' ')過濾列表只保留項目匹配模式。 :help v:val。將單引號加倍會在單引號字符串內轉義它們。
  • map(..., fnameescape())逃脫所有的空格和反斜槓
  • join()增加了文件名之間的空格

如果你想它,你可以把這個變成你的vimrc功能:

function! ArgsPattern(pat) 
    let file_list = filter(split(globpath('.','**'),nr2char(10)), 'v:val =~ ''' . substitute(a:pat,"'","''",'g') . '''') 
    execute 'args ' . join(map(file_list,'fnameescape(v:val)'),' ') 
endfunction 
command! -nargs=+ ArgsPattern call ArgsPattern(<q-args>) 

然後你只需要做:

:ArgsPattern f01\(\(4[89]\)\|\(5[0-9]\)\)\.e 

不是e如果沒有匹配,則函數內的execute命令評估爲:args,因此將打印當前參數的列表。

+0

有一個小小的語法錯誤 - 'file_list'應該是'aaa'(反之亦然),否則這個工作。這比我所尋找的要複雜一點,但我很欣賞這個建議和徹底的解釋!這可能會在未來的其他事情中派上用場。 – Mesagoma 2012-01-27 13:53:34

+0

@Mesagoma:感謝您的反饋,您可以建議編輯。 – Benoit 2012-01-27 13:55:41

+0

我會盡量記住下一次建議編輯。感謝這個功能,唉,它看起來並沒有像你發佈的命令一樣 - 它也進入了子文件夾。另外,能夠在正則表達式中包含路徑會更好...... 但是,這種方式會走向錯誤的方向:**我真正需要的**是讓原始規則表達式使用'arg'命令(可能通過以不同的方式轉義正則表達式?)或學習_why_'\ |'在這種情況下不能使用。 – Mesagoma 2012-01-29 10:50:37