在编辑器上执行 setValue 时首先标记 运行 不像连续更改那样工作
First tokenizing run when executing setValue on editor does not work like consecutive changes
我正在测试一个属性编辑器,它具有开箱即用的主题 (twilight) - 按预期工作 - 以及开箱即用的属性模式。通过 javascript 在编辑器中设置属性的初始文本(editor.setValue())在标记化而不是属性(变量、关键字、字符串)时被解析为纯文本(类型:文本)
(另请参阅以下代码笔:https://codepen.io/anon/pen/xjrvvG?editors=1111)
更新:在页面中加载以下脚本,解决了问题,但这不是实际想法
<script src="./ace/theme-twilight.js" type="text/javascript" charset="utf-8"></script>
<script src="./ace/mode-properties.js" type="text/javascript" charset="utf-8"></script>
HTML:
<div id="code" style="position: relative; width: 500px; height: 400px;"></div>
Javascript:
var editor = ace.edit("code");
var session = editor.getSession();
editor.setTheme("ace/theme/twilight");
session.setMode({
path: "ace/mode/properties",
v: Date.now()
});
session.on('change', function (e) {
console.log(e);
console.log(session.getLine(e.end.row).length);
var TokenIterator = ace.require("ace/token_iterator").TokenIterator;
var iterator = new TokenIterator(editor.getSession(), e.end.row, 0);
var token = iterator.getCurrentToken();
while (token && iterator.getCurrentTokenRow() === e.end.row) {
console.log(token);
token = iterator.stepForward();
}
});
editor.getSession().setValue("#just a comment\n" +
"database=localhost\n" +
"database=remotehost\n" +
"dbuser=uuu\n" +
"dbpassword=password", 1);
页面加载时的控制台日志(预计不会,因为 type = text 对于属性模式不正确):
Object {
action: "insert",
end: Object {
column: 19,
row: 4
},
id: 1,
lines: ["#just a comment", "database=localhost", "database=remotehost", "dbuser=uuu", "dbpassword=password"],
start: Object {
column: 0,
row: 0
}
}
19
Object {
index: 0,
start: 0,
type: "text",
value: "dbpassword=password"
}
直接在编辑器中进行更改时,属性 被正确解析(变量、关键字、字符串):
Object {
action: "insert",
end: Object {
column: 20,
row: 4
},
id: 2,
lines: ["d"],
start: Object {
column: 19,
row: 4
}
}
20
Object {
index: 0,
start: 0,
type: "variable",
value: "dbpassword"
}
Object {
type: "keyword",
value: "="
}
Object {
type: "string",
value: "passwordd"
}
当使用 setMode 时,模式是异步加载的,所以第一次被解析为文本。
当您包含 <script src="./ace/mode-properties.js" type="text/javascript" charset="utf-8"></script>
时,模式会在其余代码之前加载,因此第一个 运行 编辑器已经使用了正确的模式
我正在测试一个属性编辑器,它具有开箱即用的主题 (twilight) - 按预期工作 - 以及开箱即用的属性模式。通过 javascript 在编辑器中设置属性的初始文本(editor.setValue())在标记化而不是属性(变量、关键字、字符串)时被解析为纯文本(类型:文本)
(另请参阅以下代码笔:https://codepen.io/anon/pen/xjrvvG?editors=1111)
更新:在页面中加载以下脚本,解决了问题,但这不是实际想法
<script src="./ace/theme-twilight.js" type="text/javascript" charset="utf-8"></script>
<script src="./ace/mode-properties.js" type="text/javascript" charset="utf-8"></script>
HTML:
<div id="code" style="position: relative; width: 500px; height: 400px;"></div>
Javascript:
var editor = ace.edit("code");
var session = editor.getSession();
editor.setTheme("ace/theme/twilight");
session.setMode({
path: "ace/mode/properties",
v: Date.now()
});
session.on('change', function (e) {
console.log(e);
console.log(session.getLine(e.end.row).length);
var TokenIterator = ace.require("ace/token_iterator").TokenIterator;
var iterator = new TokenIterator(editor.getSession(), e.end.row, 0);
var token = iterator.getCurrentToken();
while (token && iterator.getCurrentTokenRow() === e.end.row) {
console.log(token);
token = iterator.stepForward();
}
});
editor.getSession().setValue("#just a comment\n" +
"database=localhost\n" +
"database=remotehost\n" +
"dbuser=uuu\n" +
"dbpassword=password", 1);
页面加载时的控制台日志(预计不会,因为 type = text 对于属性模式不正确):
Object {
action: "insert",
end: Object {
column: 19,
row: 4
},
id: 1,
lines: ["#just a comment", "database=localhost", "database=remotehost", "dbuser=uuu", "dbpassword=password"],
start: Object {
column: 0,
row: 0
}
}
19
Object {
index: 0,
start: 0,
type: "text",
value: "dbpassword=password"
}
直接在编辑器中进行更改时,属性 被正确解析(变量、关键字、字符串):
Object {
action: "insert",
end: Object {
column: 20,
row: 4
},
id: 2,
lines: ["d"],
start: Object {
column: 19,
row: 4
}
}
20
Object {
index: 0,
start: 0,
type: "variable",
value: "dbpassword"
}
Object {
type: "keyword",
value: "="
}
Object {
type: "string",
value: "passwordd"
}
当使用 setMode 时,模式是异步加载的,所以第一次被解析为文本。
当您包含 <script src="./ace/mode-properties.js" type="text/javascript" charset="utf-8"></script>
时,模式会在其余代码之前加载,因此第一个 运行 编辑器已经使用了正确的模式