「行頭に移動」の版間の差分
余分な改行と空行を除去 |
変数にvarの宣言を追加 |
||
| (同じ利用者による、間の11版が非表示) | |||
| 1行目: | 1行目: | ||
このマクロは[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]で追加されたコマンド「論理行の行頭へ移動」と同機能です。 | |||
== Kuro 版 == | |||
行頭またはインデント位置に移動します。Homeキーに割り当てると良いかもしれません。Shift + Homeキーに割り当てる場合は「shift」変数を「true」に設定してください(shift = true の場合、選択しながら移動します)。 | |||
<syntaxhighlight lang="javascript" copy> | |||
<syntaxhighlight lang="javascript"> | |||
// ----------------------------------------------------------------------------- | // ----------------------------------------------------------------------------- | ||
// 行頭に移動 | // 行頭に移動 | ||
| 19行目: | 17行目: | ||
// インデントとして認識する文字(半角空白、全角空白、タブ) | // インデントとして認識する文字(半角空白、全角空白、タブ) | ||
var indent = new RegExp(" | |\t"); | var indent = new RegExp(" | |\t"); | ||
// Selection オブジェクトを取得 | |||
var sel = document.selection; | |||
// 現在位置取得 | // 現在位置取得 | ||
var x1 = | var x1 = sel.GetActivePointX(mePosView); | ||
var y1 = | var y1 = sel.GetActivePointY(mePosView); | ||
// 選択終了位置取得 | // 選択終了位置取得 | ||
var x2 = | var x2 = sel.GetBottomPointX(mePosView); | ||
var y2 = | var y2 = sel.GetBottomPointY(mePosView); | ||
// カーソルを行末に移動 | // カーソルを行末に移動 | ||
sel.EndOfLine(false); | |||
// カーソルを行頭に移動(これで1行選択) | // カーソルを行頭に移動(これで1行選択) | ||
sel.StartOfLine(true); | |||
var s = | 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++) { | ||
var c = s.charAt(j); | |||
if (indent.test(c)) { | |||
i++; | |||
} else { | |||
break; | |||
} | |||
} | } | ||
// シフトオンの場合、選択終了位置に移動 | // シフトオンの場合、選択終了位置に移動 | ||
if (shift) | if (shift) { | ||
sel.SetActivePoint(mePosView, x2, y2, false); | |||
} | |||
// 現在位置が1より大きくてタブの数以下の場合は行頭に移動 | // 現在位置が1より大きくてタブの数以下の場合は行頭に移動 | ||
if (x1 > 1 && x1 <= i + 1) | if (x1 > 1 && x1 <= i + 1) { | ||
sel.StartOfLine(shift); | |||
// それ以外の場合はタブの数だけ進める | // それ以外の場合はタブの数だけ進める | ||
else | } else { | ||
sel.SetActivePoint(mePosView, i + 1, y1, shift); | |||
} | |||
</syntaxhighlight> | </syntaxhighlight> | ||
== masme 版 | == 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 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); | |||
})(); | })(); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== noonworks 版 | == 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) { | |||
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); | |||
} | |||
})(); | })(); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== isari 版 | == isari 版 == | ||
* | * Kuroさん版以外がうまく動かないようでしたので、sukemaruさんの「[[行頭か行末 または 選択範囲の始点か終点]]」を参考に、トグルなしの移動のみを行う簡易版として書き直してみました。 | ||
<syntaxhighlight lang="javascript"> | <syntaxhighlight lang="javascript" copy> | ||
#title = "行頭に移動" | #title = "行頭に移動" | ||
| 159行目: | 163行目: | ||
(function(){ | (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; | |||
})(); | })(); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
スポンサーリンク