y.y
Published on

Offset the Cursor to the End of a Search Match

Authors

提示 83: 将光标偏移到搜索匹配的末尾

你可以使用搜索偏移功能将光标定位在匹配的起始或结束处,距离匹配位置固定的字符数。在这个提示中,我们将研究一个例子,通过将光标定位在匹配的末尾,利用 Dot 公式高效地完成一系列的更改。

每次执行搜索命令时,光标默认会定位在匹配项的第一个字符上。这个默认设置通常是合理的,但有时我们可能更希望将光标定位在匹配项的末尾。Vim 提供了搜索偏移功能使这一操作成为可能(参见 :h search-offset)。

让我们来看一个例子。以下的文本中,作者将“language”这个单词一致地缩写为“lang”:

search/langs.txt
Aim to learn a new programming lang each year.
Which lang did you pick up last year?
Which langs would you like to learn?

你会怎么做才能将所有三处“lang”扩展为完整的单词?一种解决方案是使用替换命令::%s/lang/language/g。但让我们尝试使用 Dot 公式来找寻另一种方法,在此过程中可能会学到新东西。

首先,我们在没有使用搜索偏移的情况下来解决这个问题。我们可以从搜索需要修改的字符串开始:/lang<CR>。这会将光标定位到第一个匹配项的起始位置。接着,我们可以通过输入 eauage<Esc> 来在单词末尾附加“uage”部分。在单词末尾附加字符是非常常见的操作,所以命令 ea 应该如同单个命令一样顺畅。

现在我们只需要将光标移动到正确的位置,接下来的 dot 命令可以完成其余的工作。我们可以通过输入 ne. 来修改下一个“lang”缩写——n 跳转到下一个匹配项的起始位置,e 移动到单词的末尾,然后用 . 命令附加字符以完成单词。这需要三个按键操作。虽然这不是最理想的 Dot 公式,但至少可以完成任务。

但它真的有效吗?如果我们第二次重复相同的命令序列 ne.,我们会破坏最后一个单词。你能看出为什么吗?最后一个“lang”实际上是“languages”(注意它是复数)的缩写。所以,如果我们盲目地重复这个不完美的 Dot 公式,我们将创造出“langsuage”这种怪词。显然,在这种情况下,将光标定位在匹配项的末尾而不是单词的末尾会更理想。

表 14 显示了一种改进的工作流程,使用了搜索偏移。

在这里,我们搜索 /lang/e<CR>,这会将光标定位在匹配项的末尾,正是我们所需要的位置。每次使用 n 命令时,光标会自动跳转到下一个匹配项的末尾,这为使用 dot 命令创造了完美的条件。搜索偏移使我们能够实现理想的 Dot 公式。

在实际操作中,什么时候该使用搜索偏移并不总是显而易见。假设我们一开始没有使用偏移执行搜索命令,但在按 n 几次之后,我们意识到将光标放在匹配项的末尾会更好。这也没问题:只需执行 //e<CR> 即可。当搜索字段留空时,Vim 会重复上一次的搜索模式,但这次带有偏移。


1. Occurrences /əˈkɜːrənsɪz/ (noun)

  • 英文释义: The number of times something happens or appears.
  • 例句: "There were several occurrences of the word 'lang' in the document."
  • 中文释义: 发生,出现,指某个事物或现象发生的次数或实例。
  • 中文例句: “文件中多次出现了‘lang’这个单词。”

2. Substitute /ˈsʌbstɪtuːt/ (verb/noun)

  • 英文释义:
    • (verb) To replace or exchange one thing with another.
    • (noun) A thing or person that takes the place of another.
  • 例句: "You can substitute 'lang' with 'language'."
  • 中文释义:
    • (动词) 替换,代替。
    • (名词) 替代品,代用品。
  • 中文例句: “你可以将‘lang’替换为‘language’。”

3. Alternative /ɔːlˈtɜːrnətɪv/ (noun/adjective)

  • 英文释义:
    • (noun) Another choice or option, especially among multiple possibilities.
    • (adjective) Offering or expressing a different choice.
  • 例句: "Let’s try an alternative approach instead of using the substitute command."
  • 中文释义:
    • (名词) 替代选择,备选方案。
    • (形容词) 替代的,备选的。
  • 中文例句: “我们不使用替换命令,尝试另一种方法。”

4. Tackle /ˈtækl/ (verb)

  • 英文释义: To deal with or address a problem or task, often with determination or effort.
  • 例句: "We’ll tackle this issue step by step."
  • 中文释义: 处理,应对,通常指积极应对某个问题或任务。
  • 中文例句: “我们将一步步解决这个问题。”

5. Maneuver /məˈnuːvər/ (verb/noun)

  • 英文释义:
    • (verb) To move or control something skillfully or carefully, often to achieve a particular goal.
    • (noun) A planned or controlled movement or series of actions.
  • 例句: "We need to maneuver the cursor into the right position."
  • 中文释义:
    • (动词) 操控,熟练地或巧妙地操作。
    • (名词) 操作,精细的动作或策略。
  • 中文例句: “我们需要将光标巧妙地移动到正确位置。”

6. Mangling /ˈmæŋɡlɪŋ/ (verb)

  • 英文释义: To severely damage, distort, or twist something, often making it unusable or unrecognizable.
  • 例句: "Repeating the command might result in mangling the word."
  • 中文释义: 搞砸,扭曲,损坏。通常指使其变得无法辨认或错误的形式。
  • 中文例句: “重复该命令可能会导致单词被破坏。”

7. Abbreviation /əˌbriːviˈeɪʃən/ (noun)

  • 英文释义: A shortened form of a word or phrase.
  • 例句: "'Lang' is an abbreviation of 'language'."
  • 中文释义: 缩写,将一个单词或短语缩短成更简短的形式。
  • 中文例句: “‘lang’是‘language’的缩写。”

8. Blindly /ˈblaɪndli/ (adverb)

  • 英文释义: Acting without thinking or without proper consideration or judgment.
  • 例句: "Blindly repeating the command will cause errors."
  • 中文释义: 盲目地,未经思考或判断地做某事。
  • 中文例句: “盲目地重复命令会导致错误。”

9. Frankenword /ˈfræŋkənwɜːrd/ (noun)

  • 英文释义: A word formed by combining parts of other words in a way that is awkward or incorrect, like a "Frankenstein" creation.
  • 例句: "Langsuage is a frankenword created by incorrect substitutions."
  • 中文释义: 拼凑的“怪词”,通常是指不合适的词语组合,类似“Frankenstein”怪物的创造。
  • 中文例句: “‘langsuage’是通过错误替换产生的怪词。”