首页 > 语言 > 关键词  > Linux最新资讯  > 正文

10个你必须掌握的超酷VI命令技巧

2013-12-05 09:43 · 稿源: 酷勤网

大部分Linux开发者对vi命令相当熟悉,可是遗憾的是,大部分开发者都只能掌握一些最常用的Linux vi命令,下面介绍的10个vi命令虽然很多不为人知,但是在实际应用中又能让你大大提高效率。

在使用vi 编辑器时—无论是初次使用的用户,还是有经验的用户—大多数人往往只掌握核心命令集,这些命令可以执行最常用的功能:导航或保存文件;插入、更新、删除或搜索数据;退出但不保存修改。

但是,vi 编辑器极其强大,特性和功能非常丰富。即使在多年使用vi 之后,您仍然可能会发现有不知道的新命令。本文讨论的命令就属于不太为人所知的命令,但是它们可以简化您目前采用的操作方法,让您的工作方式更高效,或者让您能够完成原来不知道可以用vi 完成的操作。

打开和关闭行号

vi 编辑器的许多选项可以控制编辑会话的外观和感觉。使用 :set 命令修改vi 中的会话设置。按 Escape 键进入命令模式之后,可以使用 :set all 命令显示选项和设置的列表。可以设置的选项之一是 number,它的作用是打开和关闭行号

#

# 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 并按回车来打开行号

#

# 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 nonumber 命令关闭行号。还可以使用这个命令和 :set number 命令的简写,即 :set nu 和 :set nonu。如果需要快速计算要用vi 函数处理的行数,显示行号会非常有帮助。当行数很多,可能跨多个屏幕时,行号尤其有用。另外,有时候您知道要处理的行范围,但是需要查明要在vi 命令中使用的初始和结束行号。如果希望每次进入vi 会话时都显示行号,那么在主目录中的.exrc 文件中添加 set number 行。

自动缩进

在用某些编程语言编写代码时,缩进是样式的重要部分,可以确保代码的可读性更好。如果需要,可以在vi 编辑器中根据编程语言的样式设置自动缩进。使用 autoindent 打开或关闭自动缩进.

#!/bin/ksh

#

#

