Skip to content

Sử dụng ibus bamboo với Vim.

Chan edited this page Oct 5, 2024 · 6 revisions

Các bạn dùng Vim mà bật bộ gõ tiếng Việt chắc cũng sẽ gặp những hành vi không mong muốn như dd không xóa dòng mà gửi thẳng chữ đ vào buffer. Thực chất khi sử dụng Vim, các bạn chỉ mong muốn gõ tiếng Việt trong insert mode, nhưng nếu tắt IBus đi thì lại không gõ được tiếng Việt. Chúng ta sẽ giải quyết vấn đề này như sau:

  • Bật bộ gõ khi vào insert mode.
  • Tắt bộ gõ khi thoát insert mode.
  • Bật bộ gõ khi tìm kiếm, tắt bộ gõ khi tìm kiếm xong

Vim

function! IBusOff()
  " Lưu engine hiện tại
  let g:ibus_prev_engine = system('ibus engine')
  " Chuyển sang engine tiếng Anh
  execute 'silent !ibus engine xkb:us::eng'
endfunction
function! IBusOn()
  let l:current_engine = system('ibus engine')
  " nếu engine được set trong normal mode thì
  " lúc vào insert mode duùn luôn engine đó
  if l:current_engine !~? 'xkb:us::eng'
    let g:ibus_prev_engine = l:current_engine
  endif
  " Khôi phục lại engine
  execute 'silent !' . 'ibus engine ' . g:ibus_prev_engine
endfunction
augroup IBusHandler
    autocmd CmdLineEnter [/?] call IBusOn()
    autocmd CmdLineLeave [/?] call IBusOff()
    autocmd InsertEnter * call IBusOn()
    autocmd InsertLeave * call IBusOff()
augroup END
call IBusOff()

NeoVim

local ibus_prev_engine = nil

function IBusOff()
  -- Lưu engine hiện tại
  ibus_prev_engine = vim.fn.system('ibus engine')
  -- Chuyển sang engine tiếng Anh
  vim.cmd('silent !ibus engine xkb:us::eng')
end

function IBusOn()
  local current_engine = vim.fn.system('ibus engine')
  -- Nếu engine được set là tiếng Anh thì giữ nguyên,
  -- Nếu là Bamboo thì chuyển về lại Bamboo
  if not string.match(current_engine, 'xkb:us::eng') then
    ibus_prev_engine = current_engine
  end
  -- Khôi phục lại engine
  vim.cmd('silent !ibus engine ' .. ibus_prev_engine)
end

vim.api.nvim_create_augroup("IBusHandler", { clear = true })

vim.api.nvim_create_autocmd({ "CmdlineEnter" }, {
  pattern = "[/?]",
  callback = function() IBusOn() end,
  group = "IBusHandler"
})

vim.api.nvim_create_autocmd({ "CmdlineLeave" }, {
  pattern = "[/?]",
  callback = function() IBusOff() end,
  group = "IBusHandler"
})

vim.api.nvim_create_autocmd({ "InsertEnter" }, {
  pattern = "*",
  callback = function() IBusOn() end,
  group = "IBusHandler"
})

vim.api.nvim_create_autocmd({ "InsertLeave" }, {
  pattern = "*",
  callback = function() IBusOff() end,
  group = "IBusHandler"
})

-- Call IBusOff initially
IBusOff()

Lưu ý:

  1. Đoạn mã này không giúp bạn tự chuyển về engine tiếng Anh khi bạn focus sang một cửa sổ khác, bật bộ gõ lên rồi quay trở lại vim
  2. Nếu bạn không muốn tình huống như lưu ý (1), bạn có thể tắt tính năng chia sẻ engine giữa mọi cửa số trong phần cài đặt ibus. Tuy nhiên trong quá trình sử dụng mình thấy việc mỗi cửa sổ có một engine riêng hơi lag và sập. (xem thêm)