DBLCLKでの単語選択についてNo.07860
むらやん さん 01/03/07 12:02
 
秀丸V3.08を使用していて気がついたのですが、
ダブルクリックを使用して単語を選択する場合の
基準はどうなっているのでしょうか?

SAMPLE="????????"\t\t#ほげほげ

の文字列をダブルクリックすると、場所により反転エリアが
変わります。

3文字目の?にカーソルをあわせDBLCLKすると、?????"が反転します。
1文字目の?の時は、????????"が反転します。
1文字目の”の時は、"????????"が反転します。

上記の動作から、文字列の区切として、後方へは?が許されて、
前方へは?が許されないという事で宜しいのでしょうか?

このような仕様には、何か理由が有るのでしょうか?
なんか、気になって仕方が無いのです。

不都合が無いなら前方へも?を許していただきたいと。


# \tはタブコードを現します

[ ]
RE:07860 DBLCLKでの単語選択についてNo.07861
Arimac さん 01/03/07 12:43
 
=をダブルクリックしたり、?を*にしたりしてみたところでは、
記号の場合は、クリックした位置以降の連続する記号を
選択するみたいですね。

[ ]
RE:07860 DBLCLKでの単語選択についてNo.07909
秀丸担当 さん 01/03/08 18:55
 
>このような仕様には、何か理由が有るのでしょうか?
>なんか、気になって仕方が無いのです。
>
>不都合が無いなら前方へも?を許していただきたいと。

現在の仕様はこうなっていますとしか答えられませんが、
不都合がなければ大丈夫かと思います。
検討しておきます。

[ ]
RE:07909 DBLCLKでの単語選択についてNo.07957
むらやん さん 01/03/12 14:44
 
>現在の仕様はこうなっていますとしか答えられませんが、
>不都合がなければ大丈夫かと思います。
>検討しておきます。

よろしくお願いします。

便乗で質問ですが、単語と判断している条件を
教えていただきたいのですが?
条件が分かれば、ある程度クリック時にこの辺でクリックと
見当つけれますので。

[ ]
RE:07957 DBLCLKでの単語選択についてNo.07961
秀丸担当 さん 01/03/12 18:49
 
>便乗で質問ですが、単語と判断している条件を
>教えていただきたいのですが?
>条件が分かれば、ある程度クリック時にこの辺でクリックと
>見当つけれますので。

半角に限って言うと、基本的に単語は、

 a〜z A〜Z _ 0〜9

で構成される文字です。

「カーソル位置の文字がこの文字に該当しない場合」は、
まず右側に1文字だけ選択し、そして、以下の文字、

 ! " # $ % & ' ( ) * + ,
 - . / : ; < = > ? @ [ \
 ] ^ { | } ~

が右側に連続して続くぶんだけを単語選択しています。

[ ]
RE:07860 DBLCLKでの単語選択についてNo.07968
山紫水明 さん 01/03/13 08:26
 
 むらやんさん,こんにちは。

》このような仕様には、何か理由が有るのでしょうか?
》なんか、気になって仕方が無いのです。

》不都合が無いなら前方へも?を許していただきたいと。

 一度当該箇所にカーソルを置いて,次のようなマクロを試してみてください。
 もしOKであれば,このマクロをダブルクリックに割り当てていただければと思
います。


//----------------------------------------------------------------------//
if( (code > 0x20 && code < 0x30 ) || ( code > 0x39 && code < 0x41 )
        || ( code > 0x5a && code < 0x61 ) ||
        ( code > 0x7a && code < 0x7f ) ) {
    while( (code > 0x1f && code < 0x30 ) || ( code > 0x39 && code < 0x41 )
            || ( code > 0x5a && code < 0x61 ) ||
            ( code > 0x7a && code < 0x7f ) ) {
        left;
        if( !result ) {
            selectword;
            endmacro;
        }
    }
    searchdown "[!-/:-@[-`{-~]+", regular;
} else selectword;
endmacro;
//----------------------------------------------------------------------//

#条件文のところ,もう少しスマートなコーディングないものでしょうかね?
  >>皆さん

     では, (^^)/~
                                        山紫水明


