刚把 cmder 设为默认终端的人,多半会经历一个小尴尬:满屏输出之后想清屏,下意识敲了个cls,屏幕倒是清干净了,但总感觉哪里不对劲;换到 Git Bash 标签页,敲clear又提示找不到命令;想用习惯的Ctrl+L,结果光标原地乱跳,甚至把当前行内容给删了。问题本身很小,可真踩到的时候,卡住的时间一点也不短。
这篇内容就围绕 cmder 的清屏操作展开,把命令、快捷键、原理、常见坑一条条捋清楚。前排提示:这不是一篇只告诉你“敲 cls 就行”的教程。 cmder 是一层外壳,下面跑的还是 cmd、PowerShell、Git Bash 这些真实 shell,清屏方式必须和底层的 shell 匹配,还要分清“只清屏幕”和“连历史滚动内容一起清空”这两件事。接下来的方案我都实测过,适用场景、命令细节、报错原因也会一并说清楚,适合从新手到老手的任何读者。
1. 为什么一个清屏操作在 cmder 里能写出这么多门道
1.1 从“终端外壳”和“底层 Shell”的关系说起
先说个容易忽略的事实:cmder 本身不是一个 shell,它更像一个“终端窗口的包装层”。你把 cmder 打开后,默认跑的是 Windows 的cmd.exe,但你完全可以新建一个 PowerShell 标签页、一个 Git Bash 标签页,甚至接入 WSL。每一个标签页里的“清屏命令”是那个真实 shell 来理解和执行的,cmder 只是把按键和输出渲染出来。
这个关系很关键,因为很多清屏问题根本不是 cmder 坏了,而是你选择了和当前 shell 不匹配的命令。比如在 Git Bash 里敲cls,多数版本会提示cls: command not found;在纯 cmd 里敲clear,也大概率报错。cmder 作为外壳,会把你的按键原样交给 shell,shell 不认识,自然就兜不住了。
另外,cmder 自己还套了一层 ConEmu 的引擎。ConEmu 负责控制台窗口的绘制、快捷键、标签页管理、缓冲区显示。这意味着有些清屏动作是在 ConEmu 这一层完成的,不经过 shell,比如右键菜单里的清空缓冲区、工具栏的清屏按钮。理解了这个双层结构,再看后面的快捷键冲突和命令差异,思路会清爽很多。
1.2 不同 Shell 环境下清屏命令的真实差异
把常见的 shell 环境列一下,你会发现清屏这件事是“各自为政”的:
- cmd.exe:原生支持
cls。它的行为是清空当前屏幕,同时把窗口缓冲区里的历史输出一起清掉,光标回到左上角。 - PowerShell:原生命令是
Clear-Host,但微软贴心地为它加了两个别名:cls和clear。所以在 PowerShell 里你敲cls其实是敲Clear-Host。 - Git Bash(MSYS2/Cygwin 环境):遵循 Unix 习惯,用
clear。部分发行版里cls可能被映射到清屏功能,但这属于额外配置,不是默认行为。 - WSL(Ubuntu 等):同样是
clear,而且通常还支持Ctrl+L这种终端级快捷键。
看到了吧?同一个“清屏”动作,换了标签页就是两套语法。我在实际使用中见过不少人把cls的习惯带进 Git Bash,结果被报错整懵;也有朋友把clear当成万能键,在 cmd 标签页里按了半天没反应。弄清当前 shell 是什么,是选择清屏方式的第一步。
2. 五种清屏方式的适用边界与实操要点
2.1 cls:Windows 原生命令的兼容性
如果你主要在 Windows 环境里干活,cls是覆盖面最广、报错最少的选择。在 cmd 标签页里敲cls,瞬间清屏,没任何多余输出;在 PowerShell 标签页里敲cls,实际触发Clear-Host,行为也基本一致。我个人的习惯是把cls作为默认肌肉记忆,因为大多数情况下 cmder 新建标签页默认就是 cmd 或者 PowerShell,这两个环境都能吃下cls。
需要提醒的是,cls在 Git Bash 里并不稳定。部分 MSYS2 版本会把cls识别为一个外部程序,最终调用 Windows 的cls,但表现可能很怪,比如屏幕清了一部分、提示符位置不对,或者中文乱码。如果你当前标签页明确显示是MINGW64或bash,直接用clear更稳。
还有一个小坑:在 cmd 里执行cls时,如果你之前用chcp 936切过中文代码页,或者输出过超长行,个别情况下cls会把当前屏幕清掉,但滚动缓冲区最底部残留一行闪烁的内容。这通常是 ConEmu 渲染层和 cmd 缓冲区同步的问题,先按一下回车或重新切换标签页一般就能恢复。遇到这种残留,不用慌,不是命令坏了。
2.2 clear:Unix 风格命令的适用范围与常见报错
clear的底层逻辑和cls不太一样。它本质上是一个小工具,通过输出终端的转义序列,通知终端“把屏幕清空”。在 Unix 世界里这是标准操作,所以在 Git Bash 和 WSL 里,clear永远是首选。
但你把clear拿到 PowerShell 里敲,事情就变得暧昧了:PowerShell 确实认clear,因为它是Clear-Host的别名,但 PowerShell 的Clear-Host和 Git Bash 的clear底层不是一回事,只是名字碰巧相同。在 cmd 里敲clear,cmd 默认没有这个命令,会直接报'clear' 不是内部或外部命令。这是很多新手卡住的第一站,建议直接放弃“一条命令走天下”的幻想,按 shell 环境选命令。
另外一个实战经验:在 Git Bash 里,clear通常只清屏,但滚动缓冲区里依然保留你之前的历史输出。也就是说,你向上滚鼠标滚轮,还能看到刚才那一大堆编译日志。这不算 bug,是终端语义不同。如果工作流上需要“彻底清干净”,光靠clear不够,得用下一节说的缓冲区清空方式。
2.3 Ctrl+L:最接近“无感清屏”的快捷键
如果你是从 Linux 终端或 macOS 终端转过来的,Ctrl+L大概是你最熟悉的清屏快捷键。它的好处是不用敲命令,手不用离开主键区,清屏的同时还能把当前已经输入的字符保留在屏幕上,方便继续编辑。在 bash、zsh 和大部分 Unix 终端里,Ctrl+L默认就是“清屏并把当前行置顶”。
但到 cmder 里,默认情况可能让你失望。因为 cmder 底层是 ConEmu,ConEmu 自己有一整套快捷键映射,Ctrl+L在某些版本里被绑定成了“清除当前行”或者“重绘窗口”,并不一定是 bash 里的清屏行为。我实测过几个不同版本的 cmder:在 Git Bash 标签页里,Ctrl+L大多数时候能触发 bash 的清屏;但在 cmd 标签页里,按Ctrl+L很可能没有任何反应,或者光标跳了一下就没了下文。
所以我的建议是:不要死记Ctrl+L是“所有环境通用的清屏键”,养成先看标签页类型再按键的习惯。后面第三节会讲怎么在 cmder 的设置里把Ctrl+L统一绑定到 ConEmu 层的清屏动作,让它在 cmd、PowerShell 下也一致,那是更一劳永逸的做法。
2.4 cmder 内置快捷键与鼠标操作清屏
cmder 提供了不少 ConEmu 层的内置动作,其中有几个和“清屏”关系密切。很多教程喜欢说某个特定组合键,比如Ctrl+Alt+K或者类似变体,但实际上不同版本、不同下载源(完整版和迷你版)的默认按键配置并不完全一样,直接照抄容易失效。我更推荐你自己打开 cmder 的 Settings -> Keys & Macro,在搜索框里输入Clear,看当前版本的默认绑定到底是什么。
鼠标操作反而更直观。在 cmder 窗口标题栏上右键,弹出的菜单里通常会有几个清屏相关的选项,比如 Clear screen、Clear buffer(各版本叫法略有差异)。另外,cmder 的工具栏里如果开了“垃圾桶”图标,点一下也能快速清屏。这个图标默认未必显示,可以通过 Settings -> Features -> Toolbar 里勾选相关按钮加出来。鼠标操作适合不记快捷键的场景,但效率肯定不如键盘,大家按自己习惯取舍。
2.5 清屏命令对比表
| 清屏方式 | 适用环境 | 是否清空滚动缓冲区 | 备注 |
|---|---|---|---|
cls | cmd、PowerShell | 部分环境会清空 | Windows 原生,兼容性最好 |
clear | Git Bash、WSL | 通常保留 | Unix 标准,注意 cmd 下不可用 |
Ctrl+L | bash 标签页内 | 清屏并保留当前行 | cmder 层可能被占用,需要自行验证 |
| 右键菜单 Clear | 所有标签页 | 视具体选项而定 | 适合偶尔清理 |
| ConEmu 层快捷键 | 所有标签页 | 可配置 | 最统一的跨 shell 方案 |
这张表基本覆盖了常用场景。日常开发时,我的真实组合是:cmd 标签页用cls,Git Bash 标签页用clear,需要清空历史滚动的场景用右键菜单的缓冲区清理。下面一节专门讲更进阶的玩法:把清屏动作写进别名和自定义快捷键。
3. 实战场景:脚本、别名配置与自定义快捷键
3.1 在 cmder 中配置 alias 实现“智能清屏”
cmder 有一个很实用的特性:别名系统。完整版的 cmder 在安装目录下的config文件夹里有一个user_aliases.cmd文件,打开后按指定语法加内容,就能在 cmd 标签页里快速调用。默认文件里就带了一些示例,比如ll=ls -l之类。
我在这个文件里加过这样几行,专门为清屏服务:
clean=cls c=cls clr=cls其实本质都是把不同名字映射到cls,图的是顺手。比如有时候我会在一长串命令后面临时想接一个清屏,直接敲c && npm run build,看起来比cls && npm run build短一截。注意,别在别名里用@echo off之类的修饰符画蛇添足,这个文件已经被 cmder 处理过,老老实实写命令映射就行。
如果你常用 PowerShell 标签页,那要改的不是 cmder 的别名文件,而是 PowerShell 的 profile 配置。在 PowerShell 里执行$PROFILE能看到 profile 文件的路径,不存在就手动创建,然后加:
Set-Alias -Name cc -Value Clear-Host这样在 PowerShell 里敲cc就能清屏。清屏类别名的作用纯粹是减少按键次数,别指望它做太复杂的事情,真正复杂的需求要靠函数解决。
3.2 把清屏绑定到顺手的快捷键
如果你受够了“不同标签页用不同清屏方式”的割裂感,可以绕开 shell,直接把清屏绑定到 ConEmu 这一层。操作路径是:Settings -> Keys & Macro,在搜索框里搜Clear或Clear buffer,找到后点右边的铅笔或十字架按钮,按下你想用的组合键,保存即可。
这里有个很重要的判断:你绑定的动作是“清屏”还是“清空缓冲区”。ConEmu 里这两者是分开的,前者只是重绘当前可见区域,后者会把历史滚动一起抹掉。按我自己的习惯,把Ctrl+L绑定到清屏动作,所有 shell 环境都能用;把Ctrl+Alt+L绑定到清空缓冲区,需要彻底清理历史时用。绑定之后,cmd、Git Bash、PowerShell 表现一致,再也不用记环境差异。
绑定前记得检查一下快捷键是否被系统或输入法占用。中文输入法全角模式下,Ctrl+Space、Shift组合经常被截胡,我遇到过不少次绑定无效的怪问题,最后发现是输入法切换快捷键抢占了事件。绑完之后最好把输入法切成英文状态再实测几遍。
3.3 清屏之后的提示符与历史记录问题
清屏只是视觉上的清理,命令历史通常不受影响。你清屏之后按下方向键上键,之前跑过的命令照样能翻出来。这是好事,也是很多人容易误解的地方:以为清屏等于“抹掉证据”,其实历史记录还静静躺在那里。
PowerShell 的 PSReadLine 模块记录的是历史命令,和Clear-Host无关;cmd 的cls也不会动doskey的历史。如果你有隐私洁癖,想去掉历史,应该执行的是Clear-History(PowerShell)或者doskey /listsize=0(cmd),而不是清屏。顺手提一句,cmder 的 history 文件保存在%CMDER_ROOT%\config\.history,那是独立于 shell 历史的另一种记录,和清屏操作更是互不干扰。
另外一个视觉问题值得注意:清屏后提示符通常会回到窗口顶部,如果你正好在阅读一段长输出,清屏后上下文完全丢失。Git Bash 的Ctrl+L会把当前行保持在屏幕顶部,但 cmd 的cls不会。要想“留一半翻上去”,常见技巧是先输入echo若干空行,再用cls,或者干脆用clear; echo "----"来留个分隔线。这个小技巧在多窗口对照场景里非常好用。
4. 常见问题与排查技巧实录
4.1 Ctrl+L 按下没反应怎么办
遇到 Ctrl+L 无效,不要急着怪 cmder,先按这个顺序查:第一步,确认当前光标是不是在终端输入区里。如果你恰好打开了 vim、less、more这类全屏接管程序,快捷键是被程序吃掉的,不归终端管。按一次q退出程序再看。第二步,确认焦点是不是被 ConEmu 的任务栏或输出区抢走了,在窗口里点一下输入框再试。第三步,打开 Settings -> Keys & Macro,搜Clear,看有没有绑定,如果绑定的是“Clear line”而不是“Clear screen”,那按下去自然不是你想的清屏。第四步,查输入法。搜狗、微软拼音这类输入法经常占用组合键,切英文状态再试。
4.2 clear 后出现乱码或残留内容
乱码通常不是 cmder 本身的问题,而是 shell 环境把转义序列输出成了普通文本。Git Bash 里如果你在PS1中写了不兼容的色码,clear后可能在顶部显示[0m或ESC[0m之类的垃圾字符。这种情况检查/etc/profile.d/bash_completion.sh或~/.bashrc里的颜色转义是否规范。PowerShell 里出现乱码多半是代码页问题,尝试chcp 65001切到 UTF-8,或者Set-ConsoleOutputEncoding UTF-8。还有一个低概率事件:cmder 的“终端类型”设置不对,在 Settings -> Startup -> Environment 里把 TERM 设为xterm-256color,很多异常转义问题会随之消失。
4.3 清屏不等于清空滚动缓冲区
这句话值得单独强调一遍。很多用户反馈“clear 之后往上滚还能看到东西”,这其实是正常的。bash 的clear只发送清屏转义序列,ConEmu 决定保留多少历史滚动内容。想在 cmder 里彻底清空滚动历史,正确做法是用 ConEmu 层级的清空缓冲区功能,而不是 shell 里的清屏命令。什么是 ConEmu 层级?就是在窗口标题栏右键菜单里找 Clear buffer,或者在 Settings -> Keys & Macro 里给Clear buffer配一个快捷键。配好之后,一键抹掉所有历史,干净利落。
4.4 日志输出太乱:清屏之外的“扫荡式”解法
有时候你以为需要清屏,实际需要的是“让日志别那么烦人”。想想看,常见的场景不是屏幕满了要清,而是构建日志刷屏,找不到关键报错。这时候与其一遍遍cls,不如换个思路:在 cmd 下用command | findstr /v "warning"过滤无关行,或者在 Git Bash 里用command 2>&1 | grep -v "info",更强大的是用command | less -R,让输出支持翻页和搜索。配合Ctrl+L清一下当前屏幕,工作流比单纯反复清屏舒服得多。
4.5 排查清屏问题的统一思路
最后把排查逻辑压缩成一张速查表,以后遇到任何清屏失灵都能按图索骥:
| 症状 | 第一步 | 可能原因 | 解决方案 |
|---|---|---|---|
| 命令报 not found | 看标签页左下角 shell 类型 | 在当前 shell 用了错误命令 | cmd 用 cls,bash 用 clear |
| 快捷键没反应 | 切换到英文输入法 | 输入法抢占按键 | 换用 ConEmu 层绑定 |
| 按键被程序吃掉 | 按 q 退出当前程序 | vim/less 等全屏应用 | 先退出再清屏 |
| 清屏后往上滚有残留 | 判断需要是否清历史 | 只用了 shell 清屏 | 改用 ConEmu 清空缓冲区 |
| 出现转义乱码 | 检查 TERM 类型 | 终端标识不兼容 | 设为 xterm-256color |
这套思路我前后用了很久,基本覆盖了所有可能踩到的情况。如果你还是一个命令爱好者,建议把上面表格里的“第一步”练成肌肉记忆:出事先看 shell,再看快捷键,最后查缓冲区。
最后分享一个我一直在用的私人习惯:我不再把清屏键记成某个固定快捷键,而是把Ctrl+L绑定成 ConEmu 层的清屏,Ctrl+Alt+L绑定成清空缓冲区,两个组合一轻一重,日常操作非常顺手。你第一次绑定之后可能觉得要适应几天,但用过一周再回去用原生终端,会明显感觉少了点什么。清屏虽是小事,配置顺了,整个命令行体验都会提升一截,值得花十分钟折腾一次。