|
/*==uc== |
|
@name navkeys |
|
@desc personal key binds for caret-movement, scrolling and selection |
|
@include main |
|
@include ~^chrome://global/content/view(?:Partial)?Source\.xul |
|
@author satyr |
|
==/uc==*/ |
|
https://developer.mozilla.org/ja/XUL/List_of_commands |
|
NavKey = {s: { |
|
H : 'scrollLeft', |
|
J : 'scrollLineDown', |
|
K : 'scrollLineUp', |
|
L : 'scrollRight', |
|
N : 'scrollPageDown', |
|
P : 'scrollPageUp', |
|
I : 'wordNext', |
|
U : 'wordPrevious', |
|
Y : 'beginLine', |
|
O : 'endLine', |
|
$H: 'selectCharPrevious', |
|
$J: 'selectLineNext', |
|
$K: 'selectLinePrevious', |
|
$L: 'selectCharNext', |
|
$N: 'selectPagePrevious', |
|
$P: 'selectPageNext', |
|
$I: 'selectWordNext', |
|
$U: 'selectWordPrevious', |
|
$Y: 'selectBeginLine', |
|
$O: 'selectEndLine', |
|
Q : 'selectNone', |
|
',': function scrollHalfDn(){ NavKey.scroll(0, +1/2) }, |
|
'.': function scrollHalfUp(){ NavKey.scroll(0, -1/2) }, |
|
'@': function markPoint(){ |
|
NavKey.run ` |
|
return content._nkPoint = [content.scrollX, content.scrollY] |
|
` |
|
}, |
|
'$`': function gotoMark(){ |
|
NavKey.run ` |
|
var p = content._nkPoint || [0, 0] |
|
content.scrollTo(...p) |
|
return '-> '+ p |
|
` |
|
}, |
|
}, |
|
scroll: function NK_scroll(x, y){ |
|
NavKey.run(` |
|
content.scrollBy(content.innerWidth * ${x}, content.innerHeight * ${y}) |
|
`) |
|
}, |
|
say: function NK_say(msg){ |
|
gBrowser.getStatusPanel().label = msg |
|
}, |
|
run: function NK_run(js){ |
|
var mm = gBrowser.selectedBrowser.messageManager |
|
, id = 'NavKey'+ Math.random() |
|
function done(msg){ |
|
mm.removeMessageListener(id, done) |
|
if(msg) NavKey.say(msg.data) |
|
} |
|
mm.addMessageListener(id, done) |
|
mm.loadFrameScript('data:,'+ encodeURIComponent(` |
|
sendAsyncMessage('${id}', (() => {${js}})()) |
|
`), false) |
|
}, |
|
}; |
|
{ |
|
let keyset = document.querySelector('keyset'); |
|
for(let [k, cmd] in new Iterator(NavKey.s)){ |
|
let key = keyset.appendChild(document.createElement('key')); |
|
if(k[0] === '$'){ |
|
k = k[1]; |
|
key.setAttribute('modifiers', 'shift'); |
|
} |
|
let isfn = typeof cmd === 'function'; |
|
let name = isfn ? cmd.name : cmd; |
|
key.setAttribute('key', k); |
|
key.setAttribute( |
|
'oncommand', |
|
isfn ? /{[^]+}/.exec(uneval(cmd)) : 'goDoCommand("cmd_'+ cmd +'")'); |
|
key.setAttribute('id', k +'_'+ name); |
|
key.setAttribute('label', name); |
|
} |
|
} |