[ ]
RE:07968 DBLCLKでの単語選択についてNo.07969
山紫水明 さん 01/03/13 08:36
 
 追伸です。
 先ほどのマクロを実行するためには,検索での表示を範囲選択にしておく必要が
あります。
 今はちょっと時間が,ありませんので,その部分も考慮したものは後刻アップし
ます。

     では, (^^)/~
                                        山紫水明

[ ]
RE:07968 DBLCLKでの単語選択についてNo.07970
TAKA さん 01/03/13 11:16
 
TAKA です。

leftが失敗(ファイルの先頭)したら、「selectword」でいいなら、
対象外文字が見つかっても「selectword」でいいと思いますので、
whileの条件式をifと同じものにして、

// マクロ(ここから)
if( (code > 0x20 && code < 0x30 ) || ( code > 0x39 && code < 0x41 )
        || ( code > 0x5a && code < 0x61 ) ||
        ( code > 0x7a && code < 0x7f ) ) {
    while( (code > 0x20 && code < 0x30 ) || ( code > 0x39 && code < 0x41 )
            || ( code > 0x5a && code < 0x61 ) ||
            ( code > 0x7a && code < 0x7f ) ) {
        left;
        if( !result ) {
            selectword;
            endmacro;
        }
    }
    right;
    selectword;
} else selectword;
endmacro;
// マクロ(ここまで)

で、いいのでは、ないでしょうか?
それとも、スペース(0x20)の処理に何か特別な意図があったのでし
ょうか?
もしそうなら、ごめんなさい。

これでいいなら、「検索での表示を範囲選択にしておく必要」とい
うことは気にしなくていいと思います。

それと、細かいことですが、codeの前にはスペースを入れた方が
いいかも。
#スペースがあるところと、ないところが混在していましたので

[ ]
RE:07968 DBLCLKでの単語選択についてNo.07975
TAKA さん 01/03/13 19:11
 
TAKA です。

>#条件文のところ,もう少しスマートなコーディングないものでしょうかね?
>  >>皆さん

スマートかどうかは分かりませんが、別の方法で出来ます。if文内
の比較回数は一緒です。(あくまでも別の方法もあるということで)

「7970」の方法で問題ないという前提でマクロを書いています。

山紫水明さんのマクロとの違いは、以下の4点です。

1.条件式の書き方を別の方法。
 但し、コメントアウトしているような書き方が出来なかったので、
 モジュール化しましたが。
 #ちょっと、ショック

2.「code」が複数回呼び出されるのを、可能な限り少なくする。
 今回はモジュール化しましたが、モジュール化しない場合は、変
 数に受けておく方が良いと思います。

3.最初のif文で比較したものは、whileのループでチェックする必
 要がないので、すぐに「left」を行う。

4.最終的に「selectword」を使用したのでいいので、一箇所で行う。

