3

体验Emacs Systemd Daemon Unit

 3 years ago
source link: https://www.lujun9972.win/blog/2018/05/30/%E4%BD%93%E9%AA%8Cemacs-systemd-daemon-unit/index.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

体验Emacs Systemd Daemon Unit

Emacs26.1开始提供了一个systemd user unit file来让我们可以使用sytemd管理Emacs Daemon。

安装好Emacs26.1后,你会发现在 /usr/lib/systemd/user 目录下多了一个 emacs.service 文件,你只需要执行

systemctl --user start emacs.service

就能启动emacs daemon了,或者通过

systemctl --user enable emacs.service

来自动启动emacs daemon。

然而默认的 emacs.service 中没有对 LANG 进行设置,导致在Emacs中无法输入中文。

所以我们还需要对 emacs.service 文件做一些修改,在 Environment 中设置 LANG 的值。

具体的步骤为:

mkdir -p ~/.config/systemd/user/
cp /usr/lib/systemd/user/emacs.service ~/.config/systemd/user
sed -i '/Environment/ s/$/ LANG=zh_CN.UTF-8/' ~/.config/systemd/user/emacs.service

重载修改后的unit file,然后再重启 emacs daemon

systemctl --user daemon-reload
systemctl --user restart emacs.service

然后运行 emacsclient -n -c 连接上emacs daemon,运行 (getenv "LANG") 会发现LANG变量已经变成 zh_CN.UTF-8screenshot-13.png

不过,当我按下 Ctrl-SPACE 确依然使用不了中文,这是怎么回事呢()? 我用的是 fcitx, 为了排查问题,在在eshell下运行 fcitx-diagnose 结果为

Welcome to the Emacs shell

~ λ fcitx-diagnose 
# 系统信息:
1.  `uname -a`:

        Linux T520 4.16.11-1-ARCH #1 SMP PREEMPT Tue May 22 21:40:27 UTC 2018 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
        ID_LIKE=archlinux
        ANSI_COLOR="0;36"
        HOME_URL="https://www.archlinux.org/"
        SUPPORT_URL="https://bbs.archlinux.org/"
        BUG_REPORT_URL="https://bugs.archlinux.org/"

5.  桌面环境:

    无法确定桌面环境。

6.  Bash 版本:

        BASH_VERSION='4.4.19(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
            zh_TW.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/lujun9972

    2.  `${XDG_CONFIG_HOME}`:

        环境变量 `XDG_CONFIG_HOME` 没有设定。

        `XDG_CONFIG_HOME` 的当前值是 `~/.config` (`/home/lujun9972/.config`)。

    3.  Fcitx 设置目录:

        当前 fcitx 设置目录是 `~/.config/fcitx` (`/home/lujun9972/.config/fcitx`)。

5.  当前用户:

    脚本作为 lujun9972 (1000) 运行。

# Fcitx 状态:
1.  可执行文件:

    在 `/usr/bin/fcitx` 找到了 fcitx.

2.  版本:

    Fcitx 版本: `4.2.9.5`

3.  进程:

    找到了 2 个 fcitx 进程:

         4972 fcitx
         5014 fcitx-dbus-watc

4.  `fcitx-remote`:

    `fcitx-remote` 工作正常.

5.  DBus 界面:

    使用 `dbus-send` 来检查 dbus。

    DBus 名称 `org.fcitx.Fcitx` 的所有者是 `:1.0`。

    DBus 名称 `org.fcitx.Fcitx` 的 PID 所有者是 `4972`。

# 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 的配置界面:

