2014年11月14日 星期五

別讓倒退鍵不開心

倒退鍵不開心, 只吃半個字 過兩天要開一個會。 想請一些不懂電腦的朋友用 pietty 登入我的筆電, 大家一起用 cat >> chat-log.txt 七嘴八舌把重要對話記下來, 實現克難版 IRC -- 不怕對外網路斷線、 不需要自己架 IRC server、 朋友也不必學 IRC。 結果打字時發現 backspace 鍵只會吃掉半個字元... 啊你留半口是要給誰吃啊? 是說想減肥也不必這麼客氣啊... 可是為什麼在 bash 命令列上打中文就不會有這個問題, 為什麼這時倒退鍵就會很開心地把整個字吃下去呢? 原先猜測是 readline 在幫忙。 所以用 perl + readline 寫一支小程式測試, 還是不行。 最後找到 日本人寫的 caroline 模組 再搭配 小惡魔的解釋, 要用 binmode 設定 utf8 編碼, 才終於解決問題。

這個模組太不知名了, 所以沒有 debian 套件。 請先安裝 gcc 等等開發工具: apt-get install build-essential , 然後 cpan 安裝 Caroline 模組: cpan Caroline。 (要花一些時間) 於是以下這支程式就可以正常輸入輸出中文, backspace 鍵也就不再耍脾氣了, 耶!

另外, 因為這是一支類似即時通/IRC 的程式, 所以每當使用者按 Enter 鍵, 就應該立即輸出, 而不應該把它 hold 在 buffer 裡面。 根據 這一頁 的解釋, 可以用這一句達成: select((select($LOG), $|=1)[0]);

最後, 如果來自命令列上的中文參數亂掉的話, 可以參考 這一頁。 因為現在的 linux 都採 utf8 編碼, 所以我可以採用最簡單的寫法: 在命令列上加 -CA 這兩個選項就 OK 了。

[11/20 更新: 我把程式寫得比較完整一點, 改放在 這裡, 並且為我的麻瓜朋友們寫了 使用說明。]

沒有留言:

張貼留言