VS Code未聚焦代码文件运行命令报No code found的解决咨询
问题现象
当目标bash脚本未在VS Code中打开,或打开后未处于窗口聚焦状态时,保存文件触发自动运行会弹出No code found or selected通知,无法正常执行脚本。
已查阅所用扩展官方文档,未找到无需聚焦代码文件即可触发扩展运行的相关配置说明。
当前settings.json配置如下,不清楚如何调整才能让扩展无需保持bash脚本打开状态即可正常运行:
{ "runOnSave.commands": [{ "match": ".*", "command": "code-runner.run", "runIn": "vscode" "runningStatusMessage": "Running ${fileBasename}.", "finishStatusMessage": "${fileBasename} completed." }], "runOnSave.statusMessageTimeout": 78000, "files.autoSaveDelay": 1000, "code-runner.cwd": "/location/to/bash/script", "code-runner.defaultLanguage": "BASH/SH", "code-runner.showExecutionMessage": true, "code-runner.customCommand": "./bash-script.sh" }
当前使用Run on Save扩展实现保存触发运行的逻辑,若现有配置方案无法解决问题,需要可实现同类功能的替代VS Code扩展。
所需功能要求
- 支持触发运行指定命令,比如执行
./time.sh这类bash脚本,示例脚本内容如下:
#!/bin/bash echo "time" sleep 10 echo "time" sleep 10 echo "time" sleep 10 echo "time"
- 命令运行中重复触发时,不会重复启动进程,仅弹出1次
Command already running提示,当前进程执行完成前禁止重复启动 - 命令运行过程中及执行结束后,可展示类似Code Runner的结构化输出,包含运行标识、脚本输出内容、退出码、总运行时长,输出格式示例:
[Running] bash "./time.sh" time time time time [Done] exited with code=127 in 31.4 seconds
目前在VS Code扩展市场检索后,仅Code Runner扩展可满足除“无需打开聚焦代码文件即可运行”之外的所有需求,寻求可行的配置修复方案或替代扩展推荐。
解决方案
方案1:修复现有逻辑(无需更换扩展)
报错根因:code-runner.run命令默认以当前聚焦的活动编辑器内的代码作为执行目标,当目标bash脚本未打开、或未处于窗口聚焦状态时,Code Runner无法获取到待执行的代码片段,就会抛出No code found or selected错误,该逻辑是Code Runner的内置设计,没有配置项可以绕过。
不需要依赖Code Runner的执行入口,直接在Run on Save配置中调用原生shell命令,配合简单的进程判断和输出包装即可满足所有需求,步骤如下:
- 修复原有配置的语法错误:原配置中
"runIn": "vscode"行末尾缺失逗号,会导致配置加载失败 - 收窄触发匹配规则:将
match字段改为".*\\.(sh|bash)$",仅在保存shell脚本文件时触发执行,避免无关文件保存误触发 - 替换执行命令:不要调用
code-runner.run,直接通过终端执行目标脚本,同时加入进程互斥逻辑避免重复启动
调整后的基础配置如下:
{ "runOnSave.commands": [{ "match": ".*\\.(sh|bash)$", "command": "if pgrep -f 'bash-script.sh' >/dev/null; then echo 'Command already running'; else bash ./bash-script.sh; fi", "runIn": "terminal", "runningStatusMessage": "Running ${fileBasename}.", "finishStatusMessage": "${fileBasename} completed." }], "runOnSave.statusMessageTimeout": 78000, "files.autoSaveDelay": 1000, "terminal.integrated.scrollback": 10000, "code-runner.cwd": "/location/to/bash/script" }
如果需要和Code Runner完全一致的结构化输出,可新增一层包装脚本实现格式封装,不需要依赖Code Runner扩展,包装脚本示例:
#!/bin/bash # 保存为run-wrapper.sh,和目标脚本放在同一目录 TARGET_SCRIPT="./bash-script.sh" # 防重复运行判断 if pgrep -f "$TARGET_SCRIPT" >/dev/null; then echo "Command already running" exit 0 fi # 格式化输出 start_ts=$(date +%s.%N) echo "[Running] bash $TARGET_SCRIPT" bash "$TARGET_SCRIPT" exit_code=$? end_ts=$(date +%s.%N) cost=$(echo "$end_ts - $start_ts" | bc) echo -e "\n[Done] exited with code=$exit_code in ${cost%.*} seconds"
之后将Run on Save配置中的command字段改为bash ./run-wrapper.sh即可,该方案完全不依赖活动编辑器焦点,只要触发保存事件就会正常执行,同时满足防重复运行、结构化输出的要求。
方案2:基于VS Code内置Task的实现
如果不想维护额外的包装脚本,可使用VS Code原生Task能力配合Run on Save实现:
- 在项目的
.vscode/tasks.json中配置自定义shell任务,指定执行目标bash脚本,设置"problemMatcher": []避免任务阻塞 - 在Run on Save的
command字段配置为workbench.action.tasks.runTask,传入配置好的任务名称即可触发 - VS Code内置任务面板天然支持输出捕获、运行时长统计、退出码展示,配合shell层的进程判断逻辑即可覆盖所有需求,稳定性高于第三方运行类扩展。
内容的提问来源于stack exchange,提问作者Richard Lora

