Vim:word与WORD的区别

102
我正在学习 Vim,但是无法理解 wordWORD 之间的区别。
从 Vim 手册中可以得到以下信息:
单词由字母、数字和下划线序列或其他非空白字符序列组成,使用空格(空格、制表符)分隔。这可以通过 'iskeyword' 选项更改。空行也被视为单词。
大单词(WORD)由非空白字符序列组成,用空格分隔。空行也被视为大单词。
我认为 wordWORD 只是一样的东西。它们都是由非空白字符序列组成,用空格分隔。空行可被视为 wordWORD
问题:
它们之间有什么区别?
为什么/何时会使用 WORD 而不是 word
我已经在 Google 和 SO 上搜索过了,但它们的搜索引擎将 WORD 解释为 word,所以我搜索的就像是Vim word vs word,当然找不到任何有用的东西。

4
请查看用户手册中的 :h 03.1,其中有详细说明和插图。 - glts
1
@Al.G. 很高兴知道。谢谢! - octref
2
英语中的“or”存在歧义。他们想要表达的是:“一个单词由一系列(字母或数字或下划线)XOR(一系列其他非空白字符)组成,用空格(空格、制表符)分隔。” - user1433150
@user1433150,非常感谢您的帮助。但即使有了这个澄清,仍然有些令人困惑的地方。他们说:“或者是一系列其他非空白字符,用空格(空格、制表符)分隔”,但如果是这样,那么它就意味着任何单词都可以。所以在我看来,他们是在说“它是一个较小的集合XOR所有东西”。这正确吗? - Charlie Parker
1
对我来说最有用的是:h 03.1中的一行。它说:“单词以非单词字符结尾,例如“。”、“-”或“)”。”但这不是完整的列表。实际上,任何不在set iskeyword?返回的列表中的内容都将分隔单词(此命令返回ASCII值范围,iskeyword=@,48-57,_,192-255;@表示所有字符)。这些“。”、“-”、“)”等会分隔单词,因为它们不包含在指定的ASCII值范围内。下划线“_”不会分隔单词,因为它在指定的值范围内。 - Quazi Irfan
6个回答

134
  • 一个 WORD 总是由 空格 分隔。
  • 一个单词由 非关键字 字符分隔,这些字符是可配置的。空格字符不是关键字,通常其他字符(如()[],-)也不是。因此,一个单词通常比一个 WORD 小;单词导航更加精细。

示例

This "stuff" is not-so difficult!
wwww  wwwww  ww www ww wwwwwwwww    " (key)words, delimiters are non-keywords: "-! and whitespace
WWWW WWWWWWW WW WWWWWW WWWWWWWWWW   " WORDS, delimiters are whitespace only

5
注意,你可以使用命令":set iskeyword"来更改 'W' 键的功能。有关更多信息,请参阅命令":help 'iskeyword'"。 - Jessie
上面的例子是错误的。双引号也是单词(或根据“iskeyword”选项的一部分)。因此,它也应该标记为“w”。破折号也是如此。 - Flashrunner
@Flashrunner 这取决于'iskeyword'选项,就像Jared Ross所提到的那样。默认情况下,它按照我写的方式工作。 - Ingo Karkat
:set iskeyword=a-z,A-Z,",- |这个|"东西"|并不|太难|!:set iskeyword=a-z,A-Z |这个|"东西"|不|太|难|。| - 是单词停止的位置。 正如你所看到的,它总是一个单词。 - Flashrunner
Jared Ross的评论也是错误的。iskeyword更改的是'w'的行为,而不是'W'。 - Flashrunner
显示剩余4条评论

50

为了补充之前的答案...我这样想象它:WORD比单词更大,它包含更多... 输入图像描述


13
哇,一张图片胜过千言万语!(或者是千言万语...) - byxor

24
如果我的光标在以下行的“app”上,我执行“viw”(“选择内部单词”),它会选择“app”:

app/views/layouts/admin.blade.php

如果我的光标在同一位置,我执行viWWORD),它会选择整个字符序列。一个WORD包括像星号、斜杠、括号、方括号等words(类似英语单词)不包括的字符。

上面的解释最后一段不太清楚。缺少一些关键词,这些关键词会使差异更加明显。 - Praym

18
根据 Vim 文档(:h 03.1):
  • 一个单词以非单词字符结尾,例如“.”、“-”或“)”。

  • 一个 WORD 严格以空格结尾。这可能不是常规意义上的单词,因此使用大写。

例如:

           ge      b          w                             e
           <-     <-         --->                          --->
    This is-a line, with special/separated/words (and some more). ~
       <----- <-----         -------------------->         ----->
         gE      B                   W                       E

如果您的光标在m(或更高位置)

  • 一个单词意味着“more”(即由非单词字符“)”分隔)

  • 而一个WORD意味着'more).'(即仅由空格分隔)

同样地,如果您的光标在p(或特殊)

  • 一个单词意味着“special”
  • 而一个WORD则意味着'special/separated/words'

1

这是一个涉及「单词」定义以及语法理解的问题。

我最初在中文版本的定义中遇到了困难(可能是翻译错误导致的)。


这个定义是正确的,但应该这样阅读:

A word consists of:
   [(a sequence of letters,digits and underscores),
or (a sequence of other non-blank characters)], 
separated with white space (spaces, tabs, <EOL>).

空格字符只在限定相同类型的“单词”时才需要。

以下是更多的示例:

(示例^&$%^示例) 三个 "单词" :(示例), (^&$%^) 和 (示例)

(^&^&^^ &&^&^) 两个 "单词" : (^&^&^^) 和 (&&^&^)

(我们在stackoverflow) 五个 "单词" :(我们), ('), (re), (在) 和 (stackoverflow)


0

另一种说法是,如果你在编程时想要在停止符号和类似“() . [] , :”的东西之间移动,请使用w。

如果您想要跳过这些内容,直接跳到像小说或短篇故事中的单词,可以使用W。

对于编码来说,小写字母w可能是最常用的。这取决于您在代码中的位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接