// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/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)
// Plain browser env
else mod(CodeMirror)
})(function (CodeMirror) {
'use strict'
// default search panel location
CodeMirror.defineOption('search', { bottom: false })
function dialog(cm, text, shortText, deflt, f) {
if (cm.openDialog) cm.openDialog(text, f, { value: deflt, selectValueOnOpen: true, bottom: cm.options.search.bottom })
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'
})