Codemirror : Menambahkan Ctrl+D sebagai DuplicateLine

on Monday, February 19, 2018
Codemirror  adalah salah satu textarea replacement favorit saya. Tetapi karena saya lebih sering menggunakan Editor Geany untuk ngoding offline, acapkali kebiasaan-kebiasaan di Geany masih terbawa. Salah satunya adalah DuplicateLine dengan menekan Ctrl-D, sayangnya di Codemirror fungsinya jauh beda, deleteLine.

Otak-atik codemirror.js plus informasi dari Stackoverflow,ternyata bisa juga diubah.

  1. Buka codemirror.js dengan editor favorit.
  2. Search fungsi deleteLine
  3. Tambahkan beberapa baris berikut
deleteLine: function (cm) { return deleteNearSelection(cm, function (range) { return ({
from: Pos(range.from().line, 0),
to: clipPos(cm.doc, Pos(range.to().line + 1, 0))
}); }); },
//
//Start duplicateLine
duplicateLine : function(cm){
var current_cursor = cm.doc.getCursor();
var line_content = cm.doc.getLine(current_cursor.line);
CodeMirror.commands.goLineEnd(cm);
CodeMirror.commands.newlineAndIndent(cm);
cm.doc.replaceSelection(line_content);
cm.doc.setCursor(current_cursor.line + 1, current_cursor.ch);
},
//End duplicateLine
//
delLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { return ({
from: Pos(range.from().line, 0), to: range.from()
}); }); },
  1. Search lagi fungsi deleteLine
    kemudian tambahkan perintah keyboard berikut. .... tidak usah ditulis maksudnya itu dan seterusnya :D
keyMap.pcDefault = { "Ctrl-A": "selectAll", "Alt-D": "deleteLine", "Ctrl-D": "duplicateLine", "Ctrl-Z": "undo", .....
  1. Simpan dan cobalah code mirror di browser
  2. Jika belum bisa, clear cache browser anda.  
Sumber : Stackoverflow

UPDATE :

Mengambil dari https://codemirror.net/keymap/sublime.js, duplicateLine lebih mantab denga script berikut :
==========================
duplicateLine : function(cm){
var rangeCount = cm.listSelections().length;
      for (var i = 0; i < rangeCount; i++) {
        var range = cm.listSelections()[i];
        if (range.empty())
          cm.replaceRange(cm.getLine(range.head.line) + "\n", Pos(range.head.line, 0));
        else
          cm.replaceRange(cm.getRange(range.from(), range.to()), range.from());
}
      cm.scrollIntoView();
},
==========================
Jika script sebelumnya hanya single line, script ini mendukung duplicate multiple line.

0 comments:

Post a Comment