タブキーによる空白入力についてNo.36094
ヤバルゴ さん 17/10/03 08:16
 
秀丸エディタを利用しております。

いつもバグ修正や機能追加などに対応していただき、
誠にありがとうございます。


【質問・要望】
「タブキーで空白入力」をオンにしてタブを入力した際、
タブ挿入位置だけでなく、前後の空白の数によって
適切に半角スペースの挿入量が変われば便利だと考えております。

言葉だと説明しにくいので、例をご覧ください。


(例)
ファイルタイプ別の設定にて、以下のように設定する。
  ・タブの文字数=8
  ・タブキーで空白入力=オン

この設定の下、カーソル(|)の位置でタブを入れるとき、
@ではなくAのように空白(_)が挿入されるようにしたい。


@
ああ__|____

ああ____|____

※『|』の手前が8space分となる


A
ああ__|____

ああ____________|

※「ああ」が4space、『|』の前後の空白が6spaceであるため、
 合計が16spaceとなるように調整される


以上、ご検討のほどお願いいたします。

[ ]
RE:36094 タブキーによる空白入力についてNo.36095
秀丸担当 さん 17/10/03 10:48
 
「タブで空白入力」のときは、空白があってもタブ文字があるものとみなして計算し
ています。そういう意味では一応現状で合っていると思います。

ご提案の方法は、仮に「タブで空白入力」がOFFの場合で、タブ文字があるとみなし
た場合、行末または次の単語の先頭までカーソル移動してから、そこにタブ文字を入
力するという動作に近いと思います。
そういう入力方法があると便利な場面はあると思いますが、カーソル位置が次のタブ
ストップという一般的な動作ではなく、もっと先のタブストップに移動する動作にな
るので、マクロでやるといいと思います。
もし必要であればそういうマクロを書いてみます。

[ ]
RE:36095 タブキーによる空白入力についてNo.36096
秀丸担当 さん 17/10/03 16:45
 

タブの操作をマクロでする場合、範囲選択によってインデントになったりするので、
そのあたりが面倒そうでした。
目的の操作以外はデフォルトの動作(かそれに近い操作)となるようなマクロを作っ
てみました。

setcompatiblemode 0x100000;
if( multiselecting ) {
  //デフォルトのタブ操作(複数選択)
  insert "\t";
  endmacro;
} else if(selecting){
  if(rectselecting){
    //デフォルトのタブ操作(BOX先頭もどき)
    tomultiselect;
    insert "\t";
  } else {
    //デフォルトのタブ操作(インデント)
    indent;
  }
  endmacro;
}

//空白をスキップしてタブ挿入
call Label_SkipSpaceTab;
insert "\t";
endmacro;

Label_SkipSpaceTab:
  ##x2=column;
  ##y2=lineno;
  while(##x2<linelen2){
    $$c=gettext2(##x2,##y2,##x2+1,##y2);
    if( $$c==" "||$$c=="\t" ){
      ##x2=##x2+1;
      continue;
    }
    break;
  }
  if(##x2!=column){
    moveto2 ##x2,##y2;
  }
  return;
 

[ ]
RE:36096 タブキーによる空白入力についてNo.36097
ヤバルゴ さん 17/10/04 07:59
 
秀丸担当様


ご対応いただき,ありがとうございます.

> 行末または次の単語の先頭までカーソル移動してから、
> そこにタブ文字を入力するという動作に近い

ご指摘の通りですね.
カーソル前後の空白全体をタブ文字の一部とみなす,という
考え方ですので,挙動もその通りになるかと思われます.


いただいたマクロをTabにセットして利用しましたところ,
以下の問題が発生いたします.
 @範囲選択時のインデント時に表示の乱れが発生する
 A空白入力によるタブが入らない

@については,
Tabキーは変更せず,マクロ(Label_SkipSpaceTab)を
Shift+Tabに割り当てることで解決できると思われます.

Aについては,
おそらくtospace文の抜けかと思われます.
(insert "\t"ではタブ文字が入りますので,空白入力と
 する場合はinsert tospace("\t")で良い?)


いずれにしても,頂いたご回答・マクロを基に,
私の方で希望の挙動を実現できそうです.

ご協力いただきまして,誠にありがとうございました.

[ ]