VS Code按F8运行PowerShell选中代码终端重复显示命令问题咨询
问题根因
该异常是VS Code 1.68.x版本的事件透传bug、搭配PowerShell默认加载的PSReadLine模块键位规则共同导致,两个异常现象的对应逻辑如下:
- 终端聚焦时按F8等价于按向上键调出历史命令
该键绑定不属于VS Code内置快捷键配置,是PowerShell会话启动时默认加载的PSReadLine模块自带规则:PSReadLine默认将F8绑定为历史命令搜索功能,当前输入行无内容时,触发效果和向上方向键完全一致,直接遍历上一条执行过的历史命令,因此不会出现在VS Code的快捷键配置列表中。 - 编辑器聚焦按F8运行选中代码后,已执行命令重复显示在终端输入行
触发链路如下:- 编辑器聚焦状态下按F8时,PowerShell扩展的执行逻辑是:先将选中的代码文本发送到集成终端输入流,再模拟发送回车触发执行
- 代码执行完毕的瞬间,VS Code 1.68.1存在事件透传bug:会将未被编辑器完全消费的F8按键事件传递给刚激活的终端输入层
- 终端中运行的PSReadLine捕获到F8按键事件,直接触发预设的历史命令回溯逻辑,将刚执行完成的那条命令填充到当前输入提示符后,最终呈现出命令重复显示的效果。
注意:最后一行重复的命令仅被填充到输入行,没有触发回车执行,不会产生实际运行效果,直接输入新命令即可覆盖该行内容。
复现对应说明
测试使用的PowerShell代码:
Write-Output 'Hello'
终端实际输出匹配描述:
PS C:\Temp> PS C:\Temp> Write-Output 'Hello' Hello PS C:\Temp> Write-Output 'Hello'
修复方案
- 升级VS Code至1.70及以上版本,官方已在该版本修复了快捷键执行编辑器命令后事件透传到终端的bug
- 若暂不升级VS Code,可移除PSReadLine对F8的默认绑定:在PowerShell中执行
notepad $PROFILE打开当前用户的PowerShell配置文件,添加如下配置后保存,重启终端即可生效:Remove-PSReadLineKeyHandler -Key F8 - 也可在VS Code快捷键设置中,为「PowerShell: 运行选中内容」命令添加when条件
editorFocus && !terminalFocus,从规则层面避免按键事件冲突。
内容的提问来源于stack exchange,提问作者Rudhan
相关产品推荐
相关产品推荐

