通配符不展开的根本原因是未加引号导致fish在无匹配时报错退出;需用引号包裹通配符(如"file-*")或设set -g fish_glob_fail 0禁用报错,同时确认VSCode启动的是登录模式fish并正确加载config.fish。

fish-shell 通配符在 VSCode 终端里不展开?检查引号和 glob 模式
VSCode 集成终端启动 fish 后,scp、rsync 或 ls 等命令里的通配符(如 *、?)突然不匹配文件,只当字面量传给远程或报错 No matches for wildcard,根本原因不是 VSCode 限制,而是 fish 默认启用 glob,但你写了未加引号的路径,又恰好当前目录下没匹配项——fish 就直接报错退出,终端闪退。
实操建议:
- 通配符必须被 shell 解析,所以别写
scp user@host:/path/file-*(无引号),改用scp user@host:/path/"file-*"或scp user@host:/path/file-\* - 临时验证 glob 是否生效:运行
echo *.txt,有输出说明正常;若报错,说明当前目录无匹配,不是 bug 是预期行为 - 不想让 fish 在无匹配时报错,可在
~/.config/fish/config.fish中加:set -g fish_glob_fail 0
VSCode 启动 fish 后环境变量丢失、nvm/pyenv 不生效?确认是否为登录 Shell
你在终端里手动执行 fish 能用 nvm use,但 VSCode 里一打开就提示 command not found: nvm,大概率是 VSCode 启动的是非登录模式的 fish,跳过了 ~/.config/fish/config.fish 的加载(虽然 fish 默认会读,但某些系统或配置下仍可能失效)。
实操建议:
- 在 VSCode 终端中运行
ps -p $$,看输出是否含-fish(带短横表示登录 Shell);若没有,说明不是登录模式 - 强制 VSCode 启动登录 Shell:在
settings.json中设置"terminal.integrated.defaultProfile.osx": {"path": "fish", "args": ["-l"]}(macOS/Linux),Windows 同理加"args": ["-l"] - 不要依赖
.bashrc或.zshrc里的初始化逻辑——fish 不读它们;确保所有工具(nvm、pyenv、asdf)的初始化代码都放在~/.config/fish/config.fish里,且是同步执行的(别包在函数里等手动调用)
VSCode 配置 fish 作为默认终端后,Ctrl+` 打不开或闪退?聚焦 shellArgs 和配置迁移
VSCode 1.85+ 已弃用 terminal.integrated.shell.* 系列旧配置,若你还在 settings.json 里留着 "terminal.integrated.shell.linux": "/usr/bin/fish" 这类字段,VSCode 会忽略它,同时因 fallback 失败导致终端无法启动或立即退出。
实操建议:
- 删掉所有
terminal.integrated.shell.*配置项(包括.windows、.osx、.linux后缀版本) - 改用新配置:
"terminal.integrated.defaultProfile.linux": "fish"(Linux/macOS)或"terminal.integrated.defaultProfile.windows": {"path": "fish"}(Windows WSL) - 如果 fish 安装在非标准路径(比如 macOS 用 Homebrew 装在
/opt/homebrew/bin/fish),必须写完整路径,并确保该路径在 VSCode 启动时的$PATH中可用;否则加"args": ["-l"]显式传参 - 改完配置后,**关掉所有终端 tab,再按
Ctrl+`**——只刷新不重启,旧进程不会更新配置
fish 4.1+ 升级后 VSCode 终端里提示符异常或补全卡顿?注意大括号语法与 transient prompt 冲突
升级 fish 到 4.1.3 后,VSCode 终端里输入命令时提示符闪烁、补全延迟半秒、甚至输入中途光标跳位,常见于启用了 fish_transient_prompt=1 且自定义了 fish_right_prompt 的用户。这是因为 VSCode 的 xterm.js 渲染层对 fish 4.1 新增的 prompt 重绘机制响应不一致,尤其在非真彩色终端或 TERM 值不匹配时更明显。
实操建议:
- 先临时禁用 transient prompt 测试:
set -g fish_transient_prompt 0,再新开终端看是否恢复 - 确保 VSCode 终端的 TERM 环境变量合理:在
settings.json中加"terminal.integrated.env.linux": {"TERM": "xterm-256color"}(对应平台调整后缀) - 避免在
fish_prompt函数里执行耗时操作(如 Git 分支状态调用git status --porcelain),改用异步缓存或降级为简单字符串 - fish 4.1+ 移除了 terminfo 依赖,但 VSCode 仍可能读取旧缓存;可尝试在终端里运行
reset或关闭并重建终端实例
最易被忽略的一点:VSCode 终端的“工作区终端”会继承工作区级别的 settings.json 配置,而用户级配置可能被覆盖。遇到诡异行为,先检查 .vscode/settings.json 里有没有冲突的 terminal.integrated.* 字段。


















