网站搜索

javascript - ACE 编辑器 查找文本,选择行并替换文本


在 Ace 编辑器中,我想要查找文本,选择行并替换该文本。我可以找到文本(使用自己的标签来查找它们),并且它是有效的。我还能够使用以下代码获取行号(行数):

editor.find('needle',{
    backwards: true,
    wrap: true,
    caseSensitive: true, 
    range: null,
    wholeWord: true,
    regExp: false
})
editor.$search.set({
    needle: /(start_#D1_SavePos)/
});
var found = editor.$search.find(editor.getSession()),

    Range = require('ace/range').Range,

    // find tagname "start_#D1_SavePos" in editor 
    mine = new Range(found.start.row+1, found.start.column-1, found.end.row+1, found.end.column),

    // read the line number 
    D1SavePos = (editor.session.getTextRange(mine)),

    // get next line number, after "start_#D1_SavePos"
    // I need only this and in the editor it will be R13=0
    rowOfD1SavePos = (mine+1),

    // Rewrite R13 with value from input text
    // get Value from input field
    newD1SavePos = document.getElementById("highestBTTXT").value, 

    //Replace Zero-Value from R13 to new value
    D1SavePos = D1SavePos.replace(/R13=0/, "R13=" + newD1SavePos); 

    // Now set this to editors row

尝试使用行选择,因为在“rowOfD1SavePos”中存储了读取的行号:

    editor.selection.moveCursorToPosition(rowOfD1SavePos);

但是它不起作用。如果这行有效,我想用值“D1SavePos”替换这一行

更新 25.10.14

这是我完美的工作解决方案:

editor.find('needle',{
    backwards: true,
    wrap: true,
    caseSensitive: true, 
    range: null,
    wholeWord: true,
    regExp: false
});

editor.$search.set({ needle: /(start_#D1_SavePos)/  });

var found = editor.$search.find(editor.getSession()),

    Range = require('ace/range').Range,

    // Find Coordinates, after Line "start_#D1_SavePos"
    row   = new Range(found.start.row+1, found.start.column-1, found.end.row+1, found.end.column),

    // read Text in row
    D1SavePos = (editor.session.getTextRange(row)),

    // rewrite
    // get value from input field
    newD1SavePos = document.getElementById("highestBTTXT").value; 

// rewrite R-Parameter with input value
D1SavePos = D1SavePos.replace(/R13=0/, "R13=" + newD1SavePos); 

// write in editor
// mark line
editor.selection.moveCursorToPosition({row: row, column: 0});
// write    
editor.session.replace(new Range(row, 0, row, Number.MAX_VALUE), D1SavePos);

答案#1

moveCursorToPosition 接受一个位置,该位置是一个包含行和列的对象,例如 editor.selection.moveCursorToPosition({row: row, column: 0}) ;

要替换文本,请像这样使用 editor.session.replace(range, text)

var range = editor.find('needle',{
    wrap: true,
    caseSensitive: true, 
    wholeWord: true,
    regExp: false,
    preventScroll: true // do not change selection
})
range.start.column = 0
range.end.column = Number.MAX_VALUE
editor.session.replace(range, "x" + editor.session.getLine(range.start.row) + "x")
editor.selection.setRange(range)

注意:在你的示例中,mine + 1 是一个字符串,如果你使用浏览器开发者工具查看该函数的源代码,你会很容易明白为什么 editor.selection.moveCursorToPosition(rowOfD1SavePos); 不起作用

答案#2

我正在在 React 中使用 ace,这是我如何替换文本的代码片段

const text = 'Text replacement';
const editor = this.ace.editor;
const selectedContent = editor.getSelectedText();
const range = editor.selection.getRange();
editor.session.replace(range, text);