Vim 簡繁互轉 Mark.II

不久前,我曾在舊網誌寫了一篇關於 Vim 簡繁互轉的文章,那篇文章提供一個 Vim 小腳本,讓人能在編輯過程中,輕鬆愜意地完成簡繁互轉的工作。

先前的腳本簡單直接,我用得很舒心,這兩年來一直有在用,但是基於實作方式的先天性缺陷,簡繁互轉的過程中偶爾會出現問號,因此無法用於比較嚴肅的場合。為此,咱後來又寫了一個基於 OPENCC 的轉換腳本來用,可以達成更加理想的簡繁互轉效果。

--所以囉,網誌寫續篇的時候到了!

簡繁互轉 OPENCC 版

「簡繁互轉 OPENCC 版」採用 OPENCC 專案作為後端進行轉換,因此轉換效果非常非常地好,簡直無可挑剔。畢竟 OPENCC 是一個以「完美轉換」為目標的簡繁轉換專案嘛。

不過弱點還是有的:

  1. 你的平台必須要有裝 OPENCC 3.0 以上。Linux 用戶請用各自的包管理器安裝。
  2. 估計在 Windows 下還要有一點小調整才能正常運作。因為我沒在 Windows 下用過 Vim,所以這方面的調整實在是沒辦法。歡迎各位留 Patch 給我。

用法如下,請將以下程式碼貼入 vimrc 中:

"=============================================
"簡繁互轉 OPENCC 版:用 opencc 轉換緩衝區內容
" 作者:Civa Lin 林雪凡 - Version: 1.0
"
" 注意:
" - 請在系統中安裝 opencc >= 3.0 才能使用
" - 轉換不影響檔案,需要儲存者請手動儲存。
" - 在 linux 中測試過 OK,在 windows 環境下應該需要小修改,歡迎提交 patch
"
" 用法:
" :O[PENCC] 設定檔
"
" 設定檔:
" - 請善用 tab 自動補全
" - 註:以下說明中所稱之「繁體」,為一「能分則不合」的中介繁體「用字」,
" 這套用字在 opencc 中被當作中間格式,其他轉換執行時也都會經過此一模式
" 。技術細節請參考 opencc 官網。
" - 註:下方說明部份摘抄自 https://www.byvoid.com/blog/tag/OpenCC 此處僅
" 為使用方便而節錄。
"
" - zhs2zht.ini 簡體到繁體
" - zht2zhs.ini 繁體到簡體
" - zhs2zhtw_p.ini 簡體到臺灣標準(只轉換詞彙)
" - zhs2zhtw_v.ini 簡體到臺灣標準(只轉換異體字)
" - zhs2zhtw_vp.ini 簡體到臺灣標準(轉換異體字和詞彙)
" - zht2zhtw_p.ini 繁體到臺灣標準(只轉換詞彙)
" - zht2zhtw_v.ini 繁體到臺灣標準(只轉換異體字)
" - zht2zhtw_vp.ini 繁體到臺灣標準(轉換異體字和詞彙)
" - zhtw2zhs.ini 臺灣標準到簡體(不轉換詞彙)
" - zhtw2zht.ini 臺灣標準到繁體(不轉換詞彙)
" - zhtw2zhcn_s.ini 臺灣標準到中國大陸標準(轉換詞彙,並轉換爲簡體)
" - zhtw2zhcn_t.ini 臺灣標準到中國大陸標準(轉換詞彙,保持繁體)
"
" - 辭彙轉換,例: 光碟(台灣標準)<-> 光盤(大陸標準)
" - 異體字轉換,例:裏(內部繁體) <-> 裡(台灣標準)
" - 注意此處的異體字只包括涵意完全沒有歧義的,因此數量不多
" (但有些字可能很常見)
"
" - 基本上用 zht2zhs.ini 與 zhs2zht.ini 就足夠了,
" 如果要求轉換結果使用台灣/大陸慣用字詞,則再使用其他選項。
"
" 相關銘謝:
" - Opencc 由 Byvoid 製作。膜拜地點: http://opencc.byvoid.com/
command! -complete=custom,OPENCCINI -nargs=1 OPENCC call OPENCC(<q-args>)
fun! OPENCC(modefile)
if (index(g:openccinifiles, a:modefile) == -1)
echo "Cancel, Args not support!"
return
endif
let opencc = "opencc"
let infile = tempname()
let outfile = tempname()
let winview = winsaveview()
silent exe "write " . infile
let command_line = opencc . " -c " . a:modefile . " -i " . infile . " -o " . outfile
silent call system(command_line)
if (v:shell_error != 0)
echo "Opencc not found! Please install it first!"
return
endif
normal ggVGd
silent exe "read " . outfile
normal ggdd
call winrestview(winview)
endfun
fun! OPENCCINI(A,L,P)
return join(g:openccinifiles, "\n")
endfun
"可用的 opencc 設定檔
let g:openccinifiles = ["zhs2zht.ini", "zht2zhs.ini" ,"zhs2zhtw_p.ini", "zhs2zhtw_v.ini", "zhs2zhtw_vp.ini", "zht2zhtw_p.ini", "zht2zhtw_v.ini", "zht2zhtw_vp.ini", "zhtw2zhs.ini", "zhtw2zht.ini", "zhtw2zhcn_s.ini", "zhtw2zhcn_t.ini"]

使用方式就按:

:O[PENCC] <tab>

這個腳本支持自動補全,因此 <tab> 一直按就能快速切換各種模式了。模式說明請參考 OPENCC 作者的部落格:《OpenCC支持地區用詞轉換了》這一篇。

簡繁互轉基本版

「簡繁互轉基本版」就是我過去發表過的那個版本,只不過稍加修理了介面,讓它的指令變得更合理好用。

因為偶爾也會在未安裝 OPENCC 的平台上使用簡繁互轉功能,所以這個版本也繼續加以保留,作為輔助。

用法一如往常,請將以下腳本貼入您的 vimrc 中:

"=============================================
"簡繁互轉基本版:用 vim 內建的 iconv 轉換緩衝區內容
" 作者:Civa Lin 林雪凡 - Version: 1.0
"
" 使用:
" :CCONVERT s2t
" :CCONVERT t2s
"
" 注意:
" - 只限字轉換,無法轉換詞
" - 極少部份無法對應的字會變成 ? 號
" - 轉換不影響檔案,需要儲存者請手動儲存
command! -complete=custom,TSCONVERTMODE -nargs=1 CCONVERT call TSCONVERT(<q-args>)
fun! TSCONVERT(mode)
if(a:mode != "s2t" && a:mode != "t2s")
echo "Cancel, Args Should s2t or t2s!"
return
endif
let winview = winsaveview()
let lnum = 0
for line in getline(1,'$')
let lnum = lnum + 1
if(a:mode == "t2s")
call setline(lnum,iconv(iconv(iconv(line,"utf-8","big5"),"big5","gb2312"),"gb2312","utf-8"))
elseif(a:mode == "s2t")
call setline(lnum,iconv(iconv(iconv(line,"utf-8","gb2312"),"gb2312","big5"),"big5","utf-8"))
endif
endfor
call winrestview(winview)
endfun
fun! TSCONVERTMODE(A,L,P)
return join(["s2t", "t2s"], "\n")
endfun

使用方式就按:

:C[CONVERT] <tab>

同樣支持自動補全,<tab> 一直按就能切換 s2tt2s 模式。