如何将Sublime中PHP文件HTML区域按=插入<?=?>的快捷键迁移到VS Code
问题根源
你当前配置失效的核心原因是VS Code原生快捷键的when条件存在两个限制:
- 只能判断文件级别的语言ID,无法区分同一PHP文件内的HTML区域、PHP代码区域、内嵌JS区域、HTML标签属性等细分语法场景
- 不支持前置文本的正则匹配,无法过滤掉标签属性赋值、PHP变量赋值这类不该触发的场景
可行方案
方案1:用HyperSnips扩展实现(推荐,规则灵活)
HyperSnips是支持语法作用域匹配、自定义触发条件的片段扩展,可以完全对齐你Sublime里的规则:
- 安装HyperSnips扩展
- 按
Ctrl+Shift+P执行「HyperSnips: Open Snippets」,选择php打开PHP专属片段配置 - 粘贴如下配置:
global function shouldTrigger() { const editor = rvscode.window.activeTextEditor; const cursor = editor.selection.active; const precedingText = editor.document.getText( new rvscode.Range(cursor.line, 0, cursor.line, cursor.character) ); // 对齐Sublime的前置文本排除规则 return !/.*<|.*\?|.*[a-zA-Zа-яА-Я]+$/.test(precedingText); } endglobal // 仅在PHP文件的HTML区域触发,排除所有不符合的场景 context "scopes.includes('text.html.basic') && !scopes.some(s => ['source.php', 'source.js.embedded.html', 'punctuation.definition.tag.end.html'].includes(s)) && shouldTrigger()" snippet "=" "PHP快速短输出" A <?=$1?> endsnippet
方案2:用扩展增强原生快捷键能力
如果你不想改用片段方案,可以安装Extra Context Keys扩展,它会给原生when条件新增语法作用域匹配、前置文本匹配的能力,替换你的快捷键配置为:
{ "key": "=", "command": "editor.action.insertSnippet", "args": {"snippet": "<?=$1?>"}, "when": "vim.active && !inDebugRepl && vim.mode == 'Insert' && editorLangId =~ /php|html/ && editorScopeMatches('text.html.basic') && !editorScopeMatches('source.php') && !editorScopeMatches('source.js.embedded.html') && !editorScopeMatches('punctuation.definition.tag.end.html') && !editorPrecedingTextMatches('.*<') && !editorPrecedingTextMatches('.*\\?') && !editorPrecedingTextMatches('.*[a-zA-Zа-яА-Я]+')" }
内容的提问来源于stack exchange,提问作者Матвей Кучеров
相关产品推荐
相关产品推荐

