/vi.js
JavaScript | 3883 lines | 3671 code | 136 blank | 76 comment | 674 complexity | c1ae2ce7d6cb1908c44538eecb70e1fa MD5 | raw file
- /*
- JSVI - VI in JavaScript.
- Copyright (C) 2006-2008 Internet Connection, Inc.
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
- var jsvi = (function () {
- var version = '1.0',
- emacsen = false,
- term_cols,
- term_rows,
- term_win_width,
- term_win_height,
- term_cur_width,
- tools,
- suggest,
- backing,
- tagstyle = 0,
- line_height = 0,
- cclick,
- mode = 0,
- accum = 0,
- lastaccum = 0,
- marks = {},
- registers = {},
- lastreg = '',
- lastcommand,
- lastmotion,
- cursoriv,
- drawiv,
- printer,
- term,
- base = 0,
- left = 0,
- vselm = 0,
- vselx,
- vsely,
- vseld = false,
- lastkey,
- statustext = '',
- command = '',
- oldcommand = '',
- commandleft = 0,
- savex, savey,
- once = true,
- cursorx, cursory,
- file = [],
- tags = [],
- palette,
- cursor,
- yank_buffer,
- term_save_h = [],
- term_save_ss,
- term_save_mc,
- term_save_kd,
- term_save_kp,
- term_save_rs,
- term_save_op,
- lastsearch,
- lastsubst,
- lastflags,
- undoset,
- undoline,
- undoy = -1,
- term_ex_motion,
- vi_ft_reg,
- viflags = '',
- lastinsert = '',
- spelling = false,
- spellcheck = {},
- safewords = {},
- brokenwords = {},
- suggestions = {},
- doing_backing_paste = false;
- safewords['jsvi'] = true;
- safewords['javascript'] = true;
- safewords['URL'] = true;
- safewords['hyperlinks'] = true;
- safewords['HTML'] = true;
- safewords['UNIX'] = true;
- safewords['Firefox'] = true;
- safewords['MSIE'] = true;
- safewords['Ctrl'] = true;
- safewords['vi'] = true;
- safewords['vi-keys'] = true;
- safewords[':hardcopy'] = true;
- safewords['unicode-aware'] = true;
- safewords['developer-centric'] = true;
- function _cbrestore() {
- var i, z;
- for (i = 0; i < term_save_h.length; i++) {
- z = term_save_h[i];
- z();
- }
- term_save_h = [];
- }
- function _cbw(nx, ny) {
- var nz = window['on' + nx];
- (function (x, y, z) {
- term_save_h[term_save_h.length] = function () {
- window['on' + x] = z;
- };
- }(nx, ny, nz));
- window['on' + nx] = ny;
- }
- function _cbd(nx, ny) {
- var nz = document['on' + nx];
- (function (x, y, z) {
- term_save_h[term_save_h.length] = function () {
- document['on' + x] = z;
- };
- }(nx, ny, nz));
- document['on' + nx] = ny;
- }
- function _rer(re, t, aa) {
-
- if (RegExp.rightContext !== undefined) {
- return RegExp.rightContext;
- }
- var s, j;
- // emulate rightContext
- s = re.toString();
- if ((s.substr(0, 2) === '/^' && s.substr(s.length - 1, 1) === '/') || s.substr(0, 1) === '^') {
- // bound at beginning
- return t.substr(aa[0].length, t.length - aa[0].length);
- }
- if ((s.substr(0, 1) === '/' && s.substr(s.length - 2, 2) === '$/') || s.substr(s.length - 1, 1) === '$') {
- // bound at end
- return "";
- }
- j = t.lastIndexOf(aa[0]);
- if (j !== -1) {
- return t.substr(j.t.length - j);
- }
- return t;
- }
- function _rel(re, t, aa) {
- if (RegExp.leftContext !== undefined) {
- return RegExp.leftContext;
- }
- var s, j;
- // emulate leftContext
- s = re.toString();
- if ((s.substr(0, 2) === '/^' && s.substr(s.length - 1, 1) === '/') || s.substr(0, 1) === '^') {
- // bound at beginning
- return "";
- }
- if ((s.substr(0, 1) === '/' && s.substr(s.length - 2, 2) === '$/') || s.substr(s.length - 1, 1) === '$') {
- // bound at end
- return t.substr(0, t.length - aa[0].length);
- }
- j = t.indexOf(aa[0]);
- if (j !== -1) {
- return t.substr(0, j);
- }
- return "";
- }
- function _hra(x) {
- var i,
- cx = 0,
- t = '',
- g = '',
- x3, gx,
- aa = [];
- for (i = 0; i < x.length; i++) {
- x3 = x.substr(i, 3);
- gx = String.fromCharCode(cx);
- if (x3 === '<b>') {
- cx = cx | 1;
- i += 2;
- } else if (x3 === '</b') {
- cx = (cx | 1) ^ 1;
- i += 3;
- } else if (x3 === '<u>') {
- cx = cx | 2;
- i += 2;
- } else if (x3 === '</u') {
- cx = (cx | 2) ^ 2;
- i += 3;
- } else if (x3 === '<i>') {
- cx = cx | 16;
- i += 2;
- } else if (x3 === '</i') {
- cx = (cx | 16) ^ 16;
- i += 3;
- } else if (x3 === '<sp') { // <span class="rv">
- cx = cx | 4;
- i += 16;
- } else if (x3 === '</s') { // </span>
- cx = (cx | 4) ^ 4;
- i += 6;
- } else if (x3 === '&am') { // &
- t += '&';
- g += gx;
- i += 4;
- } else if (x3 === '<') { // <
- t += '<';
- g += gx;
- i += 3;
- } else {
- t += x.substr(i, 1);
- g += gx;
- }
- }
- aa[0] = t;
- aa[1] = g;
- return aa;
- }
- function _rtf(t, g) {
- var cx = 0,
- i,
- o = '',
- gx, tx;
- if (t === undefined) {
- t = '';
- g = '';
- }
- for (i = 0; i < t.length; i++) {
- gx = g.substr(i, 1).charCodeAt(0);
- tx = t.substr(i, 1);
- if (tx === "<") {
- tx = "<";
- }
- else if (tx === '&') {
- tx = '&';
- }
- if (gx !== cx) {
- if ((gx & 1) && !(cx & 1)) {
- o += "<b>";
- } else if (!(gx & 1) && (cx & 1)) {
- o += "</b>";
- }
- if ((gx & 2) && !(cx & 2)) {
- o += "<u>";
- } else if (!(gx & 2) && (cx & 2)) {
- o += "</u>";
- }
- if ((gx & 4) && !(cx & 4)) {
- o += "<span class=\"rv\">";
- } else if (!(gx & 4) && (cx & 4)) {
- o += "</span>";
- }
- if ((gx & 16) && !(cx & 16)) {
- o += "<i>";
- } else if (!(gx & 16) && (cx & 16)) {
- o += "</i>";
- }
- cx = gx;
- }
- o += tx;
- }
- return o;
- }
- function _rtfl(y) {
- return _rtf(file[y], tags[y]);
- }
- function _dfx(q) {
- /*@cc_on @*/
- /*@if (1) return
- @end @*/
- q.style.position = 'fixed';
- }
- function term_freeze() {
- var i,
- o = '';
- for (i = 0; i < file.length; i++) {
- o += _rtfl(i) + "\n";
- }
- return o;
- }
- function _term_update_printer() {
- var i,
- o = '';
- for (i = 0; i < file.length; i++) {
- o += _rtfl(i) + "<br/>";
- }
- printer.innerHTML = o;
- }
- function term_thaw(s) {
- var a = s.split("\n"),
- i,
- aa,
- o = '';
- file = [];
- tags = [];
- for (i = 0; i < a.length; i++) {
- o += a[i] + "<br/>";
- aa = _hra(a[i]);
- file[i] = aa[0];
- tags[i] = aa[1];
- }
- printer.innerHTML = o;
- }
- function _mxo(z, y) {
- var i,
- o = '';
- for (i = 0; i < z.length; i++) {
- o += String.fromCharCode(z.substr(i, 1).charCodeAt(0) | y);
- }
- return o;
- }
- function _mxs(n, y) {
- var z = String.fromCharCode(y),
- i,
- o = '';
- for (i = 0; i < n; i++) {
- o += z;
- }
- return o;
- }
- function _zeros(n) {
- return _mxs(n, 0);
- }
- function _fauc() {
- var d = document.getElementsByTagName('A'),
- i, j;
- for (i = 0; i < d.length; i++) {
- j = d[i];
- if (j._len && j._term) {
- if (j._row === (base + cursory) && (left + cursorx) >= j._col && (left + cursorx) <= (j._col + j._len)) {
- return j;
- }
- }
- }
- return undefined;
- }
- function _pass_click(e) {
- var z = _fauc();
- if (z && z.onclick) {
- return z.onclick();
- }
- return false;
- }
- function _pass_dblclick(e) {
- var z = _fauc();
- if (z && z.ondblclick) {
- return z.ondblclick();
- }
- return false;
- }
- function _cancel_ev(e) {
- if (!e) {
- e = window.event;
- }
- if (!e) {
- return false;
- }
- if (e.preventDefault) {
- e.preventDefault();
- }
- if (e.stopPropagation) {
- e.stopPropagation();
- }
- return false;
- }
- function _word(s) {
- var t = s.replace(/[.?!,:]*$/, "");
- if (t) {
- s = t;
- }
- t = s.replace(/[ \r\n\t]/, "");
- if (t) {
- s = t;
- }
- return s;
- }
- function _safe(s) {
- if (s.match(/^[ \r\n\t]*<.*>[ \r\n\t]*$/)) {
- return true;
- }
- return false;
- }
- function _calcy(zx, x, g) {
- if (zx && cursor._lasty !== cursory) {
- cursor._lasty = cursory;
- var nh = 0;
- while (zx && zx !== document.body) {
- nh += zx.offsetTop;
- zx = zx.offsetParent;
- }
- cursor.style.top = nh + 'px';
- }
- var z = x.substr(cursorx, 1);
- var q = g.substr(cursorx, 1).charCodeAt(0);
- if (cursorx >= x.length || z === undefined || z === "\240" || z === '') {
- z = ' ';
- }
-
- if (cursor._lastch !== z || cursor._lastgh !== q) {
- if (z === ' ') {
- z = "\240";
- q = 0;
- }
- while (cursor.firstChild) {
- cursor.removeChild(cursor.firstChild);
- }
- cursor.appendChild(document.createTextNode(z));
- cursor._lastch = z;
- cursor._lastgh = q;
- if (q & 1) {
- cursor.style.fontWeight = 'bold';
- } else {
- cursor.style.fontWeight = 'normal';
- }
- if (q & 2) {
- cursor.style.textDecoration = 'underline';
- } else {
- cursor.style.textDecoration = 'none';
- }
- if (q & 16) {
- cursor.style.fontStyle = 'italic';
- } else {
- cursor.style.fontStyle = 'normal';
- }
- }
- }
- function _redraw_term() {
- var h = term_rows,
- w = term_cols,
- ka, kb,
- tospell = 0,
- osp = '',
- y,
- tago = [],
- isurl = [],
- ca, cb,
- sa, sb,
- qp, zx;
- if (vselm) {
- sa = vsely - base;
- sb = cursory;
- if (sa > sb) {
- zx = sa;
- sa = sb;
- sb = zx;
- }
- ca = vselx - left;
- cb = cursorx;
- if (ca > cb) {
- zx = ca;
- ca = cb;
- cb = zx;
- }
- }
- for (y = 0; y < h; y++) {
- ka = '';
- kb = '';
- var x = file[y + base],
- g,
- zleft = 0,
- cx,
- j, vj;
- if (y === (h - 1)) {
- if (cursory === y) {
- zleft = commandleft;
- x = command;
- cx = 0;
- statustext = '';
- } else if (emacsen) {
- x = '[' + (mode === 1 ? 'Ins' : 'Ovr') + '] ' + statustext;
- while (x.length < w) {
- x += ' ';
- }
- cx = 4;
- } else if (vselm === 1) {
- cx = 1;
- x = '-- VISUAL --';
- statustext = '';
- } else if (vselm === 2) {
- cx = 1;
- x = '-- VISUAL LINE --';
- statustext = '';
- } else if (mode === 0) {
- x = statustext;
- cx = 16;
- } else if (mode === 1) {
- cx = 1;
- x = '-- INSERT --';
- statustext = '';
- } else if (mode === 2) {
- cx = 1;
- x = '-- REPLACE --';
- statustext = '';
- }
- g = _mxs(x.length, cx);
- } else if (x === undefined) {
- x = '~';
- g = "\010";
- } else {
- zleft = left;
- g = tags[y + base];
- // do spellchecking
- var p = 0;
- vj = x.split(/[ ,;]+/);
- for (j = 0; j < vj.length; j++) {
- var vx = vj[j];
- var vm = _word(vx);
- if (j !== 0) {
- p++;
- }
- if (vx.match(/^(https?|ftp):\/\//)) {
- g = g.substr(0, p)
- + _mxo(g.substr(p, vx.length), ((1 + tago.length) * 256))
- + g.substr(p + vx.length);
- isurl[tago.length] = true;
- tago[tago.length] = vx;
- } else if (brokenwords[vm] && !safewords[vm]) {
- g = g.substr(0, p)
- + _mxo(g.substr(p, vx.length), ((1 + tago.length) * 256))
- + g.substr(p + vx.length);
- isurl[tago.length] = false;
- tago[tago.length] = vx;
- } else {
- if (vm.length > 3 && !_safe(vm) && !safewords[vm] && !spelling) {
- tospell++;
- osp += escape("c" + tospell) + "="
- + escape(vm) + "&";
- spellcheck[tospell] = vm;
- }
- }
- p += vx.length;
- }
- }
- if (x === undefined) {
- x = '';
- g = '';
- }
- // truncate as necessary
- x = x.substr(zleft, x.length - zleft);
- g = g.substr(zleft, g.length - zleft);
- if (x.length >= w) {
- x = x.substr(0, w);
- g = g.substr(0, w);
- }
- if (vselm) {
- if (vselm === 1 && sa === sb && sa === y) {
- // middle of line between ca->cb is selected
- g = g.substr(0, ca) + _mxo(g.substr(ca, (cb - ca) + 1), 4) + g.substr(cb, (g.length - cb) - 1);
- } else if ((sa < y && sb > y) || (vselm === 2 && (sa <= y && sb >= y))) {
- // entire line selected
- g = _mxo(g, 4);
- } else if (sa < y && sb === y) {
- // beginning of line selected (up to q)
- // if (sb is cursory) then q = cursorx otherwise vselx
- qp = (sb === cursory) ? cursorx : (vselx - left);
- g = _mxo(g.substr(0, qp + 1), 4) + g.substr(qp, (g.length - qp) - 1);
- } else if (sa === y && sb > y) {
- // end of line selected (beginning at q)
- // if (sa is cursory) then q = cursorx otherwise vselx
- qp = (sa === cursory) ? cursorx : (vselx - left);
- g = g.substr(0, qp) + _mxo(g.substr(qp, g.length - qp), 4);
- }
- }
- vj = 0;
- g += "\377"; // terminate
- x += " ";
- x = x.replace(/ /g, "\240");
- if (term.childNodes.length > y) {
- zx = term.childNodes[y];
- if (zx._cachex === x && zx._cacheg === g) {
- if (y === cursory) {
- _calcy(zx, x, g);
- }
- continue;
- }
- // as a last ditch effort- to accelerate deletions...
- // and inserts...
- if (term.childNodes.length > (y + 1)) {
- var zy = term.childNodes[y + 1];
- if (zy._cachex === x && zy._cacheg === g) {
- // okay then, so the NEXT line is the winner
- // copy its nodes
- term.removeChild(zy);
- term.replaceChild(zy, zx);
- if (zy.nextSibling) {
- term.insertBefore(zx, zy.nextSibling);
- } else {
- term.appendChild(zx);
- }
- if (y === cursory) {
- _calcy(zy, x, g);
- }
- continue;
- }
- }
- // update
- while (zx.firstChild) {
- zx.removeChild(zx.firstChild);
- }
- } else {
- zx = document.createElement('PRE');
- zx.style.display = 'block';
- zx.style.fontFamily = 'monospace';
- zx.style.fontSize = '100%';
- _zmp(zx);
- zx.style.marginBottom = '1px';
- }
- cx = 255;
- var ax = zx;
- for (j = 0; j < x.length; j++) {
- var gx = g.charCodeAt(j);
- if (gx !== cx) {
- if (j !== vj && ax) {
- var t = x.substr(vj, (j - vj));
- if (!t) t = '';
- ax.appendChild(document.createTextNode(t));
- if (zx !== ax) zx.appendChild(ax);
- vj = j;
- }
- if (gx > 255) {
- var wx = parseInt(gx / 256) - 1;
- ax = document.createElement('A');
- if (isurl[wx]) {
- ax.style.borderBottom = '1px double blue';
- ax.href = tago[wx];
- ax.target = '_new';
- ax.ondblclick = _openurl;
- } else {
- ax.style.borderBottom = '1px dashed red';
- ax.href = 'javascript:void(0)';
- ax.ondblclick = _suggest;
- }
- ax._term = _word(tago[wx]);
- ax._len = tago[wx].length;
- ax._row = y + base;
- ax._col = j + zleft;
- ax.onclick = _subclick;
- } else {
- ax = document.createElement('SPAN');
- }
- if (gx === 255) gx = 0;
- if (gx & 1) {
- ax.style.fontWeight = 'bold';
- } else {
- ax.style.fontWeight = 'normal';
- }
- if (gx & 2) {
- ax.style.textDecoration = 'underline';
- } else {
- ax.style.textDecoration = 'none';
- }
- if (gx & 4) { // reverse video
- ax.style.color = palette[1];
- ax.style.backgroundColor = palette[0];
- } else {
- ax.style.color = palette[0];
- ax.style.backgroundColor = palette[1];
- }
- if (gx & 8) { // unselectable
- ax.unselectable = true;
- if (ax.setAttribute) ax.setAttribute('unselectable', 'on');
- ax.style.color = palette[0];
- ax.style.backgroundColor = palette[1];
- ax.style.userSelect = 'none';
- ax.style['-moz-user-select'] = 'none';
- }
- if (gx & 16) {
- ax.style.fontStyle = 'italic';
- } else {
- ax.style.fontStyle = 'normal';
- }
- cx = gx;
- }
- }
- if (j !== vj) {
- var t = x.substr(vj, (j - vj) - 1);
- ax.appendChild(document.createTextNode(t));
- if (zx !== ax) zx.appendChild(ax);
- vj = j;
- }
- ax.appendChild(document.createTextNode("\240"));
- zx._cachex = x;
- zx._cacheg = g;
- if (term.childNodes.length <= y) {
- term.appendChild(zx);
- }
- if (y === 1) {
- var qx = zx;
- var nh = 0;
- while (qx && qx !== document.body) {
- nh += qx.offsetTop;
- qx = qx.offsetParent;
- }
- if (nh !== line_height) {
- line_height = nh;
- term_resize();
- }
- }
- if (y === cursory) {
- _calcy(zx, x, g);
- }
- ax = undefined; // break;
- }
- while (term.childNodes.length > h) {
- term.removeChild(term.lastChild);
- }
- zx = undefined; // break
- if (!spelling && tospell > 0) {
- spelling = true;
- var xh = new XMLHttpRequest();
- osp = osp.substr(0, osp.length - 1);
- xh.open("GET", "spell.cgi?" + osp, true);
- xh.onreadystatechange = function () {
- if (xh.readyState === 4) {
- var j;
- var a = xh.responseText.split("\n");
- for (j = 0; j < a.length; j++) {
- var kp = a[j].split("=", 2);
- var k, v;
- if (kp.length === 2) {
- k = kp[0];
- v = kp[1];
- } else if (kp.length === 1) {
- k = kp[0];
- v = '';
- } else {
- k = a[j];
- v = '';
- }
- if (k.substr(0, 1) !== 'c') continue;
- k = k.substr(1, k.length - 1);
- var term = spellcheck[k];
- if (v === undefined || v === '') {
- brokenwords[term] = true;
- suggestions[term] = [];
- } else if (v === term) {
- safewords[term] = true;
- } else {
- safewords[v] = true;
- if (!suggestions[term]) {
- suggestions[term] = [];
- }
- suggestions[term][ suggestions[term].length ] = v;
- brokenwords[term] = true;
- }
- }
- spelling = false;
- window.setTimeout(term_redraw, 10);
- xh = undefined; // break (deferred)
- }
- };
- //HACK: Too this out, replace with an actual app :)
- //xh.send(undefined);
- }
- if (cursory === (h - 1)) {
- tools.style.display = 'none';
- } else {
- tools.style.display = 'block';
- }
- _update_backing();
- }
- function _redraw_term_back() {
- drawiv = undefined;
- _redraw_term();
- term_draw_cursor();
- }
- function term_redraw() {
- if (drawiv) {
- window.clearTimeout(drawiv);
- }
- drawiv = window.setTimeout(_redraw_term_back, 10);
- }
- function _cursortoxy(x, y) {
- // this is a little gross...
- var sx = cursorx,
- sy = cursory;
- cursorx = parseInt(x / term_cur_width, 10);
- term_redraw();
- cursory = _yaty(y);
- if (cursory >= (term_rows - 1)) {
- cursory = sy;
- cursorx = sx;
- sy = 0;
- }
- term_scrollto();
- term_calcx();
- if (cursory !== sy) {
- term_redraw();
- } else {
- term_calcy();
- }
- _update_backing();
- return true;
- }
- function _willclick(e) {
- if (window.event) {
- if (!e) {
- e = window.event;
- }
- }
- if (!e) {
- return true;
- }
- if (cclick !== undefined) {
- window.clearTimeout(cclick);
- }
- var x = e.clientX,
- y = e.clientY;
- cclick = window.setTimeout(function () {
- cclick = undefined;
- _cursortoxy(x, y);
- }, 200);
- return false;
- }
- function _subclick(e) {
- return _willclick(e);
- }
- function term_save_undo() {
- undoset = term_freeze();
- }
- function _srep(e) {
- if (!e) {
- e = window.event;
- }
- if (e.preventDefault) {
- e.preventDefault();
- }
- if (e.stopPropagation) {
- e.stopPropagation();
- }
- e.cancelBubble = true;
- var y = this._row,
- x = this._col,
- len = this._len,
- rep = this._word,
- t = (file[y]),
- g = (tags[y]),
- w = (t.substr(x, len)),
- st = (g.substr(x, len));
- while (st.length < rep.length) {
- st = st + st;
- }
- if (st.length > rep.length) {
- st = st.substr(0, rep.length);
- }
- term_save_undo(); // save undo!
- file[y] = t.substr(0, x) + rep + t.substr(x + len, t.length - (x + len));
- tags[y] = g.substr(0, x) + st + g.substr(x + len, t.length - (x + len));
- suggest.style.display = 'none';
- suggest._visible = false;
- while (suggest.firstChild) {
- suggest.removeChild(suggest.firstChild);
- }
- if (w === rep) {
- statustext = '';
- } else {
- statustext = 'Replaced "' + w + '" with "' + rep + '"';
- }
- term_redraw();
- return false;
- }
- function _rl(w, h) {
- var x = document.createElement('DIV');
- x.style.overflow = 'hidden';
- x.style.height = h + 'px';
- x.style.marginLeft = w + 'px';
- x.style.marginRight = w + 'px';
- x.style.backgroundColor = palette[0];
- x.style.display = 'block';
- x.style.innerHTML = ' ';
- x.style.fontFamily = 'monospace';
- return x;
- }
- function _ruo(t) {
- this.style.color = palette[0];
- this.style.backgroundColor = palette[1];
- }
- function _rux(t) {
- this.style.color = palette[1];
- this.style.backgroundColor = palette[0];
- }
- function _openurl(e) {
- var u = this._term;
- window.open(u, '_new');
- return true;
- }
- function _suggest(e) {
- var z = this;
- if (window.event) {
- if (!e) {
- e = window.event;
- }
- }
- if (e) {
- if (e.preventDefault) {
- e.preventDefault();
- }
- if (e.stopPropagation) {
- e.stopPropagation();
- }
- e.cancelBubble = true;
- }
- (function (q) {
- window.setTimeout(function () {
- _dosuggest(q);
- }, 10);
- }(z));
- return false;
- }
- function _dosuggest(z) {
- var x = 0,
- y = 0,
- xt = z._term,
- wrow = z._row,
- wcol = z._col,
- wlen = z._len,
- sg, sa, i, fs, fd, bf, da;
- while (z && z !== document.body) {
- x += z.offsetLeft;
- y += z.offsetTop;
- z = z.offsetParent;
- }
- suggest._visible = true;
- suggest.style.top = y + 'px';
- suggest.style.left = x + 'px';
- suggest.style.display = 'block';
- suggest.style.zIndex = '3';
- suggest.style.padding = '2px';
- while (suggest.firstChild) {
- suggest.removeChild(suggest.firstChild);
- }
- sg = document.createElement('DIV');
- sg.style.backgroundColor = palette[0];
- sg.style.color = palette[1];
- sg.style.fontSize = '100%';
- sg.style.padding = '2px';
- sg.style.textAlign = 'center';
- sg.style.cursor = 'default';
- sa = suggestions[xt];
- fs = 200;
- fd = parseInt((100 / sa.length) * 1.5);
- for (i = 0; i < sa.length; i++) {
- da = document.createElement('A');
- da.href = 'javascript:void(0)';
- da.onclick = _srep;
- da._word = sa[i];
- da._row = wrow;
- da._col = wcol;
- da._len = wlen;
- da.onmouseover = _ruo;
- da.onmouseout = _rux;
- da.style.margin = '4px';
- da.style.textDecoration = 'none';
- da.style.display = 'block';
- da.style.color = palette[1];
- da.style.backgroundColor = palette[0];
- da.style.fontSize = fs + '%';
- fs -= fd;
- if (fs <= 100) {
- fs = 100;
- }
- da.appendChild(document.createTextNode(sa[i]));
- // err...
- da.appendChild(document.createElement('BR'));
- if ((wrow - base) > term_rows - (sa.length + 1)) {
- sg.insertBefore(da, sg.firstChild);
- bf = true;
- } else if (((i % 2) === 0) || (wrow < (sa.length + 1))) {
- sg.appendChild(da);
- } else {
- sg.insertBefore(da, sg.firstChild);
- }
- da = undefined; // break
- }
- if (sa.length === 0) {
- sg.appendChild(document.createTextNode('No matches'));
- }
- var da = document.createElement('A');
- da.href = 'javascript:void(0)';
- da.onclick = _srep;
- da._word = xt;
- da._row = wrow;
- da._col = wcol;
- da._len = wlen;
- da.style.margin= '4px';
- da.style.textDecoration = 'none';
- da.style.color = palette[1];
- da.style.backgroundColor = palette[0];
- da.style.borderBottom = '1px dashed red';
- da.style.fontSize = '100%';
- da.onmouseover = _ruo;
- da.onmouseout = _rux;
- da.appendChild(document.createTextNode(xt));
- if (wrow > term_rows - (sa.length + 1)) {
- sg.insertBefore(da, sg.firstChild);
- } else {
- sg.appendChild(da);
- }
- // rounded top and bottom
- suggest.appendChild(_rl(3, 1));
- suggest.appendChild(_rl(2, 1));
- suggest.appendChild(_rl(1, 2));
- suggest.appendChild(sg);
- suggest.appendChild(_rl(1, 2));
- suggest.appendChild(_rl(2, 1));
- suggest.appendChild(_rl(3, 1));
- // msie needs to recalculate these things manually... grr...
- // this doesn't work because msie doesn't calculate offsetwidth (thtphtpht)
- var zq;
- var mw = 11;
- if (mw < xt.length) {
- mw = xt.length;
- }
- for (i = 0; i < sa.length; i++) {
- if (mw < sa[i].length) {
- mw = sa[i].length;
- }
- }
- if (mw) {
- mw *= (term_cur_width*2);
- mw += 16;
- suggest.style.width = mw + 'px';
- }
- var sx = parseInt(sg.offsetWidth / 4);
- if (x < sx) {
- x = 0;
- } else {
- x -= sx;
- suggest.style.left = x + 'px';
- }
- var sy = parseInt(sg.offsetHeight / 4);
- if (bf) {
- suggest.style.top = '';
- suggest.style.bottom = '0px';
- } else if (y < sy) {
- y = 0;
- suggest.style.top = '0px';
- suggest.style.bottom = '';
- } else {
- y -= sy;
- suggest.style.top = y + 'px';
- suggest.style.bottom = '';
- }
- statustext = 'Suggestions for: ' + xt;
- term_redraw();
- da = undefined; // break
- sg = undefined; // break
- }
- function _backing_paste_real() {
- doing_backing_paste = false;
- term_redraw();
- if (!backing.value) {
- return;
- }
- if (backing._lastvalue === backing.value) {
- return;
- }
- backing._lastvalue = backing.value;
- term_paste(false, backing.value);
- term_redraw();
- }
- function _msie_paste() {
- var chunk = "new content associated with this object";
- event.returnValue = false;
- term_paste(false, window.clipboardData.getData("Text", chunk));
- }
- function _backing_paste() {
- _update_backing();
- if (!doing_backing_paste) {
- doing_backing_paste = true;
- window.setTimeout(_backing_paste_real, 10);
- }
- }
- function _update_backing() {
- if (!backing) {
- return;
- }
- /*@cc_on @*/
- /*@if (1) return
- @end @*/
- backing.focus();
- backing.select();
- }
- function _yaty(y) {
- if (line_height) {
- return parseInt(y/line_height);
- }
- var zx;
- var qx = term.firstChild;
- var nh = 0;
- while (qx && qx !== document.body) {
- nh += qx.offsetTop;
- qx = qx.offsetParent;
- }
- var ny = 0;
- var cy = 0;
- for (zx = term.firstChild; zx; zx = zx.nextSibling) {
- nh += (zx.offsetHeight + 4);
- if (y <= nh) {
- cy = ny;
- break;
- }
- ny++;
- }
- return cy;
- }
- function _mousescroll(e) {
- if (!e) {
- e = window.event;
- }
- var d = 0;
- if (e.wheelDelta) {
- d = e.wheelDelta;
- d = d < 0 ? 1 : -1;
- } else if (e.detail) {
- d = e.detail;
- } else {
- return true;
- }
- if (d < 0) {
- if (base > 0) {
- base--;
- }
- } else if (d > 0) {
- if (base < (file.length - (term_rows - 1))) {
- base++;
- }
- }
- term_redraw();
- return false;
- }
- function _mousedown(e) {
- if (suggest._visible) {
- return true;
- }
- if (!e) {
- e = window.event;
- }
- var y = _yaty(e.clientY);
- if (y >= (term_rows - 1)) {
- return true;
- }
- _willclick(e);
- vseld = true;
- vselm = 0;
- vselx = undefined;
- vsely = undefined;
- return false;
- }
- function _mousemove(e) {
- if (!e) e = window.event;
- if (e) {
- if (e.preventDefault) e.preventDefault();
- if (e.stopPropagation) e.stopPropagation();
- e.cancelBubble= true;
- }
- if (window.getSelection) {
- var s = window.getSelection();
- if (s.removeAllRanges) s.removeAllRanges();
- }
- if (document.selection && document.selection.empty) {
- eval('try{document.selection.empty();}catch(e){}');
- }
- // fixup selection
- _update_backing();
- if (suggest._visible || !vseld) return true;
- if (vseld) {
- if (vselx === undefined && vsely === undefined) {
- // turn on v here
- vselm = 1;
- vselx = cursorx + left;
- vsely = cursory + base;
- }
- _willclick(e);
- return true;
- }
- return true;
- }
- function _mouseup(e) {
- if (suggest._visible || !vseld) {
- return true;
- }
- vseld = false;
- if (vselm && vselx !== undefined && vsely !== undefined) {
- // okay, we HAVE selection
- var rr = lastreg;
- lastreg = '*';
- term_vi_set('y');
- term_vi_unset('d');
- term_select();
- term_operate();
- lastreg = rr;
- } else {
- vselm = 0;
- }
- _willclick(e);
- return false;
- }
- function _mouseclick(e) {
- e = e || window.event;
- var y = _yaty(e.clientY);
- if (y >= (term_rows - 1)) {
- return true;
- }
- vselm = 0;
- _cursorto(e);
- return true;
- }
- function _cursorto(e) {
- e = e || window.event;
- var x = e.clientX;
- var y = e.clientY;
- if (suggest._visible) {
- suggest.style.display = 'none';
- suggest._visible = false;
- statustext = '';
- }
- return _cursortoxy(x, y);
- }
- function term_setmode(n) {
- mode = n;
- lastinsert = '';
- }
- function term_roll_yank() {
- registers["9"] = registers["8"];
- registers["8"] = registers["7"];
- registers["7"] = registers["6"];
- registers["6"] = registers["5"];
- registers["5"] = registers["4"];
- registers["4"] = registers["3"];
- registers["3"] = registers["2"];
- registers["2"] = registers["1"];
- registers["1"] = registers["0"];
- if (lastreg === '0') {
- registers[""] = yank_buffer;
- }
- if (lastreg === "" || lastreg === "*") {
- backing._lastvalue = yank_buffer;
- backing.value = yank_buffer;
- }
- registers["0"] = yank_buffer;
- }
- function term_justify() {
- var y = cursory + base;
- var i;
- if (!accum) accum = 1;
- var t = (file[y]);
- file[p] = t.replace(/[ ][ ]*$/,"");
- tags[p] = tags[p].substr(0, file[p].length);
- for (i = 0; i < accum; i++) {
- var t = file[i + y + 1];
- var g = tags[i + y + 1];
- term_delete(i + y + 1); // ignore return
- t = t.replace(/^[ ][ ]*/,"");
- g = g.substr(g.length - t.length, t.length);
- if (t !== '') {
- file[y] = file[y] + " " + t;
- tags[y] = tags[y] + "\0" + g;
- }
- }
- file[y] = file[y].replace(/^[ ][ ]*/,"");
- tags[y] = tags[y].substr(tags[y].length - file[y].length, file[y].length);
- accum = 0;
- }
- function term_vi_bb() {
- return term_skipbackward(/[ ][^ ][^ ]*[ ]*$/);
- }
- function term_vi_b() {
- return term_skipbackward(/[^a-zA-Z0-9_][a-zA-Z0-9_][a-zA-Z0-9_]*[^a-zA-Z0-9_]*$/);
- }
- function term_vi_tt() {
- var t = (file[cursory + base]);
- var i;
- var w = term_cols;
- for (i = (cursorx + left) - 1; i >= 0; i--) {
- var c = (t.substr(i, 1));
- if (c === vi_ft_reg) {
- cursorx = (i - left) + 1;
- if (cursorx >= w) {
- left = 0;
- cursorx = i + 1;
- }
- return true;
- }
- }
- return false;
- }
- function term_vi_t() {
- var t = (file[cursory + base]);
- var i;
- for (i = (cursorx + left) + 1; i < t.length; i++) {
- var c = (t.substr(i, 1));
- if (c === vi_ft_reg) {
- cursorx = (i - left) - 1;
- if (term_vi_flag('d') || term_vi_flag('c') || term_vi_flag('y')) cursorx++;
- if (cursorx < 0) {
- left = 0;
- cursorx = i - 1;
- }
- return true;
- }
- }
- return false;
- }
- function term_vi_ff() {
- var t = (file[cursory + base]);
- var i;
- for (i = (cursorx + left) - 1; i >= 0; i--) {
- var c = (t.substr(i, 1));
- if (c === vi_ft_reg) {
- cursorx = i - left;
- if (cursorx < 0) {
- left = 0;
- cursorx = i;
- }
- return true;
- }
- }
- return false;
- }
- function term_vi_f() {
- var t = (file[cursory + base]);
- var i;
- var w = term_cols;
- for (i = (cursorx + left) + 1; i < t.length; i++) {
- var c = (t.substr(i, 1));
- if (c === vi_ft_reg) {
- cursorx = i - left;
- if (term_vi_flag('d') || term_vi_flag('c') || term_vi_flag('y')) cursorx++;
- if (cursorx >= w) {
- left = 0;
- cursorx = i;
- }
- return true;
- }
- }
- return false;
- }
- function term_vi_eof() {
- cursorx = 0;
- left = 0;
- base = 0;
- if (accum) {
- cursory = accum - 1;
- return false;
- } else {
- base = file.length - (term_rows - 1);
- cursory = term_rows - 1;
- if (base < 0) {
- base = 0;
- cursory = file.length - 1;
- }
- }
- term_redraw();
- return true;
- }
- function term_vi_top() {
- cursorx = 0;
- base = 0;
- left = 0;
- if (accum) {
- cursory = accum - 1;
- return false;
- } else {
- cursory = 0;
- }
- return true;
- }
- function term_vi_h() { cursorx--; term_scrollto(); return true; }
- function term_vi_j() { cursory++; term_scrollto(); return true; }
- function term_vi_k() { cursory--; term_scrollto(); return true; }
- function term_vi_l() {
- cursorx++;
- // hack
- var a = mode;
- mode = 1;
- term_scrollto();
- mode = a;
- return true;
- }
- function term_vi_ll() {
- cursory = term_rows - 2;
- return true;
- }
- function term_vi_mm() {
- cursory = parseInt((term_rows - 2) / 2);
- cursorx = 0; left = 0;
- return true;
- }
- function term_vi_hh() {
- cursory = 0;
- return true;
- }
- function term_vi_ob() {
- cursory--;
- return term_skipreverse2(/^[ ]*$/, 0);
- }
- function term_vi_cb() {
- cursory++;
- return term_skipforward(/^[ ]*$/, 0);
- }
- function term_vi_ww() {
- return term_skipforward(/[ ][^ ]/, 0);
- }
- function term_vi_w() {
- return term_skipforward(/[^a-zA-Z0-9_(){}<>][a-zA-Z0-9_(){}<>]/, 0);
- }
- function term_vi_flag(f) {
- return (viflags.indexOf(f) === -1) ? false : true;
- }
- function term_vi_unset(f) {
- var j = viflags.indexOf(f);
- if (j === -1) return;
- viflags = viflags.substr(0, j) + viflags.substr(j + 1, (viflags.length - j) - 1);
- }
- function term_vi_set(f) {
- if (viflags.indexOf(f) === -1) viflags += '' + f;
- }
- function term_vi_bounce() {
- var y = cursory + base;
- var t = (file[y]);
- var x = cursorx + left;
- var z1 = '[{()}]';
- var z2 = ']})({[';
- while (x < t.length) {
- var z = z1.indexOf(t.substr(x, 1));
- if (z === -1) {
- x++;
- continue;
- }
- var d = (z > 2) ? -1 : 1;
- var c = z2.substr(z, 1);
- while (y >= 0 && y < file.length) {
- while (x > 0 && x < t.length) {
- if (t.substr(x, 1) === c) {
- cursorx = x - left;
- cursory = y;
- base = 0;
- term_scrollto();
- return true;
- }
- x += d;
- }
- if (d === -1) {
- y--;
- t = file[y];
- x = (t.length - 1)
- } else {
- y++;
- t = file[y];
- x = 0;
- }
- }
- }
- return false;
- }
- function term_vi_eol() {
- var t = (file[cursory + base]);
- cursorx = (t.length) - left;
- if (cursorx < 0) {
- left = 0;
- cursorx = (t.length);
- }
- return true;
- }
- function term_vi_line() {
- var t = (file[cursory + base]);
- left = 0;
- cursorx = t.length + 1;
- return true;
- }
- function term_vi_ee() {
- return term_skipforward(/[^ ][ ]/, 1);
- }
- function term_vi_e() {
- if (term_skipforward(/[a-zA-Z0-9_(){}<>][^a-zA-Z0-9_(){}<>]/, 1)) {
- if (term_vi_flag('d') || term_vi_flag('c') || term_vi_flag('y')) cursorx++;
- return true;
- }
- return false;
- }
- function term_vi_v() {
- cursorx = vselx - left;
- if (cursorx < 0) {
- left = 0;
- cursorx = vselx;
- }
- cursory = vsely - base;
- if (cursory < 0) {
- base = 0;
- cursory = vsely;
- }
- }
- function term_vi_vv() {
- term_vi_v();
- term_vi_line();
- }
- function term_select() {
- if (vselm === 1) {
- term_ex_motion = term_vi_v;
- } else if (vselm === 2) {
- term_ex_motion = term_vi_vv;
- cursorx = 0;
- left = 0;
- }
- }
- function term_indent(y, amount) {
- if (file[y] === undefined) {
- file[y] = '';
- tags[y] = '';
- }
- file[y] = _mxs(amount*4, 32) + file[y];
- tags[y] = _mxs(amount*4, tagstyle) + tags[y];
- }
- function term_unindent(y, amount) {
- amount*=4;
- while (amount > 0 && file[y].substr(0, 1) === ' ') {
- file[y] = file[y].substr(1, file[y].length - 1);
- amount--;
- }
- }
- function term_operate() {
- term_save_undo();
- var fa = accum;
- if (!fa) fa = 1;
- var sx = cursorx + left;
- var sy = cursory + base;
- while (fa > 0) {
- var t = file[base + cursory];
- if (t === undefined) break;
- if (fa > 1 && ((cursorx + left) >= t.length)) {
- cursory++;
- cursorx = 0;
- left = 0;
- }
- term_ex_motion();
- fa--;
- }
- fa = accum;
- if (!fa) fa = 1;
- accum = 0;
- var ex = cursorx + left;
- var ey = cursory + base;
- var i;
- if (ey < sy) {
- i = ey;
- ey = sy;
- sy = i;
- }
- if (ex < sx) {
- i = ex;
- ex = sx;
- sx = i;
- }
- var t = file[ey];
- var g = tags[ey];
- var restore = false;
- if (term_vi_flag('c')) term_vi_set('d');
- if (vselm !== 2 && ey === sy && ex <= t.length) {
- if (vselm) ex++;
- if (ex !== sx) {
- if (term_vi_flag('F')) {
- // styling
- tags[ey] = (g.substr(0, sx)) + _mxs(ex - sx, tagstyle) + (g.substr(ex, g.length - ex));
- } else if (term_vi_flag('d') || term_vi_flag('y')) {
- yank_buffer = _rtf(t.substr(sx, ex - sx),
- g.substr(sx, ex - sx));
- }
- if (term_vi_flag('d')) {
- file[ey] = (t.substr(0, sx)) + (t.substr(ex, t.length - ex));
- tags[ey] = (g.substr(0, sx)) + (g.substr(ex, g.length - ex));
- if (lastreg !== '_') {
- registers[lastreg] = yank_buffer;
- term_roll_yank();
- }
- } else if (term_vi_flag('y')) {
- registers[lastreg] = yank_buffer;
- term_roll_yank();
- }
- if (term_vi_flag('>')) {
- term_indent(ey, fa);
- } else if (term_vi_flag('<')) {
- term_unindent(ey, fa);
- }
- }
- } else if (vselm === 1) {
- if (term_vi_flag('d') || term_vi_flag('y') || term_vi_flag('F')) {
- yank_buffer = '';
- var al, bl;
- for (i = sy; i <= ey; i++) {
- t = file[i];
- g = tags[i];
- if (i === sy) {
- if ((sy === vsely && sx === vselx) || (sy !== vsely && sx !== vselx)) {
- al = sx;
- } else {
- al = ex;
- }
- bl = t.length;
- } else if (i === ey) {
- al = 0;
- if ((sy === vsely && sx === vselx) || (sy !== vsely && sx !== vselx)) {
- al = ex;
- } else {
- al = sx;
- }
- } else {
- al = 0;
- bl = t.length;
- }
- yank_buffer += _rtf(t.substr(al, bl - al),
- g.substr(al, bl - al));
- if (sy !== ey || vselm === 2) yank_buffer += "\n";
- if (term_vi_flag('d')) {
- file[i] = t.substr(0, al) + t.substr(bl, t.length - bl);
- tags[i] = g.substr(0, al) + g.substr(bl, g.length - bl);
- } else if (term_vi_flag('F')) {
- tags[i] = g.substr(0, al) + _mxs(bl - al, tagstyle)
- + g.substr(bl, g.length - bl);
- }
- if (term_vi_flag('>')) {
- term_indent(i, fa);
- } else if (term_vi_flag('<')) {
- term_unindent(i, fa);
- }
- }
- if (lastreg !== '_' && !term_vi_flag('F')) {
- registers[lastreg] = yank_buffer;
- term_roll_yank();
- }
- }
- } else {
- if (term_vi_flag('F')) {
- for (i = sy; i <= ey; i++) {
- tags[i] = _mxs(file[i].length, tagstyle);
- }
- } else if (term_vi_flag('d')) {
- yank_buffer = '';
- for (i = sy; i <= ey; i++) {
- yank_buffer += term_delete(sy);
- }
- if (lastreg !== '_') {
- registers[lastreg] = yank_buffer;
- term_roll_yank();
- }
- } else if (term_vi_flag('y')) {
- yank_buffer = '';
- for (i = sy; i <= ey; i++) {
- yank_buffer += _rtfl(sy) + "\n";
- }
- registers[lastreg] = yank_buffer;
- term_roll_yank();
- } else if (term_vi_flag('>')) {
- for (i = sy; i <= ey; i++) {
- term_indent(i, fa);
- }
- } else if (term_vi_flag('<')) {
- for (i = sy; i <= ey; i++) {
- term_unindent(i, fa);
- }
- }
- }
- if (term_vi_flag('d') || term_vi_flag('F') || term_vi_flag('c')) {
- _term_update_printer();
- }
- if (term_vi_flag('d')) {
- term_vi_unset('d');
- lastcommand = 'd';
- lastmotion = term_ex_motion;
- restore = true;
- }
- if (term_vi_flag('y')) {
- term_vi_unset('y');
- restore = true;
- }
- if (term_vi_flag('F')) {
- term_vi_unset('F');
- restore = true;
- }
- lastaccum = accum;
- if (restore) {
- cursorx = sx - left;
- if (cursorx < 0) {
- cursorx = sx;
- left = 0;
- }
- cursory = sy - base;
- if (cursory < 0) {
- cursory = sy;
- base = 0;
- }
- term_scrollto();
- }
- if (term_vi_flag('c')) {
- term_vi_unset('c');
- term_setmode(1);
- }
- accum = 0;
- }
- function term_save_undo_line() {
- if ((base + cursory) !== undoy) {
- undoy = base + cursory;
- undoline = _rtfl(undoy);
- }
- }
- function term_save_undo() {
- undoset = term_freeze();
- }
- function term_delete(i) {
- if (i > file.length) return '';
- var j;
- var z = file[i];
- var g = tags[i];
- for (j = i + 1; j < file.length; j++) {
- file[j - 1] = file[j];
- tags[j - 1] = tags[j];
- }
- file=_pop(file);
- return _rtf(z, g) + "\n";
- }
- function term_skipreverse2(re, fuzz) {
- var y = cursory + base;
- var x = (cursorx + left) + (1 + fuzz);
- for (;;) {
- var t = file[y];
- if (t === undefined) {
- // beep
- cursory = y - base;
- return false;
- }
- if (fuzz) t += " "; else t = " " + t;
- t = (t.substr(x, t.length - x));
- var aa = re.exec(t);
- if (!aa) {
- y--;
- x = 0;
- } else {
- x += _rel(re, t, aa).length;
- cursorx = x - left;
- cursory = y - base;
- return true;
- }
- }
- return false;
- }
- function term_skipforward(re, fuzz) {
- var y = cursory + base;
- var x = (cursorx + left) + (1 + fuzz);
- for (;;) {
- var t = file[y];
- if (t === undefined) {
- // beep
- cursory = y - base;
- return false;
- }
- if (fuzz) t += " "; else t = " " + t;
- t = (t.substr(x, t.length - x));
- var aa = re.exec(t);
- if (!aa) {
- y++;
- x = 0;
- } else {
- x += _rel(re, t, aa).length;
- cursorx = x - left;
- cursory = y - base;
- return true;
- }
- }
- return false;
- }
- function term_skipbackward(re) {
- var y = cursory + base;
- var x = (cursorx + left) + 1;
- for (;;) {
- var t = file[y];
- if (t === undefined) {
- // beep
- cursory = 0;
- cursorx = 0;
- return false;
- }
- t = " " + t.substr(0, x - 1);
- if (t === '') {
- y--;
- t = file[y];
- if (t === undefined) continue;
- x = (t.length);
- continue;
- }
- var aa = re.exec(t);
- if (!aa) {
- left = 0;
- cursorx = 0;
- cursory = y - base;
- return true;
- } else {
- x = _rel(re, t, aa).length;
- cursorx = x - left;
- cursory = y - base;
- return true;
- }
- }
- return false;
- }
- function term_search(s, top, start, bottom) {
- var re = new RegExp(s.substr(1));
- var i;
- if (s.substr(0, 1) === '/') {
- statustext='';
- re.lastIndex = cursorx + left + 1;
- for (i = start; i < bottom; i++) {
- var t = (file[i]);
- if (i === start) {
- t = t.substr(cursorx + left + 1, t.length - (cursorx + left + 1));
- }
- aa = re.exec(t);
- if (!aa) continue;
- var tx = _rel(re, t, aa).length;
- if (i === start) {
- tx += cursorx + left + 1;
- }
- left = 0;
- base = 0;
- cursorx = tx;
- cursory = i;
- term_scrollto();
- return true;
- }
- statustext = 'search hit BOTTOM, continuing at TOP';
- for (i = top; i <= start; i++) {
- var aa = re.exec(file[i]);
- if (!aa) continue;
- left = 0;
- base = 0;
- cursorx = _rel(re, file[i], aa).length;
- cursory = i;
- term_scrollto();
- return true;
- }
- statustext = 'Pattern not found: ' + s.substr(1);
- } else {
- statustext='';
- for (i = start; i >= top; i--) {
- var t = file[i];
- if (t === undefined) continue;
- var tail = 0;
- if (i === start) {
- tail = (cursorx + left);
- } else {
- tail = t.length;
- }
- var right = tail;
- while (tail > 0) {
- tail--;
- var xj = t.substr(tail, right - tail);
- var aa = re.exec(xj);
- if (!aa) continue;
- var tx = tail + _rel(re, xj, aa).length;
- left = 0;
- base = 0;
- cursorx = tx;
- cursory = i;
- term_scrollto();
- return true;
- }
- }
- statustext = 'search hit TOP, continuing at BOTTOM';
- for (i = bottom; i >= start; i--) {
- var t = file[i];
- if (t === undefined) continue;
- var tail = t.length;
- while (tail > 0) {
- tail--;
- var xj = t.substr(tail, t.length - tail);
- var aa = re.exec(xj);
- if (!aa) continue;
- cursorx = tail + _rel(re, xj, aa).length;
- cursory = i;
- left = 0;
- base = 0;
- term_scrollto();
- return true;
- }
- }
- statustext = 'Pattern not found: ' + s.substr(1);
- }
- return false;
- }
- function term_rsearch(s, top, start, bottom) {
- var cx = s.substr(0, 1);
- cx = (cx === '/') ? '?' : "/";
- return term_search(cx + s.substr(1, s.length - 1), top, start, bottom);
- }
- function _pop(q) {
- var a = [];
- var i;
- for (i = 0; i < q.length - 1; i++) {
- a[i] = q[i];
- }
- return a;
- }
- function _addr(q) {
- if (q === '.') {
- return cursory + base;
- }
- if (q === '$') {
- return file.length - 1;
- }
- if (q.substr(0, 1) === "'") {
- return marks[ q.substr(1, 1) ];
- }
- if (q === "\\/" || q === "\\&") {
- var a = cursory;
- var b = base;
- term_search(lastsearch, 0, cursory + base, file.length);
- var c = cursory + base;
- cursory = a;
- base = b;
- return c;
- }
- if (q === "\\?") {
- var a = cursory;
- var b = base;
- term_rsearch(lastsearch, 0, cursory + base, file.length);
- var c = cursory + base;
- cursory = a;
- base = b;
- return c;
- }
- if (q.substr(0, 1) === "/" || q.substr(0, 1) === "?") {
- var a = cursory;
- var b = base;
- term_search(q, 0, cursory + base, file.length);
- var c = cursory + base;
- cursory = a;
- base = b;
- return c;
- }
- q = parseInt(q) - 1;
- if (q >= file.length - 1) q = file.length - 1;
- if (q < 0) q=0;
- return q;
- }
- function term_command(s) {
- var top, start, bottom;
- if (s && s.length > 0 && s.substr(0, 1) === ':') {
- s = s.substr(1, s.length - 1);
- top = cursory + base;
- start = top;
- bottom = top;
- } else {
- top = 0;
- start = cursory + base;
- bottom = file.length;
- }
- // okay, this is kind of tricky
- var i;
- var tok = '';
- var tc = 0;
- var ng = [];
- var lastre = undefined;
- var nf = false;
- /// xxx todo implement ! with nf
- for (i = 0; i < s.length; i++) {
- var c = s.substr(i, 1);
- if ((tc==0 || tc==1) && "0123456789".indexOf(c) > -1) {
- tc = 1;
- tok = '' + tok + '' + c;
- continue;
- } else if (tc === 1) {
- tc = 0;
- ng[ng.length] = parseInt(tok) - 1;
- tok = '';
- }
- if (c === '%') {
- top = 0;
- bottom = file.length;
- start = cursory + base;
- } else if (c === '!') {
- nf = !nf;
- } else if (c === ',') {
- // do nothing
- while (ng.length > 2) {
- ng=_pop(ng);
- }
- } else if (c === ';') {
- start = ng[ng.length - 1];
- ng = _pop(ng);
- cursory = start;
- base=0;
- ng = _pop(ng);
- } else if (c === '$') {
- ng[ng.length] = file.length;
- } else if (c === '.') {
- ng[ng.length] = cursory + base;
- } else if (c === "'") {
- // mark
- ng[ng.length] = marks[s.substr(i + 1, 1)];
- i++;
- } else if (c === "\\") {
- i++;
- c = s.substr(i, 1);
- var qq;
- if (c === '?') {
- qq = term_rsearch;
- } else {
- qq = term_search;
- }
- if (ng.length === 1) {
- top = ng[0];
- ng = _pop(ng);
- } else if (ng.length >= 2) {
- top = ng[ng.length - 2];
- bottom = ng[ng.length - 1];
- ng = _pop(_pop(ng));
- }
- if (!qq(lastsearch, top, start, bottom)) {
- return;
- }
- ng[ng.length] = cursory + base;
- } else if (c === "/" || c === "?") {
- var j = i;
- for (i++; i < s.length; i++) {
- var tc = s.substr(i, 1);
- if (tc === "\\") i++;
- else if (tc === c) break;
- }
- lastre = s.substr(j, i - j);
- if (ng.length === 1) {
- top = ng[0];
- ng = _pop(ng);
- } else if (ng.length >= 2) {
- top = ng[ng.length - 2];
- bottom = ng[ng.length - 1];
- ng = _pop(_pop(ng));
- }
- if (!term_search(lastre, top, start, bottom)) {
- return;
- }
- ng[ng.length] = cursory + base;
- } else if (c === " " || c === "\t") {
- continue;
- } else {
- break;
- }
- }
- if (tc === 1) {
- ng[ng.length] = parseInt(tok) - 1;
- tok = '';
- i++;
- }
- if (ng.length === 1) {
- top = ng[0];
- bottom = ng[0];
- } else if (ng.length >= 2) {
- top = ng[ng.length - 2];
- bottom = ng[ng.length - 1];
- }
- if (lastre !== undefined) {
- lastsearch = lastre;
- registers["/"] = lastsearch.substr(1, lastsearch.length - 1);
- }
- var cmd2 = s.substr(i, 2);
- var cmd = s.substr(i, 1);
- if (cmd2 === 'wq' || cmd === 'x') {
- editor_disable(true);
- } else if (cmd === '=') {
- statustext = '' + bottom;
- return;
- } else if (cmd2 === 'ha') {
- window.print();
- return;
- } else if (cmd === 'w') {
- var zx = term_freeze();
- if (term._formelement) term._formelement.value = zx;
- statustext = '"/tmp/mess4XbCXM" ' + file.length + 'L, '
- + zx.length + 'C written';
- } else if (!emacsen && s.substr(i, (s.length - i)) === 'emacs') {
- statustext = 'EMACS mode enabled. Press M-x vi to use vi mode';
- emacsen = true;
- mode = 1;
- } else if (emacsen && cmd2 === 'vi') {
- statustext = 'VI mode enabled. Press ESC :emacs to use EMACS mode';
- mode = 0;
- emacsen = false;
- } else if (cmd === 'e' && term._formelement) {
- var zx = term_freeze();
- if (cmd2 !== 'e!') {
- if (cmd2 === 'e?') {
- if (!confirm("Your changes will be lost\nAre you sure?")) {
- return;
- }
- } else if (term._formelement.value !== zx) {
- statustext = 'No write since last change (use ! to override)';
- return;
- }
- }
- term_thaw(term._formelement.value);
- } else if (cmd === 'f') {
- var zx = term_freeze();
- statustext = '"/tmp/mess4XbCXM"';
- if (term._formelement.value !== zx) {
- statustext += ' [Modified]';
- }
- statustext += ' line ' + (cursory + base + 1) + ' of '
- + file.length + ' col ' + (cursorx + left + 1);
- } else if (cmd === 'h' || s.substr(i, 5) === 'about') {
- statustext = "jsvi \xa9 2006 Internet Connection, Inc";
- } else if (s.substr(i, 4) === 'kwak') {
- term.style.backgroundImage = 'url(ducky.jpg)';
- statustext = 'kwak kwak kwak...';
- } else if (s.substr(i, 3) === 'moo') {
- statustext = 'This editor does not have Super Cow Powers';
- } else if (cmd === 'b') {
- // only one buffer
- } else if (cmd === 'n' || cmd === 'N') {
- statustext = 'There is only one file to edit';
- } else if (cmd === 'q') {
- var zx = term_freeze();
- if (cmd2 !== 'q!') {
- if (term._formelement.value !== zx) {
- if (cmd2 === 'q?') {
- if (confirm("Your changes will be lost\nAre you sure?")) {
- editor_disable(false);
- return;
- } else {
- return;
- }
- }
- statustext = 'No write since last change (use ! to override)';
- return;
- }
- }
- editor_disable(false);
- } else if (cmd === 'd') {
- // delete lines
- yank_buffer = term_delete(top);
- while (top < bottom) {
- yank_buffer += term_delete(top);
- bottom--;
- }
- if (lastreg !== '_') {
- registers[lastreg] = yank_buffer;
- term_roll_yank();
- }
- term_scrollto();
- } else if (cmd === 'u') {
- var z = term_freeze();
- term_thaw(undoset);
- undoset = z;
- } else if (cmd === 'y') {
- yank_buffer = '';
- for (i = top; i < bottom; i++) {
- yank_buffer += (file[i]) + "\n";
- }
- registers[lastreg] = yank_buffer;
- term_roll_yank();
- } else if (cmd === 'F') {
- // styling!
- var y;
- var tadd = 0;
- var tsub = 0;
- var tset = undefined;
- var otc = tagstyle;
- var tg = '=';
- for (y = i + 1; y < s.length; y++) {
- var cy = s.substr(y, 1);
- if (cy === '=' || cy === ' + ' || cy === '-' || cy === '!') {
- tg = cy;
- } else {
- var fl = 0;
- if (cy === 'b') {
- fl = 1;
- } else if (cy === 'i') {
- fl = 16;
- } else if (cy === 'u') {
- fl = 2;
- } else if (cy === 'o') {
- fl = 4;
- } else {
- statustext = 'Unrecognized formatting specifier: ' + cy;
- return;
- }
- if (tg === '!') {
- if (tset !== undefined) tagstyle = tset;
- tagstyle = tagstyle ^ fl;
- } else if (tg === '=') {
- if (tset === undefined) tset = 0;
- tset = tset + fl;
- } else if (tg === '+') {
- tadd |= fl;
- } else if (tg === '-') {
- tsub |= fl;
- }
- }
- }
- if (tset === undefined) {
- tagstyle = ((tagstyle | tadd) | tsub) ^ tsub;
- } else {
- tagstyle = tset;
- }
- // okay, we've set tagstyle
- if (i !== 0) {
- // if this happened, then we were given a range(!)
- for (y = top; y <= bottom; y++) {
- if (file[y] === undefined) continue;
- tags[y] = _mxs(file[y].length, tagstyle);
- }
- tagstyle = otc;
- } else if (vselm) {
- term_select();
- term_vi_unset('d');
- term_vi_unset('y');
- term_vi_unset('c');
- term_vi_set('F');
- term_operate();
- tagstyle = otc;
- }
- } else if (cmd === 'g' || cmd === 'v') {
- // okay then
- var y;
- var ng = s.substr(i + 1, (s.length - i) - 1);
- if (cmd === 'v') ng = '!' + ng;
- for (y = 0; y < file.length; y++) {
- base = 0;
- cursory = y;
- term_command(ng);
- }
- } else if (cmd === 't' || cmd2 === 'co') {
- // copy- need address
- var t = s.substr(i, s.length - i).replace(/^[a-z]*[ ]*/);
- var x;
- yank_buffer = "";
- for (x = top; x <= bottom; x++) {
- if (file[x] !== undefined) {
- yank_buffer += (file[x]) + "\n";
- }
- }
- var a = cursory;
- var b = base;
- base = 0;
- cursorx = 0;
- left = 0;
- cursory = _addr(t);
- if (cursory < 0) cursory = 0;
- term_paste(false, yank_buffer);
- cursory = a;
- base = b;
- } else if (cmd === 'm') {
- // move- need address
- i++;
- if (s.substr(i, 3) === 'ove') {
- i += 3;
- }
- var t = s.substr(i, s.length - i);
- yank_buffer = term_delete(top);
- while (top < bottom) {
- yank_buffer += term_delete(top);
- bottom--;
- }
- var a = cursory;
- var b = base;
- base = 0;
- cursorx = 0;
- left = 0;
- cursory = _addr(t);
- if (cursory < 0) cursory = 0;
- term_paste(false, yank_buffer);
- cursory = a;
- base = b;
- } else if (cmd === 's') {
- // substitute
- i++;
- // extract regex
- var q = s.substr(i, 1);
- while (q === ' ') {
- i++;
- q = s.substr(i, 1);
- }
- var sep = s.substr(i, 1);
- i++;
- var lr, ls, lf;
- if (sep === '') {
- if (!lastsearch || !lastsubst) {
- statustext = 'No previous substitute regular expression';
- return;
- }
- lr = lastsearch.substr(1, lastsearch.length - 1);
- ls = lastsubst;
- lf = lastflags;
- } else {
- var jj = i;
- var zj;
- for (; i < s.length; i++) {
- zj = s.substr(i, 1);
- if (zj === "\\") {
- i++;
- } else if (zj === sep) {
- break;
- }
- }
- lastsearch = "/" + s.substr(jj, i - jj);
- registers["/"] = lastsearch.substr(1, lastsearch.length - 1);
- i++; // sep
- jj = i;
- for (; i < s.length; i++) {
- zj = s.substr(i, 1);
- if (zj === "\\") {
- i++;
- } else if (zj === sep) {
- break;
- }
- }
- lastsubst = s.substr(jj, i - jj);
- lastflags = '';
- i++;
- var count = -1;
- for (; i < s.length; i++) {
- zj = s.substr(i, 1);
- if (zj === 'i' || zj === 'g') {
- lastflags += zj;
- } else {
- count = parseInt(s.substr(i, s.length - i));
- if (count > 0) {
- break;
- } else {
- statustext = "Trailing characters";
- return;
- }
- }
- }
- var re = new RegExp;
- re.compile(lastsearch.substr(1, lastsearch.length - 1),
- (lastflags.indexOf('i') > -1) ? 'i' : '');
- var hit = false;
- for (i = top; i < bottom; i++) {
- var t = file[i];
- var g = tags[i];
- var aa;
- var st = t;
- aa = re.exec(t);
- if (!aa || aa.length === 0) continue;
- file[i] = '';
- tags[i] = '';
- // okay got a hit, do this vi style
- for (;;) {
- t = _rer(re, st, aa);
- var lt = _rel(re, st, aa);
- var lg = _resubst(lastsubst, aa);
- file[i] += lt + lg;
- tags[i] += g.substr(0, lt.length) + _zeros(lg.length);
- if (lastflags.indexOf('g') > -1) {
- st = t;
- aa = re.exec(t);
- if (aa && aa.length > 0) continue;
- }
- file[i] += t;
- tags[i] += g.substr(g.length - t.length, t.length);
- break;
- }
- hit = true;
- if (count > -1) {
- count--;
- if (count === 0) break;
- }
- }
- if (!hit) {
- statustext = 'Pattern not found: ' + lastsearch.substr(1, lastsearch.length - 1);
- }
- }
- } else if (cmd === '' && ng.length > 0) {
- base = 0;
- cursory = top;
- } else {
- statustext = "Not an editor command: " + s.substr(i, s.length - i);
- }
- }
- function _resubst(s, aa) {
- var i;
- var out = '';
- for (i = 0; i < s.length; i++) {
- var zq = s.substr(i, 1);
- if (zq === "\\") {
- zq = s.substr(i, 2);
- if (zq === "\\1") {
- zq = aa[1];
- } else if (zq === "\\2") {
- zq = aa[2];
- } else if (zq === "\\3") {
- zq = aa[3];
- } else if (zq === "\\4") {
- zq = aa[4];
- } else if (zq === "\\5") {
- zq = aa[5];
- } else if (zq === "\\6") {
- zq = aa[6];
- } else if (zq === "\\7") {
- zq = aa[7];
- } else if (zq === "\\8") {
- zq = aa[8];
- } else if (zq === "\\9") {
- zq = aa[9];
- } else {
- zq = s.substr(i + 1, 1);
- }
- i++;
- } else if (zq === "&") {
- zq = aa[0];
- }
- out += zq;
- }
- return out;
- }
- function term_calcy() {
- // fixup character inside... burrr
- var xx = file[cursory + base];
- var xg = tags[cursory + base];
- var zleft = left;
- if (cursory === (term_rows - 1)) {
- xx = command + " ";
- zleft = commandleft;
- xg = _mxs(xx.length + 1, 0);
- }
- var gg = term.childNodes;
- if (gg.length > cursory) {
- gg = term.childNodes[cursory];
- } else {
- gg = undefined;
- }
- _calcy(gg, xx.substr(zleft, xx.length - zleft), xg.substr(zleft, xg.length - zleft));
- }
- function term_calcx() {
- if (cursorx !== cursor._lastx) {
- cursor.style.left = (cursorx * (term_cur_width)) + 'px';
- cursor._lastx = cursorx;
- term_calcy();
- }
- }
- function term_scrollto() {
- var h = term_rows;
- var w = term_cols;
- var x = cursorx + left;
- var y = cursory + base;
- var t = file[y];
- if (command === '') h--;
- var ex = parseInt((w/8));
- if (ex < 4) ex = 4;
- var ey = parseInt((h/8));
- if (ey < 4) ey = 4;
- while (t === undefined && y > 0) {
- y--;
- t = file[y];
- }
- if (t === undefined) t = '';
- if (x >= t.length) {
- if (mode) x = t.length;
- else x = t.length - 1;
- }
- if (x < 0) x = 0;
- if (y < 0) y = 0;
- if (x < left) {
- left = (x - ex);
- cursorx = ex;
- if (left < 0) {
- left = 0;
- cursorx = 0;
- }
- } else if (x >= left + w) {
- left = (x - w) + ex;
- cursorx = w - ex;
- } else {
- cursorx = x - left;
- }
- if (y < base) {
- base = (y - ey);
- cursory = ey;
- if (base < 0) {
- base = 0;
- cursory = 0;
- }
- } else if (y >= base + h) {
- base = ((y - h) + ey);
- cursory = (h - ey);
- } else {
- cursory = y - base;
- }
- term_calcx();
- term_calcy();
- }
- function term_insert(y, str) {
- var z = file.length;
- file[z] = '';
- tags[z] = '';
- var i;
- for (i = z; i > y; i--) {
- file[i] = (file[i - 1]);
- tags[i] = (tags[i - 1]);
- }
- file[y] = '';
- tags[y] = '';
- }
- function term_paste(after, ign) {
- if (ign !== undefined) {
- yank_buffer = ign;
- } else {
- registers['.'] = lastinsert;
- registers[':'] = oldcommand;
- registers['%'] = "/tmp/mess4XbCXM";
- registers['#'] = "";
- yank_buffer = registers[lastreg];
- }
- if (yank_buffer === undefined) return false;
- if (yank_buffer.indexOf("\n") > -1) {
- // insert after this line
- if (after) cursory++;
- var nq = yank_buffer.split("\n");
- var nj;
- for (nj = 0; nj < nq.length; nj++) {
- if (nj === (nq.length - 1)) {
- if (nq[nj] === undefined) break;
- if (nq[nj] === '') break;
- // handled specially
- var aa = _hra(nq[nj]);
- file[cursory + base + nj] = aa[0] + (file[cursory + base + nj]);
- tags[cursory + base + nj] = aa[1] + (tags[cursory + base + nj]);
- break;
- }
- term_insert(cursory + base + nj);
- var aa = _hra(nq[nj]);
- file[cursory + base + nj] = aa[0];
- tags[cursory + base + nj] = aa[1];
- }
- } else {
- var t = (file[cursory + base]);
- var g = (tags[cursory + base]);
- var aa = _hra(yank_buffer);
- if (after) cursorx++;
- file[cursory + base] = t.substr(0, cursorx + left)
- + aa[0] + t.substr(cursorx + left, t.length - (cursorx + left));
- tags[cursory + base] = g.substr(0, cursorx + left)
- + aa[1] + g.substr(cursorx + left, g.length - (cursorx + left));
- }
- return true;
- }
- function term_keyfix(e) {
- if (!e) e = window.event;
- var ch = e.keyCode;
- if (!ch) ch = e.which;
- if (e.DOM_VK_UP) {
- if (e.DOM_VK_UP === ch) ch = 57373;
- else if (e.DOM_VK_DOWN === ch) ch = 57374;
- else if (e.DOM_VK_LEFT === ch) ch = 57375;
- else if (e.DOM_VK_RIGHT === ch) ch = 57376;
- }
- if (ch === 8 || ch === 9 || ch === 37 || ch === 39
- || ch === 38 || ch === 40 || ch === 127
- || ch === 33 || ch === 34 || ch === 36
- || ch === 35 || ch === 45 || ch === 46
- || ch === 57373
- || ch === 57374
- || ch === 57375
- || ch === 57376) {
- if (e.preventDefault) e.preventDefault();
- if (e.stopPropagation) e.stopPropagation();
- term_keypress_inner(e, true);
- e.cancelBubble= true;
- return false;
- } else {
- e.cancelBubble = false;
- return true;
- }
- }
- function term_keypress(e) {
- if (!e) e = window.event;
- if (e.preventDefault) e.preventDefault();
- if (e.stopPropagation) e.stopPropagation();
- if (suggest._visible) {
- suggest.style.display = 'none';
- suggest._visible = false;
- }
- e.cancelBubble = true;
- term_keypress_inner(e, false);
- return false;
- }
- function term_keypress_inner(e, synth) {
- var k = e.which;
- var kc;
- if (e.charCode) {
- if (e.charCode === 27 || e.charCode === 13 || e.charCode === 10
- || e.charCode === 8
- || e.charCode === 9) {
- k = e.charCode;
- kc = String.fromCharCode(e.charCode);
- } else if (e.charCode === 63232) {
- k = 57373;
- } else if (e.charCode === 63233) {
- k = 57374;
- } else if (e.charCode === 63234) {
- k = 57375;
- } else if (e.charCode === 63235) {
- k = 57376;
- } else {
- if (e.charCode === 191) return; // wtf?
- kc = String.fromCharCode(e.charCode);
- k = 0;
- }
- } else if (e.keyCode) {
- k = e.keyCode;
- if (e.DOM_VK_UP) {
- if (e.DOM_VK_UP === k) k = 57373;
- else if (e.DOM_VK_DOWN === k) k = 57374;
- else if (e.DOM_VK_LEFT === k) k = 57375;
- else if (e.DOM_VK_RIGHT === k) k = 57376;
- } else {
- kc = String.fromCharCode(e.keyCode);
- }
- if (k === 191) return; // unicode i think
- } else {
- if (!k || k === 191) return;
- kc = String.fromCharCode(k);
- var i;
- }
- var mod;
- if (e.modifiers) mod = e.modifiers; else mod = 0;
- var ctrl = e.ctrlKey | (mod & 2);
- var shift = e.shiftKey | (mod & 4);
- var meta = e.altKey | e.metaKey | (mod & 1);
- var lk = lastkey;
- lastkey = kc;
- if (kc === undefined) kc = '';
- if (!emacsen && mode === 0) {
- if (kc === 'U') {
- if ((base + cursory) === undoy) {
- var aa = _hra(undoline);
- file[undoy] = aa[0];
- tags[undoy] = aa[1];
- }
- } else if (kc === 'u' && undoset) {
- var z = term_freeze();
- term_thaw(undoset);
- undoset = z;
- }
- if (kc === 'u' || kc === 'U') {
- term_scrollto();
- term_redraw();
- lastkey = undefined;
- return;
- }
- }
- var fakemode = false;
- // emacsen
- if (emacsen && meta && (kc === 'x' || kc === 'X')) {
- kc = ':'
- fakemode = true;
- lk = undefined;
- lastkey = undefined;
- } else if (ctrl && (kc === 't' || kc === 'T')) {
- kc = '?'
- fakemode = true;
- lk = undefined;
- lastkey = undefined;
- } else if (ctrl && (kc === 's' || kc === 'S')) {
- kc = '/'
- fakemode = true;
- lk = undefined;
- lastkey = undefined;
- } else if (ctrl && (kc === 'k' || kc === 'K')) {
- term_command(':d');
- lastkey = undefined;
- return;
- } else if (emacsen && meta && (kc === 'd' || kc === 'D')) {
- kc = 'D';
- fakemode = true;
- lk = undefined;
- lastkey = undefined;
- } else if (ctrl && (kc === 'a' || kc === 'A')) {
- kc = '0';
- fakemode = true;
- lk = undefined;
- lastkey = undefined;
- } else if (ctrl && (kc === 'd' || kc === 'D')) {
- if (emacsen) {
- kc = 'x';
- } else {
- // err...
- if (!accum) accum = term_rows + 1;
- cursory += parseInt(accum/2) + 2;
- accum=0;
- term_scrollto();
- term_redraw();
- lk = undefined;
- lastkey = undefined;
- return;
- }
- fakemode = true;
- lk = undefined;
- lastkey = undefined;
- } else if (ctrl && (kc === 'g' || kc === 'G')) {
- term_command(':f');
- lastkey = undefined;
- return;
- } else if (ctrl && (kc === 'e' || kc === 'E')) {
- if (emacsen) {
- kc = '$';
- } else {
- if (!accum) accum = 1;
- cursory += accum;
- accum = 0;
- term_scrollto();
- term_redraw();
- lk = undefined;
- lastkey = undefined;
- return;
- }
- fakemode = true;
- lk = undefined;
- lastkey = undefined;
- } else if (emacsen && meta && (kc === 'b' || kc === 'B')) {
- kc = 'b';
- fakemode = true;
- lk = undefined;
- lastkey = undefined;
- } else if (emacsen && meta && (kc === 'l' || kc === 'L')) {
- kc = 'e';
- fakemode = true;
- lk = undefined;
- lastkey = undefined;
- } else if (emacsen && meta && (kc === 'f' || kc === 'F')) {
- kc = 'w';
- fakemode = true;
- lk = undefined;
- lastkey = undefined;
- } else if (ctrl && (kc === 'f' || kc === 'F')) {
- if (emacsen) {
- kc = 'l';
- } else {
- // vi pagedown
- if (!accum) accum = 0;
- cursory += (term_rows*accum);
- accum = 0;
- term_scrollto();
- term_redraw();
- lk = undefined;
- lastkey = undefined;
- return;
- }
- fakemode = true;
- lk = undefined;
- lastkey = undefined;
- } else if (ctrl && (kc === 'y' || kc === 'Y')) {
- if (emacsen) {
- term_command(':y');
- lastkey = undefined;
- return;
- } else {
- if (!accum) accum = 1;
- cursory -= accum;
- accum = 0;
- term_scrollto();
- term_redraw();
- lk = undefined;
- lastkey = undefined;
- return;
- }
- } else if (ctrl && (kc === 'l' || kc === 'L')) {
- term_redraw();
- lk = undefined;
- lastkey = undefined;
- return;
- } else if (ctrl && (kc === 'u' || kc === 'U')) {
- if (emacsen) {
- // emacs undo
- kc = 'u';
- } else {
- // vi pageup
- if (!accum) accum = term_rows + 1;
- cursory -= parseInt(accum/2) + 2;
- accum=0;
- term_scrollto();
- term_redraw();
- lk = undefined;
- lastkey = undefined;
- return;
- }
- fakemode = true;
- lk = undefined;
- lastkey = undefined;
- } else if (ctrl && (kc === 'w' || kc === 'W')) {
- // vim uses this for window control; this is actually useful
- fakemode = true;
- term_vi_set('d');
- kc = 'b';
- lk = undefined;
- lastkey = undefined;
- } else if (ctrl && (kc === 'b' || kc === 'B')) {
- if (emacsen) {
- kc = 'h';
- } else {
- // vi pageup
- if (!accum) accum=1;
- cursory -= (term_rows*accum);
- accum=0;
- term_scrollto();
- term_redraw();
- lk = undefined;
- lastkey = undefined;
- return;
- }
- fakemode = true;
- lk = undefined;
- lastkey = undefined;
- }
- if (k >= 57373 && k <= 57376 && !synth) {
- // bail
- return
- } else if (!synth && (k < 57373 || k > 57376)) {
- // no touching...
- } else if (k === 31 || k === 40 || k === 57374) { // down
- if (!synth) return;
- fakemode = true;
- kc = 'j';
- lk = undefined;
- lastkey = undefined;
- } else if (k === 30 || k === 38 || k === 57373) { // up
- if (!synth) return;
- fakemode = true;
- kc = 'k';
- lk = undefined;
- lastkey = undefined;
- } else if (k === 28 || k === 37 || k === 57375) { // left
- if (!synth) return;
- fakemode = true;
- kc = ctrl ? 'B' : 'h';
- lk = undefined;
- lastkey = undefined;
- } else if (k === 29 || k === 39 || k === 57376) { // right
- if (!synth) return;
- fakemode = true;
- kc = ctrl ? 'W' : 'l';
- lk = undefined;
- lastkey = undefined;
- } else if (k === 33) { // pageup
- cursory -= term_rows;
- term_scrollto();
- term_redraw();
- lk = undefined;
- lastkey = undefined;
- return;
- } else if (k === 34) { // pagedown
- cursory += term_rows;
- term_scrollto();
- term_redraw();
- lk = undefined;
- lastkey = undefined;
- return;
- } else if (k === 36) { // home
- if (ctrl) {
- lk = 'g';
- kc = 'g';
- } else {
- kc = '0';
- }
- fakemode = true;
- lk = undefined;
- lastkey = undefined;
- accum = 0;
- } else if (k === 35) { // end
- fakemode = true;
- accum = 0;
- if (ctrl) {
- kc = 'G';
- } else {
- kc = '$';
- }
- lk = undefined;
- lastkey = undefined;
- } else if (k === 45) { // insert
- fakemode = true;
- if (mode === 1) {
- mode = 2;
- } else if (mode === 2) {
- mode = 1;
- } else {
- term_setmode(1);
- }
- lk = undefined;
- lastkey = undefined;
- term_redraw();
- return;
- } else if (k === 46) { // delete
- fakemode = true;
- kc = 'x';
- lk = undefined;
- lastkey = undefined;
- } else if (synth && k !== 8) {
- return;
- }
- term_save_undo_line();
- if (fakemode || mode === 0) {
- if (!fakemode && ctrl) return;
- if (lk === 'F' || lk === 'T' || lk === 'f' || lk === 't') {
- vi_ft_reg = kc;
- if (lk === 'F') {
- term_ex_motion = term_vi_ff;
- } else if (lk === 'T') {
- term_ex_motion = term_vi_tt;
- } else if (lk === 'f') {
- term_ex_motion = term_vi_f;
- } else if (lk === 't') {
- term_ex_motion = term_vi_t;
- }
- term_operate();
- lastkey = undefined;
- term_scrollto();
- term_redraw();
- _update_backing();
- return;
- } else if (lk === 'm') {
- // set mark
- marks[kc] = cursory + base;
- lastkey = undefined;
- accum = 0;
- return;
- } else if (lk === "'") {
- term_ex_motion = function () {
- cursory = marks[kc];
- base = 0;
- term_scrollto();
- term_redraw();
- return true;
- };
- if (!accum) accum = 1;
- term_operate();
- return;
- } else if (lk === '"') {
- // set last register
- lastreg = kc;
- lastkey = undefined;
- accum = 0;
- return;
- } else if (lk === 'r') {
- var p = cursorx + left;
- var t = (file[cursory + base]);
- if (!accum) accum = 1;
- var ng = '';
- var i;
- for (i = 0; i < accum; i++) ng += kc;
- term_save_undo();
- file[cursory + base] = (t.substr(0, p))
- + (ng) + (t.substr(p + accum, t.length - (p + accum)));
- // tags remains unchanged (same length)
- accum = 0;
- lastkey = undefined;
- term_scrollto();
- term_redraw();
- _update_backing();
- _term_update_printer();
- return;
- }
- if (kc === ':' || kc === '/' || kc === '?') {
- command = kc;
- commandleft = 0;
- savex = cursorx;
- savey = cursory;
- cursorx = 1;
- cursory = term_rows - 1;
- mode=1;
- term_redraw();
- term_calcx();
- return;
- } else if (kc === "'") {
- // jump to mark (ick)
- } else if (kc === '"') {
- // do nothing for now
- } else if (kc === '.') {
- term_vi_set(lastcommand);
- term_ex_motion = lastmotion;
- term_operate();
- } else if (kc === '$') {
- term_ex_motion = term_vi_eol;
- term_operate();
- } else if (kc === '%') {
- if (accum <= 0) {
- term_ex_motion = term_vi_bounce;
- term_operate();
- } else if (file.length > 0) {
- base = 0;
- cursorx = 0;
- left = 0;
- cursory = parseInt(accum * (term_rows / (file.length + 1.0)));
- accum = 0;
- }
- } else if (kc === '0') {
- if (accum) {
- accum *= 10;
- } else {
- cursorx = 0;
- left = 0;
- }
- } else if (kc === '1') {
- accum *= 10; accum++;
- } else if (kc === '2') {
- accum *= 10; accum += 2;
- } else if (kc === '3') {
- accum *= 10; accum += 3;
- } else if (kc === '4') {
- accum *= 10; accum += 4;
- } else if (kc === '5') {
- accum *= 10; accum += 5;
- } else if (kc === '6') {
- accum *= 10; accum += 6;
- } else if (kc === '7') {
- accum *= 10; accum += 7;
- } else if (kc === '8') {
- accum *= 10; accum += 8;
- } else if (kc === '9') {
- accum *= 10; accum += 9;
- } else if (kc === 'A') {
- var t = (file[cursory + base]);
- cursorx = t.length; // will be fixed up...
- term_setmode(1);
- term_save_undo();
- } else if (kc === 'a') {
- term_setmode(1);
- cursorx++;
- term_save_undo();
- } else if (kc === 'B') {
- term_ex_motion = term_vi_bb;
- term_operate();
- } else if (kc === 'b') {
- term_ex_motion = term_vi_b;
- term_operate();
- } else if (kc === 'c') {
- if (term_vi_flag('c')) {
- term_vi_set('d');
- term_vi_unset('c');
- savex = cursorx + left;
- savey = cursory + base;
- cursorx = 0; left = 0;
- term_ex_motion = term_vi_line;
- term_operate();
- cursorx = savex - left;
- cursory = savey - base;
- term_setmode(1);
- } else {
- term_vi_set('c');
- }
- } else if (kc === 'C') {
- term_ex_motion = term_vi_eol;
- term_vi_set('d');
- term_operate();
- term_setmode(1);
- } else if (kc === 'D') {
- term_ex_motion = term_vi_eol;
- term_vi_set('d');
- term_operate();
- } else if (kc === 'd') {
- if (vselm) {
- term_vi_set('d');
- term_vi_unset('y');
- term_select();
- term_operate();
- vselm = 0;
- } else if (term_vi_flag('d')) {
- accum++;
- savex = cursorx + left;
- savey = cursory + base;
- cursorx = 0; left = 0;
- term_ex_motion = term_vi_line;
- term_operate();
- cursorx = savex - left;
- cursory = savey - base;
- } else {
- term_vi_set('d');
- term_vi_unset('y');
- }
- } else if (kc === '>' || kc === '<') {
- if (vselm) {
- term_vi_unset('<');
- term_vi_unset('>');
- term_vi_set(kc);
- term_vi_unset('d');
- term_vi_unset('y');
- term_operate();
- vselm = 0;
- } else if (term_vi_flag(kc)) {
- accum++;
- savex = cursorx + left;
- savey = cursory + base;
- cursorx = 0; left = 0;
- term_ex_motion = term_vi_line;
- term_operate();
- cursorx = savex - left;
- cursory = savey - base;
- term_vi_unset('<');
- term_vi_unset('>');
- } else {
- term_vi_unset('<');
- term_vi_unset('>');
- term_vi_set(kc);
- term_vi_unset('d');
- term_vi_unset('y');
- }
- } else if (kc === 'E') {
- term_ex_motion = term_vi_ee;
- term_operate();
- } else if (kc === 'e') {
- term_ex_motion = term_vi_e;
- term_operate();
- } else if (kc === 'F' || kc === 'f') {
- // does nothing here
- } else if (kc === 'G') {
- term_ex_motion = term_vi_eof;
- term_operate();
- } else if (kc === 'g' && lk === 'g') {
- term_ex_motion = term_vi_top;
- term_operate();
- } else if (kc === 'H') {
- term_ex_motion = term_vi_hh;
- term_operate();
- } else if (kc === 'h') {
- term_ex_motion = term_vi_h;
- term_operate();
- } else if (kc === 'I') {
- term_save_undo();
- if (vselm) {
- term_vi_set('d');
- term_vi_unset('y');
- term_select();
- term_operate();
- vselm = 0;
- }
- term_setmode(1);
- cursorx = 0;
- left = 0;
- } else if (kc === 'i') {
- term_save_undo();
- if (vselm) {
- term_vi_set('d');
- term_vi_unset('y');
- term_select();
- term_operate();
- vselm = 0;
- }
- term_setmode(1);
- } else if (kc === 'J') {
- term_save_undo();
- term_justify();
- } else if (kc === 'j') {
- term_ex_motion = term_vi_j;
- term_operate();
- } else if (kc === 'K') {
- // err..
- } else if (kc === 'k') {
- term_ex_motion = term_vi_k;
- term_operate();
- } else if (kc === 'L') {
- term_ex_motion = term_vi_ll;
- term_operate();
- } else if (kc === 'l') {
- term_ex_motion = term_vi_l;
- term_operate();
- } else if (kc === 'M') {
- term_ex_motion = term_vi_mm;
- term_operate();
- } else if (kc === 'm') {
- // set mark
- } else if (kc === 'N') {
- if (lastsearch === '') {
- statustext = 'No previous regular expression';
- } else {
- if (!accum) accum = 1;
- var sl = lastsearch;
- var cx = lastsearch.substr(0, 1);
- cx = (cx === '?') ? '/' : '?';
- var i;
- for (i = 0; i < accum; i++) {
- term_command(cx + (sl.substr(1, sl.length - 1)));
- }
- lastsearch = sl;
- accum = 0;
- }
- } else if (kc === 'n') {
- if (lastsearch === '') {
- statustext = 'No previous regular expression';
- } else {
- if (!accum) accum = 1;
- var i;
- for (i = 0; i < accum; i++)
- term_command(lastsearch);
- accum = 0;
- }
- } else if (kc === 'O') {
- cursorx = 0;
- left = 0;
- term_insert(cursory + base);
- term_setmode(1);
- } else if (kc === 'o') {
- cursory++;
- cursorx = 0;
- left = 0;
- term_insert(cursory + base);
- term_setmode(1);
- term_save_undo();
- } else if (kc === 'P' || kc === 'p') {
- term_save_undo();
- term_paste(kc === 'P' ? false : true);
- accum = 0;
- } else if (kc === 'R') {
- term_save_undo();
- if (vselm) {
- term_vi_set('d');
- term_vi_unset('y');
- term_select();
- term_operate();
- vselm = 0;
- }
- term_setmode(2);
- } else if (kc === 'S') {
- term_vi_set('d');
- term_vi_unset('c');
- savex = cursorx + left;
- savey = cursory + base;
- cursorx = 0; left = 0;
- term_ex_motion = term_vi_line;
- term_operate();
- cursorx = savex - left;
- cursory = savey - base;
- term_setmode(1);
- } else if (kc === 's') {
- term_vi_set('d');
- term_vi_unset('c');
- savex = cursorx + left;
- savey = cursory + base;
- term_ex_motion = term_vi_l;
- term_operate();
- cursorx = savex - left;
- cursory = savey - base;
- term_setmode(1);
- } else if (kc === 'T' || kc === 't') {
- // nothing here
- } else if (kc === 'V' || kc === 'v') {
- if (vselm) {
- vselm = 0;
- vselx = undefined;
- vsely = undefined;
- } else {
- vselm = (kc === 'v') ? 1 : 2;
- vselx = cursorx + left;
- vsely = cursory + base;
- }
- } else if (kc === 'W') {
- term_ex_motion = term_vi_ww;
- term_operate();
- } else if (kc === '{') {
- term_ex_motion = term_vi_ob;
- term_operate();
- } else if (kc === '}') {
- term_ex_motion = term_vi_cb;
- term_operate();
- } else if (kc === 'w') {
- term_ex_motion = term_vi_w;
- term_operate();
- } else if (kc === 'x' || kc === 'X') {
- if (term_vi_set('d')) {
- term_vi_unset('d');
- } else {
- term_vi_set('d');
- if (kc === 'x') {
- term_ex_motion = term_vi_l;
- } else {
- term_ex_motion = term_vi_h;
- }
- term_operate();
- }
- } else if (kc === 'y') {
- if (vselm) {
- term_vi_set('y');
- term_vi_unset('d');
- term_select();
- term_operate();
- vselm = 0;
- } else if (term_vi_flag('y')) {
- accum++;
- savex = cursorx + left;
- savey = cursory + base;
- cursorx = 0; left = 0;
- term_ex_motion = term_vi_line;
- term_operate();
- cursorx = savex - left;
- cursory = savey - base;
- } else {
- term_vi_set('y');
- term_vi_unset('d');
- }
- } else if (kc === 'Z' && lk === 'Z') {
- editor_disable(true);
- accum = 0;
- } else if (k === 27 || (k === 91 && ctrl)) { // escape or ^[
- vselm = 0;
- statustext = '';
- mode = 0;
- } else {
- accum = 0;
- }
- term_scrollto();
- } else if ((k === 27 || (k === 91 && ctrl))) { // escape or ^[
- vselm = 0;
- statustext = '';
- if (command !== '') {
- cursorx = savex;
- cursory = savey;
- } else {
- if (mode) _term_update_printer();
- if (accum > 1) {
- var i, j;
- j = lastreg;
- lastreg = '.';
- for (i = 1; i < accum; i++) {
- term_paste(false);
- }
- lastreg = j;
- accum = 0;
- }
- cursorx--;
- term_scrollto();
- }
- mode = emacsen ? 1 : 0;
- command = '';
- commandleft = 0;
- } else if (command !== '') {
- if (k === 10 || k === 13) {
- // cr and execute command
- cursorx = savex;
- cursory = savey;
- if (emacsen) {
- mode = 1;
- } else {
- mode = 0;
- }
- var cy = command;
- command = '';
- commandleft = 0;
- term_command(cy);
- var cx = command.substr(0, 1);
- if (cx === '/' || cx === '?') lastsearch = cy;
- else oldcommand = cy;
- // incase its needed
- term_scrollto();
- } else if (k === 8) {
- if (!synth) return;
- command = command.substr(command, command.length - 1);
- cursorx--;
- if (cursorx <= 0) {
- var w = term_cols;
- commandleft -= (w - 16);
- cursorx = w - 8;
- if (commandleft < 0) {
- cursorx = savex;
- cursory = savey;
- if (emacsen) {
- mode = 1;
- } else {
- mode = 0;
- }
- }
- }
- } else {
- command = command + kc;
- cursorx++;
- var w = term_cols;
- if (cursorx >= (w - 8)) {
- cursorx = 8;
- commandleft += w - 16;
- }
- }
- term_redraw();
- term_calcx();
- _update_backing();
- return;
- } else {
- var t = (file[cursory + base]);
- var lx = (t.substr(0, cursorx + left));
- var ly = (t.substr(cursorx + left + (mode - 1)));
- var lz = (t.substr(cursorx + left));
- var g = (tags[cursory + base]);
- var gx = (g.substr(0, cursorx + left));
- var gy = (g.substr(cursorx + left + (mode - 1)));
- var gz = (g.substr(cursorx + left));
- if (!lx) lx = '';
- if (k === 9) kc = ' ';
- if (k === 10 || k === 13) {
- // CR
- if (!lz) lz = '';
- file[cursory + base] = lx;
- tags[cursory + base] = gx;
- cursory++;
- cursorx=0;
- left=0;
- term_insert(cursory + base);
- file[cursory + base] = lz;
- tags[cursory + base] = gz;
- lastinsert += "\n";
- } else if (k === 8) {
- if (!synth) return;
- // backspace
- file[cursory + base] = lx.substr(0, lx.length - 1) + lz;
- tags[cursory + base] = gx.substr(0, lx.length - 1) + gz;
- lastinsert = lastinsert.substr(0, lastinsert.length - 1);
- cursorx--;
- } else {
- if (kc === '') return;
- file[cursory + base] = lx + kc + ly;
- tags[cursory + base] = gx + String.fromCharCode(tagstyle) + gy;
- lastinsert += kc;
- cursorx += kc.length;
- }
- term_scrollto();
- }
- term_redraw();
- _update_backing();
- return;
- }
- function _redraw_cursor() {
- term_draw_cursor(true);
- _update_backing();
- }
- function term_draw_cursor(tf) {
- // maybe use vertical bar if mode==1 hrm?
- if (!tf || !cursor._opaque) {
- cursor._opaque = true;
- cursor.style.color = palette[1];
- cursor.style.backgroundColor = palette[0];
- } else {
- cursor._opaque = false;
- cursor.style.color = palette[0];
- cursor.style.backgroundColor = palette[1];
- }
- }
- function _redraw_term_force() {
- while (term.firstChild) term.removeChild(term.firstChild);
- }
- function term_resize() {
- var h = term.offsetHeight;
- var r = line_height;
- if (!line_height) r = cursor.offsetHeight - 1; // 1 px overlap
- var nh = (h/r);
- term_rows = parseInt(nh);
- term_win_height = h;
-
- h = term.offsetWidth;
- r = (term_cur_width + 1); // 1 px padding
- nh = (h/r);
- term_cols = parseInt(nh);
- term_win_width = h;
- term_redraw();
- }
- function editor_disable(sav) {
- if (cursoriv) {
- window.clearInterval(cursoriv);
- cursoriv = undefined;
- }
- _cbrestore();
- if (term._formelement) {
- if (sav) term._formelement.value = term_freeze();
- // disconnect
- term._formelement = undefined;
- }
- if (backing.removeEventListener) {
- backing.removeEventListener('DOMAttrModified', _backing_paste, false);
- backing.removeEventListener('Input', _backing_paste, false);
- backing.removeEventListener('input', _backing_paste, false);
- }
- backing.oninput = undefined;
- backing.onInput = undefined;
- document.body.removeChild(suggest);
- document.body.removeChild(term);
- document.body.removeChild(printer);
- document.body.removeChild(tools);
- document.body.removeChild(cursor);
- var z;
- for (z = document.body.firstChild; z; z = z.nextSibling) {
- if (z.tagName && z._flipe) z.style.display = z._orige;
- }
- // bug in firefox: can't remove this
- //document.body.removeChild(backing);
- if (backing.blur) backing.blur();
- backing.style.display = 'none';
- if (document.body.focus) document.body.focus();
- if (document.focus) document.focus();
- document.body.style.overflow = '';
- }
- function _cursor_fix() {
- term_cur_width = cursor.offsetWidth;
- }
- function _zmp(o) {
- o.style.marginTop='0px';
- o.style.marginLeft='0px';
- o.style.marginRight='0px';
- o.style.marginBottom='0px';
- o.style.paddingTop='0px';
- o.style.paddingLeft='0px';
- o.style.paddingRight='0px';
- o.style.paddingBottom='0px';
- }
- function editor(t) {
- if (term && term._formelement && term._formelement !== t) {
- editor_disable(false);
- }
- // okay, find EVERYTHING inside body and display none it
- var z;
- for (z = document.body.firstChild; z; z = z.nextSibling) {
- if (z.tagName) {
- z._orige = z.style.display;
- z._flipe = true;
- z.style.display = 'none';
- }
- }
- if (!term) {
- term = document.createElement('DIV');
- printer = document.createElement('DIV');
- suggest = document.createElement('DIV');
- backing = document.createElement('TEXTAREA');
- tools = document.createElement('DIV');
- cursor = document.createElement('DIV');
- }
- printer.className = 'print';
- cursor.className = 'editorcursor';
- term.className = 'editor';
- suggest.style.position = 'absolute';
- suggest.style.display = 'none';
- backing.tabIndex = -1;
- backing.style.position = 'absolute';
- backing.style.bottom = '0px';
- backing.style.right = '0px';
- backing.style.width = '1px';
- backing.style.height = '1px';
- backing.style.visibility = 'hidden';
- backing.oninput = _backing_paste;
- backing.onInput = _backing_paste;
- if (backing.addEventListener) {
- backing.addEventListener('DOMAttrModified', _backing_paste, false);
- backing.addEventListener('Input', _backing_paste, false);
- backing.addEventListener('input', _backing_paste, false);
- }
- if (window.addEventListener) {
- window.addEventListener('DOMMouseScroll', _mousescroll, false);
- }
- tools.className = 'editortools';
- tools.style.position = 'absolute';
- tools.style.right = '0px';
- tools.style.bottom = '0px';
- tools.innerHTML = ''
- + '<input tabindex="-1" type="button" value="B" style="font-weight:bold;" onClick="term_command(\':F!b\');" />'
- + '<input tabindex="-1" type="button" value="I" style="font-style:italic;" onClick="term_command(\':F!i\');" />'
- + '<input tabindex="-1" type="button" value="U" style="text-decoration:underline;" onClick="term_command(\':F!u\');" />'
- + ' '
- + '<input tabindex="-1" type="button" value="Print" onClick="term_command(\':ha\');" />'
- + ' '
- + '<input tabindex="-1" type="button" value="Abort" onClick="term_command(\':q?\');" />'
- + '<input tabindex="-1" type="button" value="Save and Close" onClick="term_command(\':wq\');" />'
- cursor.onclick = _pass_click;
- cursor.ondblclick = _pass_dblclick;
- document.body.appendChild(suggest);
- document.body.appendChild(term);
- document.body.appendChild(printer);
- document.body.appendChild(tools);
- // firefox bug
- if (once) document.body.appendChild(backing);
- document.body.appendChild(cursor);
- cursoriv = window.setInterval(_redraw_cursor, 300);
- term.style.position = 'absolute';
- term.style.top = '0px';
- term.style.left = '0px';
- term.style.display = 'block';
- term.style.overflow = 'hidden';
- term.style.width = '100%';
- term.style.height = '100%';
- term.style.cursor = 'default';
- term.style.fontFamily = 'monospace';
- term.style.fontSize = '100%';
- _zmp(term);
- term._formelement = t;
- document.body.style.overflow = 'hidden';
- tools.style.display = 'block';
- _cbd('select', _cancel_ev);
- _cbd('selectstart', _cancel_ev);
- _cbd('keydown', term_keyfix);
- _cbd('keypress', term_keypress);
- _cbd('paste', _msie_paste);
- _cbd('click', _mouseclick);
- _cbd('mousedown', _mousedown);
- _cbd('mousemove', _mousemove);
- _cbd('mouseup', _mouseup);
- _cbd('mousewheel', _mousescroll);
- vselm = 0;
- vseld = false;
- vselx = undefined;
- vsely = undefined;
- t.blur();
- cursorx = 0;
- cursory = 0;
- cursor.style.position = 'absolute';
- cursor.style.top = 0;
- cursor.style.left = 0;
- cursor.style.fontFamily = 'monospace';
- cursor.style.fontSize = '100%';
- cursor.style.width = 'auto';
- cursor.style.cursor = 'default';
- _zmp(cursor);
- cursor.style.overflow = 'hidden';
- cursor.innerHTML = 'X';
- cursor._opaque = false;
- cursor._lasty = -1;
- cursor._lastx = -1;
- cursor._lastch = '-xyz-';
- cursor._lastgh = 0;
- palette = undefined;
- if (document.defaultView && document.defaultView.getComputedStyle) {
- palette = [];
- var cs = document.defaultView.getComputedStyle(term, null);
- palette[0] = cs.color;
- palette[1] = cs.backgroundColor;
- } else if (window.getComputedStyle) {
- palette = [];
- var cs = window.getComputedStyle(term, null);
- palette[0] = cs.color;
- palette[1] = cs.backgroundColor;
- } else if (term.currentStyle) {
- palette = [];
- palette[0] = term.currentStyle.color;
- palette[1] = term.currentStyle.backgroundColor;
- }
- if (emacsen) {
- mode = 1;
- } else {
- mode = 0;
- }
- once = false;
- backing._lastvalue = '';
- backing.value = '';
- backing.defaultValue = '';
- suggest._visible = false;
- suggest.display = 'none';
- tools.style.backgroundColor = palette[0];
- _dfx(tools);
- // degrading...
- file = [];
- tags = [];
- var st = t.value.split("\n");
- var j;
- for (j = 0; j < st.length; j++) {
- if (st[j].substr(st[j].length - 1, 1) === "\r") {
- st[j] = st[j].substr(0, st[j].length - 1);
- }
- var aa = _hra(st[j]);
- file[j] = aa[0];
- tags[j] = aa[1];
- }
- // fix
- t.value = term_freeze();
- _term_update_printer();
- cursor.style.display = 'inline';
- _cursor_fix();
- window.setTimeout(term_redraw, 1);
- term_resize();
- _cbw('resize', term_resize);
- _cbw('beforeprint', _term_update_printer);
- _update_backing();
- }
- return {
- editor: editor,
- version: version
- };
- }());