「行頭に移動」の版間の差分
ナビゲーションに移動
検索に移動
SyntaxHighlightにcopyの追加 |
変数にvarの宣言を追加 |
||
| 40行目: | 40行目: | ||
// 行頭からタブの数を確認 | // 行頭からタブの数を確認 | ||
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++; | ||
2025年11月25日 (火) 12:57時点における最新版
このマクロはMery Ver 3.6.1で追加されたコマンド「行頭へ移動」「行頭またはテキストの開始位置へ移動」およびMery Ver 3.6.2で追加されたコマンド「論理行の行頭へ移動」と同機能です。
Kuro 版[編集]
行頭またはインデント位置に移動します。Homeキーに割り当てると良いかもしれません。Shift + Homeキーに割り当てる場合は「shift」変数を「true」に設定してください(shift = true の場合、選択しながら移動します)。
// -----------------------------------------------------------------------------
// 行頭に移動
//
// Copyright (c) Kuro. All Rights Reserved.
// www: https://www.haijin-boys.com/
// -----------------------------------------------------------------------------
// シフトの状態(オンの場合は選択、オフの場合は移動)
var shift = false;
// インデントとして認識する文字(半角空白、全角空白、タブ)
var indent = new RegExp(" | |\t");
// Selection オブジェクトを取得
var sel = document.selection;
// 現在位置取得
var x1 = sel.GetActivePointX(mePosView);
var y1 = sel.GetActivePointY(mePosView);
// 選択終了位置取得
var x2 = sel.GetBottomPointX(mePosView);
var y2 = sel.GetBottomPointY(mePosView);
// カーソルを行末に移動
sel.EndOfLine(false);
// カーソルを行頭に移動(これで1行選択)
sel.StartOfLine(true);
var s = sel.Text;
var i = 0;
// 行頭からタブの数を確認
for (var j = 0; j < s.length; j++) {
var c = s.charAt(j);
if (indent.test(c)) {
i++;
} else {
break;
}
}
// シフトオンの場合、選択終了位置に移動
if (shift) {
sel.SetActivePoint(mePosView, x2, y2, false);
}
// 現在位置が1より大きくてタブの数以下の場合は行頭に移動
if (x1 > 1 && x1 <= i + 1) {
sel.StartOfLine(shift);
// それ以外の場合はタブの数だけ進める
} else {
sel.SetActivePoint(mePosView, i + 1, y1, shift);
}
masme 版[編集]
- 論理行単位の移動に対応しました。「logic」変数を「true」に書き換えてください。
- 折り返し行頭の空白をインデントとみなさない設定を追加する予定でしたが、一筋縄ではいかなかったため見送りました。
//■行頭に移動(インデント対応)
// 2014/02/08
//■範囲選択(true:する/false:しない)
var shift = false;
//■論理行の行頭に移動(true:する/false:しない) ●標準=false (表示行)
var logic = false;
//■インデントの定義 ●初期値=/^[ \t]+/ (半角空白/全角空白/水平タブ)
var indent = /^[ \t]+/;
(function(){
var sel = Document.Selection;
var meP = logic? mePosLogical: mePosView;
var meGL = logic? 0: meGetLineView;
var px = sel.GetActivePointX(meP);
var py = sel.GetActivePointY(meP);
var line = Document.GetLine(py, meGL);
var ix = 1+ (line.match(indent)||{lastIndex:0}).lastIndex;
if (ix<px) //◆ix<px インデント位置<カーソル位置の場合、インデント位置へ
sel.SetActivePoint(meP, ix, py, shift);
else //◆px<=ix カーソル位置≦インデント位置の場合、行頭へ
sel.StartOfLine(shift, meP);
})();
noonworks 版[編集]
- masmeさんのコードを参考に、折り返し行頭の空白をインデントとみなさない設定を追加してみました。
- 元から行頭にいた場合に前の行の行末に移動する設定を追加しました。
- github
#title = "行頭に移動"
// 行頭に移動
var go_prev_line = true; // すでに先頭にいたとき前の行の行末に移動するか
var view_line = true; // 折り返し行(表示行)の行頭に移動するか
var view_line_indent = true;// 折り返し行の行頭の空白をインデントとして扱うか
var indent = /^[ \t]+/; // インデントの定義
(function(){
var getToXView = function(line, nowX, ignore_indent) {
if (ignore_indent) return 1;
var m = line.match(indent);
var toX = (m === null) ? 1 : (1 + m.lastIndex);
return (toX < nowX) ? toX : 1;
};
var sel = Document.Selection;
var tp = sel.GetTopPointX(mePosLogical);
var bt = sel.GetBottomPointX(mePosLogical);
var selecting_now = (tp != bt);
var posX_l = sel.GetActivePointX(mePosLogical);
var posY_l = sel.GetActivePointY(mePosLogical);
var posX_v = sel.GetActivePointX(mePosView);
var posY_v = sel.GetActivePointY(mePosView);
if (posX_l == 1) {
if (go_prev_line) {
sel.LineUp(selecting_now, 1);
if (posY_v != sel.GetActivePointY(mePosView)) {
sel.EndOfLine(selecting_now, mePosView);
}
}
return;
}
var toX_v = null;
var line_l = Document.GetLine(posY_l, 0);
var line_v = Document.GetLine(posY_v, meGetLineView);
if (view_line && (line_l != line_v)) {
if (posX_v > 1) {
toX_v = getToXView(line_v, posX_v, (!view_line_indent));
sel.SetActivePoint(mePosView, toX_v, posY_v, selecting_now);
} else if (posY_v - posY_l > 1) {
toX_v = getToXView(Document.GetLine(posY_v - 1, meGetLineView), 9999, (!view_line_indent));
sel.SetActivePoint(mePosView, toX_v, posY_v - 1, selecting_now);
}
}
if (toX_v === null) {
var m = line_l.match(indent);
toX_v = (m === null) ? 1 : (1 + m.lastIndex);
if (toX_v >= posX_l) toX_v = 1;
sel.SetActivePoint(mePosLogical, toX_v, posY_l, selecting_now);
}
})();
isari 版[編集]
- Kuroさん版以外がうまく動かないようでしたので、sukemaruさんの「行頭か行末 または 選択範囲の始点か終点」を参考に、トグルなしの移動のみを行う簡易版として書き直してみました。
#title = "行頭に移動"
// シフトの状態(trueなら選択、falseなら移動)
var shift = false;
// 論理行か表示行か(trueなら論理行、falseなら表示行)
var logic = true;
// インデントの定義(「^」の後を変更してください)
var indent = new RegExp('[^ \s]');
(function(){
var d = document, s = d.selection;
var meP = logic ? mePosLogical : mePosView;
var meGL = logic ? 0 : meGetLineView;
Redraw = false;
var x = s.GetActivePointX( meP );
var y = s.GetActivePointY( meP );
var pos = s.GetActivePos(); // 現在位置
var top = pos + 1 - x; // 行頭位置
var st = d.GetLine( y, meGL );
var sId = st.search( indent ); // 行頭の空白文字数
var ind = top + sId; // インデントの後ろ位置
if ( ind < pos ) {
// 文字列開始位置に移動(インデントの後ろ)
s.SetActivePos( ind, shift );
}
else {
// 文頭に移動
s.StartOfLine( shift, meP );
}
Redraw = true;
})();
スポンサーリンク