インデントした行頭に移動No.08871
むらまさ さん 01/06/04 13:33
 
カーソル移動系のコマンドで行頭に移動があります。
これとは違って、インデントされている行は、インデントされた所に行くような
動作は可能になりませんでしょうか。

期待する動作としては、VBなどのエディタのような動きです。
仮に、インデントされたところ、すなわち以下のサンプルコード二行目の
[p]の位置のことを、場所pと呼ぶと、

----
1: if( hoge ) {
2:     puts("hoge");
3: }
---

カーソルが二行目にあって、
1,場所pに無い場合にそのコマンドを実行すると必ず場所pに移動する。
2,場所pに有る場合にそのコマンドを実行すると行頭に移動する。
という動作です。

ご検討のほどよろしくお願いします。

[ ]
RE:08871 インデントした行頭に移動No.08874
yoshi223 さん 01/06/04 17:42
 
>1: if( hoge ) {
>2:     puts("hoge");
>3: }
>---
>
>カーソルが二行目にあって、
>1,場所pに無い場合にそのコマンドを実行すると必ず場所pに移動する。
>2,場所pに有る場合にそのコマンドを実行すると行頭に移動する。
>という動作です。
>

以下のマクロでどうでしょうか?


///SmartHome.mac
disabledraw;
#sx = x;
#sy = y;
golinetop2;

if(#sy != y && #sx != 0){
 moveto 0, #sy;
 endmacro;
}

while(true){
 $s = gettext(x, y, x+1, y);
 if($s == " " || $s == "\t"){//スペースとタブを飛ばす
  right;
 }else{
  break;
 }
}
if(#sx == x && #sy == y){
 golinetop2;
}
endmacro;


[ ]
RE:08871 インデントした行頭に移動No.08877
ひろ さん 01/06/04 18:02
 
 むらまささん今日は、ひろです。
> カーソル移動系のコマンドで行頭に移動があります。
> これとは違って、インデントされている行は、インデントされた所に行くような
> 動作は可能になりませんでしょうか。
 確かにその様な動きをすると便利なこともありますが、逆に、標準でその
様な動きをすると不便なこともあると思います。以下のようなマクロをいて、
適当なキーに割り当てられては如何でしょうか?
//--------------- linetop.mac ---------------------------------------
golinetop;//ソースの場合、golinetop2 の方が便利かも
if(code == 0x20 || code == 0x09)wordright;

[ ]
RE:08874 インデントした行頭に移動No.08880
yoshi223 さん 01/06/04 18:55
 
>以下のマクロでどうでしょうか?
>
ひろさんのコメントにあるように,wordrightでタブと空白をまとめて
飛ばせますね.勉強不足でした.

それと,「先頭のタブ文字の後の折り返しをインデントしたように見せる」
が有効になってると期待通りに動きませんでした.
修正はしてみましたが,まだバグがあるかも.

さらに,最初実行したときHOMEキーと違う動作なのが違和感あったので
デフォルトで行頭,行頭ならインデント先,としてみました.

参考までに修正したものを以下に載せます.

disabledraw;
#sx = x;
#sy = y;
golinetop;
if(x != 0 && #sx == x){
 golinetop2;
 endmacro;
}
golinetop2;

if(#sy != y && #sx != 0){
 moveto 0, #sy;
 endmacro;
}

if(#sx == 0 && #sy == y && (code == 0x20 || code==0x09)){
 wordright;
}
endmacro;


[ ]
RE:08874 インデントした行頭に移動No.08887
むらまさ さん 01/06/05 10:41
 
>以下のマクロでどうでしょうか?
>
>
>///SmartHome.mac
>disabledraw;
>#sx = x;
>#sy = y;
>golinetop2;
>
>if(#sy != y && #sx != 0){
> moveto 0, #sy;
> endmacro;
>}
>
>while(true){
> $s = gettext(x, y, x+1, y);
> if($s == " " || $s == "\t"){//スペースとタブを飛ばす
>  right;
> }else{
>  break;
> }
>}
>if(#sx == x && #sy == y){
> golinetop2;
>}
>endmacro;


このマクロで満足できそうです。どうもありがとうございます。

[ ]
RE:08877 インデントした行頭に移動No.08888
むらまさ さん 01/06/05 11:00
 
> 確かにその様な動きをすると便利なこともありますが、逆に、標準でその
>様な動きをすると不便なこともあると思います。以下のようなマクロをいて、
>適当なキーに割り当てられては如何でしょうか?

yoshi223さんのマクロで実現しました。

マクロで出来ることはマクロでやるべきかとは思いますが、
いまいちマクロの使い方が分からない(ヘルプを見てもさっぱり)という点と、
苦労してまでマクロを勉強して使う時間(と気力)がないという点が
マクロの利用を避けている原因でして、
マクロを提供されている方々には頭が下がります。

[ ]
RE:08888 インデントした行頭に移動No.08889
TAKA さん 01/06/05 12:14
 
TAKAです。

>yoshi223さんのマクロで実現しました。
>
>マクロで出来ることはマクロでやるべきかとは思いますが、
>いまいちマクロの使い方が分からない(ヘルプを見てもさっぱり)という点と、
>苦労してまでマクロを勉強して使う時間(と気力)がないという点が
>マクロの利用を避けている原因でして、

むらまささんは、がんばってマクロを使えるようになったようです
が、マクロの使い方が分からなくて困っている人は、

「第III部〜秀丸マクロのいろはにほへと マクロを実行してみよう」
http://win.blue.co.jp/~jr-kun/hidemaru_qa/3_macro.html

を読むと良いと思います。

かなり細かく書かれていますので、苦労することなく使えるように
なると思います。


また、マクロのプログラムの勉強を始めてみようと思っている人は、

「第III部〜秀丸マクロのいろはにほへと」
http://win.blue.co.jp/~jr-kun/hidemaru_qa/hmindex3.html

を読むと良いと思います。

[ ]
RE:08880 インデントした行頭に移動No.08890
yoshi223 さん 01/06/05 15:55
 
さらに修正です.

>if(#sx == 0 && #sy == y && (code == 0x20 || code==0x09)){
> wordright;
>}
>
wordrightだと

01|____[hoge](「_」はタブか半角スペースの繰り返し)

と言った行で実行すると,カーソルが「[」と「h」の間に来てしまうので,

if(#sx == 0 && #sy == y){
 while(code==0x20 || code==0x09)right;
}

とした方がいいかもしれないです.

[ ]