Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@satyr
Last active May 11, 2016 16:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save satyr/353447 to your computer and use it in GitHub Desktop.
Save satyr/353447 to your computer and use it in GitHub Desktop.
navkeys
/*==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);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment