/* * ISC License * * Copyright (c) 2024 idnovate.com * idnovate is a Registered Trademark & Property of idnovate.com, innovación y desarrollo SCP * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. * * @author idnovate * @copyright 2024 idnovate * @license https://www.isc.org/licenses/ https://opensource.org/licenses/ISC ISC License */ // Defines jumpToLine command. Uses dialog.js if present. (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../dialog/dialog")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../dialog/dialog"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; function dialog(cm, text, shortText, deflt, f) { if (cm.openDialog) cm.openDialog(text, f, {value: deflt, selectValueOnOpen: true}); else f(prompt(shortText, deflt)); } function getJumpDialog(cm) { return cm.phrase("Jump to line:") + ' ' + cm.phrase("(Use line:column or scroll% syntax)") + ''; } function interpretLine(cm, string) { var num = Number(string) if (/^[-+]/.test(string)) return cm.getCursor().line + num else return num - 1 } CodeMirror.commands.jumpToLine = function(cm) { var cur = cm.getCursor(); dialog(cm, getJumpDialog(cm), cm.phrase("Jump to line:"), (cur.line + 1) + ":" + cur.ch, function(posStr) { if (!posStr) return; var match; if (match = /^\s*([\+\-]?\d+)\s*\:\s*(\d+)\s*$/.exec(posStr)) { cm.setCursor(interpretLine(cm, match[1]), Number(match[2])) } else if (match = /^\s*([\+\-]?\d+(\.\d+)?)\%\s*/.exec(posStr)) { var line = Math.round(cm.lineCount() * Number(match[1]) / 100); if (/^[-+]/.test(match[1])) line = cur.line + line + 1; cm.setCursor(line - 1, cur.ch); } else if (match = /^\s*\:?\s*([\+\-]?\d+)\s*/.exec(posStr)) { cm.setCursor(interpretLine(cm, match[1]), cur.ch); } }); }; CodeMirror.keyMap["default"]["Alt-G"] = "jumpToLine"; });