Mình viết blog này hoàn toàn bằng Vim, vì thế gõ tiếng Việt một cách mượt mà trong Vim là điều không thể thiếu.
Một trong vô vàn tính năng mà Vim mang đến là autocmd
.
Chạy lệnh một cách tự động khi những sự kiện xảy ra.
Như đã đề cập ở bài viết Gõ tiếng Việt trên Linux. Mình dùng lệnh inp
để bật tắt chế độ gõ tiếng Việt.
Để tiếp tục, bạn hãy tìm hiểu về lệnh inp
tại repo dotfiles của mình.
Quay trở lại với Vim, mình sẽ chạy lệnh inp
trong 5 sự kiện chính:
InsertEnter
: vào chế độ insertInsertLeave
: thoát khỏi chế độ insertCmdLineLeave
: thoát khỏi chế độ nhập lệnhVimLeavePre
: trước khi thoát VimVimEnter
: khi mở Vim
Mục đích của mình là bật gõ tiếng Việt khi đang trong Insert Mode
và tắt telex khi trong Normal Mode
.
Nhưng không phải lúc nào mình cũng muốn gõ telex trong Insert Mode
, chẳng hạn như khi viết code hoặc viết tiếng Anh.
Do đó mình sẽ không bật những lệnh tự động này mọi lúc mọi nơi.
Trong vimrc, hãy thêm hàm sau, mình sẽ gọi là ToggleTelex
:
function! ToggleTelex()
if !exists("g:telex_enabled") || g:telex_enabled == 0
let g:telex_enabled = 1
augroup Telex
autocmd!
autocmd InsertEnter * silent! !inp vi &>/dev/null &
autocmd InsertLeave,CmdLineLeave,VimLeavePre,VimEnter * silent! !inp en &>/dev/null &
augroup END
else
let g:telex_enabled = 0
augroup Telex
autocmd!
augroup END
endif
endfunction
Mình sẽ không giải thích dài dòng vì nhìn thì thấy rối nhưng mà khá là đơn giản nếu bạn hiểu vim script.
Mặc định để bật tính năng này, bạn phải dùng lệnh:
call ToggleTelex()
Để thuận tiện hơn, mình sẽ gán nó vào phím tắt Leaderv. Và để thuận tiện hơn nữa, mình sẽ bật nó khi đang soạn thảo các file có định dạng markdown hoặc asciidoc. Để làm điều này, hãy thêm hai dòng sau vào vimrc của bạn:
nnoremap <leader>v :call ToggleTelex()<CR>
autocmd FileType markdown,asciidoc :call ToggleTelex()
Cách hoạt động
- Khi chỉnh sửa file
.md
hoặc.adoc
:- Vào
Insert Mode
, gõ tiếng Việt sẽ bật - Trở ra
Normal Mode
, gõ tiếng Việt sẽ tắt
- Vào
- Khi chỉnh sửa các file không phải
.md
và.adoc
:- Không có gì thay đổi cho đến khi bạn bấm Leaderv hoặc nhập
:call ToggleTelex()
- Không có gì thay đổi cho đến khi bạn bấm Leaderv hoặc nhập
- Trong mọi trường hợp:
- Bấm Leaderv để bật/tắt tính năng này