PathQuoteSpacesのような関数の必要性を感No.08308
天翔記jp さん 16/08/29 23:16
 
私の認識不足でこのような関数はあるのかもしれませんが、
見付けられなかったので要望させていただきます。


MS-Windowsでは、「空白があるディレクトリやファイル名」なるものが
認められています。

この空白の存在は、ご存知のように、
外部プロセスの呼び出しと相性が悪いものです。

秀丸においても、外部runexなどを呼び出しす際、
「""」を付与するわけですが、
やはり見づらいものを感じます。

 
@現状よく見るパターン
----------------------------------------------------------------
runex "\"" + currentmacrodirectory + "\\abc.exe" + "\"" + " " + "\"" + filen
ame2 + "\"" + " " +params_str, ...
----------------------------------------------------------------
正に「わかりにくい」「書き間違える、読み間違える可能性が高い」ハズです。
慣れているため、あぁ、「"」を付けてるな、とういのは
瞬時にわかるものの、対応関係があってるのか等は、
目がしょぼしょぼしそうです。



A最近実装された機能群で改善される…か?
8.56のsprintfや8.66で正式となるであろうR""、@を組み合わせることで、
----------------------------------------------------------------
$cmd = sprintf( R"("%s" "%s" %s)",
                    currentmacrodirectory + @"\abc.exe",
                    filename2,
                    params_str );
runex $cmd, ...

のようになっていく可能性もありますが、
(筋は悪くはないものの)大仰でもあり、
ちょっと「ズレている」感があります。




Bそこでpqs(PathQuoteSpacesの略)の新規実装
やはりここは、PathQuoteSpacesのような機能を持つ関数を、pqsのような比較的短い
名前で実装して、
runex pqs(currentmacrodirectory + @"\abc.exe") + " " + pqs(filename2) + " "
+params_str, ...

程度が、一番意図がわかりやすく、
見る側も「あーはいはい」と理解できるように思えます。

pqsの具体的な実装としては
・ダブルクォーテーションを最初と最後につける必要性があるようならば、付ける。
 そうでなければ、元の文字列をそのまま返す、というものです。

具体的には
 @引数の文字列の先頭もしくは末尾に「"」がすでに存在するなら、
 (2重に「"」にならないように)何もせず、元の引数の文字列をそのまま返す

 A @以外の時、引数の文字列に「空白」が無いならば、
 やはり元の引数の文字列をそのまま返す

 B @A以外の時、引数の文字列中に「空白」があるので、先頭と末尾に「"」を付
ける。

のようなものとなるでしょう。


これにより、長い目で見れば、外部プロセスrunex系へのコマンドの渡し方が、
ある程度スッキリした記法へと落ち着いていくことが期待できるのではないかと思い
ます。



以上、ご検討ください。

[ ]
RE:08308 PathQuoteSpacesのような関数のNo.08310
秀丸担当 さん 16/08/30 09:57
 

PathQuoteSpacesのような関数はいまのところ無いです。
現状でサブルーチンを作ればそういう文字列を返すことはできると思いますが、
冗長になるからすっきりさせたいということもあると思います。
あったらいい関数はいろいろあると思いますが、サブルーチンでできることをマ
クロ内部で追加していくときりがないと思うので、参考にさせていただきつつ、
とりあえず保留にしようと思います。
現状で、V8.66β3でR"()"と@""が両立できたことで、一応、sprintfの方法です
っきりする書き方も不可能ではないということになった気がします。

[ ]