「行頭に移動」の版間の差分

MSY-07 (トーク | 投稿記録)
余分な改行と空行を除去
MSY-07 (トーク | 投稿記録)
変数にvarの宣言を追加
 
(同じ利用者による、間の11版が非表示)
1行目: 1行目:
インデント位置<カーソル位置の場合は、インデント位置に、カーソル位置≦インデント位置の場合は、(表示)行頭に移動します。「Home」キーなどに割り当ててご利用ください。
このマクロは[https://www.haijin-boys.com/software/mery/mery-3-6-0#17 Mery Ver 3.6.1]で追加されたコマンド「行頭へ移動」「行頭またはテキストの開始位置へ移動」および[https://www.haijin-boys.com/software/mery/mery-3-6-0#16 Mery Ver 3.6.2]で追加されたコマンド「論理行の行頭へ移動」と同機能です。


「shift」変数を「true」に書き換えると、選択しながら移動します。「Shift + Home」キーなどに割り当ててご利用ください。
== Kuro 版 ==
行頭またはインデント位置に移動します。Homeキーに割り当てると良いかもしれません。Shift + Homeキーに割り当てる場合は「shift」変数を「true」に設定してください(shift = true の場合、選択しながら移動します)。


<div>__TOC__</div>
<syntaxhighlight lang="javascript" copy>
 
== Kuro 版 ==
<syntaxhighlight lang="javascript">
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
// 行頭に移動
// 行頭に移動
19行目: 17行目:
// インデントとして認識する文字(半角空白、全角空白、タブ)
// インデントとして認識する文字(半角空白、全角空白、タブ)
var indent = new RegExp(" | |\t");
var indent = new RegExp(" | |\t");
// Selection オブジェクトを取得
var sel = document.selection;


// 現在位置取得
// 現在位置取得
var x1 = document.selection.GetActivePointX(mePosView);
var x1 = sel.GetActivePointX(mePosView);
var y1 = document.selection.GetActivePointY(mePosView);
var y1 = sel.GetActivePointY(mePosView);


// 選択終了位置取得
// 選択終了位置取得
var x2 = document.selection.GetBottomPointX(mePosView);
var x2 = sel.GetBottomPointX(mePosView);
var y2 = document.selection.GetBottomPointY(mePosView);
var y2 = sel.GetBottomPointY(mePosView);


// カーソルを行末に移動
// カーソルを行末に移動
document.selection.EndOfLine(false);
sel.EndOfLine(false);


// カーソルを行頭に移動(これで1行選択)
// カーソルを行頭に移動(これで1行選択)
document.selection.StartOfLine(true);
sel.StartOfLine(true);


var s = document.selection.Text;
var s = sel.Text;
var i = 0;
var i = 0;


// 行頭からタブの数を確認
// 行頭からタブの数を確認
for (var j = 0; j < s.length; j++) {
for (var j = 0; j < s.length; j++) {
  c = s.charAt(j);
var c = s.charAt(j);
  if (indent.test(c))
if (indent.test(c)) {
    i++;
i++;
  else
} else {
    break;
break;
}
}
}


// シフトオンの場合、選択終了位置に移動
// シフトオンの場合、選択終了位置に移動
if (shift)
if (shift) {
  document.selection.SetActivePoint(mePosView, x2, y2, false);
sel.SetActivePoint(mePosView, x2, y2, false);
}


// 現在位置が1より大きくてタブの数以下の場合は行頭に移動
// 現在位置が1より大きくてタブの数以下の場合は行頭に移動
if (x1 > 1 && x1 <= i + 1)
if (x1 > 1 && x1 <= i + 1) {
  document.selection.StartOfLine(shift);
sel.StartOfLine(shift);
// それ以外の場合はタブの数だけ進める
// それ以外の場合はタブの数だけ進める
else
} else {
  document.selection.SetActivePoint(mePosView, i + 1, y1, shift);
sel.SetActivePoint(mePosView, i + 1, y1, shift);
}
</syntaxhighlight>
</syntaxhighlight>


== masme 版 (2014/02) ==
== masme 版 ==
* 論理行単位の移動に対応しました。「logic」変数を「true」に書き換えてください。
* 論理行単位の移動に対応しました。「logic」変数を「true」に書き換えてください。
* 折り返し行頭の空白をインデントとみなさない設定を追加する予定でしたが、一筋縄ではいかなかったため見送りました。
* 折り返し行頭の空白をインデントとみなさない設定を追加する予定でしたが、一筋縄ではいかなかったため見送りました。


<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript" copy>
//■行頭に移動(インデント対応)
//■行頭に移動(インデント対応)
// 2014/02/08
// 2014/02/08
74行目: 78行目:


(function(){
(function(){
  var sel = Document.Selection;
var sel = Document.Selection;
  var meP = logic? mePosLogical: mePosView;
var meP = logic? mePosLogical: mePosView;
  var meGL = logic? 0: meGetLineView;
var meGL = logic? 0: meGetLineView;
  var px = sel.GetActivePointX(meP);
var px = sel.GetActivePointX(meP);
  var py = sel.GetActivePointY(meP);
var py = sel.GetActivePointY(meP);
  var line = Document.GetLine(py, meGL);
var line = Document.GetLine(py, meGL);
  var ix = 1+ (line.match(indent)||{lastIndex:0}).lastIndex;
var ix = 1+ (line.match(indent)||{lastIndex:0}).lastIndex;
  if (ix<px) //◆ix<px インデント位置<カーソル位置の場合、インデント位置へ
if (ix<px) //◆ix<px インデント位置<カーソル位置の場合、インデント位置へ
    sel.SetActivePoint(meP, ix, py, shift);
sel.SetActivePoint(meP, ix, py, shift);
  else //◆px<=ix カーソル位置≦インデント位置の場合、行頭へ
else //◆px<=ix カーソル位置≦インデント位置の場合、行頭へ
    sel.StartOfLine(shift, meP);
sel.StartOfLine(shift, meP);
})();
})();
</syntaxhighlight>
</syntaxhighlight>


== noonworks 版 (2014/03) ==
== noonworks 版 ==
* masmeさんのコードを参考に、折り返し行頭の空白をインデントとみなさない設定を追加してみました。
* masmeさんのコードを参考に、折り返し行頭の空白をインデントとみなさない設定を追加してみました。
* 元から行頭にいた場合に前の行の行末に移動する設定を追加しました。
* 元から行頭にいた場合に前の行の行末に移動する設定を追加しました。
* [https://github.com/noonworks/my-mery-util github]
* [https://github.com/noonworks/my-mery-util github]


<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript" copy>
#title = "行頭に移動"
#title = "行頭に移動"
// 行頭に移動
// 行頭に移動
101行目: 105行目:
var indent = /^[  \t]+/;  // インデントの定義
var indent = /^[  \t]+/;  // インデントの定義
(function(){
(function(){
    var getToXView = function(line, nowX, ignore_indent) {
var getToXView = function(line, nowX, ignore_indent) {
        if (ignore_indent) return 1;
if (ignore_indent) return 1;
        var m = line.match(indent);
var m = line.match(indent);
        var toX = (m === null) ? 1 : (1 + m.lastIndex);
var toX = (m === null) ? 1 : (1 + m.lastIndex);
        return (toX < nowX) ? toX : 1;
return (toX < nowX) ? toX : 1;
    };
};
    var sel = Document.Selection;
var sel = Document.Selection;
    var tp = sel.GetTopPointX(mePosLogical);
var tp = sel.GetTopPointX(mePosLogical);
    var bt = sel.GetBottomPointX(mePosLogical);
var bt = sel.GetBottomPointX(mePosLogical);
    var selecting_now = (tp != bt);
var selecting_now = (tp != bt);
    var posX_l = sel.GetActivePointX(mePosLogical);
var posX_l = sel.GetActivePointX(mePosLogical);
    var posY_l = sel.GetActivePointY(mePosLogical);
var posY_l = sel.GetActivePointY(mePosLogical);
    var posX_v = sel.GetActivePointX(mePosView);
var posX_v = sel.GetActivePointX(mePosView);
    var posY_v = sel.GetActivePointY(mePosView);
var posY_v = sel.GetActivePointY(mePosView);
    if (posX_l == 1) {
if (posX_l == 1) {
        if (go_prev_line) {
if (go_prev_line) {
            sel.LineUp(selecting_now, 1);
sel.LineUp(selecting_now, 1);
            if (posY_v != sel.GetActivePointY(mePosView)) {
if (posY_v != sel.GetActivePointY(mePosView)) {
                sel.EndOfLine(selecting_now, mePosView);
sel.EndOfLine(selecting_now, mePosView);
            }
}
        }
}
        return;
return;
    }
}
    var toX_v = null;
var toX_v = null;
    var line_l = Document.GetLine(posY_l, 0);
var line_l = Document.GetLine(posY_l, 0);
    var line_v = Document.GetLine(posY_v, meGetLineView);
var line_v = Document.GetLine(posY_v, meGetLineView);
    if (view_line && (line_l != line_v)) {
if (view_line && (line_l != line_v)) {
        if (posX_v > 1) {
if (posX_v > 1) {
            toX_v = getToXView(line_v, posX_v, (!view_line_indent));
toX_v = getToXView(line_v, posX_v, (!view_line_indent));
            sel.SetActivePoint(mePosView, toX_v, posY_v, selecting_now);
sel.SetActivePoint(mePosView, toX_v, posY_v, selecting_now);
        } else if (posY_v - posY_l > 1) {
} else if (posY_v - posY_l > 1) {
            toX_v = getToXView(Document.GetLine(posY_v - 1, meGetLineView), 9999, (!view_line_indent));
toX_v = getToXView(Document.GetLine(posY_v - 1, meGetLineView), 9999, (!view_line_indent));
            sel.SetActivePoint(mePosView, toX_v, posY_v - 1, selecting_now);
sel.SetActivePoint(mePosView, toX_v, posY_v - 1, selecting_now);
        }
}
    }
}
    if (toX_v === null) {
if (toX_v === null) {
        var m = line_l.match(indent);
var m = line_l.match(indent);
        toX_v = (m === null) ? 1 : (1 + m.lastIndex);
toX_v = (m === null) ? 1 : (1 + m.lastIndex);
        if (toX_v >= posX_l) toX_v = 1;
if (toX_v >= posX_l) toX_v = 1;
        sel.SetActivePoint(mePosLogical, toX_v, posY_l, selecting_now);
sel.SetActivePoint(mePosLogical, toX_v, posY_l, selecting_now);
    }
}
})();
})();
</syntaxhighlight>
</syntaxhighlight>


== isari 版 (2020/05) ==
== isari 版 ==
* kuroさん版以外がうまく動かないようでしたので、sukemaruさんの「[[行頭か行末 または 選択範囲の始点か終点]]」を参考に、トグルなしの移動のみを行う簡易版として書き直してみました。
* Kuroさん版以外がうまく動かないようでしたので、sukemaruさんの「[[行頭か行末 または 選択範囲の始点か終点]]」を参考に、トグルなしの移動のみを行う簡易版として書き直してみました。


<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript" copy>
#title = "行頭に移動"
#title = "行頭に移動"


159行目: 163行目:


(function(){
(function(){
    var d = document, s = d.selection;
var d = document, s = d.selection;
    var meP = logic ? mePosLogical : mePosView;
var meP = logic ? mePosLogical : mePosView;
    var meGL = logic ? 0 : meGetLineView;
var meGL = logic ? 0 : meGetLineView;


    Redraw = false;
Redraw = false;
    var x = s.GetActivePointX( meP );
var x = s.GetActivePointX( meP );
    var y = s.GetActivePointY( meP );
var y = s.GetActivePointY( meP );
    var pos = s.GetActivePos(); // 現在位置
var pos = s.GetActivePos(); // 現在位置
    var top = pos + 1 - x;      // 行頭位置
var top = pos + 1 - x;      // 行頭位置
    var st = d.GetLine( y, meGL );
var st = d.GetLine( y, meGL );
    var sId = st.search( indent );    // 行頭の空白文字数
var sId = st.search( indent );    // 行頭の空白文字数
    var ind = top + sId;    // インデントの後ろ位置
var ind = top + sId;    // インデントの後ろ位置


    if ( ind < pos ) {
if ( ind < pos ) {
        // 文字列開始位置に移動(インデントの後ろ)
// 文字列開始位置に移動(インデントの後ろ)
        s.SetActivePos( ind, shift );
s.SetActivePos( ind, shift );
    }
}
    else {
else {
        // 文頭に移動
// 文頭に移動
        s.StartOfLine( shift, meP );
s.StartOfLine( shift, meP );
    }
}


    Redraw = true;
Redraw = true;
})();
})();
</syntaxhighlight>
</syntaxhighlight>
スポンサーリンク