阅读:6850回复:5
多行詞庫輸入
先簡單說明一下這裡所謂的「多行詞庫輸入」
一般用詞庫輸入時,通常是限於同一行的詞庫文字 若像多行的簽名檔(雖然現在很多論壇軟體已提供簽名檔設置,不需經常輸入) 或多行的文字模板 可能就要分幾次輸入。或自己用剪、貼的動作來達成 而「多行詞庫輸入」則用一個字碼組合來輸入多行文字 這功能有幾個輸入法軟體做出來(僅指台灣方面的,自己只對這方面較清楚) 如:嘸蝦米與「偽.蝦米」 http://www.ptt.cc/man/Liu/DA17/M.1183784094.A.E26.html (如果文字行的開頭要用「+」符號時怎麼辦?同樣再多加個「+」。) 大新倉頡也有這功能(http://www.eztyping.com.tw/newcj_brief.htm) 自己利用小小平台的「命令直通車」功能,模擬上述「多行詞庫輸入」 但只將多行文字讀入clipboard,還要按Ctrl+V做貼上的動作才會把多行文字真正輸出 具體作法如下: 先聲明一下:以下只是自己的作法,請自行依實際情況做適度調整 自己的東西都放在yong/tw/資料夾之下,這樣不會與小小原來的東西混一起 tw裡面建個plugin資料夾,放這功能所要用的程式與「多行式詞庫」檔案 一、先做好「多行式詞庫」,假定名稱為ml_wbank.txt 內容像以下的範例: <llzl>聯絡資料</llzl> <qzw>千字文</qzw> ===分隔線========== <llzl> 聯絡資料範例 姓名 電話:1234567890 手機:0987654321 電子郵件:mailbox@dd.com 地址:太陽系地球村 </llzl> <qzw> 天地玄黃 宇宙洪荒 日月盈昃 辰宿列張 寒來暑往 ...中間省略... 徘徊瞻眺 孤陋寡聞 愚蒙等誚 謂語助者 焉哉乎也 </qzw> 分隔線上方只是類似摘要,沒有實質作用,真正內容在分隔線之下 這裡面只放2個例子,一個是聯絡資料,打算以llzl這組字碼來輸入 另一個是千字文,打算以qzw這組字碼來輸入。當然不會真有人這樣輸入千字文的,這只是個例子 用像html tag的方式,以組合字碼,前後包住一段文字,如千字文的內容是在<qzw>與</qzw>的中間 二、在碼表(或分詞庫)中加入命令直通車的指令 如以下二行: llzl $GO(聯絡資料,tw\plugin\llzl.pyw) qzw $GO(千字文,tw\plugin\qzw.pyw) 自己是把命令直通車功能用的指令行都放在單獨的分詞庫檔案中(為方便說明,這裡假定檔名為cmds.dic),非直接放在碼表中 然後設置 dicts=tw/cmds.dic 如果原本有慣用的分詞庫(假定名稱為wbank.dic),兩個分詞庫也可串一起用 dicts=tw/wbank.dic tw/cmds.dic 三、做好llzl.pyw與qzw.pyw 因命令直通車目前不支援命令參數,所以利用二支python小程式,執行下述四、主程式,將自己的檔案名稱(就是組字碼)傳入 二支程式的內容完全一樣,只有檔案名稱不一樣 #!/usr/bin/env python # -*- coding: utf-8 -*- import os import sys def main(): path, filename = os.path.split(sys.argv[0]) basename, ext = os.path.splitext(filename) os.chdir('tw/plugin/') os.system('mlbank.pyw ' + basename) if __name__ == '__main__': main() 四、主程式:mlbank.pyw 利用這程式讀取所要的文字行區段,複製到clipboard 這程式是粗略做的,目前只用在Windows平台,若要用在Linux上,必須修改 #!/usr/bin/env python3 # -*- coding: utf-8 -*- src = 'ml_wbank.txt' import sys import os import win32clipboard import win32con import win32gui def main(): if len(sys.argv) > 1: tag_start = '<{}>'.format(sys.argv[1]) tag_end = '</{}>'.format(sys.argv[1]) text = '' with open(src, encoding='utf-8') as f: start = False match_start = False for line in f: if start: if match_start: if line.rstrip() == tag_end: break else: text += line elif line.rstrip() == tag_start: match_start = True else: continue elif line.startswith('='): start = True else: continue win32clipboard.OpenClipboard() win32clipboard.EmptyClipboard() win32clipboard.SetClipboardData(win32con.CF_UNICODETEXT, text) win32clipboard.CloseClipboard() if __name__ == '__main__': main() 上述工作正確做好後,要正常發揮作用,需有以下執行的條件。當然先決條件是要有執行小小的環境 一、Windows平台,32或64位元 二、Python 3.x,配合Windows平台的版本 三、Python for Windows extensions 二、三項也可用 http://www.activestate.com/activepython 就包含在內 若用便㩗版,可用 http://portablepython.com/ 也包含第三項,記得把python執行檔的位置設在系統路徑中 一切就緒後,照以往般使用小小,切換到能使用上述二個命令直通車指令的輸入法 輸入llzl,選「->聯絡資料」。此時會執行指令,有個命令窗口短暫出現一下並關閉。文字會複製到clipboard中 在任一文字視窗中按Ctrl+V,把多行文字貼上 這作法並不是很理想,要透過剪貼板才能達成工作,只能算是個變通的方式。也許有人會有更好的想法與作法 對於有類似「命令直通車」的輸入法而言(台灣方面的輸入法有少數幾個有這類功能),在尚不支援多行詞庫功能時,若有使用多行詞庫的需要,這變通的作法算是可通用的 程式也並不一定要用python做,ruby或其他合適的語言大致上也可達成 當然若輸入法軟體直接內建支持多行詞庫的功能當然是最好不過了 補充說明一下: 上述步驟一、三、四的檔案是採utf-8編碼,這是因在自己的環境中要使用utf-8文字的關係 若要用GBK編碼,主程式中開啟檔案的地方就要修改一下 自己在Win 7 64位元上使用,在notepad.exe程式視窗中貼上時,不會換行,不知為何?沒去細察原因 但在其它文字編輯軟體上則是正常 另外有兩處非與本主題有直接相關的問題,在此一併提出來 在小小的設置檔中,路徑的分隔符號,通常用 / 就可以,這對於可在Windows與Linux平台執行的軟體是很方便的,不須因換平台而修改設置檔中的這類符號 但在做這功能時發現,命令直通車中的指令路徑,在Windows機器不能用 / ,而要像: llzl $GO(聯絡資料,tw\plugin\llzl.pyw) 另一處類似的情形是在yong.ini的help項,如: help=字根表 tw\hanpin.pdf 若改用 / 符號,就不行了 |
|
板凳#
发布于:2012-12-24 10:22
照周老師說的方法,馬上試了一下
用命令直通車的方式加入: test $[測試]$FILE(tw\plugin\test.txt) 輸入test,會讀入test.txt中的文字內容,並將文字輸出 又學了一招,謝謝了 回頭再看了一下chm檔的說明,在「其它说明」──「码表设置」找到了$FILE的用法 发送文件 $[ ]的用法,說明中好像沒有 |
|
地板#
发布于:2012-12-24 10:42
回 1楼(dgod) 的帖子
dgod:不用那么麻烦 對了 周老師可有注意到最後一段所提到的路徑分隔符號的問題 |
|
4楼#
发布于:2012-12-24 10:43
fygul,你好,
真是不错呢,这个帖子严谨详细,简直就是教程了,感谢分享经验。 如果小小没有这些功能,确实可以好好学习下您的做法。 |
|
5楼#
发布于:2012-12-24 12:06
回 3楼(fygul) 的帖子
fygul:對了 路径分隔符取决于系统是否支持。一般来说应该用/,大多数情况下应该是可以的。 我就不详细测了。 |
|