Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> 關於 Linux

Ubuntu 系統 Sublime Text 2/3/4 配置 fcitx 中文輸入法完整解決方案

編輯:關於 Linux

Sublime Text 基於自定 UI 工具包,不直接使用 GTK/Qt 輸入法模組,導致 Linux 下無法直接啟用 fcitx/ibus 中文輸入。解決方案是編寫一個 LD_PRELOAD 共享庫,攔截 GTK 輸入法上下文事件並修正游標位置傳遞。本文提供適用於 Sublime Text 2/3/4 的完整編譯與配置步驟。

核心原理

  • Sublime Text 使用自繪介面,游標位置變更時未正確通知 GTK 輸入法模組(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

1. 建立修正源碼

儲存為 ~/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);
}

2. 編譯共享庫

GTK 2 版 (Sublime Text 2/3 早期版本)

cd ~
gcc -shared -o libsublime_imfix.so sublime_imfix.c `pkg-config --libs --cflags gtk+-2.0` -fPIC

GTK 3 版 (Sublime Text 3 Build 3170+ / Sublime Text 4)

gcc -shared -o libsublime_imfix.so sublime_imfix.c `pkg-config --libs --cflags gtk+-3.0` -fPIC

3. 修改啟動器

方法 A:修改 .desktop 檔案 (推薦,圖形介面啟動生效)

# 找到 .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

方法 B:建立包裝腳本 (終端機啟動也生效)

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 中

4. 設定 fcitx 環境變數 (必要)

編輯 ~/.xprofile 或 ~/.profile (登入時載入):

export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export SDL_IM_MODULE=fcitx

重新登入或 source ~/.xprofile。

5. 驗證與測試

  1. 從應用程式選單啟動 Sublime Text (使用 .desktop 方式)。
  2. 按 Ctrl+Space (或您的 fcitx 啟動鍵) 切換中文輸入。
  3. 輸入拼音/注音,候選框應出現在游標附近。
  4. 在檔案對話框、側邊欄、命令面板中測試輸入。

常見問題排除

現象解決方案
編譯錯誤 "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 TextFlatpak 沙箱阻擋 LD_PRELOAD,改用 flatpak override --env=LD_PRELOAD=... 或改用系統安裝版

現代替代方案

  • Sublime Text 4 Build 4143+:官方已改善輸入法支援,嘗試不使用修補直接設定環境變數測試。
  • fcitx5 + GTK4/Qt6:新架構相容性更好。
  • 使用 VS Code / GNOME Text Editor / Kate:原生支援輸入法,無需折騰。

總結

Ubuntu Sublime Text 啟用 fcitx 中文輸入核心步驟:安裝 GTK 開發套件 → 編譯 LD_PRELOAD 共享庫 (GTK2/GTK3 擇一) → 修改 .desktop Exec 行注入庫 → 設定 fcitx 環境變數 → 重新登入驗證。此方案經過多年社群驗證,適用於 Sublime Text 2/3/4 絕大多數版本。

Copyright © Windows教程網 All Rights Reserved