
昨天下午帮同事处理一个“输入法坏了”的问题他在 Ubuntu 上写中文技术文档逗号句号打出来全是英文的,和.一个中文标点都出不来切回 Windows 立刻正常。类似的情况我这些年遇到不下十次结论几乎都一样——fcitx 框架的输入法本身没坏是它内部的“全角/半角”状态被切到了半角那一侧。这个状态和“中文/英文”是两个互相独立的开关很多人包括当年的我默认它们是一回事于是越折腾越乱重装输入法、换发行版、改环境变量最后发现只是少按了一个键。下面我把这套状态机怎么工作、快捷键为什么按了没反应、配置到底存在哪个文件、终端和 IDE 里表现为什么不一样以及怎么把标点改成完全符合自己习惯的样子一次讲透。刚装完系统的朋友看第 1、2 节就够用了已经在用 fcitx5 折腾自定义标点的老用户可以直奔第 5、6 节。1. 别急着怪输入法fcitx 里“中文/英文”和“全角/半角”是两套独立开关1.1 一个真实场景中文文档里混进一串英文逗号最典型的症状是这样输入法状态栏上明明显示“拼”或者“中”候选框也能正常弹出汉字候选说明拼音引擎在干活但你敲,出来的是,敲.出来的是.敲引号出来的是。这时候很多人第一反应是“中文标点词库丢了”“配置损坏了”跑去apt重装一遍输入法重装完重启依旧。其实从程序的角度看一切都在正常工作引擎收到了按键查表输出对应的字符只是这张表当前指向的是半角字符而不是中文全角标点。关键点在于fcitx 的输入状态被拆成了两个维度。第一个维度是输入模式中文拼音还是英文直接上屏对应状态栏上的“中/英”默认用CtrlSpace切换Shift是临时英文松开就回中文。第二个维度是字符宽度全角还是半角对应状态栏或者候选框上方的一个小提示不同主题长得不一样有的是“半”字有的是一条亮起的小图标。这两个维度是正交的一共四种组合而“中文 半角”这一格就是大多数人翻车的地方——模式是中文能出汉字但标点走半角表。1.2 两套状态为什么要拆开设计这个设计初看很反直觉但从使用场景出发是合理的。写代码、敲命令、写 Markdown 里的英文链接时你希望括号、引号、逗号都是半角的 ASCII 字符否则 shell 会报错、编译器会不认、URL 会打不开而写中文正文时你又希望标点自动变成。“”。如果只有一个“中文/英文”开关这两个需求就会打架切到中文就必然出全角标点写代码时得反复切回英文模式效率极低。拆成两个维度之后理想用法就变成了写代码时保持“英文模式”或者“中文模式 半角”写中文正文前确认“全角”。问题出在第二件事上——全角/半角这个开关在界面上远不如“中/英”显眼很多人压根不知道它存在更不知道它是会因快捷键误触而改变、并且会被保存下来的持久状态。于是某次不小心按到组合键之后所有中文标点都变成半角用户只觉得“输入法突然坏了”。1.3 花三十秒先确认当前到底处于哪个状态在动手改任何配置之前先定位现状别盲改。第一步看状态栏如果是 fcitx5托盘图标点开或者鼠标悬停通常能看到当前输入法和宽度状态fcitx4 的状态栏会直接显示输入法名字和“半/全”字样。第二步用命令行确认输入法框架和进程是不是活着# 确认装的是哪一代 fcitx which fcitx5 fcitx 2/dev/null fcitx5 --version 2/dev/null || fcitx --version 2/dev/null # fcitx5查询/切换输入法启用状态 fcitx5-remote # 打印当前状态码2 表示已激活1 表示未激活 fcitx5-remote -n # 打印当前输入法的名字 # fcitx4 对应的命令 fcitx-remote -nfcitx5-remote -n的输出特别有用如果它返回的是keyboard-us之类说明你其实压根没在拼音输入法上标点当然是英文的这种情况在第 2.3 节展开。如果返回的是pinyin汉字也能正常上屏那就基本可以确定问题只在全角/半角这一维直接进第 2 节按快捷键即可。2. 最快的一条路用快捷键把标点切回中文2.1 那个被九成人忽略的切换键fcitx 系输入法给“全角/半角”配了默认快捷键多数发行版和多数版本预置的是Ctrl.句号键也就是右侧那个键按一下在中文标点和半角标点之间来回切。想让.变回。最省事的动作就是在中文模式下按一下Ctrl.然后再打一个逗号看看变没变。如果切回来了说明整套机制没问题你只需要记住这个键。顺手把几个容易混淆的默认快捷键一起列出来避免按错键白折腾快捷键作用影响范围CtrlSpace中文/英文输入模式切换只影响出汉字还是出字母Shift临时英文按住期间英文松开自动回中文Ctrl.全角/半角字符切换决定标点是还是,CtrlShiftF简体/繁体切换依赖配置影响汉字字形这里必须提醒一句这几个键的绑定在不同发行版、不同版本里都可能被改过尤其是被输入法的“云输入”“简繁切换”抢占之后。所以Ctrl.没反应别急着判定“这方法没用”去配置界面看一眼实际绑定是什么第 3.2 节给了具体路径。2.2 按了没反应先排查三个最常见的拦截者第一种情况快捷键被系统或其他软件抢走了。某些桌面环境的窗口管理器、截图工具、录屏工具会占用Ctrl.这类组合输入法收不到按键。验证方法很直接——把输入法配置里的这个绑定改成一个冷门组合比如CtrlShift;改完立刻生效如果新键好用就说明旧键被占了。第二种情况你装了两个输入法框架在打架。典型的现场是系统里同时存在 fcitx4 和 fcitx5或者 fcitx 与另一个框架都配了自启动XMODIFIERS、GTK_IM_MODULE指向的是 A实际跑起来的是 B于是你在 B 的界面上看到的配置对 A 无效。用下面两行就能看出来# 看有几个输入法框架在跑 ps -ef | grep -Ei fcitx|ibus | grep -v grep # 看当前环境变量指向谁 env | grep -Ei IM_MODULE|XMODIFIERS如果输出里同时出现 ibus 和 fcitx 的进程先把其中一个的自启动关掉重启会话再测快捷键。这一点在从旧系统升级上来的机器上尤其常见配置文件是老的装的包是新的。第三种情况你改的配置没被加载。fcitx 的配置改动通常是即时生效的但如果配置文件的属主或权限不对比如曾经用sudo跑过图形配置工具导致~/.config/fcitx5下某些文件变成 root 所有输入法读取时会静默失败表现为“改了没用重启还是老样子”。一条命令确认ls -l ~/.config/fcitx5/ ~/.config/fcitx5/conf/ 2/dev/null # 只要出现 root root 的文件就把它改回你自己的用户 sudo chown -R $USER:$USER ~/.config/fcitx52.3 别忘了你可能根本没切到拼音输入法这是我见过最冤的一类“故障”用户以为自己在中文模式其实按CtrlSpace切过去的是另一个“键盘-英语”布局。判断方法就是 2.1 节提到的fcitx5-remote -n或者看候选框——纯英文输入法是没有候选框的而拼音输入法只要你敲字母就一定弹候选。另一个快速验证随便敲几个拼音字母如果上屏的是字母本身而不是汉字候选你就没在拼音输入法里标点问题自然不存在去把输入法列表里的拼音加回来第 3.1 节的配置界面里能加就行。3. 从配置层根治把标点行为和触发键写进配置3.1 图形配置的完整点击路径快捷键只能临时切状态要长期稳定得看配置。fcitx5 的图形配置工具是fcitx5-configtool终端里直接敲这个命令就能打开如果提示找不到装一下对应包Debian/Ubuntu 系通常是fcitx5-configtoolArch 系在fcitx5主包里。打开之后关注三个地方第一块是当前输入法列表。确认Keyboard - 英语(US)和拼音Pinyin都在且拼音在列表里。顺便注意列表顺序用CtrlSpace是在这个列表里轮询如果你把好几个输入法都塞进去切换时很容易切到意想不到的位置。第二块是全局选项里的快捷键页。这里能找到“切换全角/半角字符”这一项看它当前绑定的是什么。找不到的话说明它被归到了附加组件里去第三块看。第三块是附加组件Addons/输入法的高级配置。选中“拼音”点配置会进入拼音引擎自己的选项页里面通常有和标点符号、简繁转换、模糊音相关的条目。这里是最该花时间的地方不同版本的选项名称不完全一样你要做的事情是找到那个描述“标点是否使用全角/半角”“是否自动转换标点”的勾选项把它调整成你期望的行为然后点应用立刻回到编辑器里打一串,.?!验证。改完一个选项就验证一次不要一口气改五个再一起测——出问题了你根本不知道是哪一个引起的。3.2 给“全角/半角”换一个不会误触的键默认的Ctrl.位置很尴尬它离右手小指和方向键区域很近打字快的时候误触概率不低而且很多人误触之后完全不知道发生了什么。我的习惯是把它改成CtrlShift;或者Ctrl;。理由有两个一是分号键在打中文时几乎不会被用到组合二是这个组合不会被常见软件的默认快捷键占用。换完之后要在三个地方各测一遍文本编辑器里测一次验证标点转换、终端里测一次验证终端没有被吞键、浏览器里测一次验证网页输入框也正常。三处都正常才算真的改好了只测一处很容易误判。3.3 配置文件里到底存了什么不喜欢点图形界面的可以直接看配置文件也能顺便排查“到底有没有写进去”。fcitx5 的配置目录是~/.config/fcitx5/其中config存全局设置profile存输入法列表和当前输入法conf/目录下每个输入法一个文件例如拼音对应conf/pinyin.conf附加组件在conf/下也有各自的文件。fcitx4 则对应~/.config/fcitx/和conf/子目录。# 看全局配置和输入法列表 sed -n 1,40p ~/.config/fcitx5/config cat ~/.config/fcitx5/profile # 看拼音引擎自己的配置 cat ~/.config/fcitx5/conf/pinyin.conf注意具体键名会随版本变化不要凭记忆手写未知的键值。推荐流程是用图形界面改一次然后git diff式的思路对比文件变化或者干脆先cp pinyin.conf pinyin.conf.bak备份再动手。改动前备份这一条在标点映射那一步尤其重要。如果你发现文件里写的已经是“全角”相关设置但实际行为还是半角那说明状态被别的地方覆盖了——去看第 5 节的排查表大概率是“运行时状态”和“配置”不一致或者有第二个框架在插手。3.4 “重启之后又变回半角”的三种根因这是被问得最多的一种情况我遇到过的原因基本就三类。第一类是状态被会话管理重置部分桌面环境在登录时会重新初始化输入法把它拉回默认状态解法是把期望状态写进配置文件而不是靠快捷键临时切并用登录后立刻按一次快捷键的方式过渡。第二类是自启动没配好输入法启动顺序晚于你要用的程序表现是刚进桌面那几十秒标点不正常过一会儿自己好了解法是把输入法加进开机自启动图形界面里通常在“系统设置 → 自启动”或者把/usr/share/applications/fcitx5.desktop复制到~/.config/autostart/。第三类是多用户/多桌面环境共享配置目录导致互相覆盖比如你用同一个家目录跑两个不同的发行版或者有脚本定期同步~/.config这种就要检查同步工具是不是把另一台机器上的半角状态一起带了过来。4. 终端、IDE、浏览器表现不一致的排查顺序4.1 GTK / Qt / XIM 三条通道的差异标点转换是在输入法引擎里做的理论上所有程序看到的都是转换后的字符。但不同程序接入输入法的方式不一样GTK 程序走GTK_IM_MODULEQt 程序走QT_IM_MODULE老程序和 Java 系不少 IDE、部分办公软件走XMODIFIERS/ XIM。三条通道里任意一条没接上那个程序里的中文输入和标点就会表现异常——典型症状是“浏览器里标点正常IDE 里全是半角”或者反过来。排查顺序建议从“哪一类程序有问题”反推通道而不是瞎改环境变量症状大概率原因处理方向所有程序标点都是半角全角/半角状态是半角按快捷键或改配置只有 GTK 程序正常Qt 程序不正常Qt 通道未接上检查QT_IM_MODULE只有 IDE / Java 程序不正常XIM 通道未接上检查XMODIFIERS只有终端不正常终端对按键的特殊处理见 4.3换桌面环境后才出问题该环境对输入法集成方式不同见 4.24.2 Wayland 下不要再硬设 QT_IM_MODULE这一条单独拎出来说因为太多人沿用 X11 时代的老教程。在 Wayland 会话里fcitx5 通常是通过桌面环境提供的文本输入协议直接接入的桌面环境本身已经处理好了大部分应用的接入问题。这时候如果你照着几年前的文章在~/.xprofile或者/etc/environment里硬塞GTK_IM_MODULEfcitx、QT_IM_MODULEfcitx反而可能让某些应用走错通道出现“输入法前端在正常工作但某些程序里打不出中文或者标点错乱”的怪异现象。判断依据很简单先确认会话类型echo $XDG_SESSION_TYPE # 输出 wayland 或 x11如果是wayland我建议的做法是先把这些IM_MODULE相关变量清掉至少不要全局设死只保留XMODIFIERSimfcitx给 XWayland 的老程序用重启会话后观察。反之如果是x11那这几个变量该设还是要设缺了就会出现部分程序无法输入中文。同一个问题在两种会话下的答案完全相反这也是为什么网上搜到的方案经常互相矛盾。4.3 终端和 vim 里的标点为什么更麻烦终端本身就是个吃按键的程序它对中文标点的处理有两层第一层是输入法引擎转换第二层是终端自己的按键映射和编码。常见现象有两个。一是某些终端在“应用光标键模式”下会拦截部分组合键导致Ctrl.这类快捷键在终端里按下去无效解决办法是把切换键换成终端不拦的组合或者先切到文本编辑器里切换状态再回到终端状态是全局的。二是vim在插入模式下有:set相关的编码和fileencoding影响如果终端 locale 不是 UTF-8全角标点可能显示成乱码方块。先确认 localelocale # 关注 LC_CTYPE 和 LANG 是否为 UTF-8如果LC_CTYPE是C或者POSIX全角标点会显示异常这时候先把 locale 调到 UTF-8 系例如zh_CN.UTF-8或en_US.UTF-8再回头看标点行为能省掉很多误判。5. 自定义标点映射让引号、书名号按中文习惯来5.1 为什么有人非要动映射文件默认的中文标点方案是“一个半角键对应一个中文标点”但中文排版的真实需求比这复杂有人希望打出来的是中文弯引号“”并且能自动配对有人希望出来的是书名号有人写技术文档时希望~保持 ASCII 而不变成。这些都超出了“全角/半角”开关能覆盖的范围需要改标点映射。fcitx4 时代这套映射放在用户配置目录下一个类似punc.mb.zh_CN的文件里并且在拼音的配置项里有一个“启用自定义标点”之类的开关fcitx5 沿用了同样的思路只是路径挪到了用户数据目录下我见到的机器上多在~/.local/share/fcitx5/punctuation/一带。不同版本和不同打包方式路径确实有差异所以别照抄路径直接用命令找# 找现成的标点映射文件 find ~/.config/fcitx5 ~/.local/share/fcitx5 ~/.config/fcitx -iname *punc* 2/dev/null5.2 一个可复制的最小改动流程改这类映射文件的原则是只加行不改行先备份小步验证。第一步备份第二步打开文件观察已有几行的写法每行的结构基本是“半角按键”加分隔再加“目标中文标点”分隔符是空格还是制表符照着现有行来别自己发明格式第三步只加你确定需要的那一两行第四步重启输入法fcitx5 -r -d或者退出后重新拉起来第五步在编辑器逐键测试。# 备份 cp -a ~/.local/share/fcitx5/punctuation ~/punc_backup_$(date %F) # 改完之后让输入法重新加载配置fcitx5 的常用做法 fcitx5 -r -d这里有个容易忽略的点如果在配置里勾了“自定义标点”但映射文件不存在或者格式不对部分版本会回落到默认行为表现出来还是标点不对容易被误判成“改了没生效”。所以改完一定回头确认那个开关是开着的文件也确实被读到了可以故意写一个明显错误的映射来验证文件是否生效确认后再改回正确值。5.3 改坏了怎么快速回滚标准做法就一条用备份覆盖回去然后重启输入法再不行就把自定义标点开关关掉先回到默认行为确认基础功能正常。我一般会额外做一个“干净环境”验证新建一个临时用户登录进去只配输入法测一遍标点如果那边正常而你的账号不正常问题一定在你家目录的配置里而不是系统层面——这个手法能帮你把排查范围瞬间缩小一半。6. 排查清单与几个我踩过的坑6.1 症状到原因的一张速查表症状首先检查常见结论汉字能出标点全是半角fcitx5-remote -n是否在拼音上全角/半角状态是半角按Ctrl.敲字母直接上屏英文是否在键盘英语布局加回拼音输入法快捷键无反应绑定是否被改/被占用换一个冷门组合键改了配置重启失效配置目录文件属主chown回当前用户只有某类程序异常会话是 X11 还是 Wayland见 4.1、4.2每次登录都变半角自启动与配置文件写进配置而非临时切改映射文件无效自定义标点开关开关未开或文件格式错6.2 我踩过的三个坑你可以直接绕开第一个坑是用sudo开图形配置工具。早年为了让输入法在登录界面也能用我习惯性地sudo fcitx5-configtool去改结果~/.config/fcitx5下一批文件变成 root 所有之后所有普通用户下的修改全部静默失效表现就是“改了半天没用”。现在的习惯是任何时候都用普通用户开配置工具改配置需要动系统级文件时才单独用sudo编辑并立刻改回属主。第二个坑是把标点问题当成编码问题修。有段时间终端里中文标点显示成方块我以为是输入法配置问题折腾了半个下午最后发现是LANG被某个脚本改成了非 UTF-8。现在遇到“标点异常”我会先花十秒跑一次locale这一条基本能排除掉三分之一的情况。第三个坑是在两个输入法框架之间反复横跳。从 fcitx4 升级到 fcitx5 的时候旧的自启动项没删新的又加了一遍两代框架同时跑快捷键互相抢标点状态随机漂移一会正常一会不正常。后来我把旧框架的自启动彻底删掉、环境变量统一指向新框架、重启会话一切就稳定了。如果你现在正处在这种“时好时坏”的状态先别研究配置项先去ps -ef | grep fcitx看看是不是有两个进程在抢活。最后分享一个日常习惯把“全角/半角”的状态显示打开不少主题支持在候选框旁边显示一个小标记状态可视化之后误触导致的问题你一眼就能看出来比事后排查快得多。至于那些偶尔还是会冒出来的半角逗号我现在都是写完之后把文档丢进编辑器里搜一遍,和.中文语境里出现的半角标点基本都是漏网的用查找替换统一处理比反复怀疑输入法靠谱。