嗨,读者们! 今天我们将再次研究 vim,特别是我们如何在 vim 中轻松进行搜索和替换。 在本文中,我们将介绍搜索和替换并实现无鼠标 vim 目标的前 5 种方法。 记得取消映射箭头键!
Vim 教程 – 开始使用 VIM 所需的一切
目录
/ 和? 命令
在 vim 中搜索最简单直接的方法是通过 / 和 ? 命令。 如果你在 vim 中:
- 一个接一个地按 Esc 和 /
- 然后输入你要搜索的词
- 打 Enter 键将带您到光标后出现的搜索词。
- 要在出现之间移动,您可以按 n 键,要向后移动,请按 N 键。
您甚至可以通过输入两个单词来搜索并排的两个单词,这将仅显示单词并排出现的那些事件。
如果要关闭突出显示,请在正常模式下使用以下命令:
:noh
这 ? 命令与 / 命令非常相似,但它向后搜索整个文件。 在这种情况下,n 个键向后搜索,N 个键向前搜索。
另请检查: 10 种方法 Exit Vim 编辑器
* 和 # 命令
如果要搜索光标下的单词,只需在正常模式下按 * 键即可。 光标将放置在光标下最近出现的单词处。 您现在可以再次按 * 键搜索下一个匹配项,也可以使用 n 和 N 键向前或向后循环搜索结果。
# 与 * 相同,但它向后搜索。
您可以通过发出命令搜索忽略大小写:
:set ic
在上述两种情况下,您都可以简单地定位单词并在正常模式下点击 ciw(更改单词内部)来删除单词并进入插入模式。 但是当我们要替换很多匹配项时,这种方法比较麻烦,让我们进一步看看。
Emacs 与 Vim:Linux 顶级终端编辑器之间的差异
s 命令(替代)
在 vim 中,s 命令代表替换。 要替换单词,请在正常模式下执行以下命令:
:s/search_word/substitute_word
该命令将仅用当前行中的给定替换替换第一次出现的搜索词。 为了替换每一行中的第一次出现,我们添加一个表示当前文件的 % 符号,因此命令变为:
:%s/search_wprd/substitue_word
但是我们还没有完成,因为如果你仔细观察,上面的命令只替换了行中的第一个匹配项,我们需要的是完全替换,为此我们添加了代表全局的标志 g:
:%s/search_word/substitue_word/g
类似地,如果我们只想替换当前行中的所有匹配项,那么我们将执行带有 g 标志但开头没有 % 符号的命令:
:s/search_word/substitue_word/g
s 命令的高级使用
如果您只想替换第 4 到第 7 行中的单词 say 怎么办? 好吧,我们可以非常简单地将命令开头的 % 符号替换为指定 s 命令的范围,那么命令是:
:4,7s/search_word/substitue_word
如果我们想搜索搜索词的大小写敏感,我们可以在 i 中添加不区分大小写和 I 标志用于区分大小写的替换。 正在执行的命令是:
:4,7s/search_word/substitue_word/i :4,7s/search_word/substitue_word/I
如果您只是想确认每个更改,那么我们可以为此添加 c 标志,因此如果您不确定替换的范围和位置,只需在整个文件上运行带有 c 标志的替换命令并在必要时确认:
:%s/search_word/substitute_word/gIc
现在,在确认消息中,每次替换都有几个选项。 具体来说,您有以下七个选项:
- y –> 是的,执行替换
- n –> 不,不执行替换
- a –> 更改此之后的所有事件
- q –> 退出而不做任何更改
- l –> 将此作为最后一个替换然后退出
- ctrl+Shift+e –> 向下移动屏幕(查找出现)
- ctrl+Shift+y –> 向上移动屏幕
现在,这一切都很好,但您可能已经注意到,搜索词不仅匹配完整的词,而且还匹配一些它只是另一个词的一部分的情况。 为了解决这个问题,我们必须将搜索词包含在 < 和 > 中,我们还必须记住在这样做时转义这些字符! 所以现在的命令是:
:s/<search_word>/substitute_word
g 命令
g 命令代表全局命令。 该命令的语法如下:
:g/pattern/command
它的作用是为整个文档中与给定模式匹配的行运行给定的命令。 假设我们正在处理以下文件:
-- Base import XMonad import System.Directory import System.IO (hClose, hPutStr, hPutStrLn) import System.Exit (exitSuccess) import qualified XMonad.StackSet as W
现在出于某种原因,我们希望删除所有导入,我们可以使用 g 命令执行此操作:
:g/import/d
它的作用是在所有包含 import 的行上执行 d(删除)命令。 同样,我们也可以做相反的事情,这意味着我们可以删除所有没有单词 import 的行:
:g!/import/d OR :v/import/d
我们可以用 g 命令做一些非常高级的事情。 假设我们要删除文档中的所有空行,为此我们运行以下命令:
:g/^s*$/d
这里 s* 表示零个或多个空白字符,$ 表示行尾,所以本质上 s*$ 表示空行。
结论
好了,现在您已经掌握了 vim 必须提供的一些最佳搜索和替换命令。 如果对更多这样很棒的 vim 文章感兴趣,请随时在这里搜索!