From c91c63d6f296df5ef8da0e975fd5e6fde8ba1d11 Mon Sep 17 00:00:00 2001 From: anekos Date: Mon, 2 Mar 2009 14:59:59 +0000 Subject: 拡張モードをひっそり追加 git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@30708 d0d07461-0603-4401-acd4-de1884942a52 --- caret-hint.js | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) (limited to 'caret-hint.js') diff --git a/caret-hint.js b/caret-hint.js index 5bcaaed..f4e0c76 100644 --- a/caret-hint.js +++ b/caret-hint.js @@ -38,7 +38,7 @@ let PLUGIN_INFO = Caret Hint Move caret position by hint Hint を使ってキャレット位置を移動 - 1.2.1 + 1.3.0 anekos new BSD License (Please read the source code comments of this plugin) 修正BSDライセンス (ソースコードのコメントを参照してください) @@ -110,8 +110,30 @@ let PLUGIN_INFO = let selectHeadMode = gval('caret_hint_select_key', ''); let selectTailMode = gval('caret_hint_select_tail_key', 'S'); let swapKey = gval('caret_hint_swap_key', 's'); + let extendLeader = gval('extend_leader', 'c'); let hintXPath = liberator.globalVariables.caret_hint_xpath || '//*'; + let extendMode = false; + + [headMode, tailMode, selectHeadMode, selectTailMode].forEach( + function(mode) { + let map = extendLeader + ';' + mode; + mappings.remove(modes.NORMAL, map); // for debug + mappings.remove(modes.VISUAL, map); // for debug + mappings.addUserMap( + [modes.NORMAL, modes.VISUAL], + [map], + 'desc', + function () { + extendMode = true; + hints.show(mode); + }, + { + } + ); + } + ); + [ [[true, false], headMode], [[false, false], tailMode], @@ -123,7 +145,10 @@ let PLUGIN_INFO = hints.addMode( m, 'Move caret position to ' + (h ? 'head' : 'tail') + (s ? ' and Select' : ''), - function (elem, loc, count) moveCaret(elem, h, s), + function (elem, loc, count) { + moveCaret(elem, h, s); + extendMode = false; + }, function () hintXPath ); }); @@ -167,11 +192,9 @@ let PLUGIN_INFO = r.selectNodeContents(elem); if (select) { - liberator.log('select') mappings.getDefault(modes.NORMAL, 'i').action(); mappings.getDefault(modes.CARET, 'v').action(); } else { - liberator.log('not select') if (head) { r.setEnd(r.startContainer, r.startOffset); } else { @@ -180,10 +203,20 @@ let PLUGIN_INFO = mappings.getDefault(modes.NORMAL, 'i').action(); } + if (extendMode) { + let a = sel.getRangeAt(0); + if (r.compareBoundaryPoints(Range.END_TO_START, a) < 0) { + r.setEnd(a.endContainer, a.endOffset); + } else { + r.setStart(a.startContainer, a.startOffset); + } + } + sel.addRange(r); if (select && head) swapCaret(); + } })(); -- cgit v1.2.3