お世話になっております。grepやagなどありあますが、なぜptかといえば、なにせ早い、日本語系の文字コードが使える、これに尽きます。似た仕様を満たしているものでhighwayというものもあるみたいですが、こちらはwindowsがサポートされてないようなのでptです。vimもそうなんですが、ptをはじめとするgrep系のコマンドも、Windowsでの使い方ってやっぱりUnix系と比べると特殊だったりこつがいる部分があったりするんですよね。デが、Unix上での実装なので当然の成り行きではあるのですが、わたくし、仕事がバリッバリのWindowsマンなので、Windowsでうまいこと使えないと困ってしまうわけです。いうわけでWindowsで、ptとvimを併用して使うときのちょっとした覚書です。スポンサーリンクptコマンドをWindows上で使う際の注意まずはpt自体の使い方。PATTERNを使うまず大きな分かれ道として、コマンドライン(shell)をなにを使うかで挙動が異なります。結論からいえば、cmd.exe上での[PATTERN]にはダブルクォーテーションをつけましょう。引数としてダブルクォーテーションをつけて渡しているような挙動になりました。'^aaa'test.txt:2:'aaa'結果は見ての通りですが、特徴としては以下の感じです。上記のような結果になりました。ここで、少しだけ調べてみました。http://thinca.hatenablog.com/entry/20100210/1265813598資料はあまりないらしいですが、こちらでとても検証されてました。いうか、cmd.exeのエスケープ文字って[^]だったの!?という驚きの事実があかされました。正規表現自体が効かないというよりは、^がエスケープ文字として処理されてるゆえだったんですね。謎が少しとけたものの・・・・cmd.exeのカオス具合がよくわかりました。ここでひとつの結論にたどり着きました。grep系のコマンドをcmd.exeで真面目にやろうとするのはやめるそんなわけで以下の検証に続いていきます。それでも、どうしても、cmd.exeを使う場合、基本ダブルクォートありきで実行するのが一番意図通りの挙動をとるかなと思います。'^aaa'test.txt:1:aaaという感じで、シングルクォートもダブルクォートも囲みなしも意図通りの動作をしました。いうわけで、powershellのほうが安定して使いやすい気がします。理由は不明です、ここが重要なわけじゃないので調査もしてないので誰か知ってたら教えてください^^;というわけで、結論としては、シェルとしての機能も充実してるpowershellを使っていきましょう。vimとptを併用するそもそも、なんでcmd.exeとpowershell.exeの比較なんて始めたかというと、vimでptを使って検索をしたときに、思ったように動かなかったんですね。コマンド自体の挙動を確認しようとcmd.exeで試し始めたら、そっちもうまくいったりいかなかったりで・・みたいな感じで上の調査になりました。いうわけで本来の目的、Windows上でvimからptをいい感じに使う準備です。vimからptの実行のためのpt.vimプラグインがありますのでこれをインストール。それからpt.exeはパスを通しておきましょう。これでvim上のコマンドとして(外部コマンドではなく):Ptができるようになります。これでかんたんなワードなどの検索(vimgrepの代わり)は高速にできるようになります。ここで、サンプルを増やします。このへんがしっかり検索できるようになりたいのが自分の元々の目的です。aaa'aaa'%aaaふつーにワード検索は問題ないので、まず正規表現ありパターン。aaa次にシングルクォートしてみる。'aaa'はい、まぁ大体お察しの通り、cmd.exeで実行したときと同じ結果です。shell?shell=C:WINDOWSsystem32cmd.exevimのshellがcmd.exeに設定されているんですもの。pt.vimの中身詳細はわかりませんが、基本はptを外部コマンドとして実行した結果をquicklistに取り込んでるようなものだと思うので、shell実行環境が依存してくると思われます。いうわけで、より安定した挙動だったpowershellをshellにしたいと考えます。_vimrcへ以下を追加します。shellxquote=endifshellxquoteは:hするとわかりますが、powershellを指定するとshellxquote=”になります。^aaa"としてくれるということです。このまま:Ptすると、検索結果がおかしなことになってしまいます。(外部コマンドで:!ptは大丈夫だったんですけどね・・)で、とりあえずshellxquoteを空にしてコマンド文字列まんま渡しを試してみたらうまくいったという次第。これで他に不具合がでたらやめるか、なにか考えますが、ひとまず、これで目的を達したのでよしとしました。(ちゃんとわかるにはpowershellやvimrunの仕様を把握していかないとなんだけど時間がかかるのでまた今度。)これで正規表現つきの:Ptができる環境が整いました。やったーーこれで思い通りだああああ、終わり!と思って色々試してみたら、まだ終わってなかった・・ただダブルクォートするだけじゃ、事足りない特殊文字が現れました。(他にもvimで予約してるやつは色々あるのかも。:_%などを参照)、を表す記号です。結果だけ見るとちゃんとエスケープされて”%aaa”という文字になっているようですがヒットしません。これ、ヒットなしということは検索が走ってはいるので、もしやと思いtest.txtにtest.txtaaaを追記した状態でもう一度処理(test.txtとカレンドディレクトリが同じ状態)するとヒット。エスケープできてないんですね。pt.vimの中の処理は見てない(見てすぐわかるほどVimscriptに精通してない)ですが、Vimのコマンドモードでのエスケープ後の文字列を再度エスケープが必要な状態の検索コマンドとして実行されてしまっているのかなと予想しております。いうわけで、詳細な理由はわかってはいないものの、Vimのコマンドモードでの特殊記号はエスケープ2回が必要です。以上、ながなが見てきた割に、本質の理由は突き止めてないところが多くて不甲斐ないですが、(そこを調べだすとながいんで・・。)ひとまず、WindowsでVimでptで、高速に正規表現付きや、特殊記号込みで検索できる環境ができました。コメントをキャンセルメールアドレスが公開されることはありません。(1)お問い合わせタイトルとURLをコピーしました。