sontungexpt/vietnamese.nvim

github github
language
stars 2
issues 1
subscribers 0
forks 2
CREATED

UPDATED


🚀 Vietnamese.nvim – Vietnamese Input Engine for Neovim

Vietnamese.nvim giúp bạn gõ tiếng Việt dễ dàng trong Neovim, hỗ trợ logic xử lý dấu câu tự động, tương thích nhiều IME (ibus, fcitx5…), và tích hợp mượt với nhiều plugin khác.

🔧 Tính năng chính

  • Gõ dấu Telex(dơn giản), VNI đúng vị trí, tự động điều chỉnh dấu cho từ hiện tại trên con trỏ.
  • Tự động bật/tắt IME hệ thống khi focus/blur Neovim.
  • Realtime xử lý dấu câu khi gõ
  • Tương thích với plugin bim để xử lí việc mapping jj hay jk để escape
  • Có thể chỉnh sửa từ đã gõ một cách dễ dàng hơn chỉ cần di chuyển tới vị trí từ đó rồi gõ các kí tự dấu thay vì phải xoá đi gõ lại như ime tryền thống

🖼️ Minh hoạ

  • Mình viết file readme này bằng chính plugin này

⚙️ Cài đặt

Dùng plugin manager (lua)

Lazy.nvim:

{
    "sontungexpt/vietnamese.nvim",
    dependencies = {
        -- if you want to map jj or any key to escape
        "sontungexpt/bim.nvim",
    },nvim-web-devicons
    event = "InsertEnter",
    config = function(
        require("vietnamese").setup()
    end,
}

Packer.nvim:

use {
    "sontungexpt/vietnamese.nvim",
    config = function()
        require("vietnamese").setup()
    end,
}

🧠 Cấu hình

Bạn có thể tùy chỉnh `telex`, `vni`, hoặc các nút xoá dấu trong file `lua/vietnamese/config.lua`. Ví dụ:

require("vietnamese").setup({
    enabled = true, -- Bật plugin
    input_method = "telex", -- Hoặc "vni" (hiện tại chỉ hỗ trợ telex đơn giản)
    excluded = {
        filetypes = {
            "nvimtree", -- Loại filetypes
            "help",
        }, -- File types to exclude
        buftypes = {
            "nowrite",
            "quickfix",
            "prompt",
        }, -- Loại buffer types
    },
    custom_methods =
        -- Tự tạo riêng intput methods của mình
        -- Tạm thời mọi người đừng tự tạo bởi vì mình chưa test (này edge case nên để sau)
        -- Còn néu muôn tạo thì mọi người làm giống trong file config của telex là được

        name = {

            -- nhớ import ENUM_DIACRITIC from vietnamese.constant trên đầu file config để lấy enum
            -- local ENUM_DIACRITIC = require("vietnamese.constant").Diacritic

            tone_keys = {
                ["s"] = ENUM_DIACRITIC.Acute,
                ["f"] = ENUM_DIACRITIC.Grave,
                ["r"] = ENUM_DIACRITIC.Hook,
                ["x"] = ENUM_DIACRITIC.Tilde,
                ["j"] = ENUM_DIACRITIC.Dot,
            },
            tone_removal_keys = {
                ["z"] = true,
            },
            shape_keys = {
                w = {
                    a = ENUM_DIACRITIC.Breve,
                    o = ENUM_DIACRITIC.Horn,
                    u = ENUM_DIACRITIC.Horn,
                    e = ENUM_DIACRITIC.Circumflex,
                },

                a = {
                    a = ENUM_DIACRITIC.Circumflex,
                },

                e = {
                    e = ENUM_DIACRITIC.Circumflex,
                },

                o = {
                    o = ENUM_DIACRITIC.Circumflex,
                },

                d = {
                    d = ENUM_DIACRITIC.HorizontalStroke,
                },
            },

            -- Check if a character is a valid input character to make a Vietnamese character
            --
            is_diacritic_pressed = function(char)
                return char:lower():match("[sfrxjzawdeo]") ~= nil
            end,
        }


    },
})

Command:

  • VietnameseToggle: Bật/Tắt plugin
  • VietnameseMethod: Chuyển đổi giữa các phương thức gõ dấu (telex, vni, hoặc custom methods)

⏱️ Cách hoạt động sơ lược

  1. Khi ở chế độ Insert, plugin dùng `vim.on_key()` để theo dõi phím gõ nhưng không thao tác buffer luôn.
  2. Đến event `InsertCharPre` hoặc `TextChangedI` — buffer đã ổn định — plugin lấy toàn chữ bên trái và phải dấu, xử lý dấu với `WordEngine`, và update đoạn từ.
  3. Khi focus/blur window, plugin sẽ bật/tắt IME như ibus, fcitx5.
  4. Ở đây mình không lưu lại buffer như các ime truyền thống mà mình sẽ xem mỗi một tử là một buffer và dựa vào api neovim để lấy buffer như vậy chúng ta có thể sửa từ đã gõ dễ dàng mà không cần xoá đi gõ lại

✅ NOTES

  • Khuyến khích mọi người chuyển sang tiếng anh cho các IME hệ thống trước khi xài plugins, vì hiện tại mình chưa xử lí kĩ phần này

🧩 Phát triển & Góp ý

Rất hoan nghênh issue & pull request! Bạn có thể:

  • Báo lỗi logic xử lý dấu hoặc tương thích IME.
  • Gợi ý hỗ trợ thêm IME khác hoặc method mới.
  • Xin thêm API hoặc thiết lập linh hoạt hơn.

📄 Giấy phép

Được phát hành với giấy phép Apache Licence 2.0 – xem file LICENSE