新しい言語モード用にコードミラーをカスタマイズする作業をしています。この新しいモードの実装の一環として、ユーザーがテキストを選択して挿入と言うことができる新しいツールバーを作成しています。このコマンドは、ユーザーがツールバーをクリックする直前に入力していた場所にテキストを挿入する必要があります。
そうするためのAPIレベルのサポートが見つかりませんでした。他の方法があれば、誰かがこれについて私を助けることができますか?
基本的に、現在のカーソル位置番号とカーソルが現在存在する位置を取得します。 Positionオブジェクトの可能性があります
insertText("Text", PositionObject)
のようなテキストを挿入するためのAPI
replaceSelection
( http://codemirror.net/doc/manual.html#replaceSelection )はどうですか?
doc.replaceSelection(replacement:string、?select:string)選択範囲を指定された文字列に置き換えます。デフォルトでは、新しい選択は挿入されたテキストの後に終了します。オプションのselect引数を使用して、これを変更できます。「around」を渡すと新しいテキストが選択され、「start」を渡すと選択範囲が挿入されたテキストの先頭に折りたたまれます。
これが私がそれをした方法です:
function insertTextAtCursor(editor, text) {
var doc = editor.getDoc();
var cursor = doc.getCursor();
doc.replaceRange(text, cursor);
}
最後に改行を追加するには-
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");
replaceRange 関数を使用します。名前には「置換」と書かれていますが、引数によっては「挿入」としても機能します。私がこれを書いている時点のドキュメントから:
Fromとtoの間のドキュメントの部分を指定された文字列に置き換えます。 fromおよびtoは{line、ch}オブジェクトである必要があります。 toを省略して、からの位置に文字列を挿入するだけです。オリジンが指定されると、「変更」イベントに渡され、その最初の文字を使用して、選択オリジンについて説明した方法で、この変更を以前の履歴イベントとマージできるかどうかが決定されます。
選択が存在する場合はテキストを置き換え、そうでない場合は現在のカーソル位置に挿入する機能の改善
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);
}
}
現在のカーソル位置にパフォーマンスの高い方法でテキストを挿入する最後の関数。それが役に立てば幸い。
function insertStringInTemplate(str)
{
var doc = editor_template.getDoc();
var cursor = doc.getCursor();
var pos = {
line: cursor.line,
ch: cursor.ch
}
doc.replaceRange(str, pos);
}