以下の内容はhttps://tomato3713.hatenablog.com/entry/2024/05/01/204354より取得しました。


Neovimで平仮名とカタカナを変換するカスタムオペレーターを定義した

https://github.com/monaqa/general-converter.nvim を使って「平仮名からカタカナへの変換」と「カタカナから平仮名への変換」の2つのオペレータを自作した。

イメージとしてはVimの標準機能にあるアルファベットの大文字と小文字に変換するgu / gU オペレータの日本語版だ。

general-converters.nvimについては誰でも簡単手作りわくわくオペレータ作成Neovimプラグイン で作者により詳しく紹介されているので参照してほしい。

general-converters.nvim は文字列から文字列に変換する関数を与えることでカスタムオペレータを定義できる。 今回は次のような関数を定義した。

local utf8 = require ('utf8')

require("general_converter").setup {
    converters = {
        {
            desc = "ひらがなに変換する (「あ」 -> 「あ」, 「ア」 -> 「あ」)",
            converter = function(str)
                local ret = ""
                for i = 1, utf8.len(str) do
                    local lead = utf8.offset(str, i)
                    local trail = utf8.offset(str, i + 1) - 1
                    local codepoint = utf8.codepoint(string.sub(str, lead, trail))

                    if codepoint >= 0x30A0 and codepoint <= 0x30FF then
                        ret = ret .. utf8.char(codepoint - 0x60)
                    else
                        ret = ret .. utf8.char(codepoint)
                    end
                end
                return ret
            end,
            labels = { "hira" },
        },
        {
            desc = "カタカナに変換する (「あ」 -> 「あ」, 「あ」 -> 「ア」)",
            converter = function(str)
                local ret = ""
                for i = 1, utf8.len(str) do
                    local lead = utf8.offset(str, i)
                    local trail = utf8.offset(str, i + 1) - 1
                    local codepoint = utf8.codepoint(string.sub(str, lead, trail))

                    if codepoint >= 0x3040 and codepoint <= 0x309F then
                        ret = ret .. utf8.char(codepoint + 0x60)
                    else
                        ret = ret .. utf8.char(codepoint)
                    end
                end
                return ret
            end,
            labels = { "kana" },
        },
      },
}

Neovimに組み込まれているLuaLua 5.1 であるため標準のutf8 module が利用できない。 そのため同様の機能を提供するhttps://github.com/uga-rosa/utf8.nvim をNeovim プラグインとしてインストールして標準の utf8 moduleの代わりに使った。

平仮名とカタカナの変換はよくある処理で平仮名とカタカナの文字コードの差 (0x60)を足し引きしているだけだ。

一応、平仮名カタカナ以外の文字が変換されると困るので、変換対象の文字種別かどうかを文字コードの範囲をチェックして守っている。

キーマップは一旦次のようにして @k / @h に割り当てた。 これで@ki"ノーマルモードで入力するとダブルクウォーテーションで囲まれた範囲にある平仮名をカタカナに変換できるようになる。

vim.keymap.set(
    { "n", "x" },
    "@k",
    require("general_converter").operator_convert("kana"),
    { expr = true }
)
vim.keymap.set(
    { "n", "x" },
    "@h",
    require("general_converter").operator_convert("hira"),
    { expr = true }
)



以上の内容はhttps://tomato3713.hatenablog.com/entry/2024/05/01/204354より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14