Skip to content

Instantly share code, notes, and snippets.

@llinfeng
Last active December 16, 2023 23:39
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save llinfeng/8e003b2107d7ab25e5daedc27c5730ae to your computer and use it in GitHub Desktop.
Save llinfeng/8e003b2107d7ab25e5daedc27c5730ae to your computer and use it in GitHub Desktop.
Greasemonkey Script with Forward search in Overleaf
// ==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)
})();
@llinfeng
Copy link
Author

llinfeng commented Apr 11, 2020

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> and imap jk <esc>;
  • \lv and ;lv are triggering the following button
    image
  • ,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.

  1. nmap and vmap;
  2. unmap certain special keys. (For now, ; and , are specially reserved for unknown purposes.)
  3. command! Short LongCommand, where :Short can be callable. And, in TamperMonkey, the LongCommand needs to be specified through JavaScript.

@llinfeng
Copy link
Author

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