许多用户在Ubuntu终端里想要修改光标形状时,首先想到的是去系统设置中寻找,但往往找不到对应选项。实际上,正确的设置入口隐藏在配置文件(Profile Preferences)中——按下Alt键呼出菜单,选择Edit→Profile Preferences,切换到Compatibility标签页,即可看到Cursor shape下拉框,包含Block、Underline和I-Beam三种选项。不过需要注意的是,修改完成后必须将该Profile设为默认,并新开一个终端窗口才能看到实际效果。

终端光标形状设置位置:Profile Preferences 是核心入口
Ubuntu默认终端(GNOME Terminal)并未提供系统级的光标形状控制功能,该设置绑定在“配置文件”这一层级上。换句话说,您调整的并非整个系统的终端光标,而是当前Profile的光标行为——即便您只使用一个Profile,也需要从这里入手。常见的误区是前往Settings或GNOME Tweaks中寻找“光标主题”,但那些修改的是桌面鼠标指针,与终端内的竖线、下划线或方块光标完全无关。
具体操作步骤非常简单:打开终端,按下Alt键呼出隐藏的菜单栏(Ubuntu 20.04+默认隐藏),点击Edit→Profile Preferences,或者直接在终端空白处右键选择Profiles→Profile Preferences。切换到Compatibility标签页(注意不是General或Colors),找到Cursor shape下拉框,三个选项分别为:Block(实心方块)、Underline(下划线)、I-Beam(竖线|)。
修改后无效?Profile 默认继承关系常被忽略
很多人修改后却发现没有任何变化,于是开始怀疑操作是否正确——其实问题很可能出在默认Profile上。GNOME Terminal允许创建多个Profile,但新开终端默认使用哪个Profile取决于“默认Profile”的设置。如果您新建了一个Profile并在其中修改了Cursor shape,却没有将其设为默认,那么新终端仍会沿用旧Profile的设置,光标自然保持不变。如何解决?在Profile Preferences窗口左上角查看当前Profile名称(例如Unnamed或Default),关闭窗口后,回到终端顶部菜单Edit→Profiles…,选中您要设为默认的Profile,勾选Use this profile by default。如果Profile名称是Unnamed,建议先重命名(例如命名为dev-i-beam),以避免后续混淆。修改完成后必须新开终端窗口或标签页才能生效,已打开的终端不会动态刷新光标形状。
命令行临时控制光标可见性:推荐使用 tput 而非 echo
在编写脚本或运行交互式程序时,有时需要临时隐藏光标,例如绘制进度条。此时使用tput是最稳妥的方案。有些用户可能会直接使用echo -e "\033[?25l"来隐藏,但这存在隐患:终端复位或退出时,光标可能一直保持消失状态,而tput会自动适配当前$TERM类型,更为安全。具体命令:隐藏光标使用tput civis,恢复标准光标(通常为方块)使用tput cnorm,强制显示使用tput cvvis。这些命令不产生输出,也不会影响您在Profile中设置的光标形状,它们仅控制显示或隐藏。但有一个注意事项:不要在.bashrc中无条件写入tput civis,否则每次打开终端都看不见光标,只能盲打tput cnorm来恢复,非常尴尬。
Vim 插入模式光标与终端光标:两个独立控制层需区分
这一点常让用户感到困惑。许多人希望Vim在插入模式下显示竖线,普通模式下显示方块,于是尝试修改终端的Cursor shape,却发现完全不起作用。原因很简单:Vim自己接管了光标样式,终端仅负责基础渲染。Vim的光标行为由:set guicursor(GUI)或termcap序列(终端)控制,与GNOME Terminal的Cursor shape毫无关联。正确的做法是在~/.vimrc中添加如下配置:set guioptions+=a(如果使用GUI)或更通用的写法:let &t_SI = "\e[6 q" | let &t_SR = "\e[4 q" | let &t_EI = "\e[2 q"。其中\e[6 q代表竖线,\e[4 q代表下划线,\e[2 q代表空心块。请注意,这些值依赖终端支持,GNOME Terminal 3.36+是支持的,老版本可能统一为一种形状。总之,不要指望终端设置能够透传给Vim,反之亦然。
终端光标形状本身是一个很薄的抽象层,真正起作用的要素包括:Profile配置、新建窗口触发、以及Vim等应用的主动协商。最容易卡住的地方,就是误以为修改系统设置就能全局生效,或者将桌面鼠标指针、终端光标、编辑器光标混为一谈。
