Last active
December 16, 2023 23:39
-
-
Save llinfeng/8e003b2107d7ab25e5daedc27c5730ae to your computer and use it in GitHub Desktop.
Greasemonkey Script with Forward search in Overleaf
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name Overleaf Editor Custom VIM Keybindings | |
// @namespace http://tampermonkey.net/ | |
// @version 0.1 | |
// @match https://www.overleaf.com/project/* | |
// @grant none | |
// Source 1: https://groups.google.com/d/msg/ace-discuss/gwXMzUM17I4/9B_acHBSCQAJ | |
// Source 2: https://www.overleaf.com/learn/how-to/How_can_I_define_custom_Vim_macros_in_a_vimrc_file_on_Overleaf%3F | |
// ==/UserScript== | |
(function() { | |
'use strict'; | |
// poll until editor is loaded | |
const retry = setInterval(() => { | |
if (window._debug_editors === undefined) return | |
clearInterval(retry) | |
// get current editor instance | |
// get current editor instance | |
var editor = window._debug_editors[window._debug_editors.length -1] | |
// vim keyboard plugin | |
var vimKeyboard = window.ace.require("ace/keyboard/vim") | |
//////////////////////////////////////////////////////////// | |
// j k within long lines | |
vimKeyboard.Vim.map("j", "gj", "normal") | |
vimKeyboard.Vim.map("k", "gk", "normal") | |
// add custom keybindings - insert mode applies on insert | |
vimKeyboard.Vim.map("jj", "<Esc>", "insert") | |
// Equilivantly, from https://groups.google.com/d/msg/ace-discuss/gwXMzUM17I4/9B_acHBSCQAJ | |
// window.ace.require("ace/keyboard/vim").Vim.map('jj', '<Esc>', 'insert') | |
vimKeyboard.Vim.map("jk", "<Esc>", "insert") | |
//////////////////////////////////////////////////////////// | |
// Remapping one key to another is doable, in Normal mode | |
// `nmap h j` can be defined as the following: | |
// Though, why should this mapping be here anyways? It is just meant for demo purpose. | |
// vimKeyboard.Vim.map("h", "j", "normal") | |
// Define local commands ==> matching elements along with a identifier that matches. | |
// Maintenance note: if one hotkey/cmd does not work, check here for the matching HTML element. | |
editor.commands.addCommands([{ | |
name: "jumpToPdf", | |
exec: function() { | |
document.querySelector(".synctex-control-goto-pdf").click() | |
} | |
}, { | |
name: "VimtexTocToggle", | |
exec: function() { | |
document.querySelector('a[tooltip*="the file-tree"]').click() | |
} | |
}, { | |
name: "CloseComment", | |
exec: function() { | |
document.querySelector('a[class*="review-panel-toggler"]').click() | |
} | |
}, { | |
name: "TogglePDF", | |
exec: function() { | |
document.querySelector('a[tooltip*="the PDF"]').click() | |
} | |
}]) | |
// add keybindings for jump to pdf | |
vimKeyboard.Vim.mapCommand("\\v", "action", "aceCommand", | |
{ name: "VimtexTocToggle" }, { context: "normal" }); | |
vimKeyboard.Vim.mapCommand("\\lv", "action", "aceCommand", | |
{ name: "jumpToPdf" }, { context: "normal" }); | |
vimKeyboard.Vim.mapCommand("\\o", "action", "aceCommand", | |
{ name: "TogglePDF" }, { context: "normal" }); | |
// bind to ;lv | |
vimKeyboard.Vim.unmap(";") | |
vimKeyboard.Vim.unmap(",") | |
vimKeyboard.Vim.map(";lv", "\\lv", "normal") | |
vimKeyboard.Vim.map(",v", "\\v", "normal") | |
// Use ,o to activate two hotkeys: hide file-menu and hide PDF preview | |
vimKeyboard.Vim.map(",o", "\\v\\o", "normal") | |
vimKeyboard.Vim.defineEx("ShowPDF", "", ()=>editor.commands.exec("TogglePDF")) | |
vimKeyboard.Vim.defineEx("ClosePDF", "", ()=>editor.commands.exec("TogglePDF")) | |
vimKeyboard.Vim.defineEx("OpenPDF", "", ()=>editor.commands.exec("TogglePDF")) | |
vimKeyboard.Vim.defineEx("PDF", "", ()=>editor.commands.exec("TogglePDF")) | |
vimKeyboard.Vim.defineEx("pdf", "", ()=>editor.commands.exec("TogglePDF")) | |
// Close comment: CC, cc, CloseComment | |
vimKeyboard.Vim.defineEx("CloseComment", "", ()=>editor.commands.exec("CloseComment")) | |
vimKeyboard.Vim.defineEx("CC", "", ()=>editor.commands.exec("CloseComment")) | |
vimKeyboard.Vim.defineEx("cc", "", ()=>editor.commands.exec("CloseComment")) | |
// set the modified keyboard handler for editor | |
editor.setKeyboardHandler(vimKeyboard.handler) | |
console.log("Custom key bindings applied") | |
}, 100) | |
})(); |
The Violentmonkey add-on for Firefox does not let me to source from this Gist. The script will be updated on here instead.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Full Credits to Harutyun Amirjanyan for the jump-to-PDF script, as found on the Ace forum, in this post.
List of mappings defined in this gist.
imap jj <esc>
andimap jk <esc>
;\lv
and;lv
are triggering the following button,v
to toggle the file-tree on the left.:pdf
in Commandline, to toggle the PDF pane on the right. Alias include::PDF
,:ShowPDF
,:ClosePDF
,:OpenPDF
.cc
in Commandline, to toggle the Comment panel. Alias include::CC
,:CloseComment
.It should be plug-and-play, and include settings of the following sort.
nmap
andvmap
;unmap
certain special keys. (For now,;
and,
are specially reserved for unknown purposes.)command! Short LongCommand
, where:Short
can be callable. And, in TamperMonkey, theLongCommand
needs to be specified through JavaScript.