Вставка нового текста в заданное положение курсора


Я работаю над настройкой codemirror для моего нового языкового режима. В рамках реализации этого нового режима я пишу новую панель инструментов, где пользователь может выбрать некоторый текст и сказать insert. Эта команда должна вставить текст, который пользователь набирал непосредственно перед щелчком на панели инструментов.

Я не смог найти никакой поддержки уровня API, чтобы сделать это. Если есть какой-то другой способ, может ли кто-то помочь мне в этом?

В основном получаем текущее положение курсора - номер строки и положение, при котором курсор в данный момент присутствует. Может быть объектом позиции

API для вставки текста, что-то вроде insertText("Text", PositionObject)

6 9

6 ответов:

Как насчет replaceSelection (http://codemirror.net/doc/manual.html#replaceSelection)?

Чтобы добавить новую строку в конце -

function updateCodeMirror(data){
    var cm = $('.CodeMirror')[0].CodeMirror;
    var doc = cm.getDoc();
    var cursor = doc.getCursor(); // gets the line number in the cursor position
    var line = doc.getLine(cursor.line); // get the line contents
    var pos = { // create a new object to avoid mutation of the original selection
        line: cursor.line,
        ch: line.length - 1 // set the character position to the end of the line
    }
    doc.replaceRange('\n'+data+'\n', pos); // adds a new line
}

Вызов функции

updateCodeMirror("This is new line");

Вот как я это сделал:

function insertTextAtCursor(editor, text) {
    var doc = editor.getDoc();
    var cursor = doc.getCursor();
    doc.replaceRange(text, cursor);
}

Вы хотите использовать функциюreplaceRange . Даже если имя говорит "заменить", оно также служит" вставить " в зависимости от аргументов. Из документации на тот момент я пишу следующее:

Заменить часть документа между ОТ и до на заданную строка. from и to должны быть объектами {line, ch}. чтобы можно было остановиться на просто вставьте строку в позицию from. Когда дано происхождение, оно будут переданы на "изменение" события, и его первая буква будет быть используется для определения возможности слияния этого изменения с предыдущим история событий, в том виде, как описано для отбора истоков.

Улучшена функция, которая, если выделение присутствует, заменяет текст, если нет, вставляет в текущую позицию курсора

function insertString(editor,str){

        var selection = editor.getSelection();

        if(selection.length>0){
            editor.replaceSelection(str);
        }
        else{

            var doc = editor.getDoc();
            var cursor = doc.getCursor();

            var pos = {
               line: cursor.line,
               ch: cursor.ch
            }

            doc.replaceRange(str, pos);

        }

    }

Конечная функция для вставки текста в текущей позиции курсора в performant образом. Надеюсь, это поможет.

function insertStringInTemplate(str)
{
    var doc = editor_template.getDoc();
    var cursor = doc.getCursor();

    var pos = {
        line: cursor.line,
        ch: cursor.ch
    }

    doc.replaceRange(str, pos);
}