有没有办法在某些字符之间选择代码

时间:2019-09-01 22:00:28

标签: matlab visual-studio-code

TL DR

是否有一些扩展名或其他功能来选择由某些字符包围的光标上方和下方的代码,例如[STAThread] static void Main(string[] args) { OpenFileDialog openFileDialog1 = new OpenFileDialog(); openFileDialog1.Title = "Load List"; openFileDialog1.DefaultExt = "txt"; openFileDialog1.Filter = "Text files|*.txt"; openFileDialog1.RestoreDirectory = true; openFileDialog1.ShowDialog(); //Error CS1061 here string fileName = openFileDialog1.FileName; List<string> accounts = File.ReadAllLines(fileName).ToList<string>(); Console.WriteLine("Lines Loaded: " + accounts.Count); Console.Write("Threads : "); } %%还是其他?

为什么

我正在用VSCode编码Matlab,因为内置的Matlab编辑器缺少许多有用的功能。但是,我想念的一件事是能够运行“节”:

% =====

可以使用 Ctrl + Enter 运行部分。由于我在Windows上使用Matlab,因此不支持从终端/ cmd运行Matlab解释器。

因此,我创建了一些AutoHotKey脚本,这些脚本将复制选定的代码,打开Matlab窗口,粘贴并运行。这很好用,但是,当我要运行一个很大的部分时,这意味着我必须手动选择它,然后按定义的快捷方式来调用AutoHotkey脚本。因此,上面的问题。

所以说%% section 1 x = 0:0.01:pi; y = sin(y); plot(x,y); %% section 2 x = 0:0.01:pi; y = cos(y); plot(x,y); %% section 3 x = 0:0.01:pi; y = tan(y); plot(x,y); 的某行有光标,我该如何只选择本节中的代码(包括或不包括“ headers”节,这些都是注释,所以没关系)。

更新

由于@ rioV8的扩展,我认为我现在使用的工作流程对其他人也非常有用,因此我创建了一个包含所需脚本和安装步骤的仓库:vscode-run-matlab

2 个答案:

答案 0 :(得分:3)

我做了一个扩展Select By,它允许基于相对于光标位置的正则表达式进行选择。您可以为前进和后退搜索指定不同的表达式,以及是否要在选择中包括搜索到的文本。

您最多可以设置5个正则表达式搜索。

扩展名定义了5个可在键盘快捷键中使用的命令

答案 1 :(得分:2)

(当然)可以通过编写自定义扩展名来完成。

由于总体上看似有用的功能和有趣的练习,所以我已经在我的个人vscode-smcpeak扩展名中添加了所需的功能。

要使用它:

  1. 安装vscode-smcpeak。现在必须manually安装它。在撰写本文时,最新值为0.0.7。
  2. 通过 ctf0 安装macros。可以从VSCode内安装这一程序。 安装后重新启动VSCode。(有关“宏”扩展名的选择,请参见下文。)
  3. 添加到settings.json中(文件→首选项→设置,然后单击右上角的“打开设置(JSON)”图标):
    // Custom macros for ctf0.macros extension
    "macros.list": {
        // https://stackoverflow.com/questions/57749780/is-there-a-way-to-select-code-between-certain-characters
        "selectPercentRegion": [
            {
                "command": "smcpeak.goToLineMatching",
                "args": {
                    "regex": "^%%",
                    "moveUp": true,
                    "select": false,
                    "allowZeroMove": true
                }
            },
            {
                "command": "smcpeak.goToLineMatching",
                "args": {
                    "regex": "^%%",
                    "moveUp": false,
                    "select": true,
                    "allowZeroMove": false
                }
            },
            "smcpeak.revealCurrentSelection"
        ]
    },
  1. 添加到keybindings.json(文件→首选项→键盘快捷方式,然后单击右上角的“打开键盘快捷方式(JSON)”图标):
    {
        "key": "ctrl+alt+m",   // or whatever
        "command": "macros.selectPercentRegion"
    },

(注意:VSCode总是会抱怨macros.selectPercentRegion不是有效的命令。这是对“宏”扩展名的限制。)

然后,将光标置于由指定正则表达式分隔的区域中,按键盘上的键以激活宏:

Screenshot of before and after macro invocation

为什么要使用两个扩展名?

rioV8的accepted answer使用单个扩展名来回答OP的问题。这对我来说似乎是一个很好的解决方案,并且比我的方法更易于使用,因此我赞成将其作为可接受的答案。

但是,我的方法有一个优点:它允许在settings.json中修改行为。例如,OP在后续问题中询问有关让命令在选择后将文本另外复制到剪贴板的问题。使用基于宏的解决方案,这是对settings.json的简单修改;只需添加:

            "editor.action.clipboardCopyAction"

selectPercentRegion宏的末尾。 (该命令通常绑定到Ctrl + C。)

因此,尽管我的建议涉及更多动议,但我个人更喜欢这种方法。

要使用哪个宏扩展?

正如Mark在评论中指出的那样,最流行的宏扩展名geddski.macros未被保留。此外,它还有一个相当严重的bug,因为这些命令的顺序不正确,从而导致竞争状态。 (我实际上在测试过程中见过一次。)

marketplacel7ssha.macrosRectf0.macros上有geddski.macros的两个分支。 l7ssha.macrosRe仅添加"delay" ability,这是解决竞争条件的尴尬方式。 ctf0.macros则完全解决了竞争条件(通过complete rewrite)。

因此,我建议使用 ctf0.macros ,实际上,我已经编辑了答案以使用它,而不是原来的geddski.macros扩展名。

但是,请注意:

  • ctf0.macros在macros.list中使用macros而不是settings.json
  • ctf0.macros需要在安装后重新启动VSCode才能激活

工作原理

添加的内容在vscode-smcpeak commit 6d5f5d4689中。

我的扩展程序注册了一个新命令smcpeak.goToLineMatching,该命令向上或向下搜索包含正则表达式的行。逻辑非常简单,只需执行循环和正则表达式测试即可。

它还会注册smcpeak.revealCurrentSelection,这是必需的,因为否则,所选文本可能会在屏幕外显示,并且默认情况下不会滚动到该文本。

selectPercentRegion使用goToLineMatching向上查找一个正则表达式,在那里设置锚点(选择开始),然后再次使用它向下查找另一正则表达式(尽管此处相同) ,将选择范围扩展到该点。然后滚动以确保该选择可见。

如果您不希望我提供的其余内容,则可以轻松地将此代码移植到您自己的扩展中。 (但是我没有绑定任何密钥,因此拥有多余的东西应该没有不利的影响。)