Leopard的終端機和screen中文寬度修正

升級到Leopard後,意外發現內建的終端機(Terminal.app)也做了大改版。
加了TAB的支援,還有方塊選取功能(按住Opt再選,就不再是以行為單位選取,而是選任意的方塊),長時間使用佔用的記憶體更少了,而且也加強了對亞洲文字的支援。
對於我這種Terminal重度使用者來說,以上當然都是好消息。

但事實上當然沒這麼美好啦XD

第一,Terminal.app對於中文輸入法極不友善。只要在IRC或BBS等地,用中文輸入法就常會發現打到一半整個輸入框就消失的情形。從OpenVanilla team那邊得到的消息是:這是Terminal.app的錯,而且目前無解。

第二,對於亞洲文字的支援的確有加強,搭配screen做big5 -> utf-8的轉碼可以看到幾乎是完美的,只剩下”《”和”》”的寬度不對而已:

這問題蠻容易解決的。參考Eric的patch,用以下patch修正0x300a和0x300b的寬度就行了。


--- encoding.c.orig 2007-12-09 09:26:01.000000000 +0800
+++ encoding.c 2007-12-09 09:27:17.000000000 +0800
@@ -860,7 +860,8 @@
(c >= 0xfe30 && c < = 0xfe6f) || /* CJK Compatibility Forms */ (c >= 0xff00 && c < = 0xff5f) || /* Fullwidth Forms */ (c >= 0xffe0 && c < = 0xffe6) || - (c >= 0x20000 && c < = 0x2ffff))); + (c >= 0x20000 && c < = 0x2ffff))) || + (c == 0x300a || c == 0x300b) ; } #endif

另外,在Leopard下自行編譯screen還會碰到找不到sys/stropts.h的錯誤訊息,只要加上這個patch就行了。

--- pty.c.orig 2007-12-09 09:30:14.000000000 +0800
+++ pty.c 2007-12-09 09:30:30.000000000 +0800
@@ -34,7 +34,7 @@
#endif

/* for solaris 2.1, Unixware (SVR4.2) and possibly others */
-#ifdef HAVE_SVR4_PTYS
+#if !defined(__APPLE__) && defined(HAVE_SVR4_PTYS)
# include
#endif

另外如果是要拿Terminal.app上BBS的話,建議再加上Screen UAO patch (注意,不要用mhsin的cjkwidth patch。在Leopard下反而會再把寬度搞亂)。這樣就幾乎能正確看到大部分的特殊符號了。

如果不想自己patch和compile的人,可以直接抓我編好的binary: screen-leopard-patched.tgz。在/下解開,就會裝到/opt/local/bin下。如果想要直接取代內建的screen,把它link到/usr/bin/screen取代原先的版本就行了。

3 thoughts on “Leopard的終端機和screen中文寬度修正

  1. 這……用了 cjkwidth patch 會發生什麼事? @_@
    有 ^A :cjkwidth on 嗎?


    話說,cjkwidth patch 和 300a/300b 的 patch 應該會 conflict 吧

留言給我吧!