是否可以使用 TeXstudio 的编辑器按字典顺序对行进行排序(升序/降序)?当然,切换到第三方文本编辑器是一种选择,但我觉得很奇怪,我无法在 TeXstudio 中找到执行如此简单任务的方法。
我有一个单独的列表,其中包含词汇表条目(超过一千行),但为了简单起见,请考虑以下示例:
未分类列表:
\newacronym{cba}{cba}{reversed alphabetic sequence}
\newacronym{123}{123}{first, second, third}
\newacronym{ABC}{ABC}{alphabetic sequence}
按升序排列的行:
\newacronym{123}{123}{first, second, third}
\newacronym{ABC}{ABC}{alphabetic sequence}
\newacronym{cba}{cba}{reversed alphabetic sequence}
答案1
TeXstudio wiki 中提供了一个简单的脚本:https://sourceforge.net/p/texstudio/wiki/Scripts/#sorting
如果您想实现这一点,请转至Macros -> Edit Macros
。
%SCRIPT
var a = new Array();
for (var i=0;i<editor.document().lineCount();i++)
a.push(editor.text(i));
a.sort();
var t = "";
for (var l in a) t+= a[l]+"\n";
editor.setText(t);
突出显示您想要排序的文件部分,然后调用宏。(默认情况下,此操作的键盘快捷键是Shift+ F1(或其他功能键)。)
请注意,排序发生在a.sort();
,这是 QTScript 的内置排序函数(TeXstudio 宏在 QTscript 中解释(与 Javascript 密切相关)。因此,如果您想自定义此排序功能(如大写字母最后等),就不会那么简单了。
然而,实现反向(降序)顺序相对容易。
免责声明:我不是 QTScript 专家,但下面的应该可以满足你的目的降序命令。
也就是说,结果将是:
\newacronym{cba}{cba}{reversed alphabetic sequence}
\newacronym{ABC}{ABC}{alphabetic sequence}
\newacronym{123}{123}{first, second, third}
该脚本与上面的脚本相比略有变化:
%SCRIPT
var a = new Array();
for (var i=0;i<editor.document().lineCount();i++)
a.push(editor.text(i));
a.sort();
var t = "";
for (var l in a) t+= a[a.length-1-l]+"\n";
editor.setText(t);
Ninja 编辑:@samcarter 的降序解决方案更好。
%SCRIPT
var a = new Array();
for (var i=0;i<editor.document().lineCount();i++)
a.push(editor.text(i));
a.sort();
a.reverse();
var t = "";
for (var l in a) t+= a[l]+"\n";
editor.setText(t);
答案2
下面的代码还会扩展当前选择以匹配整行,然后对其进行排序。此处的其他脚本没有考虑选择,因此我对其进行了修复。
%SCRIPT
function expandSelection() {
/* Will expand the selection to match entire lines
or the entire document if nothing is selected.
This could be easily altered by removing the Else clause.
*/
if (cursor.hasSelection()) {
// Gets the first and last line of selection
// (can be done upwards or downwards)
var selectBeg = Math.min(cursor.lineNumber(), cursor.anchorLineNumber());
var selectEnd = Math.max(cursor.lineNumber(), cursor.anchorLineNumber());
// Expands the selection
cursor = editor.document().cursor(selectBeg, 0, selectEnd);
} else {
// Expands the selection to all the lines
cursor = editor.document().cursor(0, 0, editor.document().lineCount());
}
}
var mySorting = function(A, B) {
/* This function returns -1 when A is first in alphabetical order than B
1 when B is first
0 when they're the same
*/
A = A.toLowerCase();
B = B.toLowerCase();
if (A < B) {
return -1;
} else if (B < A) {
return 1;
} else {
0
}
}
expandSelection();
var eol = editor.document().lineEndingString(); //'\n' probably would've worked just fine, but I wanted to be fancy
var inputText = cursor.selectedText().split(eol).sort(mySorting).join(eol);
cursor.replaceSelectedText(inputText);