Search code examples
javascriptjquerycodemirrorcursor-position

Append HTML Tag Into Codemirror and Center Cursor Location


Fiddle - http://liveweave.com/kzBlq3

I'm trying to add custom html tags into CodeMirror and focus the cursor into the center of these tags.

Here's an example of how it'd be done for a textarea.

// Mirror Codemirror Code to Textarea
$(".code").val( editor.getValue() ).on('keyup change', function() {
  editor.setValue( $(this).val() );
});

// Add center code
$(".bold").click(function() {
  // For a regular textarea & center cursor
    var start = $('.code').get(0).selectionStart;
    $('.code').val($('.code').val().substring(0, start) + "<strong></strong>" + $('.code').val().substring($('.code').get(0).selectionEnd));
    $('.code').get(0).selectionStart = $('.code').get(0).selectionEnd = start + 8;
    $('.code').focus();
    return false;
});

The lines and locations will always be different so I have to grab it's location first before I add and move it aside the added characters as I did with the textarea demo.

However I don't want to use a blank textarea. I want to use Codemirror.

I can add the html tag without a problem, but getting the cursor location inside of the appended tag is where I'm having trouble.

editor.replaceRange("<strong></strong>", editor.getCursor());

Solution

  • Add the following code to move cursor to center of tag. Also I updated your code, Please use the below link for accessing it

    http://liveweave.com/LLq9GS

      $(".bold").click(function() {
        // For codemirror & center cursor
        editor.replaceRange("<strong></strong>", editor.getCursor());
       editor.focus();
        var str="</strong>";
        var mynum=str.length;
        var start_cursor = editor.getCursor();  //I need to get the cursor position
        console.log(start_cursor);  //Cursor position 
        var cursorLine = start_cursor.line;
        var cursorCh = start_cursor.ch;
    
        //Code to move cursor back [x] amount of spaces. [x] is the data-val value.
        editor.setCursor({line: cursorLine , ch : cursorCh -mynum });