摘要:大部分Linux开发者对vi命令至关熟悉,但是遗憾的是,大部分开发者都只能掌握一些最经常使用的Linux vi命令,下面介绍的10个vi命令虽然不少鲜为人知,可是在实际应用中又能让你大大提升效率。web
在使用vi 编辑器时—不管是初次使用的用户,仍是有经验的用户—大多数人每每只掌握核心命令集,这些命令能够执行最经常使用的功能:导航或保存文件;插入、更新、删除或搜索数据;退出但不保存修改。正则表达式
可是,vi 编辑器极其强大,特性和功能很是丰富。即便在多年使用vi 以后,您仍然可能会发现有不知道的新命令。本文讨论的命令就属于不太为人所知的命令,可是它们能够简化您目前采用的操做方法,让您的工做方式更高效,或者 让您可以完成原来不知道能够用vi 完成的操做。shell
打开和关闭行号编程
vi 编辑器的许多选项能够控制编辑会话的外观和感受。使用 :set 命令修改vi 中的会话设置。按 Escape 键进入命令模式以后,可使用 :set all 命令显示选项和设置的列表。能够设置的选项之一是 number,它的做用是打开和关闭行号centos
#app
# 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 还有更多不太为人所知的特性。祝工做愉快!
转载请注明:编程文库 » 10个你必须掌握的超酷VI命令技巧