如何对 TeXstudio 中的代码行进行排序?

如何对 TeXstudio 中的代码行进行排序?

是否可以使用 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);

相关内容