本文来自依云's Blog,转载请注明。
国家标准使用这些引号:‘’“”,而我发现传统中文的引号更漂亮:「」『』。我切换到传统引号已经有一段时间了,但最近发现有时还是需要使用国标引号,而 fcitx 的现任开发者认为不需要加入该切换功能。好在 fcitx 的配置文件都是文本,又有 fcitx-remote 工具,所以自己很容易地手动实现了两个版本的——Haskell 版本纯粹是练习用,因为没有扩展路径中的~的现成函数,所以只好自己找了个实现,代码有些长。
import Control.Applicative ((<$>))
import System.Cmd (rawSystem)
import System.Directory (getHomeDirectory)
import System.Posix.User
import qualified Data.Text as T
import qualified Data.Text.IO as TIO
main = do
file <- getFile
TIO.readFile file >>= (TIO.writeFile file) . (T.map (trChar "“”‘’『』「」" "『』「」“”‘’"))
reloadFcitx
getFile :: IO FilePath
getFile = expandUser "~/.config/fcitx/data/punc.mb.zh_CN"
reloadFcitx :: IO ()
reloadFcitx = rawSystem "fcitx-remote" ["fcitx-remote", "-r"] >> return ()
expandUser :: FilePath -> IO FilePath
expandUser "~" = getHomeDirectory
expandUser ('~':'/':p) = fmap (++ "/" ++ p) getHomeDirectory
expandUser ('~':up) = let (u, p) = break (== '/') up
in fmap (++ tail p) (homeDirectory <$> getUserEntryForName u)
expandUser p = return p
trChar :: [Char] -> [Char] -> Char -> Char
trChar from to ch = case i of
Just i -> to !! i
_ -> ch
where i = elemIndex ch from
Python 版本就很简洁了:
#!/usr/bin/env python3
# vim:fileencoding=utf-8
import os
m = str.maketrans('“”‘’『』「」', '『』「」“”‘’')
file = os.path.expanduser("~/.config/fcitx/data/punc.mb.zh_CN")
c = open(file).read().translate(m)
open(file, 'w').write(c)
os.execvp('fcitx-remote', ['fcitx-remote', '-r'])

Mar 03, 2012 02:38:58 PM
没办法,Haskell 的库分得比较散
Mar 03, 2012 06:07:14 PM
主要是它自己没有 expanduser,得自己写。
Mar 04, 2012 12:53:16 AM
嘿嘿!我早就定制标点符号表了!直接修改 punc.mb,连单书名号都做进去了!
只是成对符号和引号样都用一键表示了。用用就习惯了。
Mar 04, 2012 01:04:01 AM
定制不是问题,我解决的问题是一条命令就切换。
Mar 05, 2012 12:01:13 AM
我还是看国标的引号比较顺眼。记得在大陆,那种传统的引号似乎是用于竖排文字的。
Mar 08, 2012 05:38:20 PM
国标与传统引号的切换,我是一直切汉语和日语输入法的……