Restaurar posicion del cursor en el editor de codigo después de guardar.

22 views
Skip to first unread message

Fernando Erazo V

unread,
May 26, 2025, 10:11:46 AMMay 26
to Comunidad ScriptCase Latino
Colegas, siempre me ha molestado guardar en el editor de scriptcase y perder el lugar donde estaba el cursor.

Alguien del foro colocó un post que me dió una idea para solucionar eso .
(https://forum.scriptcase.net/t/customize-ide-editor/37382):

El codigo fue asistido por chatgpt, y funciona con varios editores abiertos a la vez en pestañas.

Funciona con scriptcase 9.12.011 (10)

Pasos
instalar Tampermonkey web extension
Activar modo desarrollador en extensiones.
Adicionar el siguiente script en tempermonkey.



// ==UserScript==
// @name Restaurar posición del cursor y scroll en CodeMirror Scriptcase
// @version 1.2
// @description Guarda y restaura posición del cursor y scroll en CodeMirror tras recargar, asegurando foco y timing
// @match *://*/scriptcase/*
// @grant none
// ==/UserScript==

(function () {
'use strict';

const content = document.querySelector('.CodeMirror')?.CodeMirror.getValue() || '';
const hash = hashString(content);
const STORAGE_KEY = 'codemirror_cursor_' + hash;
const SCROLL_KEY = 'codemirror_scroll_' + hash;

// Guarda posición de cursor y scroll al salir
window.addEventListener('beforeunload', () => {
const cm = document.querySelector('.CodeMirror')?.CodeMirror;
if (cm) {
const cursor = cm.getCursor();
const scroll = cm.getScrollInfo();
localStorage.setItem(STORAGE_KEY, JSON.stringify(cursor));
localStorage.setItem(SCROLL_KEY, JSON.stringify(scroll));
}
});

function hashString(str) {
let hash = 0;
for (let i = 0; i < str.length; i++) {
hash = (hash << 5) - hash + str.charCodeAt(i);
hash |= 0;
}
return hash;
}

function waitForEditorAndRestoreCursorAndScroll() {
const interval = setInterval(() => {
const cmElement = document.querySelector('.CodeMirror');
if (cmElement && cmElement.CodeMirror) {
const cm = cmElement.CodeMirror;
const savedCursor = localStorage.getItem(STORAGE_KEY);
const savedScroll = localStorage.getItem(SCROLL_KEY);

// Restaurar cursor
if (savedCursor) {
try {
const cursor = JSON.parse(savedCursor);

requestIdleCallback(() => {
cm.focus();
setTimeout(() => {
cm.setCursor(cursor);
}, 100);
});

let retries = 5;
const retrySetCursor = () => {
if (retries-- > 0) {
setTimeout(() => {
cm.focus();
cm.setCursor(cursor);
retrySetCursor();
}, 200);
}
};
retrySetCursor();

} catch (e) {
console.warn('Error al restaurar cursor:', e);
}
}

// Restaurar scroll
if (savedScroll) {
try {
const scroll = JSON.parse(savedScroll);
setTimeout(() => {
cm.scrollTo(scroll.left, scroll.top);
}, 200);
} catch (e) {
console.warn('Error al restaurar scroll:', e);
}
}

clearInterval(interval);
}
}, 300);
}

waitForEditorAndRestoreCursorAndScroll();
})();

Reply all
Reply to author
Forward
0 new messages