Sublime Text 基於自定 UI 工具包,不直接使用 GTK/Qt 輸入法模組,導致 Linux 下無法直接啟用 fcitx/ibus 中文輸入。解決方案是編寫一個 LD_PRELOAD 共享庫,攔截 GTK 輸入法上下文事件並修正游標位置傳遞。本文提供適用於 Sublime Text 2/3/4 的完整編譯與配置步驟。
gtk_im_context_set_cursor_location)。LD_PRELOAD 注入共享庫,Hook gdk_region_get_clipbox 與 gtk_im_context_set_client_window,在偵測到游標寬度為 2 像素(典型游標特徵)時,主動設定輸入法游標位置。sudo apt-get update
sudo apt-get install build-essential libgtk2.0-dev
# Sublime Text 3/4 可能需 GTK 3:
sudo apt-get install libgtk-3-dev
儲存為 ~/sublime_imfix.c:
/*
* sublime_imfix.c
* Fix fcitx/ibus input method for Sublime Text on Linux
* Compile: gcc -shared -o libsublime_imfix.so sublime_imfix.c `pkg-config --libs --cflags gtk+-2.0` -fPIC
* (GTK3 版: pkg-config --libs --cflags gtk+-3.0)
* Run: LD_PRELOAD=~/libsublime_imfix.so sublime_text
*/
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
GtkIMContext *local_context = NULL;
void gdk_region_get_clipbox(const GdkRegion *region, GdkRectangle *rectangle) {
g_return_if_fail(region != NULL);
g_return_if_fail(rectangle != NULL);
rectangle->x = region->extents.x1;
rectangle->y = region->extents.y1;
rectangle->width = region->extents.x2 - region->extents.x1;
rectangle->height = region->extents.y2 - region->extents.y1;
GdkRectangle rect;
rect.x = rectangle->x;
rect.y = rectangle->y;
rect.width = 0;
rect.height = rectangle->height;
// 檢測游標:寬度 2px 且輸入法上下文存在
if (rectangle->width == 2 && GTK_IS_IM_CONTEXT(local_context)) {
gtk_im_context_set_cursor_location(local_context, rectangle);
}
}
static GdkFilterReturn event_filter(GdkXEvent *xevent, GdkEvent *event, gpointer im_context) {
XEvent *xev = (XEvent *)xevent;
if (xev->type == KeyRelease && GTK_IS_IM_CONTEXT(im_context)) {
GdkWindow *win = g_object_get_data(G_OBJECT(im_context), "window");
if (GDK_IS_WINDOW(win)) {
gtk_im_context_set_client_window(im_context, win);
}
}
return GDK_FILTER_CONTINUE;
}
void gtk_im_context_set_client_window(GtkIMContext *context, GdkWindow *window) {
GtkIMContextClass *klass;
g_return_if_fail(GTK_IS_IM_CONTEXT(context));
klass = GTK_IM_CONTEXT_GET_CLASS(context);
if (klass->set_client_window)
klass->set_client_window(context, window);
if (!GDK_IS_WINDOW(window))
return;
g_object_set_data(G_OBJECT(context), "window", window);
int width = gdk_window_get_width(window);
int height = gdk_window_get_height(window);
if (width != 0 && height != 0) {
gtk_im_context_focus_in(context);
local_context = context;
}
gdk_window_add_filter(window, event_filter, context);
}
cd ~
gcc -shared -o libsublime_imfix.so sublime_imfix.c `pkg-config --libs --cflags gtk+-2.0` -fPIC
gcc -shared -o libsublime_imfix.so sublime_imfix.c `pkg-config --libs --cflags gtk+-3.0` -fPIC
# 找到 .desktop 檔案位置
find /usr/share/applications ~/.local/share/applications -name "sublime*.desktop" 2>/dev/null
# 編輯 (以 sublime_text.desktop 為例)
sudo vi /usr/share/applications/sublime_text.desktop
# 找到 Exec= 行 (通常有兩行:一般啟動、新視窗),修改為:
Exec=bash -c "LD_PRELOAD=/home/您的用戶名/libsublime_imfix.so /opt/sublime_text/sublime_text %F"
# 或使用環境變數:
Exec=env LD_PRELOAD=/home/您的用戶名/libsublime_imfix.so /opt/sublime_text/sublime_text %F
cat > ~/bin/subl <<'EOF'
#!/bin/bash
export LD_PRELOAD=/home/您的用戶名/libsublime_imfix.so
exec /opt/sublime_text/sublime_text "$@"
EOF
chmod +x ~/bin/subl
# 確保 ~/bin 在 PATH 中
編輯 ~/.xprofile 或 ~/.profile (登入時載入):
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export SDL_IM_MODULE=fcitx
重新登入或 source ~/.xprofile。
| 現象 | 解決方案 |
|---|---|
| 編譯錯誤 "gtk/gtk.h: No such file" | 安裝 libgtk2.0-dev 或 libgtk-3-dev |
| 啟動後仍無法輸入中文 | 1. 確認 LD_PRELOAD 路徑正確 2. 確認 fcitx 守護程式運行 fcitx -r 3. 檢查環境變數 env | grep -i im_module |
終端機輸入 subl 可輸入中文,但圖形啟動不行 | .desktop 檔案 Exec 行未正確設定 LD_PRELOAD,檢查引號轉義 |
| Sublime Text 4 (GTK3) 候選框位置偏移 | 改用 GTK3 編譯版本,或更新原始碼處理高 DPI 縮放 |
| Flatpak 版 Sublime Text | Flatpak 沙箱阻擋 LD_PRELOAD,改用 flatpak override --env=LD_PRELOAD=... 或改用系統安裝版 |
Ubuntu Sublime Text 啟用 fcitx 中文輸入核心步驟:安裝 GTK 開發套件 → 編譯 LD_PRELOAD 共享庫 (GTK2/GTK3 擇一) → 修改 .desktop Exec 行注入庫 → 設定 fcitx 環境變數 → 重新登入驗證。此方案經過多年社群驗證,適用於 Sublime Text 2/3/4 絕大多數版本。
Linux cp 指令完整教學:檔案/目錄複製、屬性保留、備份控制、稀疏檔處理、跨檔案系統複製實戰
Linux 安裝 Python 第三方庫報錯「Python version 2.7 required」?註冊表修復腳本解決
Linux 終端機 11 個必學高效操作技巧:快捷鍵、sudo!!、背景執行、nohup、at 排程
Git 在 Windows 上報錯「exit code 128/1」:TortoiseGit SSH Client 設定修正指南
Linux 磁碟故障導致系統運行緩慢?排查 RAID 快取電池失效案例實錄
Linux 終端機快捷鍵大全:刪除、移動、替換、歷史指令與進階技巧