-
Notifications
You must be signed in to change notification settings - Fork 76
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 ý:
- Đ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
- 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)