vim 认为什么是一个词?

Mar*_*rco 11 vim

可能的重复:
匹配包含 a-zA-Z 以外字符的单词

我不明白vim一个词的定义。来自运动的帮助w ( :h w):

w [count] 字数。|独家| 运动。这些命令在单词或 WORDS 上移动。

   *word*
Run Code Online (Sandbox Code Playgroud)

一个单词由一系列字母、数字和下划线或一系列其他非空白字符组成,以空格(空格、制表符、.)分隔。这可以通过 'iskeyword' 选项改变。

这意味着当我调用w动作时,vim 需要检查哪些字符可以在iskeyword选项的帮助下组成一个单词。因此,让我们检查一下,一个单词可能包含哪些字符:

:set iskeyword?
iskeyword=@,48-57,_,192-255
Run Code Online (Sandbox Code Playgroud)

让我们用iskeyword选项中列出的字符中未包含的字符来测试一下,例如U+015B LATIN SMALL LETTER S WITH ACUTE. 按gaon?告诉我们它有十进制值 347,它大于 255,因此超出 iskeyword. 光标放在ttre?? 我按w

tre?? bar
^ (cursor)
Run Code Online (Sandbox Code Playgroud)

结果:

tre?? bar
      ^ (cursor)
Run Code Online (Sandbox Code Playgroud)

如果一个单词可以由字母、数字、下划线和其他字符组成,那么唯一的可能性就是 vim 将 the?视为字母,因为它显然不是数字或下划线。让我们来看看如何判断一个字符是否是一个字母。来自:h :alpha:

支持以下字符类: [:alpha:] [:alpha:] 字母

一个测试

/[[:alpha]]
Run Code Online (Sandbox Code Playgroud)

显示它?不被认为是一个字母。

为什么光标跳转到bif?既不是字母,也不是数字,也不是下划线并且没有列在中iskeyword

在 VIM 上测试 - Vi IMproved 7.3(2010 年 8 月 15 日,编译于 2012 年 12 月 27 日 21:21:18)包含的补丁:Debian GNU/Linux 上的 1-762,区域设置为 en_GB.UTF-8.

Mar*_*rco 1

正如乌尔里希在他的评论中提到的,原因是多字节字符始终被视为单词的一部分。它们不需要在 中指定iskeyword。引用:h iskeyword指向的帮助:h isfname

始终包含 256 及以上的多字节字符,仅使用此选项指定最多 255 个字符。对于 UTF-8,还包括字符 0xa0 到 0xff。