You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VS Code未聚焦代码文件运行命令报No code found的解决咨询

问题:保存触发脚本运行时报“No code found or selected”(脚本未打开/未聚焦场景)

问题现象

当目标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命令,配合简单的进程判断和输出包装即可满足所有需求,步骤如下:

  1. 修复原有配置的语法错误:原配置中"runIn": "vscode"行末尾缺失逗号,会导致配置加载失败
  2. 收窄触发匹配规则:将match字段改为".*\\.(sh|bash)$",仅在保存shell脚本文件时触发执行,避免无关文件保存误触发
  3. 替换执行命令:不要调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 22:36:20