for file in /etc/*

do

if [[ -f ${file} ]] ; then

echo “${file} is a file”

~

~

~

~

~

:set autoindent

在此之后,如果在一行的开头输入空格或制表符,那么后续的新行将会缩进到相同的位置。在命令模式下,输入 :set autoindent,然后按回车打开自动缩进。通过设置 shiftwidth 确定缩进级别。例如,:set shiftwidth=4 把每级缩进设置为四个空格。

#!/bin/ksh

#

#

for file in /etc/*

do

if [[ -f ${file} ]] ; then

echo “${file} is a file”

elif [[ -d ${file} ]] ; then

echo “${file} is a directory”

fi

done

~

~

:set shiftwidth=4

在命令模式下,可以使用>> 命令让现有的一行增加一级缩进,使用<< 命令减少一级缩进。在这些命令前面加上一个整数,即可让多行增加或减少一级缩进。例如,把游标放在清单 4 中第 6 行的开头,进入命令模式之后,输入 5>> 就会让下面五行增加一级缩进。

#!/bin/ksh

#

#

for file in /etc/*

do

if [[ -f ${file} ]] ; then

echo “${file} is a file”

elif [[ -d ${file} ]] ; then

echo “${file} is a directory”

fi

done

~

~

可以使用 :set noautoindent 命令关闭自动缩进。还可以使用这个命令和 autoindent 命令的简写,即 :set ai 和 :set noai。还可以使用 :set ai sw=4 在一个命令中打开缩进并设置缩进级别。如果希望每次启动vi 会话时都启用自动缩进并把缩进级别设置为四个空格,那么在主目录中的.exrc 文件中添加 set ai sw=4 行。

在搜索时不区分大小写

如您所知,在 UNIX®中执行搜索时,模式匹配是区分大小写的。但是,如果希望vi 不区分大小写,那么可以使用 :set ignorecase 命令。使用 :set noignorecase 恢复区分大小写。还可以使用简写(:set ic 和 :set noic)。如果希望每次进入vi 会话时都启用不区分大小写的搜索,那么在主目录中的.exrc 文件中添加 set ignorecase 行。

复合搜索

在vi 中,可以使用/命令搜索字符串,这需要以字面字符串或正则表达式的形式指定要匹配的模式。例如,要想在文件中搜索单词 echo,只需进入命令模式,输入/echo,然后按回车。这个命令会找到清单 6 所示文件的第 3 行的第一个单词。

#!/bin/ksh

#

echo “Starting”

file=${1}

echo ${file}

if [[ ${file} = 1 ]] ; then

((file=${file}+1))

echo “Adding one gives ” \

${file}

fi

echo “Ending”

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,然后按回车。

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 —全局修改(即修改所有匹配的地方)

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

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

书签

可以让vi 在文件中的特定位置放上书签。方法是按 Escape 键,再按 M 键,然后输入另一个表示书签引用的字母表字符。因此,最多可以有 26 个书签,分别名为 a 到z。要返回到上一书签,按 Escape 键,再按反撇号(`),然后输入书签引用字符。

例如,按 Escape 之后按 M 和 A 键,就会把当前游标位置保存在书签 a 中。在编辑会话中,以后希望返回到这个游标位置时,只需按 Escape,然后输入 `A。可以使用双反撇号(“)命令在当前书签和前一个书签之间切换。

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

在vi 编辑器中,最有用的搜索/替换特性之一是查找与某个模式匹配的字符串,更新它,然后继续搜索下一个匹配的字符串,然后选择是否以相同方式更新它。这与 Microsoft® Word 中的查找下一个/替换功能很相似。您可能已经知道可以在vi 中搜索字符串模式,方法是进入命令模式,输入/search_pattern(其中的 search_pattern 是字符串或正则表达式),然后按回车。这样做就会找到与指定的模式匹配的第一个字符串。在此之后,可以在找到的文本上执行任何操作。例如,按 Escape,再按 C 和 W 键,再输入更多文本,就会把找到的字符串替换为另一个单词。

要想快速地找到与模式匹配的下一个地方,应该按 Escape,然后按 N 键。在找到下一个匹配时,可以使用点号键(.)在这个位置重复最近的文本操作,比如前一个示例中使用的修改单词(cw)操作。然后,可以使用这些键继续寻找其他匹配(n)并选择重复文本操作(.),操作方式与使用 Word 中的查找下一个/替换功能很相似。

切换大小写

在vi 中,可以切换游标下的字母字符的大小写,方法是按 Escape,然后按波浪号键(~)。这会在小写和大写之间来回切换。按着这个键,移动游标经过行中的每个字符,就会切换遇到的每个字母字符的大小写。可以在波浪号前面输入一个数字,表示希望改变多少个字母字符的大小写。

筛选

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

但是,还可以把文件的一部分作为标准输入发送给 UNIX 命令,并用产生的输出替换编辑缓冲区中的相同部分。例如,如果希望在vi 会话内对清单 9 所示的整个文件进行排序,可以按 Escape,输入 :1,$!sort 并按回车,这让vi 把从第一行到文件末尾($)的所有内容传递给 sort 命令,用输出替换指定的部分。

另外,还可以在 shell 命令前面加上从当前游标位置开始希望操作的行数。方法是按 Escape,然后输入指定行数的数字,然后输入两个惊叹号(!!),最后输入 UNIX 命令。

可以使用管道分隔符(|)把 UNIX 命令连接在一起,从而在vi 会话中执行复杂强大的筛选。例如,假设要把当前vi 会话的编辑缓冲区中的文件内容替换为每行的第一个空格分隔的字段,按升序排序并转换为大写,那么在按 Escape 之后输入:

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

保存部分内容

可以保存当前编辑的文件的部分内容,方法是按 Escape,然后输入 :start,endw file,其中的 start 是当前文件中要保存的第一行,end 是要保存的最后一行,w表示希望写到另一个文件中(或者覆盖现有的文件),file 是指定的部分要保存到的文件。对于最后一行,可以使用$表示文件的末尾。可以在w后面使用两个大于号(>>)表示希望把内容附加到文件中而不是覆盖文件。清单 12 中的示例把第 6 到第 9 行(含)附加到文件/tmp/newfile 中。

#

# 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

~

~

~

:6,9w >> /tmp/newfile

结束语

vi 编辑器是一个极其强大的工具,本文提供了一些技巧和诀窍,希望能够帮助您更高效地编辑文件。请记住,vi 还有更多不太为人所知的特性。祝工作愉快!

  • 相关推荐
  • 大家在看
  • 开发者就苹果关于删除“FlickType”的说法提出异议

    开发者兼 App Store 评论家 Kosta Eleftheriou 表示,他耗时 1 年多时间才让 “FlickType” 这款Apple Watch 输入法应用在 App Store 上架,而这些来之不易的收益可能会因 Apple “Sherlock”应用程序而一扫而光。本周二,在发布 Apple Watch Series 7 时推出了 QuickPath 输入法。该功能在 Watch 的小型显示屏上显示一个完整的 QWERTY 键盘,并允许用户滑动手指进行输入,并利用设备上的机器学习来预测后续单词。FlickType 于 201

  • 微软Win11被Linux社区炮轰:背叛了用户、不要安装

    微软的Win11系统发布一周时间了,很多人都在忙着升级,也有人因为种种问题选择观望,对微软来说,Win11显然是他们未来几年的重点,但对Linux社区来说,Win11的发布让自由软件基金会很不满。SFS自由软件基金会可谓是开源届的精神领袖,也是重要的Linux社区之一,在Win11正式发布当天,他们发表了一篇名为《当你避开Win11 生活更美好》的文章,将微软及Win11系统从头到尾批判了一通。他们指责微软推出Win11是延续了 剥夺用户自由和数

  • Linux Mint全新网站已上线

    全新的 Linux Mint 网站已经上线。Mint 的开发人员表示,近期正在进行主页的改版工作,甚至还邀请社区对拟议的设计提供反馈。所有这些合作努力都得到了回报,新的 Linux Mint 主页已经上线。除了给潜在新用户提供有吸引力的第一印象之外,全新的 Linux Mint 网站还传达了“为何这个特别的 Linux 发行版本是其他系统(例如 Windows)的可靠替代者”的核心原因。

  • 华为应用市场商业推广为开发者提供多重推广权益 丰富开发者合作内容

    移动应用行业竞争激烈,产品除了要不断打磨优化体验,更要考虑高效获量增长的问题。华为应用市场商业推广业务在帮助优质应用获量增长的同时,也通过丰富多元的资源扶持与权益激励,助力优质应用更精准、高效地连接用户,实现品效齐增。8 月,华为应用市场以“玩转精彩”为主题,结合多家华为授权体验店及周边商圈资源,联动懒人畅听、同程旅行等优质应用合作伙伴,策办了集品牌营销、内容分享、用户交流,互动体验等形式的整合营销

  • 开发者省下80%的开发工作量,Serverless 真的要成为未来?

    Serverless 正在改变未来软件开发的模式和流程,有人说,Serverless 是未来。那么Serverless 到底是什么?Serverless 通常被定义为是一种具有隐藏服务器、事件驱动、弹性伸缩、按调用量付费等特征的云原生开发模型。Serverless 使开发者们无需更多地去考虑服务器的相关内容,无需再对服务器进行运维。Serverless 真正实现了让开发者聚焦应用端最核心的功能——代码。Serverless 能为企业和开发者带来什么对于大多数应用而言,借助

  • Linus Torvalds开源峰会访谈摘录:关于社区、Rust和Linux 30周年

    在周二于西雅图举办的北美开源峰会上,Linux 之父 Linus Torvalds 在凯悦酒店宴会厅的下午场主题演讲期间,回答了早期 Linux 贡献者、现 VMware 首席开源官与副总裁 Dirk Hohndel 长达半小时的提问。与此同时,作为 Linux 30 周年庆的一部分,吉祥物“Tux”也在观众的掌声中端上了一个生日蛋糕。作为一个众人拾柴火焰高的开源社区项目,Hohndel 也向所有 Linux 内核开发人员送去送上了 30 周年庆的祝福。以下参考 The News Stack ?

  • Linux基金会筹集千万美元 以扩展和支持OpenSSF

    Linux 基金会刚刚宣布筹集到 1000 万美元的新资金,旨在为开源安全基金会(OpenSSF)提供扩展支持。作为一个跨行业联盟,OpenSSF 致力于将各种开源软件计划集中在一个保护伞下,以识别和解决开源软件中的网络安全漏洞,并增强漏洞披露实践、研究、培训和相关工具。开源名人兼 Apache Web 服务器主要开发者 Brian Behlendorf,将主管负责这项服务协作。针对美国政府提出的网络安全行政命令,Linux 基金会执行董事 Jim Zemlin 评论道

  • 微软为Windows 11 Linux子系统带来了一些新特性

    随着 Windows 11 的正式推送,Windows Central 也深入研究了 Linux 子系统(简称 WSL)的一些新特性。如果你想要借助轻量级虚拟机在 Windows 11 上运行 Ubuntu 或 Debian 等 Linux 发行版,WSL 将可免除设置完整的虚拟机环境、或配置双引导系统等繁琐的事务。尽管大版本仍是 WSL 2,但 Windows 11 还是带来了体验方面的诸多改进,包括对 Linux GUI 应用程序的支持、更易于安装和更新、集成文件资源管理器、以及存储等方面的增强。?

  • PNEdit文本编辑器-从2021智博会看编辑技术同数字经济发展深度融合

    8 月 25 日,中国—上海合作组织数字经济产业论坛圆满结束, 2021 中国国际智能产业博览会在礼嘉智慧公园智慧馆落下帷幕。本届智博会主题为“智能化:为经济赋能,为生活添彩”,以“线上线下结合,线上为主”原则举办,智汇八方、博采众长,为各类企业和各界友人提供了全新的数字体验。 近年来,我国数字经济飞速发展,数字经济已成为国民经济中增速最快、最具活力的新经济形态,也代表着未来的产业发展方向,能够有效提升经济韧

  • Linux基金会技术顾问委员会五位现任成员均获连任

    2021 年 Linux 基金会技术顾问委员会(TAB)选举工作落下帷幕,所有五位现任成员 Greg Kroah-Hartman、Jonathan Corbet、Steven Rostedt、Ted Tso(中文名曹子德)和 Sasha Levin 都获得了连任。在 1012 名被授权投票的开发者中,有 237 人实际投了票。TAB 主要负责内核开发社区和 Linux 基金会之间的接口,为基金会提供与内核有关的建议事项,帮助成员公司学习与社区合作,努力解决与社区有关的问题。在过去的一年里,TAB 所处理?

这篇文章对你有价值吗?

  • 热门标签

热文

  • 3 天
  • 7天