当初次使用vi编辑器时(无论是第一次还是作为普通用户),大多数人倾向于掌握核心命令集,使他们能够执行最经常使用的功能:导航或保存文件; 插入,更新,删除或搜索数据; 或退出而不保存更改。

但是,vi编辑器非常强大,并且具有丰富的功能。 即使使用了很多年,您仍然可以发现您从未意识到的新命令。 本文介绍的命令是鲜为人知的命令,但是它们可以通过简化您可能使用的现有方法或允许您执行您从未意识到可以用vi做的事情来帮助您更智能地工作。

在我们开始之前,仅回顾一下vi的两种模式:命令和插入。 命令模式允许用户执行命令来修改文本,浏览文件或以某种方式控制vi会话。 插入模式会将您键入的任何内容放入vi会话中的当前文件。 启动vi时,将以命令模式启动。 进入插入模式后,您可以通过按Escape键切换回命令模式。 在命令模式下按Escape键将使您进入命令模式。 本文中介绍的所有命令都应从命令模式下执行。

打开和关闭行号

vi编辑器具有许多选项,这些选项确定编辑会话的外观。 要在vi中更改任何会话设置,请使用:set命令。 要显示选项和设置的列表,请使用:set all命令。

您可以设置的选项之一是number ,它可以打开和关闭行编号(请参见清单1 )。

清单1.在打开行号之前
#
# Internet host table
#
::1     localhost
127.0.0.1       localhost       loghost
192.168.0.6     centos5
192.168.0.10    appserv
192.168.0.11    webserv
192.168.0.12    test
192.168.0.5     solaris10       # Added by DHCP
~
~
~
:set number

该命令指示vi在您当前正在编辑的文件中的每个记录上显示行号。 将vi置于命令模式后,可以输入:set number并按Enter打开行号(请参见清单2 )。

清单2.行号已打开
1  #2  # Internet host table3  #4  ::1     localhost5  127.0.0.1       localhost       loghost6  192.168.0.6     centos57  192.168.0.10    appserv8  192.168.0.11    webserv9  192.168.0.12    test10  192.168.0.5     solaris10       # Added by DHCP
~
~
~
:set number

您可以使用:set nonumber命令关闭行号。 您也可以使用此命令和:set number命令的简写形式,即:set nu:set nonu

当需要快速计算要使用vi函数处理的行数时,显示行号特别有用。 当行数很长并且可能跨越多个屏幕时,或者您知道要处理的行数范围,但是需要找到将在适当的vi命令中使用的开始和结束行号时,尤其如此。

如果要在每次进入vi会话时显示行号,请将行set number添加到主目录中的.exrc文件中。

自动缩进

使用某些编程语言编写代码时,缩进是样式的重要组成部分,可确保代码更具可读性。 您可以将vi编辑器设置为在必要时自动缩进以遵循特定于语言的样式。 您可以使用autoindent打开或关闭自动缩进(请参见清单3 )。

