Context 自动切换
根据光标所在的高亮(语法作用域)自动切换【Rime 接管】与【原生直通】模式。
INFO
- 仅在光标跨越高亮区域边界时才会触发切换判断
- 进入插入模式时强制校准一次;离开插入模式后状态复位;组词过程中不会切换
- 插入模式下用
;;重启输入法时,同样会强制校准一次
配置
vim
" 上下文自动切换总开关(默认关闭)
let g:im_context_enabled = 1
" '*' 为全局默认规则,具体 filetype 的配置优先级更高
let g:im_context_config = {
\ '*': {'mode': 'blacklist'},
\ 'vim': {'mode': 'whitelist', 'ts': ['comment', 'string'], 'syntax': ['comment', 'string']},
\ 'markdown': {'mode': 'blacklist', 'syntax': ['math', 'code']},
\ }mode为whitelist时,仅在列出的高亮区域内接管为 Rime,其余区域保持直通;为blacklist时反之。ts对应 treesitter highlight capture 名称(大小写不敏感子串匹配,如comment可命中@comment,markup.raw可命中@markup.raw.block)syntax对应 vim syntax 高亮组名称。ts与syntax之间为「或」的关系,命中任一即生效;两者同时配置时ts优先级更高。
事件
状态变化时会触发以下 autocmd,可用于联动第三方插件(如补全、AI 续写等):
| 事件 | 触发时机 |
|---|---|
RimeContextChinese | 进入【Rime 接管】模式时触发,常用于关闭第三方补全 |
RimeContextEnglish | 回到【原生直通】模式时触发,常用于恢复第三方补全 |
RimeContextChanged | 接管状态发生变化时触发(不区分方向) |
vim
function! im#hooks#suppress_completion() abort
if exists('*coc#config')
call coc#config('suggest.autoTrigger', 'none')
endif
if exists(':Codeium')
Codeium Disable
endif
if exists('g:blink_cmp_enabled')
let g:blink_cmp_enabled = v:false
endif
endfunction
function! im#hooks#restore_completion() abort
if exists('*coc#config')
call coc#config('suggest.autoTrigger', 'always')
endif
if exists(':Codeium')
Codeium Enable
endif
if exists('g:blink_cmp_enabled')
let g:blink_cmp_enabled = v:true
endif
endfunction
augroup IMGroup
autocmd!
autocmd User RimeContextChinese call im#hooks#suppress_completion()
autocmd User RimeContextEnglish call im#hooks#restore_completion()
augroup END快捷键
手动切换【Rime 接管】与【原生直通】模式:
vim
inoremap <silent> ;u <cmd>call im#context#set('chinese')<cr>
inoremap <silent> ;n <cmd>call im#context#set('english')<cr>
inoremap <silent> <c-;> <cmd>im#context#toggle()<cr>开关整个自动切换功能:
vim
nnoremap <silent> ;c <cmd>call im#context#auto_toggle()<cr>
inoremap <silent> ;c <cmd>call im#context#auto_toggle()<cr>