TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

【秀丸マクロ】HomeキーでVisual Studio風に行頭移動する

個人的なメモ

4Kディスプレイに変えたところ、長年愛用しているxyzzyが高解像度モードに対応していないので、秀丸エディタに乗り換えを検討している。


秀丸エディタには、Homeキーの動作をVisual Studio風にするオプションがないので、マクロで対応する必要がある。

こちらのマクロをベースに使用して、行頭に空白文字がないと2文字目が選択される、Shift+Homeで選択できないという問題があるので修正する。
秀まるおのホームページ(サイトー企画)−VB風行頭移動マクロ

行頭に空白文字がないと2文字目が選択される

searchdownをsearchdown2に修正する。

Shift+Homeで選択できない

以下の2か所を修正する。

1か所目
    #StartCol = column;

の直後に、

    if (selecting){
        if (x==selendx){
            #PrevX = seltopx;
            #PrevY = seltopy;
        }else{
            #PrevX = selendx;
            #PrevY = selendy;
        }
    }else{
        #PrevX = x;
        #PrevY = y;
    }

を追加する。

2か所目

主処理の最後に以下を追加する。

    #NextX = x;
    #NextY = y;
    if (iskeydown(0x10)){
        moveto #PrevX,#PrevY;
        beginsel;
        moveto #NextX,#NextY;
        endsel;
    }

2026/3/8 追記

  • 検索文字列が置き換えられる
  • 選択行選択状態から選択を拡張する際、カーソル位置から選択されてしまう

という課題があったので、修正した。

    //***************************************
    //**  初期処理                         **
    //***************************************
    setcompatiblemode 0x20000;
    disableinvert;  // 選択反転停止
    disabledraw;    // 画面更新停止

    #StartCol = column;
    if (selecting){
        if ((x==selendx) && (y==selendy)){
            #PrevX = seltopx;
            #PrevY = seltopy;
        }else{
            #PrevX = selendx;
            #PrevY = selendy;
        }
    }else{
        #PrevX = x;
        #PrevY = y;
    }
    
    golinetop2;

    //***************************************
    //**  主処理                           **
    //***************************************
    searchdown2 "[^  \\t\\n]",regular,inselect;
    if(result == true){
        if((column - 1 == 0)&&(code != 8)){
            golinetop2;
        }else if((column < #StartCol)||(#StartCol == 0)) {
            moveto x,y;
        }else{
            golinetop2;
        }
    }

    #NextX = x;
    #NextY = y;
    if (iskeydown(0x10)){
        moveto #PrevX,#PrevY;
        beginsel;
        moveto #NextX,#NextY;
        endsel;
    }

    //***************************************
    //**  後処理                           **
    //***************************************
END:

    enableinvert;   // 選択反転開始
    enabledraw;     // 画面更新開始

    endmacro;