清单3.启用自动缩进
#!/bin/ksh
#
#
for file in /etc/*
doif [[ -f ${file}  ]] ; thenecho "${file} is a file"~
~
~
~
~
:set autoindent

从这一点开始,如果您在一行中使用前导空格或制表符,则随后的新行将缩进到同一位置。 在命令模式下,在vi下,键入:set autoindent ,然后按Enter打开自动缩进。 通过设置shiftwidth设置缩进级别。 例如,要将每个缩进设置为四个空格,请使用:set shiftwidth=4 (请参见清单4 )。

清单4.设置缩进级别
#!/bin/ksh
#
#
for file in /etc/*
doif [[ -f ${file}  ]] ; thenecho "${file} is a file"elif [[ -d ${file} ]] ; thenecho "${file} is a directory"fi
done
~
~
:set shiftwidth=4

在命令模式下,您可以使用>>命令将缩进级别添加到现有行中,或使用<<命令来删除级别。 在这些命令前添加一个整数,以在多行之间添加或删除缩进级别。 例如,将光标放在清单4中第6行的开头,并进入命令模式后,键入5>>将缩进级别添加到接下来的5行中。 清单5显示了结果。

清单5.缩进一行
#!/bin/ksh
#
#
for file in /etc/*
doif [[ -f ${file}  ]] ; thenecho "${file} is a file"elif [[ -d ${file} ]] ; thenecho "${file} is a directory"fi
done
~
~

您可以使用:set noautoindent命令关闭自动缩进。 也可以使用它的简写版本和autoindent命令,即:set ai:set noai 。 您也可以使用:set ai sw=4在一个命令中打开缩进并设置缩进级别。

如果要启用自动缩进,并且每次启动vi会话时都将缩进级别设置为四个空格,请将行set ai sw=4到主目录中的.exrc文件中。

忽略大小写

如您所料,UNIX®中搜索的模式匹配区分大小写。 但是,如果您希望vi忽略大小写,则可以使用:set ignorecase命令。 使用:set noignorecase重新打开区分大小写。 您也可以使用简写版本( :set ic:set noic )。

如果您想在每次进入vi会话时都忽略对搜索的区分大小写,则可以将行set ignorecase添加到主目录中的.exrc文件中。

复合搜索

您可以使用/命令在vi中搜索字符串,并指定模式以文字字符串或正则表达式进行匹配。 例如,要在文件中搜索单词echo ,请进入命令模式,键入/echo ,然后按Enter。 该命令将在清单6所示的文件中的第3行找到第一个单词。

清单6.复合搜索
1  #!/bin/ksh2  #3  echo "Starting"4  file=${1}56  echo ${file}78  if [[ ${file} = 1 ]] ; then9          ((file=${file}+1))10          echo "Adding one gives " \11                  ${file}12  fi13  echo "Ending"14  exit
~
~

您可以使用简单的正则表达式来指定要查找包含一个单词后接另一个单词的行。 例如,要查找包含字符串echo的第一行,然后是零个或多个字符,然后是字符串file ,则可以使用/echo.*file 。 在清单6所示的文件中,此命令将在第6行找到第一个单词。

但是,此命令将仅在两个字符串都位于同一行的情况下找到匹配项。 如果要搜索模式或字符串的第一个匹配项,而不管模式或字符串是否在同一行上,那么可以通过指定两个搜索命令并用分号( ;来进行复合搜索; )。 例如,要搜索在字符串{file}+1出现的字符串echo的第一个匹配项,可以使用/{file}+1/;/echo/ 。 在清单6所示的文件中,此命令将在第10行找到第一个单词。

当您在代码中搜索是否存在紧跟另一个命令的命令时,复合搜索特别有用,例如,在设置了特定变量之后调用函数的情况。

重放搜索模式

在文件中寻找要替换的模式时,可以指示vi将与之匹配的任何模式保存到缓冲区中,然后可以使用缓冲区参考号以替代方式重新播放。 您可以通过将模式包含在\(\)中来完成此操作,该模式指示vi将模式保存到带编号的缓冲区(1到9)中。 然后,您可以使用缓冲区引用\1\9替代引用这些缓冲区。

例如,要在清单7中的文件中搜索以单词Martin开头的行,并为每次出现添加前缀Mr和后缀Wicks的情况出现,请进入命令模式,输入vi命令:%s/^\(Martin\)/Mr \1 Wicks/g ,然后按Enter。

清单7.重放搜索模式(之前)
Martin is an IT consultant. Martin likes
snowboarding and mountain biking. Martin has
worked on UNIX systems for over 15 years. Martin also
worked for many years before that on mainframes.
Martin lives in London.
~
~
~
~
:%s/^\(Martin\)/Mr \1 Wicks/g

以下是该命令的各个组成部分:

  • :%s指示vi执行替换。
  • / -模式分离器。
  • ^\(Martin\) -查找以字符串Martin开头的行,并将该字符串保存在缓冲区1中。
  • / -模式分离器。
  • Mr \1 Wicks用字符串Mr替换字符串,然后用缓冲区1的内容替换字符串Wicks
  • / -模式分离器。
  • g全局更改(即,更改匹配的每一行中的每个匹配项)。

您可以在搜索和替换字符串中使用缓冲区引用。

产生的更改如清单8所示。

清单8.重放搜索模式(之后)
Mr Martin Wicks is an IT consultant. Martin likes
snowboarding and mountain biking. Martin has
worked on UNIX systems for over 15 years. Martin also
worked for many years before that on mainframes.
Mr Martin Wicks lives in London.
~
~
~
~
:%s/^\(Martin\)/Mr \1 Wicks/g

书签

您可以通过按M键和另一个表示书签引用的字母字符来告诉vi将书签放置在文件中的某个点。 因此,您最多有26个名为a到z的书签。 要返回上一个书签,请按后退标记( ` ),然后按书签参考字母字符。

例如,按MA键后,您将当前光标位置保存到名为a的书签中。 每当您想在编辑会话中稍后返回到该光标位置时,只需按`A键。 要在当前书签和上一个书签之间切换,可以使用双回勾( `` )命令序列。

查找,更新,查找下一个,重复

vi编辑器最有用的“搜索/替换”功能之一是能够找到与模式匹配的字符串,对其进行更新,然后针对下一次出现重复相同的搜索,并有选择地针对该字符串重复更新,就像“查找下一个” /替换在Microsoft®Word中找到的功能。

您可能已经知道,可以通过输入命令模式,键入/ search_pattern (其中search_pattern是字符串或正则表达式),然后按Enter来在vi中搜索字符串模式。 这样做可以使您首次出现与指定模式匹配的字符串。 在这里,您可以对所定位的文本执行所需的任何操作。 例如,在按C和W键后再输入更多文本,会将找到的字符串更改为另一个单词。

要快速找到下一个匹配模式,请按N键。 找到下一个匹配项时,可以选择使用句点键( . )在此位置重复上一次文本操作,例如上一个示例中使用的更改字( cw )函数。 然后,您可以继续查找其他匹配项( n ),并可以选择使用这些键重复执行文本操作( . ),其方式与在Word中使用“查找下一个”和“替换”功能非常相似。

开关盒

您可以使用波浪号( ~ )在光标下方切换字母字符的大小写。 这样做会从小写变为大写,反之亦然。 按住键将滚动显示该行中的每个字符,翻转编辑器遇到的任何字母字符的大小写。 您可以在波浪号之前输入数字字符,以表示要更改多少个字母字符。

筛选

您可能知道,您可以通过输入:! command在vi中的Shell中执行命令:! command :! command ,其中command是要执行的UNIX命令(例如, :!pwd以显示您的编辑会话所在的当前工作目录),然后按Enter。

但是,您也可以将文件的一部分作为标准输入发送到您选择的UNIX命令,并使编辑缓冲区中的同一部分被结果输出替换。 例如,如果要对清单9中显示的整个文件进行排序,而又保留在vi会话中,则可以输入:1,$!sort指示vi将第1行通过文件末尾( $ )传递到sort命令,将指定的部分替换为输出,然后按Enter。

清单9.在vi会话中对文件排序(排序之前)
5
4
3
2
7
6
5
4
8
9
6
3
1
3
4
~
~
:1,$!sort

清单10显示了sort操作的结果输出。

清单10.在vi会话中对文件排序(排序后)
1
2
3
3
3
4
4
4
5
5
6
6
7
8
9
~
~
:1,$!sort

另外,您可以在shell命令前加上希望其从当前光标开始执行的行数。 为此,键入一个数字字符,指定行数,后跟双感叹号( !! )和UNIX命令。

例如,将光标放在清单9中第4行的开头,您将输入:

4!!awk '{print "New text",$0}'

然后按Enter键在第4至7行(包括第6行)之前加上文本New text ,如清单11所示。

清单11.用新文本在一行行之前加上前缀
5
4
3
New text 2
New text 7
New text 6
New text 5
4
8
9
6
3
1
3
4
~
~
!awk '{print "New text",$0}'

您可以使用管道分隔符( | )将UNIX命令串在一起,以在vi会话中创建复杂而强大的过滤。 例如,要将当前vi会话的编辑缓冲区中的文件内容替换为每行的第一个以空格分隔的字段,并按升序排序并转换为大写,请输入以下行:

:1,$!awk '{print $1}' | sort | tr [:lower:] [:upper:]

节保存

您可以输入: start , end w file来保存当前正在编辑的文件的各个部分: start , end w file ,其中start是您要保存的当前文件的第一行, end是您要保存的最后一行, w表示您要写入另一个文件(或覆盖现有文件),并且file是要将指定节保存到的文件的名称。 您可以在最后一行使用$表示法指定到文件的末尾,并在w后面加双倍的大于号( >> )表示您要追加而不是覆盖文件。 清单12中的示例显示第6至9行(包括第6行和第9行)被附加到一个名为/ tmp / newfile的文件中。

清单12.将文件的一部分保存到另一部分,追加而不是覆盖它
1  #2  # Internet host table3  #4  ::1     localhost5  127.0.0.1       localhost       loghost6  192.168.0.6     centos57  192.168.0.10    appserv8  192.168.0.11    webserv9  192.168.0.12    test10  192.168.0.5     solaris10       # Added by DHCP
~
~
~
:6,9w >> /tmp/newfile

结论

vi编辑器是一个非常强大的工具,本文为您提供了许多技巧,它们有望使文件编辑更加有效。 请记住,vi总是有更多吸引眼球的东西。 编辑愉快!


翻译自: https://www.ibm.com/developerworks/aix/library/au-vitips.html

vi: 未找到命令_vi技巧和窍门:十个很棒的命令一定会给您的朋友留下深刻的印象...相关推荐

  1. win7 命令行工具_7个很棒的命令行工具

    win7 命令行工具 The terminal/command line is a sacred tool that developers have under their belt. It is p ...

  2. 打开word文档提示文件未找到_word文档打开,提示“向程序发送命令时出现问题”的原因...

    故障现象 Definition 无论是我们的工作生活还是日常生活,在编辑一些文字的时候,还是习惯性的敲击在word里,这样不仅盛世方便,同时还能够快速的调整格式,如果需要打印的话也更是方便无比了.但是 ...

  3. linux nvcc未找到命令,打印本页 - nvcc命令无法识别

    标题: nvcc命令无法识别 作者: 修雨轩陈 于 四月 21, 2016, 05:43:24 pm 求各位兄弟帮忙..... =============运行make文件之后============= ...

  4. 实用的Linux命令行技巧

    实用的Linux命令行技巧 1. 输出内容格式化 例如mount命令的输出结果看起来很费劲 请点击此处输入图片描述 可以使用column对其进行格式化 mount | column -t 请点击此处输 ...

  5. 微信小程序bug小全 : [“usingComponents“][“XXX“]: “../../components/XXX/XXX“ 未找到

    bug 描述: pages/XXX/XXX.json: ["usingComponents"]["XXX"]: "-/-/components/XXX ...

  6. virtualenv: 未找到命令

    centos安装virtualven后, pip list可以看到,但使用命令virtualven时会提示"bash:virtualven:未找到命令..." 解决办法: vi / ...

  7. linux shell 未找到命令,未找到linux问题setenv命令(linux issue setenv command not found)

    未找到linux问题setenv命令(linux issue setenv command not found) 我在Linux中开发了一个Tcl / Tk脚本工具. 为了运行该工具,每次需要在she ...

  8. workon 未找到命令

    1.0 已经安装虚拟环境所需要的包 sudo pip install virtualenv sudo pip install virtualenvwrapper 2.0 创建虚拟环境 mkvirtua ...

  9. Kubectl 好用的命令行工具:oh-my-zsh 技巧和窍门

    Zsh 技巧和窍门 在 unix/linux 操作系统环境中,我们会经常讨论 shell.终端和命令行接口.Bash 可能是最有名的 shell,但在 Mac 电脑中,Zsh 可能是最为流行的 she ...

  10. Linux CentOS 7安装之后,ip addr命令无法显示ip地址。ifconfig命令报错:未找到命令!

    文章目录 一.Linux CentOS 7安装之后,ip addr命令无法显示ip地址.ifconfig命令报错:未找到命令! 二.解决"ip addr命令无法显示ip地址"方法 ...

最新文章

  1. ABS是啥,为什么区块链可以与它完美结合?
  2. android中websockt断开链接,接吻SDK - 的WebSocket在断开的Android
  3. 申请MVP成功,发贴祝贺!
  4. nfc pm3 模拟加密门禁卡_华为手机NFC的妙用,模拟门禁卡、公交卡、银行卡,电子证件等...
  5. Jmeter之Bean shell使用(二)
  6. 【转】接口 与 抽象类
  7. 2021年最新UI/UE设计学习路线图
  8. [摘抄] 匈牙利命名法
  9. 李开复写给大学生的第四封信的一些笔录
  10. java 打包 根目录_java打包
  11. python类属性用法总结
  12. SpringMvc date数据传递处理
  13. 【存储】什么是纠删码(与纠错码的区别)|纠删码与副本对比|LDPC码
  14. 计算机端口错误678,Win8宽带连接出现错误678的解决方法
  15. 常见算法工程师面试题总结(机器学习,深度学习)
  16. 利用uniapp实现手机摇一摇H5项目
  17. 场景图生成论文阅读笔记 之 LinkNet: Relational Embedding for Scene Graph
  18. 超声波传感器(CHx01) 学习笔记 Ⅵ - 原始数据
  19. iOS 打开天猫/淘宝/京东客户端并且进入商品详情页/店铺主页的方法
  20. 微信ChatEmoji表情适配,对微信公众号开发有帮助

热门文章

  1. AD15使用出现的小问题
  2. STM8L低功耗停止看门狗
  3. 林子雨《大数据技术原理与应用》第五讲——NoSQL数据库
  4. 一款快速开单 订单发货收货的在线订货管理软件
  5. crt连接中兴服务器,利用SecureCRT实现中兴C220自动登录
  6. vscode下使用gcc进行Npcap网络编程开发的环境配置
  7. 使用matlab时括号附近出现红色波浪线“使用的MATLAB语法可能无效”提示
  8. 软考常考知识点整理-项目风险管理计划
  9. Mysql环境变量配置
  10. python 将图像变为矢量图(可字符和序列化)