[英]Is there a way to select code between certain characters
TL 博士
在 cursor 上方和下方的 select 代码是否有一些扩展或其他功能,这些代码被一些字符包围,例如%%
或% =====
或其他任何字符?
为什么
我在 VSCode 中编码 Matlab,因为内置的 Matlab 编辑器缺少很多有用的功能。 但是,我想念的一件事是运行“部分”的能力:
%% 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);
可以使用Ctrl + Enter运行一个部分。 由于我在 Windows 上使用 Matlab,因此不支持从终端/cmd 运行 Matlab 解释器。
所以我创建了一些 AutoHotKey 脚本,它们将复制选定的代码,打开 Matlab window,粘贴它,然后运行。 这很好用,但是,当我想运行一个非常大的部分时,这意味着我必须手动输入 select,然后按我定义的快捷方式来调用 AutoHotkey 脚本。 因此上面的问题。
所以说我在section 2
的某行有 cursor,我怎么能 select 只有本节中的代码(包括或不包括“标题”节,这些是评论所以没关系)。
我做了一个扩展选择方式 ,它允许基于相对光标位置的正则表达式的选择。 您可以为前进和后退搜索指定不同的表达式,以及是否要在选择中包括搜索到的文本。
您最多可以设置5个正则表达式搜索。
该扩展定义了5个可在键盘快捷方式中使用的命令
(当然)这可以通过编写自定义扩展来完成。
由于这通常看起来是有用的功能,而且是有趣的练习,因此,我在个人vscode-smcpeak扩展中添加了所需的功能。
要使用它:
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"
]
},
keybindings.json
(文件→首选项→键盘快捷键,然后单击右上角的“打开键盘快捷键(JSON)”图标): {
"key": "ctrl+alt+m", // or whatever
"command": "macros.selectPercentRegion"
},
(注意:VSCode始终会抱怨macros.selectPercentRegion
不是有效的命令。这是对“ macros”扩展名的限制。)
然后,将光标置于由指定正则表达式分隔的区域中,按键盘上的键以激活宏:
rioV8 接受的答案使用单个扩展名来回答OP的问题。 这对我来说似乎是一个很好的解决方案,并且比我的使用起来更简单,因此我同意将其作为可接受的答案。
但是,我的方法有一个优势:它允许在settings.json
修改行为。 例如,OP在后续问题中询问有关让命令在选择后将文本另外复制到剪贴板的问题。 使用基于宏的解决方案,这是对settings.json
的简单修改; 只需添加:
"editor.action.clipboardCopyAction"
到selectPercentRegion
宏的末尾。 (这是通常绑定到Ctrl + C的命令。)
因此,尽管我的建议涉及更多方面,但我个人更喜欢这种方法。
正如Mark在评论中指出的那样,最受欢迎的宏扩展名geddski.macros并未维护。 此外,它还有一个相当严重的错误 ,即命令的顺序不正确,导致出现竞争状况。 (实际上,我在测试过程中见过一次。)
市场上有geddski.macros的两个分支,即l7ssha.macrosRe和ctf0.macros 。 l7ssha.macrosRe仅添加了“延迟”功能 ,这是解决竞赛条件的尴尬方式。 另一方面,ctf0.macros完全修复了竞争条件(通过完全重写 )。
因此,我建议使用ctf0.macros ,并且实际上已经编辑了答案以使用它,而不是原始的geddski.macros扩展名。
但是,请注意:
macros.list
而不是settings.json
macros
这些附加内容在vscode-smcpeak commit 6d5f5d4689中 。
我的扩展程序注册了一个新命令smcpeak.goToLineMatching
,该命令向上或向下搜索包含正则表达式的行。 逻辑非常简单,只需进行循环和正则表达式测试即可。
它还会注册smcpeak.revealCurrentSelection
,这是必需的,因为否则,所选文本可能会在屏幕外,并且默认情况下不会滚动到该文本。
宏selectPercentRegion
使用goToLineMatching
向上查找一个正则表达式,在那里设置锚点(选择开始),然后再次使用它向下查找另一个正则表达式(尽管此处相同),将选择范围扩展到该点。 然后滚动以确保选择可见。
如果您不希望我提供的其余内容,则可以直接将此代码移植到您自己的扩展中。 (但是我没有绑定任何密钥,因此拥有多余的东西应该没有不利的影响。)
这是执行此操作的另一种方法,使用我编写的扩展名Find and Transform 。
在您的键绑定中进行此键绑定keybindings.json
(或者它也可以是一个设置):
{
"key": "alt+m", // whatever keybinding you want
"command": "findInCurrentFile",
"args": {
"find": "^(%%[\\s\\S]+?)(?=^$)|(^%%[\\s\\S]+)",
"run": [
"$${",
"const sections = vscode.window.activeTextEditor.selections;",
"await vscode.commands.executeCommand('cursorUndo');",
"const mySection = sections.find(section => section.contains(vscode.window.activeTextEditor.selection));",
"if (mySection) {",
"vscode.window.activeTextEditor.selections = [mySection];"
"}",
"}$$",
],
"isRegex": true,
"postCommands": "editor.action.clipboardCopyAction"
}
}
查找正则表达式查找并选择所有%%....
部分。 但是由于您只想要 cursor 开始的部分,因此run
一些代码来恢复原始 cursor,然后找到包含当前 cursor 的部分。然后选择该部分。 并在postCommand
中将选择保存到剪贴板。
那是在键绑定或设置中使用 javascript 和 vscode 扩展 api。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.