// Paste this into surfingkeys advanced settings // or use: // Load settings from: https://raw.githubusercontent.com/js0ny/dotfiles/refs/heads/master/surfingkeys.js /** Examples // an example to create a new mapping `ctrl-y` api.mapkey('', 'Show me the money', function() { Front.showPopup('a well-known phrase uttered by characters in the 1996 film Jerry Maguire (Escape to close).'); }); // an example to replace `T` with `gt`, click `Default mappings` to see how `T` works. api.map('gt', 'T'); // an example to remove mapkey `Ctrl-i` api.unmap(''); */ // Settings settings.language = "zh-CN" ; settings.showModeStatus = false; // Keymap, reference https://github.com/texiwustion/colemak_config_for_surfingkeys/tree/main const forward = { add: function (key) { // 转发即将被 unmap 的键 return api.map(`for${key}`, key) }, cancel: function (key) { // 删除转发生成的键 api.unmap(`for${key}`) api.unmap(key) }, use: function (key) { return `for${key}` } } const colemak = { forward: function (key) { // 转发即将被 unmap 的键 api.map(key, `col${key}`) api.unmap(`col${key}`) }, use: function (key) { return `col${key}` }, map: function (a, b) { api.map(colemak.use(a), forward.use(b)) } } const forwardFactory = { push: function (mapLists) { // forward original keys for (let key in mapLists) { forward.add(mapLists[key]) } }, map: function (mapLists) { for (let key in mapLists) { colemak.map(key, mapLists[key]) } }, pull: function (mapLists) { for (let key in mapLists) { forward.cancel(mapLists[key]) } for (let key in mapLists) { colemak.forward(key) } } } const mapLists = { /// scroll page // Arrow 'n': 'j', 'e': 'k', 'i': 'l', // l <-> i 'l': 'i', 'L': 'I', // k <-> n 'k': 'n', 'K': 'N', // j <-> e 'j': 'e', 'J': 'E', // 缩放 'zu': 'zi', 'zo': 'ze', 'zz': 'zr', } forwardFactory.push(mapLists) api.unmap('t') forwardFactory.map(mapLists) // 鼠标点击 api.unmap('gi') api.unmap('[[') api.unmap(']]') api.unmap(';m') api.unmap(';fs') api.unmap('O') api.unmap('C') forwardFactory.pull(mapLists) // Search Alias api.addSearchAlias('f', 'Felo', 'https://felo.ai/search?q=', 's', 'https://duckduckgo.com/ac/?q=', function(response) { var res = JSON.parse(response.text); return res.map(function(r){ return r.phrase; }); }); api.addSearchAlias('p', 'Perplexity', 'https://www.perplexity.ai/?q=', 's', 'https://duckduckgo.com/ac/?q=', function(response) { var res = JSON.parse(response.text); return res.map(function(r){ return r.phrase; }); }); api.addSearchAlias('r', 'Raindrop', 'https://app.raindrop.io/my/0/', 's', 'https://duckduckgo.com/ac/?q=', function(response) { var res = JSON.parse(response.text); return res.map(function(r){ return r.phrase; }); }); // Theme, reference to https://github.com/Foldex/surfingkeys-config api.Hints.style('border: solid 2px #4C566A; color:#A3BE8C; background: initial; background-color: #3B4252;'); api.Hints.style("border: solid 2px #4C566A !important; padding: 1px !important; color: #E5E9F0 !important; background: #3B4252 !important;", "text"); api.Visual.style('marks', 'background-color: #A3BE8C99;'); api.Visual.style('cursor', 'background-color: #88C0D0;'); settings.theme = ` fg: #E5E9F0; bg: #3B4252; bg-dark: #2E3440; border: #4C566A; main-fg: #88C0D0; accent-fg: #A3BE8C; info-fg: #5E81AC; select: #4C566A; /* ---------- Generic ---------- */ .sk_theme { background: var(--bg); color: var(--fg); background-color: var(--bg); border-color: var(--border); font-family: var(--font); font-size: var(--font-size); font-weight: var(--font-weight); } input { font-family: var(--font); font-weight: var(--font-weight); } .sk_theme tbody { color: var(--fg); } .sk_theme input { color: var(--fg); } /* Hints */ #sk_hints .begin { color: var(--accent-fg) !important; } #sk_tabs .sk_tab { background: var(--bg-dark); border: 1px solid var(--border); } #sk_tabs .sk_tab_title { color: var(--fg); } #sk_tabs .sk_tab_url { color: var(--main-fg); } #sk_tabs .sk_tab_hint { background: var(--bg); border: 1px solid var(--border); color: var(--accent-fg); } .sk_theme #sk_frame { background: var(--bg); opacity: 0.2; color: var(--accent-fg); } /* ---------- Omnibar ---------- */ /* Uncomment this and use settings.omnibarPosition = 'bottom' for Pentadactyl/Tridactyl style bottom bar */ /* .sk_theme#sk_omnibar { width: 100%; left: 0; } */ .sk_theme .title { color: var(--accent-fg); } .sk_theme .url { color: var(--main-fg); } .sk_theme .annotation { color: var(--accent-fg); } .sk_theme .omnibar_highlight { color: var(--accent-fg); } .sk_theme .omnibar_timestamp { color: var(--info-fg); } .sk_theme .omnibar_visitcount { color: var(--accent-fg); } .sk_theme #sk_omnibarSearchResult ul li:nth-child(odd) { background: var(--bg-dark); } .sk_theme #sk_omnibarSearchResult ul li.focused { background: var(--border); } .sk_theme #sk_omnibarSearchArea { border-top-color: var(--border); border-bottom-color: var(--border); } .sk_theme #sk_omnibarSearchArea input, .sk_theme #sk_omnibarSearchArea span { font-size: var(--font-size); } .sk_theme .separator { color: var(--accent-fg); } /* ---------- Popup Notification Banner ---------- */ #sk_banner { font-family: var(--font); font-size: var(--font-size); font-weight: var(--font-weight); background: var(--bg); border-color: var(--border); color: var(--fg); opacity: 0.9; } /* ---------- Popup Keys ---------- */ #sk_keystroke { background-color: var(--bg); } .sk_theme kbd .candidates { color: var(--info-fg); } .sk_theme span.annotation { color: var(--accent-fg); } /* ---------- Popup Translation Bubble ---------- */ #sk_bubble { background-color: var(--bg) !important; color: var(--fg) !important; border-color: var(--border) !important; } #sk_bubble * { color: var(--fg) !important; } #sk_bubble div.sk_arrow div:nth-of-type(1) { border-top-color: var(--border) !important; border-bottom-color: var(--border) !important; } #sk_bubble div.sk_arrow div:nth-of-type(2) { border-top-color: var(--bg) !important; border-bottom-color: var(--bg) !important; } /* ---------- Search ---------- */ #sk_status, #sk_find { font-size: var(--font-size); border-color: var(--border); } .sk_theme kbd { background: var(--bg-dark); border-color: var(--border); box-shadow: none; color: var(--fg); } .sk_theme .feature_name span { color: var(--main-fg); } /* ---------- ACE Editor ---------- */ #sk_editor { background: var(--bg-dark) !important; height: 50% !important; /* Remove this to restore the default editor size */ } .ace_dialog-bottom { border-top: 1px solid var(--bg) !important; } .ace-chrome .ace_print-margin, .ace_gutter, .ace_gutter-cell, .ace_dialog { background: var(--bg) !important; } .ace-chrome { color: var(--fg) !important; } .ace_gutter, .ace_dialog { color: var(--fg) !important; } .ace_cursor { color: var(--fg) !important; } .normal-mode .ace_cursor { background-color: var(--fg) !important; border: var(--fg) !important; opacity: 0.7 !important; } .ace_marker-layer .ace_selection { background: var(--select) !important; } .ace_editor, .ace_dialog span, .ace_dialog input { font-family: var(--font); font-size: var(--font-size); font-weight: var(--font-weight); }`; // click `Save` button to make above settings to take effect.