# 百发百中：掌握搜索命令

  有一天，你终于厌倦了 `h` `j` `k` `l` 在字里行间移动，厌倦了 `w` `b` `e` 在 ~~屎山~~ 代码中半天跳不到头；你在想，有没有一种方法，可以像东风-41导弹一样指哪打哪，快速去到 ~~同事们写的垃圾~~ 代码中；
  
  恭喜你，你找到了！

  今天，我们就来学习搜索命令，打破你的困境。

## 行内搜索

  通常我们在一行代码中时，有可能需要这里编辑一下那里编辑一下，虽然之前讲过的移动光标的命令也基本够用了，但可能在某些情况下，代码比较长之类的，可能用行内搜索命令是不错的方式。

  - `f` + 字符：自左往右移动光标到下一个匹配的字符中
  - `F` + 字符：自右往左移动光标到下一个匹配的字符中
  - `t` + 字符：自左往右移动光标到下一个匹配的字符的前一个字符中
  - `T` + 字符：自右往左移动光标到下一个匹配的字符的后一个字符中
  - `;`：重复执行上一个搜索命令
  - `,`： 与上一个命令方向相反地执行上一个搜索命令
  
  :::tip 使用技巧
  普通移动光标的时候使用 `f` `F`，配合 `c` `d` `v` 这些操作时使用 `t` `T`，如：
  
  this is a simple easy vim tutorial.

  如果我们光标在句首，需要跳到 easy 这个单词的字母 e，则直接 `fe;`即可（因为 `fe` 会跳到 simple 的 e，所以需要用 `;` 再执行一遍 `fe`）;

  而假如我们需要删除 easy 单词前的内容，则可以使用 `d2te` ，则句子就变成：

  easy vim tutorial.

  这里的 `2te` 是指使用 `te` 这个指令时的第二个结果，因为上面那句话有两个字母 e，我们要匹配第二个，所以在这个指令前加上数字 2，指令 `f` 也同理。
  :::

## 全局搜索

  在日常开发中，我们用得最多的搜索其实是全局搜索，尤其是在查看一些变量、函数调用情况的时候，而 vim 也提供了方便的全局搜索：

  - 从光标位置向下查找：`/` + 字符 + enter
  - 从光标位置向上查找：`?` + 字符 + enter
  - 查看搜索历史：`/` + 上下方向键

  :::tip 使用技巧
  使用 `/` `?` 查找时不需要输入要搜索的完整文本，就输入前面几个字符就可以了；而且这两个搜索命令是大写不敏感的，比如输入 `/ula，都可以匹配到 `ULA` 和 `ula`；这种特性下，如果我们搜索一个变量，如 `text`，会匹配到 `Text` `TEXT` 等单词，所以这两个命令是模糊搜索。
  :::

  在大多数情况下，其实我们更需要的是精确搜索，这时我们可以把光标移到我们需要搜索的单词上，然后按下以下命令：

  - 向上查找：`#`
  - 向下查找：`*`

  这样就可以愉快地搜索了；我们还可以使用：

  - `n`：跳到下一个结果
  - `N`：跳到上一个结果

  然后就可以快速查看搜索的结果了，完全不输 vscode 自带的搜索。