// マクロ(ここから)
    call Check code;
    if( ##return )
    { // 単語とみなしたい
        //--------------------------------------//
        //      単語とみなす開始まで移動        //
        //--------------------------------------//
        while( 1 )
        {
            left;
            if( !result )   goto LEND;
            call Check code;
            if( !##return ) break;
        }
        right;
    }
LEND:
    selectword;
    endmacro;

Check:
    ##RC = false;
// この記述は認めてくれないみたい
//  if( ( ( ##1 >= 0x21 ) && ( ##1 <= 0x7e ) ) &&   // 単語とみなす範囲
//     !( ( ##1 >= 0x30 ) && ( ##1 <= 0x39 ) ) &&   // 0〜9は対象外
//     !( ( ##1 >= 0x41 ) && ( ##1 <= 0x5A ) ) &&   // A〜Zは対象外
//     !( ( ##1 >= 0x61 ) && ( ##1 <= 0x7A ) ) )    // a〜zは対象外
//  {
//      ##RC = true;
//  }
    if( ( ##1 >= 0x21 ) && ( ##1 <= 0x7e ) )
    { // 単語とみなす範囲
        if( ( ( ##1 >= 0x30 ) && ( ##1 <= 0x39 ) ) ||   // 0〜9は対象外
            ( ( ##1 >= 0x41 ) && ( ##1 <= 0x5A ) ) ||   // A〜Zは対象外
            ( ( ##1 >= 0x61 ) && ( ##1 <= 0x7A ) ) )    // a〜zは対象外
        {
        }
        else
        {
            ##RC = true;
        }
    }
    return ##RC;
// マクロ(ここまで)

[ ]
RE:07970 DBLCLKでの単語選択についてNo.07979
山紫水明 さん 01/03/13 20:12
 
 TAKAさん,こんばんは。ご教示ありがとうございます。

》leftが失敗(ファイルの先頭)したら、「selectword」でいいなら、
》対象外文字が見つかっても「selectword」でいいと思いますので、
》whileの条件式をifと同じものにして、
(中略)
》で、いいのでは、ないでしょうか?

 そうでした! searchdown で範囲選択できたのですが,ファイル先頭がうまく
いかないので,その部分だけ変更したのですが,考えてみれば,カーソルが指定範
囲の先頭にあれば selectword でよかったわけです。

》それとも、スペース(0x20)の処理に何か特別な意図があったのでし
》ょうか?

 いや,これもスペースは含まれないと気づいたのはよかったのですが,中途半端
でした。

》これでいいなら、「検索での表示を範囲選択にしておく必要」とい
》うことは気にしなくていいと思います。

 おっしゃるとおりです。手間が省けました。

》それと、細かいことですが、codeの前にはスペースを入れた方が
》いいかも。
》#スペースがあるところと、ないところが混在していましたので

 先頃のスタイルの話題で,私のはスペースが少ないようだったので,スペース挿
入マクロをつくったのですが,そのマクロのバグでした(^^;

 それとじつは アンダースコア=( _ ) の処理がおかしかったです。これは記号
ではなくて文字として処理する必要があるようです。
 それで結局次のようになります。

//---------------------------------------------------------------------//
if( ( code > 0x20 && code < 0x30 ) || ( code > 0x39 && code < 0x41 ) ||
    ( code > 0x5a && code < 0x5f ) || ( code > 0x5f && code < 0x61 ) ||
    ( code > 0x7a && code < 0x7f ) ) {
        while( (code > 0x20 && code < 0x30 ) ||
            ( code > 0x39 && code < 0x41 ) ||
            ( code > 0x5a && code < 0x5f ) ||
            ( code > 0x5f && code < 0x61 ) ||
            ( code > 0x7a && code < 0x7f ) ) {
            left;
            if( !result ) {     //ファイル先頭の場合の処理
                selectword;
                endmacro;
            }
        }
    right;
    selectword;
} else selectword;
endmacro;
//---------------------------------------------------------------------//

     では, (^^)/~
                                        山紫水明

[ ]
RE:07975 DBLCLKでの単語選択についてNo.07985
える さん 01/03/13 21:40
 
>TAKA です。
>// この記述は認めてくれないみたい
>//  if( ( ( ##1 >= 0x21 ) && ( ##1 <= 0x7e ) ) &&   // 単語とみなす範囲
>//     !( ( ##1 >= 0x30 ) && ( ##1 <= 0x39 ) ) &&   // 0〜9は対象外

&& の使い方が間違っています。

マクロヘルプの「演算子」を参照してみましょう。
結合順序の都合ですね。

&& ! を解決しようとしてしまうので、 () を使って
優先度の低い ! を先に評価するように (expr) && (!(expr))
としなければなりません。

[ ]
RE:07985 DBLCLKでの単語選択についてNo.07987
TAKA さん 01/03/13 22:04
 
TAKA です。

>マクロヘルプの「演算子」を参照してみましょう。
>結合順序の都合ですね。
>
>&& ! を解決しようとしてしまうので、 () を使って
>優先度の低い ! を先に評価するように (expr) && (!(expr))
>としなければなりません。

なるほど。ヘルプを見ると「&&」と「!」が同じ優先順位ですね。
それが連続していたので、マクロ実行時にエラーが出るのは当然で
すね。
ヘルプなど読まずに、ごく当たり前のように書いてしまっていまし
た。
たまには、ヘルプも見ろよ。 > 自分


情報ありがとうございます。勉強になりました。


という訳で、「仕様追加を取り下げます」ではなくて、現状が正し
い仕様でした。
私の勘違いでしたので、今回の発言は無視しておいて下さい。 > 秀丸担当さん

[ ]
RE:07975 DBLCLKでの単語選択についてNo.07989
山紫水明 さん 01/03/13 23:06
 
 TAKAさん,こんばんは。ありがとうございます。

》2.「code」が複数回呼び出されるのを、可能な限り少なくする。

 これを考えたのですが,私の力ではあれ以上はできませんでした。お示しいただ
いたマクロ,読めばなるほどと思います。勉強になります。

》3.最初のif文で比較したものは、whileのループでチェックする必
》 要がないので、すぐに「left」を行う。
》4.最終的に「selectword」を使用したのでいいので、一箇所で行う。

 これは私の方法でもやれることですね。繰り返しはできるだけ少なくしたいと思
います。少しシェイプアップできます。

//---------------------------------------------------------------------//
if( ( code > 0x20 && code < 0x30 ) || ( code > 0x39 && code < 0x41 ) ||
    ( code > 0x5a && code < 0x5f ) || ( code > 0x5f && code < 0x61 ) ||
    ( code > 0x7a && code < 0x7f ) ) {
    left;
    while( (code > 0x20 && code < 0x30 ) ||
        ( code > 0x39 && code < 0x41 ) ||
        ( code > 0x5a && code < 0x5f ) ||
        ( code > 0x5f && code < 0x61 ) ||
        ( code > 0x7a && code < 0x7f ) ) {
        left;
        if( !result ) goto End;     //ファイル先頭の場合の処理
    }
    right;
}
End:
selectword;
endmacro;
//---------------------------------------------------------------------//

     では, (^^)/~
                                        山紫水明

[ ]
RE:07975 DBLCLKでの単語選択についてNo.07990
でるもんた さん 01/03/13 23:18
 
> // この記述は認めてくれないみたい
> //  if( ( ( ##1 >= 0x21 ) && ( ##1 <= 0x7e ) ) &&   // 単語とみなす範囲
> //     !( ( ##1 >= 0x30 ) && ( ##1 <= 0x39 ) ) &&   // 0〜9は対象外
> //     !( ( ##1 >= 0x41 ) && ( ##1 <= 0x5A ) ) &&   // A〜Zは対象外
> //     !( ( ##1 >= 0x61 ) && ( ##1 <= 0x7A ) ) )    // a〜zは対象外
> //  {
> //      ##RC = true;
> //  }
>     if( ( ##1 >= 0x21 ) && ( ##1 <= 0x7e ) )
>     { // 単語とみなす範囲
>         if( ( ( ##1 >= 0x30 ) && ( ##1 <= 0x39 ) ) ||   // 0〜9は対象外
>             ( ( ##1 >= 0x41 ) && ( ##1 <= 0x5A ) ) ||   // A〜Zは対象外
>             ( ( ##1 >= 0x61 ) && ( ##1 <= 0x7A ) ) )    // a〜zは対象外
>         {
>         }
>         else
>         {
>             ##RC = true;
>         }
>     }

これ、こんな書き方はいかがでしょうか?

if (0<=strstr("!\"#$%&'()*+,-./:;<=>?@[\]^_`{|}~",char(##1)))

または

if (##1>=0x21 && ##1<=0x7E && -1==strstr(
     "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
     char(##1))
   )

[ ]
RE:07975 DBLCLKでの単語選択についてNo.07991
でるもんた さん 01/03/13 23:18
 
> // この記述は認めてくれないみたい
> //  if( ( ( ##1 >= 0x21 ) && ( ##1 <= 0x7e X-Mozilla-Status: 0009_$J$9HO0O
> //     !( ( ##1 >= 0x30 ) && ( ##1 <= 0x39 ) ) &&   // 0〜9は対象外
> //     !( ( ##1 >= 0x41 ) && ( ##1 <= 0x5A ) ) &&   // A〜Zは対象外
> //     !( ( ##1 >= 0x61 ) && ( ##1 <= 0x7A ) ) )    // a〜zは対象外
> //  {
> //      ##RC = true;
> //  }
>     if( ( ##1 >= 0x21 ) && ( ##1 <= 0x7e ) )
>     { // 単語とみなす範囲
>         if( ( ( ##1 >= 0x30 ) && ( ##1 <= 0x39 ) ) ||   // 0〜9は対象外
>             ( ( ##1 >= 0x41 ) && ( ##1 <= 0x5A ) ) ||   // A〜Zは対象外
>             ( ( ##1 >= 0x61 ) && ( ##1 <= 0x7A ) ) )    // a〜zは対象外
>         {
>         }
>         else
>         {
>             ##RC = true;
>         }
>     }

これ、こんな書き方はいかがでしょうか?

if (0<=strstr("!\"#$%&'()*+,-./:;<=>?@[\]^_`{|}~",char(##1)))

または

if (##1>=0x21 && ##1<=0x7E && -1==strstr(
     "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
     char(##1))
   )

[ ]
RE:07989 DBLCLKでの単語選択についてNo.07992
TAKA さん 01/03/13 23:18
 
TAKA です。

> これは私の方法でもやれることですね。繰り返しはできるだけ少なくしたいと思
>います。少しシェイプアップできます。

エレガントなソースコードに仕上がりましたね。

[ ]
RE:07991 DBLCLKでの単語選択についてNo.07993
TAKA さん 01/03/13 23:29
 
TAKA です。

>これ、こんな書き方はいかがでしょうか?
>
>if (0<=strstr("!\"#$%&'()*+,-./:;<=>?@[\]^_`{|}~",char(##1)))
>
>または
>
>if (##1>=0x21 && ##1<=0x7E && -1==strstr(
>     "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
>     char(##1))
>   )

「strstr」ですか。まったく、思いつきませんでした。
アイデア次第で、いろいろな書き方が出来るのですね。

いろいろな人の意見を聞くと、とても勉強になります。

[ ]
RE:07992 DBLCLKでの単語選択についてNo.07994
山紫水明 さん 01/03/14 07:45
 
 TAKAさん,でるもんたさん,こんにちは。

 でるもんたさんのご指摘ではっとおもいあたりました。
 次のようにできるんですね。

//----------------------------------------------//
//          単語選択補正マクロ
//        半角記号をまとまりとして扱う

$a = "!\"#$%&'()*+,-./:;<=>?@[\\]^`{|}~";
if( strstr( $a, char( code ) ) > -1 ) {
    left;
    while( strstr( $a, char( code ) ) > -1 ) {
        left;
        if( !result ) goto End;
    }
    right;
}
End:
selectword;
endmacro;
//----------------------------------------------//

     では, (^^)/~
                                        山紫水明

[ ]
RE:07961 DBLCLKでの単語選択についてNo.07995
山紫水明 さん 01/03/14 10:12
 
 秀丸担当さん,こんにちは。

》半角に限って言うと、基本的に単語は、

》 a〜z A〜Z _ 0〜9

》で構成される文字です。

》「カーソル位置の文字がこの文字に該当しない場合」は、
》まず右側に1文字だけ選択し、そして、以下の文字、

》 ! " # $ % & ' ( ) * + ,
》 - . / : ; < = > ? @ [ \
》 ] ^ { | } ~

》が右側に連続して続くぶんだけを単語選択しています。

 半角記号の「`」の扱いはどうなっているのでしょうか。
下の例で適宜カーソルを置いて,単語選択をすると不思議な動きをします。
####`$$$$`$$$
````
 自分自身は半角記号の仲間と思っているが,仲間はずれ?

     では, (^^)/~
                                        山紫水明

[ ]
RE:07994 DBLCLKでの単語選択についてNo.07998
むらやん さん 01/03/14 11:44
 
山紫水明さん、でるもんたさん、TAKAさん、こんにちは。

マクロでいろいろ出来るという事に気がつけば、
「要望する必要も無かったかな?」と、感じています。

マクロで選択機能を作成できるんだから、好みに合った
選択が可能ですね。

それに、DBLCLKにマクロを割り当て出来るとは、
今まで気がつきませんでした。


[ ]
RE:07995 DBLCLKでの単語選択についてNo.08019
秀丸担当 さん 01/03/15 18:31
 
> 半角記号の「`」の扱いはどうなっているのでしょうか。

これは、凡例に示したとおり、含まれていません。
特に問題なければ記号の仲間に入れるよう検討しておきます。

[ ]