Vim配置:仅当连字符-后接字母时才将其识别为单词组成部分
Vim 自定义连字符单词识别规则配置
Vim原生iskeyword选项仅按单个字符判定是否属于单词,无法识别-的上下文,因此默认配置下无法区分kebab-case连字符单词和->箭头运算符两种场景。以下两种方案可实现需求:
方案1:语法规则适配(代码场景推荐)
保留-为单词组成字符的配置,额外添加语法规则强制将->识别为独立运算符,断开其与前后标识符的关联即可,配置如下:
" 适配kebab-case命名,将-纳入单词字符范围 set iskeyword+=- " 全局识别->为独立运算符,不受其他语法组规则影响 autocmd FileType * syn match ArrowOperator "->" containedin=ALL
配置生效后:
- 在
this-is-one-word开头执行dw,会一次性删除整个连字符字符串,符合连字符为单词组成部分的需求 - 在
$logger->info的logger位置执行dw,会识别到后续-属于独立的->运算符,不会将其纳入删除范围,最终得到$->info,保留箭头结构
该方案不修改原生按键映射,性能开销极低,适配所有带->运算符的编程语言文件。
方案2:自定义单词移动逻辑(全场景通用)
如果需要在纯文本、Markdown等非代码场景也使用该规则,可以通过正则自定义单词边界判定,覆盖原生的单词移动、操作逻辑:
" 向前移动单词时,在->的-前断开 nnoremap <silent> w :<C-u>call search('\(\k*\%(-\@!\|\%->\)\)\@=', 'W')<CR> onoremap <silent> w :<C-u>call search('\(\k*\%(-\@!\|\%->\)\)\@=', 'W')<CR> " 向后移动单词适配相同规则 nnoremap <silent> b :<C-u>call search('\%(\%(-<\@<=\|\k\)\@<=\k\+\)\@=', 'bW')<CR>
该配置通过正则做上下文判定:仅当-后不紧跟>时,才将-算作单词组成部分,一旦检测到-后为>,则将该-排除在当前单词范围外,全场景下都符合预期。
注意:如果已有其他单词相关的自定义映射,优先选择方案1避免冲突;仅在需要非代码场景适配时使用方案2。
内容的提问来源于stack exchange,提问作者David Oneill
相关产品推荐
相关产品推荐

