// ==UserScript== // @name HjklNavigation // @namespace com.gmail.fujifruity.greasemonkey // @version 1.2 // @description Shortcuts for Google Search result. j or k to move focus, l to open. (I have no idea to do with h.) // @author fujifruity // @include https://www.google.com/search* // @grant GM.openInTab // @license MIT // @downloadURL none // ==/UserScript== { const googleUrl = "www.google.com" // Add another URL variable and @include above. // This script may handle most list-like elements. let focusIdx = null const results = (() => { switch (location.hostname) { case googleUrl: return document.getElementsByClassName('g') // add another one here default: return null } })() function open(result) { switch (location.hostname) { case googleUrl: { const url = result.getElementsByTagName('a')[0].href GM.openInTab(url, false) break } // add another one here } } function refocus(nextIdx) { if (focusIdx == null) { focusIdx = 0 } else { results[focusIdx].style.backgroundColor = null focusIdx = nextIdx } results[focusIdx].style.backgroundColor = 'lightyellow' results[focusIdx].scrollIntoView({ behavior: "smooth", block: "center" }) } function onKeydown(event) { if (event.target.tagName == "INPUT" || event.ctrlKey || event.altKey) return const result = results[focusIdx] switch (event.key) { case 'j': { refocus((focusIdx + 1) % results.length) break } case 'k': { refocus((focusIdx - 1 + results.length) % results.length) break } case 'l': { open(result) break } case 'g': { refocus(0) break } case 'G': { refocus(results.length - 1) break } } } window.addEventListener('keydown', onKeydown) }