行頭に移動

提供: MeryWiki
移動先: 案内検索

インデント位置<カーソル位置の場合は、インデント位置に、
カーソル位置≦インデント位置の場合は、(表示)行頭に移動します。
「Home」キーなどに割り当ててご利用ください。

「shift」変数を「true」に書き換えると、選択しながら移動します。
「Shift + Home」キーなどに割り当ててご利用ください。

Kuro 版[編集]

// -----------------------------------------------------------------------------
// 行頭に移動
//
// Copyright (c) Kuro. All Rights Reserved.
// www:    http://www.haijin-boys.com/
// -----------------------------------------------------------------------------
 
// シフトの状態(オンの場合は選択、オフの場合は移動)
var shift = false;
 
// インデントとして認識する文字(半角空白、全角空白、タブ)
var indent = new RegExp(" | |\t");
 
// 現在位置取得
var x1 = document.selection.GetActivePointX(mePosView);
var y1 = document.selection.GetActivePointY(mePosView);
 
// 選択終了位置取得
var x2 = document.selection.GetBottomPointX(mePosView);
var y2 = document.selection.GetBottomPointY(mePosView);
 
// カーソルを行末に移動
document.selection.EndOfLine(false);
 
// カーソルを行頭に移動(これで1行選択)
document.selection.StartOfLine(true);
 
var s = document.selection.Text;
var i = 0;
 
// 行頭からタブの数を確認
for (var j = 0; j < s.length; j++) {
  c = s.charAt(j);
  if (indent.test(c))
    i++;
  else
    break;
}
 
// シフトオンの場合、選択終了位置に移動
if (shift)
  document.selection.SetActivePoint(mePosView, x2, y2, false);
 
// 現在位置が1より大きくてタブの数以下の場合は行頭に移動
if (x1 > 1 && x1 <= i + 1)
  document.selection.StartOfLine(shift);
// それ以外の場合はタブの数だけ進める
else
  document.selection.SetActivePoint(mePosView, i + 1, y1, shift);

masme 版 (2014/02)[編集]

  • 論理行単位の移動に対応しました。「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 版 (2014/03)[編集]

  • 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);
    }
})();