日,更新 arch 后也出现了这个问题,我没有安装 ibus ,真是奇怪了
我折腾了这个问题很久,最后发现如果不用 systemctl --user
起 daemon ,而是自己在命令行里用 emacs --daemon
起的话,就不会有这个问题。
但我很确信我 service 文件里的 Environment
是对的……真是神奇。
估计是bug吧。。。。。
你的现象看起来就是环境变量丢失,在 Emacs 里 (getenv "LANG")
看到正确的结果才算确信。
刚看了一下, service 和 emacs --daemon
里的 (getenv "LANG")
C-x C-e
都是 zh_CN.UTF-8
旧事重提
他在第一部分解决了图形界面下的输入问题,方法是重新链接参数。
$ sudo mv /usr/bin/emacs /usr/bin/emacs.origin
$ sudo touch /usr/bin/emacs
$ sudo vim /usr/bin/emacs
#!/bin/zsh
LC_CTYPE=zh_CN.UTF-8
/usr/bin/emacs.origin "$@"
而且中文的变量定义是局部的,不会因为你全盘的中文设置造成乱码。第二段是输入法和键位交换(左Ctrl 和 Caps Lock)的设置,如果你使用startx
开启图形界面也是没有问题的。我是用xfce4,没有在.xinitrc
里面写exec startxfce4
,所以这些我放在.zshrc
里面。
我使用ubuntu 16.04也有这个问题,不过在/etc/default/locale
里加上LC_CTYPE=zh_CN.UTF-8
,然后重启就可以了~
如果和我曾经碰到的问题一样,这是arch linux的gui engine的更新的造成的:如果你登录gnome用的是X window,那通常的设置.xinitrc当然是可用的;但是现在默认是用wayland,你要对应吧fcitx的设置放到wayland读的配置档中。当然,你可以在登录界面,切换到X-org。因为全局快捷键的问题,我还是在用X,这个问题不知道现在wayland下搞定没有,小半年没更新了。这些问题应该都算Xwayland这个兼容层功能不全造成的,bug多多,毕竟绝大多数软件都是为X建的,慢慢会好。
核心关键就是,让wayland看到fcitx的那几行配置,如果用的gui emacs,再加上locale的设置(算是个bug吧,反正我当时,wayland貌似会漏掉.profile、.bashrc的的locale设置);别的一切基本设置照旧。我fix它了,不过忘了具体哪里设置了。看看wayland下哪个是类似.xinitrc的配置档。
gentoo xorg plasma5 emacs 执行 (getenv “LANG”) 得出结果是 C,gentoo下的locale设为en_US.utf-8 请问下这样的环境变量丢失如何解决?
如果你是命令行启动 GUI,会继承终端的 locale。如果是双击启动,试试在配置文件里指定 (setenv "LANG" ...)
(setenv “LANG” “zh_CN.utf8”) 我试过了,还是不能切fcitx输入法
还有更搞笑的,非root账户登录后,终端下运行 locale 会看到所有的都是 C,需要 sudo env-update && source /etc/profile 后再运行 locale 才和 root 的一致
你到底是终端启动,还是双击启动?
创建一个 shell 脚本,在脚本里设置 locale,我是这么做的:
...
69| export TERM=xterm-24bits-italic
70| export TRUE_COLOR=yes
71| export LANG=en_US.UTF-8
72| export LC_ALL=en_US.UTF-8
73| $emacs_path "$@" $opt_default
可以在终端运行这个脚本,也可以做成可以双击的「快捷方式」(ubuntu 上叫做 desktop shortcut?其它发行版不了解)
感谢:grin:
配新电脑的时候居然把这问题解决了,在这里留个档吧……
我当初的问题是 systemd --user
起的 Emacs daemon 无法在 emacsclient -c
里呼出 fcitx。但在 shell 里 emacs --daemon
起的就可以。
最后问题还是在 env 的配置上,但问题不在 LANG
,而在 fcitx 所需要的那些。
以下是一个我能用的 ~/.config/systemd/user/emacs.service
的例子:
[Unit]
Description=Emacs daemon service
[Service]
Type=forking
ExecStart=/usr/bin/emacs --daemon
ExecStop=/usr/bin/emacsclient --eval "(kill-emacs)"
Environment=XMODIFIERS=@im=fcitx
Environment=GTK_IM_MODULE=fcitx
Restart=always
[Install]
WantedBy=default.target
如果有朋友遇到类似问题的,试着在 Emacs 里检查 (getenv "XMODIFIERS")
和 (getenv "GTK_IM_MODULE")
的值是否正确
换fcitx输入法。
It works. Thank you!
在 service 里加入下面两行重启 emacs.service 就 ok 了.
Environment=XMODIFIERS=@im=fcitx
Environment=GTK_IM_MODULE=fcitx
新安装的系统,刚开始能在Emacs里使用Fcitx输入中文,重启后又无法输入了。诊断信息如下。
# 系统信息:
1. `uname -a`:
Linux workstation 5.0.0-arch1-1-ARCH #1 SMP PREEMPT Mon Mar 4 14:11:43 UTC 2019 x86_64 GNU/Linux
2. `lsb_release`:
`lsb_release` 未找到.
3. `/etc/lsb-release`:
`/etc/lsb-release` 未找到.
4. `/etc/os-release`:
NAME="Arch Linux"
PRETTY_NAME="Arch Linux"
ID=arch
BUILD_ID=rolling
ANSI_COLOR="0;36"
HOME_URL="https://www.archlinux.org/"
DOCUMENTATION_URL="https://wiki.archlinux.org/"
SUPPORT_URL="https://bbs.archlinux.org/"
BUG_REPORT_URL="https://bugs.archlinux.org/"
5. 桌面环境:
无法确定桌面环境。
6. Bash 版本:
BASH_VERSION='5.0.0(1)-release'
# 环境:
1. DISPLAY:
DISPLAY=':0'
2. 键盘布局:
1. `setxkbmap`:
xkb_keymap {
xkb_keycodes { include "evdev+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compat { include "complete" };
xkb_symbols { include "pc+us+inet(evdev)" };
xkb_geometry { include "pc(pc105)" };
};
2. `xprop`:
_XKB_RULES_NAMES(STRING) = "evdev", "pc105", "us", "", ""
3. Locale:
1. 全部可用 locale:
C
en_US.utf8
POSIX
zh_CN.utf8
2. 当前 locale:
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
4. 目录:
1. 主目录:
/home/jlzhang
2. `${XDG_CONFIG_HOME}`:
环境变量 `XDG_CONFIG_HOME` 没有设定。
`XDG_CONFIG_HOME` 的当前值是 `~/.config` (`/home/jlzhang/.config`)。
3. Fcitx 设置目录:
当前 fcitx 设置目录是 `~/.config/fcitx` (`/home/jlzhang/.config/fcitx`)。
5. 当前用户:
脚本作为 jlzhang (1000) 运行。
# Fcitx 状态:
1. 可执行文件:
在 `/usr/bin/fcitx` 找到了 fcitx.
2. 版本:
Fcitx 版本: `4.2.9.5`
3. 进程:
找到了 2 个 fcitx 进程:
443 fcitx
3438 fcitx-dbus-watc
4. `fcitx-remote`:
`fcitx-remote` 工作正常.
5. DBus 界面:
使用 `dbus-send` 来检查 dbus。
DBus 名称 `org.fcitx.Fcitx` 的所有者是 `:1.25`。
DBus 名称 `org.fcitx.Fcitx` 的 PID 所有者是 `443`。
# Fcitx 配置界面:
1. 配置工具封装:
在 `/usr/bin/fcitx-configtool` 找到了 fcitx-configtool。
2. 用于 GTK+-2.0 的配置界面:
**未找到 gtk2 的配置界面.**
3. 用于 GTK+-3.0 的配置界面:
在 `/usr/bin/fcitx-config-gtk3` 找到了 `fcitx-config-gtk3`。
4. KDE 的配置界面:
**`kcmshell4` 未找到.**
# 前端设置:
## Xim:
1. `${XMODIFIERS}`:
环境变量 XMODIFIERS 已经正确地设为了 "@im=fcitx".
从环境变量中获取的 Xim 服务名称为 fcitx.
2. 根窗口上的 XIM_SERVERS:
Xim 服务的名称与环境变量中设置的相同.
## Qt:
1. qt4 - `${QT4_IM_MODULE}`:
环境变量 QT_IM_MODULE 已经正确地设为了 "fcitx".
2. qt5 - `${QT_IM_MODULE}`:
环境变量 QT_IM_MODULE 已经正确地设为了 "fcitx".
3. Qt 输入法模块文件:
找到了 Qt5 的输入法模块: `/usr/lib/qt/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.so`.
找到了 Qt4 的输入法模块: `/usr/lib/qt4/plugins/inputmethods/qtim-fcitx.so`.
找到了 fcitx 的 qt 模块: `/usr/lib/fcitx/qt/libfcitx-quickphrase-editor5.so`.
## Gtk:
1. gtk - `${GTK_IM_MODULE}`:
环境变量 GTK_IM_MODULE 已经正确地设为了 "fcitx".
2. `gtk-query-immodules`:
1. gtk 2:
在 `/usr/bin/gtk-query-immodules-2.0` 找到了 gtk `2.24.32` 的 `gtk-query-immodules`.
版本行:
# Created by /usr/bin/gtk-query-immodules-2.0 from gtk+-2.24.32
已找到 gtk `2.24.32` 的 fcitx 输入法模块.
"/usr/lib/gtk-2.0/2.10.0/immodules/im-fcitx.so"
"fcitx" "Fcitx (Flexible Input Method Framework)" "fcitx" "/usr/share/locale" "ja:ko:zh:*"
2. gtk 3:
在 `/usr/bin/gtk-query-immodules-3.0` 找到了 gtk `3.24.5` 的 `gtk-query-immodules`.
版本行:
# Created by /usr/bin/gtk-query-immodules-3.0 from gtk+-3.24.5
已找到 gtk `3.24.5` 的 fcitx 输入法模块.
"/usr/lib/gtk-3.0/3.0.0/immodules/im-fcitx.so"
"fcitx" "Fcitx (Flexible Input Method Framework)" "fcitx" "/usr/share/locale" "ja:ko:zh:*"
3. Gtk 输入法模块缓存:
1. gtk 2:
在 `/usr/lib/gtk-2.0/2.10.0/immodules.cache` 找到了 gtk `2.24.32` 的输入法模块缓存.
版本行:
# Created by /usr/bin/gtk-query-immodules-2.0 from gtk+-2.24.32
已找到 gtk `2.24.32` 的 fcitx 输入法模块.
"/usr/lib/gtk-2.0/2.10.0/immodules/im-fcitx.so"
"fcitx" "Fcitx (Flexible Input Method Framework)" "fcitx" "/usr/share/locale" "ja:ko:zh:*"
2. gtk 3:
在 `/usr/lib/gtk-3.0/3.0.0/immodules.cache` 找到了 gtk `3.24.5` 的输入法模块缓存.
版本行:
# Created by /usr/bin/gtk-query-immodules-3.0 from gtk+-3.24.5
已找到 gtk `3.24.5` 的 fcitx 输入法模块.
"/usr/lib/gtk-3.0/3.0.0/immodules/im-fcitx.so"
"fcitx" "Fcitx (Flexible Input Method Framework)" "fcitx" "/usr/share/locale" "ja:ko:zh:*"
4. Gtk 输入法模块文件:
1. gtk 2:
找到的全部 Gtk 2 输入法模块文件均存在.
2. gtk 3:
找到的全部 Gtk 3 输入法模块文件均存在.
# 配置:
## Fcitx 插件:
1. 插件配置文件目录:
找到了 fcitx 插件配置目录: `/usr/share/fcitx/addon`.
2. 插件列表:
1. 找到了 27 个已启用的插件:
fcitx-autoeng
fcitx-chttrans
fcitx-classic-ui
fcitx-clipboard
fcitx-dbus
fcitx-freedesktop-notify
fcitx-fullwidth-char
fcitx-imselector
fcitx-ipc
fcitx-ipcportal
fcitx-keyboard
fcitx-kimpanel-ui
fcitx-notificationitem
fcitx-pinyin
fcitx-pinyin-enhance
fcitx-punc
fcitx-quickphrase
fcitx-remote
fcitx-rime
fcitx-spell
fcitx-table
fcitx-unicode
fcitx-vk
fcitx-x11
fcitx-xim
fcitx-xkb
fcitx-xkbdbus
2. 找到了 1 个被禁用的插件:
fcitx-qw
3. 插件库:
所有插件所需的库都被找到。
4. 用户界面:
找到了 2 个已启用的用户界面插件:
fcitx-classic-ui
fcitx-kimpanel-ui
## 输入法:
1. 找到了 2 个启用的输入法:
fcitx-keyboard-us
rime
2. 默认输入法:
您已经正确的将一个键盘输入法 "fcitx-keyboard-us" 设为默认.
# 日志:
1. `date`:
2019年 03月 10日 星期日 11:10:35 CST
2. `~/.config/fcitx/log/`:
总用量 4
-rw-r--r-- 1 jlzhang jlzhang 44 3月 10 10:53 crash.log
3. `~/.config/fcitx/log/crash.log`:
fcitx: BadWindow (invalid Window parameter)
在/etc/locale.conf
增加
LANG=en_US.UTF-8
LC_CTYPE=zh_CN.UTF-8
试试。