「変換」コマンドについてNo.40577
SATORU さん 23/05/20 09:26
 
バッチファイルの編集においてファイル名やフォルダ名の記載を半角英数に揃えたい
場合があります。
その時「変換」コマンドの「英数字/記号/空白のみ半角に」を使用しますが、ファイ
ル名やフォルダ名に使えない記号まで半角になってしまい、手動で編集しています。

例)
 ? → ?  ・・・「?」のままにしたい
 < → <  ・・・「<」のままにしたい

半角に変換する対象記号はどこかで設定可能でしょうか。
(出来ない場合、対応を希望いたします)

[ ]
RE:40577 「変換」コマンドについてNo.40578
でるもんたいいじま さん 23/05/20 14:41
 
こんにちは。秀丸愛用者の「でるもんた・いいじま」です。

> 「変換」コマンドの「英数字/記号/空白のみ半角に」を使用しますが、
> ファイル名やフォルダ名に使えない記号まで半角になってしまい、
> 手動で編集しています。
>
> 例)
>  ? → ?  ・・・「?」のままにしたい
>  < → <  ・・・「<」のままにしたい

まずは、「置換」機能で下記のように指定してみてください。

  検索(S)  [ A-Za-z0-9!#$%&’()+−,.;=@[]^_`]+
  置換(E)  \(0,ToHankaku)
  「正規表現(R)」をONに指定

「検索」のパターン内には全角文字と半角文字が混在しているのでご注意ください。
'['と'A'の間にあるのは全角スペースです。

☆ ☆ ☆

一番単純な方法としては、この「検索」「置換」のパターンをそのまま辞書登録して
しまうのが楽だと思います。この際、品詞は「顔文字」にしてください。
(少なくとも手元の環境では、「名詞」や「短縮よみ」の品詞で登録すると全角・半
角の区別が保たれません。)

☆ ☆ ☆

マクロで実装することも当然できますが、少々厄介なので(replaceall系の命令で一
発、とはいかないのです)、どなたか余裕のあるかたにお任せします。時間があれば
私のほうで書いてみるかもしれないですが。

[ ]
RE:40577 「変換」コマンドについてNo.40579
こみやんま さん 23/05/21 12:25
 
>バッチファイルの編集においてファイル名やフォルダ名の記載を半角英数に揃えた
>い場合があります。
> ......
>(出来ない場合、対応を希望いたします)


マクロでやるとしたら、



js {
    function getCustomHankakuText(target_string) {
        if (target_string == null || target_string == "") {
            return "";
        }

        var no_hankaku = "¥/:*?”<>|";

        var result_string = "";

        for(var ix=0; ix<target_string.length; ix++) {
            var chr = target_string[ix];
            if (no_hankaku.indexOf(chr) >= 0) {
                result_string = result_string + chr;
            } else {
                result_string = result_string + filter( "", "ToHankakuAlnum",
 "", chr);
            }
        }
     
        return result_string;
    }

    var target = hidemaru.getSelectedText();
    var norm_text = getCustomHankakuText(target);

    begingroupundo();
    insertfix(norm_text, 1);
    endgroupundo();
}


とかですかねぇ。


[ ]
RE:40579 「変換」コマンドについてNo.40581
こみやんま さん 23/05/21 15:54
 
 さすさにコードの難度下げようと原始的に処理しすぎて速度がやばいですか。

ある程度妥当性のあるコードという意味なら下記ですかねぇ...

jsmode "WebView2";

js {
    let regexp = /[^¥/:*?”<>|]+/g;
    function getCustomHankakuText(target) {
        if (!target) {return "";}
        return target.replace(
                   regexp, (match) => {
                       return filter( "", "ToHankakuAlnum", "", match);
                   }
               );
    }

    let target = hidemaru.getSelectedText();
    let norm_text = getCustomHankakuText(target);

    begingroupundo();
    insertfix(norm_text, 1);
    endgroupundo();
}

[ ]
RE:40581 「変換」コマンドについてNo.40583
でるもんたいいじま さん 23/05/22 04:25
 
でるもんた・いいじまです。

こみやんまさん、ありがとうございます。

☆ ☆ ☆

以下雑感。

私自身は実のところJavaScriptはそんなに得意ではないのですが、このコードは何と
か完全に理解できました。
それと、JavaScript云々の前に、filter キーワードは文字列操作関数としても使え
る、という事実を今までずっと見落としていました(汗)

というわけで、仮にもし「JavaScriptは無しで」という注文がついた場合でも、デー
タ量がそれほど多くなければマクロ言語だけですんなり実装できそうですね。

☆ ☆ ☆

それと、個人的に一つだけ引っ掛かった点があるので指摘しておきます。

> let regexp = /[^¥/:*?”<>|]+/g;

この部分、「 ¥/:*?”<>| の9文字以外すべて」という書き方になっています。
「◯◯のみ除外する、それ以外はすべて対象にする」という、ネガティブリスト方式
です。

一方で、私はこういう置換を提案しました。
> 検索(S)  [ A-Za-z0-9!#$%&’()+−,.;=@[]^_`]+
> 置換(E)  \(0,ToHankaku)
> 「正規表現(R)」をONに指定

こちらは「◯◯のみ対象にする、それ以外はすべて除外する」というポジティブリス
ト方式です。
今回は「9つ以外はすべて対象、なんて安易に断定しちゃって本当に本当に大丈夫か
なあ」と不安に感じたので、面倒を承知でポジティブリストにしました。
(ちなみに今回、「\」「〜」「U+00A5」については実際にフィルタの動作を確認し
ましたが、それだけでは当然、「100%絶対に大丈夫」とは断言できませんよね。)

このあたりは完全に「哲学の違い」ですが、後日、他の方のご相談への対応の件も含
めて、ベータ版会議室のほうで私の考えを少し詳しめに語らせていただければ、と思
っています。

[ ]
RE:40577 「変換」コマンドについてNo.40584
秀丸担当 さん 23/05/22 10:31
 
マクロを使って高度に処理する方法もありますが、一応、大きな分類で対象を指定す
る標準の変換コマンドもあります。

[編集]→[変換]→[半角/全角変換(E)...]で、対象を指定できるので、ここでローマ
字と数字だけを対象にできます。
英数字だけ対象でよければ、これが一番簡単だと思います。

次に簡単なのは、複数選択して、それに変換コマンドをかける方法もあります。
検索ダイアログで、変換対象にしたい文字列を指定して、[すべて検索 - 複数選択]
で選択すると、複数に散らばった選択された箇所だけ対象にできます。

例えば、変換対象を選択した状態で、検索ダイアログを出します。[選択した範囲]を
ONにします。(必要であれば[文字単位])
正規表現ONにして、[A-Z0-9!#$%]+だったら、英数字と任意の記号の検索です。
下検索はせずに、[すべて検索 - 複数選択]をすると、最初に選択した範囲の中から
対象の文字列だけに絞り込まれます。
そして、[その他]→[変換]→[英数字/記号/空白のみ半角に]を実行します。

マクロにするとしたら、上記の操作をキー操作の記録してから、キー操作の保存をす
ると、以下のようなマクロが生成されます。

    setcompatiblemode 0x30000F;
    setsearch "[A-Z0-9!#$%]+" , 0x203950;
    forceinselect 2;
    selectallfound;
    filter "" , "ToHankakuAlnum";

あるいは、対象にする記号をいっぱい書かずに
[^¥”<>|:/*?]+
として、ファイル名として使えない文字以外は全て対象としたほうが簡単かもしれま
せん。

[ ]
RE:40584 「変換」コマンドについてNo.40585
秀丸担当 さん 23/05/22 10:50
 

> そして、[その他]→[変換]→[英数字/記号/空白のみ半角に]を実行します。

[編集]→[変換]→[英数字/記号/空白のみ半角に]
でした。

[ ]
RE:40583 「変換」コマンドについてNo.40590
SATORU さん 23/05/24 23:53
 
皆様へ
 情報提供ありがとうございます。

[ ]
RE:40585 「変換」コマンドについてNo.40591
SATORU さん 23/05/24 23:54
 
ご回答ありがとうございます。

[ ]