// ==UserScript== // @name HjklNavigation // @namespace com.gmail.fujifruity.greasemonkey // @version 1.0 // @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. const results = (() => { switch (location.hostname) { case googleUrl: return document.getElementsByClassName('rc') // add another one here default: return null } })() function open(result) { switch (location.hostname) { case googleUrl: { const url = result.firstChild.firstChild.href GM.openInTab(url, false) break } // add another one here } } let focuseIdx = null function refocus(nextIdx) { if (focuseIdx == null) { focuseIdx = 0 } else { results[focuseIdx].style.backgroundColor = null focuseIdx = nextIdx } results[focuseIdx].style.backgroundColor = 'lightyellow' results[focuseIdx].scrollIntoView({ behavior: "smooth", block: "center" }) } function onKeydown(event) { if (event.target.tagName == "INPUT" || event.ctrlKey || event.altKey) return const result = results[focuseIdx] switch (event.key) { case 'j': { refocus((focuseIdx + 1) % results.length) break } case 'k': { refocus((focuseIdx - 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) }