# 前端设置:
## Xim:
1.  `${XMODIFIERS}`:

    **XMODIFIERS 没有设置**

    **请使用您发行版提供的工具将环境变量 XMODIFIERS 设为 "@im=fcitx" 或者将 `export XMODIFIERS=@im=fcitx` 添加到您的 `~/.xprofile` 中. 参见 [输入法相关的环境变量: XMODIFIERS](http://fcitx-im.org/wiki/Input_method_related_environment_variables/zh-cn#XMODIFIERS).**
    从环境变量中获取的 Xim 服务名称为 fcitx.

2.  根窗口上的 XIM_SERVERS:

    Xim 服务的名称与环境变量中设置的相同.

## Qt:
1.  qt4 - `${QT4_IM_MODULE}`:

    **请使用您发行版提供的工具将环境变量 QT_IM_MODULE 设为 "fcitx" 或者将 `export QT_IM_MODULE=fcitx` 添加到您的 `~/.xprofile` 中. 参见 [输入法相关的环境变量: QT_IM_MODULE](http://fcitx-im.org/wiki/Input_method_related_environment_variables/zh-cn#QT_IM_MODULE).**

2.  qt5 - `${QT_IM_MODULE}`:

    **请使用您发行版提供的工具将环境变量 QT_IM_MODULE 设为 "fcitx" 或者将 `export QT_IM_MODULE=fcitx` 添加到您的 `~/.xprofile` 中. 参见 [输入法相关的环境变量: QT_IM_MODULE](http://fcitx-im.org/wiki/Input_method_related_environment_variables/zh-cn#QT_IM_MODULE).**

3.  Qt 输入法模块文件:

    找到了 Qt4 的输入法模块: `/usr/lib/qt4/plugins/inputmethods/qtim-fcitx.so`.
    找到了 fcitx 的 qt 模块: `/usr/lib/fcitx/qt/libfcitx-quickphrase-editor5.so`.
    找到了 Qt5 的输入法模块: `/usr/lib/qt/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.so`.

## Gtk:
1.  gtk - `${GTK_IM_MODULE}`:

    **请使用您发行版提供的工具将环境变量 GTK_IM_MODULE 设为 "fcitx" 或者将 `export GTK_IM_MODULE=fcitx` 添加到您的 `~/.xprofile` 中. 参见 [输入法相关的环境变量: GTK_IM_MODULE](http://fcitx-im.org/wiki/Input_method_related_environment_variables/zh-cn#GTK_IM_MODULE).**

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.22.30` 的 `gtk-query-immodules`.
        版本行:

            # Created by /usr/bin/gtk-query-immodules-3.0 from gtk+-3.22.30

        已找到 gtk `3.22.30` 的 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.22.30` 的输入法模块缓存.
        版本行:

            # Created by /usr/bin/gtk-query-immodules-3.0 from gtk+-3.22.30

        已找到 gtk `3.22.30` 的 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-spell
            fcitx-sunpinyin
            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
        sunpinyin

2.  默认输入法:

    您已经正确的将一个键盘输入法 "fcitx-keyboard-us" 设为默认.

# 日志:
1.  `date`:

        2018年 05月 30日 星期三 13:18:42 CST

2.  `~/.config/fcitx/log/`:

        总用量 0

3.  `~/.config/fcitx/log/crash.log`:

    `~/.config/fcitx/log/crash.log` 未找到.
~ λ 

从诊断信息中可以发现,原来是 GTK_IM_MODULE, QT_IM_MODULEXMODIFIERS 这三个环境变量没有设置。

sed -i '/Environment/ s/$/ GTK_IM_MODULE=fcitx QT_IM_MODULE=fctix XMODIFIERS="@im=fcitx"/' ~/.config/systemd/user/emacs.service

再次重载修改后的unit file,然后再重启 emacs daemon

systemctl --user daemon-reload
systemctl --user restart emacs.service

运行 emacsclient -n -c 连接上emacs daemon, 按下 Ctrl-SPC, 这次能用中文了.

screenshot-14.png 最后的service unit file是这样的

[Unit]
Description=Emacs text editor
Documentation=info:emacs man:emacs(1) https://gnu.org/software/emacs/

[Service]
Type=simple
ExecStart=/usr/bin/emacs --fg-daemon
ExecStop=/usr/bin/emacsclient --eval "(kill-emacs)"
Environment=SSH_AUTH_SOCK=%t/keyring/ssh LANG=zh_CN.UTF-8 GTK_IM_MODULE=fcitx QT_IM_MODULE=fctix XMODIFIERS="@im=fcitx"
Restart=on-failure

[Install]
WantedBy=default.target

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK