⌨️

CorvusSKKのinit.luaをカスタマイズする

2024/03/04に公開

ネットで検索をかけた範囲では見つけられなかったので試行錯誤した備忘録。

init.lua

CorvusSKKはlisp形式の辞書を指定できますが、公式で「もどき」と書いてあるようにskk-relative-date などの関数はluaで定義されています。

なので、luaで自作の関数を作ってカスタマイズすることが可能です。
ここでは一例として、 ymd2404014月1日(月) のように〈曜日を補完した日付変換〉を実装してみます。

関数を作る

CorvusSKKをインストールすると %SystemRoot%\IME\IMCRVSKK\init.lua が作られるので、これを %APPDATA%\CorvusSKK にコピーしましょう。

init.luaにこのような関数を追加します。

local function yymmdd_to_short_date(t)
	local ymd = t[1]
	local yy = "20" .. tostring(ymd:sub(1, 2))
	local mm = tostring(ymd:sub(3, 4))
	local dd = tostring(ymd:sub(5, 6))
	local ww = os.date("%a", os.time({year=yy,month=mm,day=dd}))
	return string.format("%d月%d日(%s)", mm, dd, ww)
end

引数 t は、辞書からスペース区切りで渡された引数が格納されるテーブルです。
(luaなのでインデックスが1始まり)

辞書から呼び出せるようにする

SKK辞書から呼び出すためには skk_gadget_func_table_org に登録します。
テーブルのキーが辞書上での関数名になるようです。

https://github.com/AWtnb/CorvusSKK/blob/588d61ceb66aadf6570861860e9a7f4415fffa88/init.lua#L959-L997

辞書に登録する

abbrevモードで ymd240303 のように入力して何回かスペースを押して辞書登録バッファが表示されたら、 (yymmdd-to-short-date #0) のように入力して登録します。

これで、ymd2407077月7日(日)のような変換が可能になります。

応用

もっと簡単に曜日を補完

下記の関数を to-short-date-of-this-year という名前で skk_gadget_func_table_org に登録して、

local function to_short_date_of_this_year(t)
	local yy = os.date("%Y")
	local mm = t[1]
	local dd = t[2]
	local ww = os.date("%a", os.time({year=yy,month=mm,day=dd}))
	return string.format("%d月%d日(%s)", mm, dd, ww)
end

#m#(to-short-date-of-this-year #0 #0) を登録すると、3m43月4日(月) のように変換できるようになります(実行時の年で計算するので年をまたぐときは要注意)。

n 日前(後)のタイムスタンプを簡単に出す

local function day_delta(fmt, diff)
	local yy = tostring(os.date("%Y"))
	local mm = tostring(os.date("%m"))
	local dd = tostring(tonumber(os.date("%d")) + tonumber(diff))
	local f = tostring(os.date(fmt, os.time({year=yy,month=mm,day=dd})))
	return string.gsub(string.gsub(f, "年0", "年"), "月0", "月")
end

local function skk_day_minus(t)
	local fmt = t[1]
	local diff = -1 * tonumber(t[2])
	return day_delta(fmt, diff)
end

このように定義した関数を skk_gadget_func_table_org に登録して、dminus#0(skk-day-minus "%Y%m%d" #0) を辞書登録すると、たとえば dminus320240301(3日前の日付)に変換できるようになります。

おまけ:辞書管理プロセスのリロード

上記のように辞書管理プロセスのリロードをGUIからマウスでポチポチ行うのは結構手間です。
要はプロセスを再起動すればいいのでPowerShellでこのようなコマンドレットを $PROFILE に書いています。

function Restart-CorvusSKK {
    $proc = Get-Process | Where-Object {$_.Name -eq "imcrvmgr"}
    if ($proc) {
        $p = $proc.Path
        $proc | Stop-Process -Force
        Start-Process $p
    }
}

最新状態はコチラ:

https://github.com/AWtnb/CorvusSKK

Discussion