2012-01-27 6 views
1

私はVimでバッチ処理したいファイルセットの名前と一致する正規表現を定式化しようとしていますが、\ | (正規表現OR)予想通り...Vim Regex OR Windowsのファイル名パターン

具体的には、私は現在のディレクトリに以下のファイルで構成された引数リストを作成したいと考え、次のように

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

私は入力されたvimのコマンドが行く:

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

Vimが目立った結果せずにこのコマンドを完了 - 何のメッセージとからの出力はありません:引数が変わらない(ファイル名の希望リストを生成しません)。

私は正規表現を分割した場合: :arg f01\(\(4[89]\)\).e(注:上記の完全な表現のように、ここで括弧を残す)
...と...

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

...その後:argsf0148.e f0149.eを生成(所望の場合)それぞれ、f0150.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

+0

それを指摘してくれてありがとう - そしてすぐに、あまりにも! – Mesagoma

答えて

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()。セパレータはラインが
  • filter(..., 'v:val =~ ''pattern'' ')がパターンに一致する項目のみを保ちリストをフィルタリングフィードだったので
  • split(..., nr2char(10))は、それのリストを作成します。 :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 

一致しない場合は、関数内のexecuteコマンドは:argsと評価され、現在の引数のリストが出力されます。

+0

小文字のエラーがあります。 'file_list'は' aaa'(あるいはその逆)でなければなりませんが、そうでない場合はうまくいきます。それは私が探していたものより少し複雑ですが、私は提案と徹底した説明に感謝します!これは将来の何かのために便利になるかもしれません。 – Mesagoma

+0

@Mesagoma:フィードバックいただきありがとうございました。あなたは編集を提案できました。 – Benoit

+0

次回は編集をお勧めします。この機能をお寄せいただき、ありがとうございます。あなたが投稿したコマンドと同じことをしているようには見えません。サブフォルダにも入ります。また、正規表現にパスを含めることができたらうれしいです... これは間違った方向に進んでいます:**私が本当に探しているのは、元の正規のものを作ることです(おそらく正規表現ORを別にエスケープするか?)あるいは_why_ '\ |'を学ぶためには、この文脈では使用できません。 – Mesagoma

関連する問題