转 vi 技巧和诀窍:令人刮目相看的 10 个超酷命令
for ksh
vi 编辑器的许多选项可以控制编辑会话的外观和感觉。使用 :set
命令修改 vi 中的会话设置。按 Escape 键进入命令模式之后,可以使用 :set all
命令显示选项和设置的列表。
如果希望每次进入 vi 会话时都显示行号,那么在主目录中的 .exrc 文件中添加 set number
行。
chmod 660 .exrc
vi .exrc
for bash
/etc/vimrc
怎么设置这个东东呢?很简单 打开/etc/vimrc 加入类似这样的内容就可以了:
set tabstop=4
or
Edit Vim configuration file ".vimrc" in your HOME directory, add below lines:
################
在使用 vi 编辑器时 — 无论是初次使用的用户,还是有经验的用户 — 大多数人往往只掌握核心命令集,这些命令可以执行最常用的功能:导航或保存文件;插入、更新、删除或搜索数据;退出但不保存修改。
但是,vi 编辑器极其强大,特性和功能非常丰富。即使在多年使用 vi 之后,您仍然可能会发现有不知道的新命令。本文讨论的命令就属于不太为人所知的命令,但是它们可以简化您目前采用的操作方法,让您的工作方式更高效,或者让您能够完成原来不知道可以用 vi 完成的操作。
打开和关闭行号
vi 编辑器的许多选项可以控制编辑会话的外观和感觉。使用 :set
命令修改 vi 中的会话设置。按 Escape 键进入命令模式之后,可以使用 :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
并按回车来打开行号(见 清单 2)。
清单 2. 打开行号之后
1 #
2 # Internet host table
3 #
4 ::1 localhost
5 127.0.0.1 localhost loghost
6 192.168.0.6 centos5
7 192.168.0.10 appserv
8 192.168.0.11 webserv
9 192.168.0.12 test
10 192.168.0.5 solaris10 # Added by DHCP
~
~
~
:set number
可以使用 :set nonumber
命令关闭行号。还可以使用这个命令和 :set number
命令的简写,即 :set nu
和 :set nonu
。
如果需要快速计算要用 vi 函数处理的行数,显示行号会非常有帮助。当行数很多,可能跨多个屏幕时,行号尤其有用。另外,有时候您知道要处理的行范围,但是需要查明要在 vi 命令中使用的初始和结束行号。
如果希望每次进入 vi 会话时都显示行号,那么在主目录中的 .exrc 文件中添加 set number
行。
自动缩进
在用某些编程语言编写代码时,缩进是样式的重要部分,可以确保代码的可读性更好。如果需要,可以在 vi 编辑器中根据编程语言的样式设置自动缩进。使用 autoindent
打开或关闭自动缩进(见 清单 3)。
清单 3. 打开自动缩进
#!/bin/ksh
#
#
for file in /etc/*
do
if [[ -f ${file} ]] ; then
echo "${file} is a file" ~
~
~
~
~
:set autoindent
在此之后,如果在一行的开头输入空格或制表符,那么后续的新行将会缩进到相同的位置。在命令模式下,输入 :set autoindent
,然后按回车打开自动缩进。通过设置 shiftwidth
确定缩进级别。例如,:set shiftwidth=4
把每级缩进设置为四个空格(见 清单 4)。
清单 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>>
就会让下面五行增加一级缩进。清单 5 显示结果。
清单 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 行的第一个单词。
清单 6. 复合搜索
1 #!/bin/ksh
2 #
3 echo "Starting"
4 file=${1}
5
6 echo ${file}
7
8 if [[ ${file} = 1 ]] ; then
9 ((file=${file}+1))
10 echo "Adding one gives " \
11 ${file}
12 fi
13 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
,然后按回车。
清单 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
书签
可以让 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
命令,用输出替换指定的部分。
清单 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 命令前面加上从当前游标位置开始希望操作的行数。方法是按 Escape,然后输入指定行数的数字,然后输入两个惊叹号(!!
),最后输入 UNIX 命令。
例如,把游标放在 清单 9 中第 4 行的开头,按 Escape,然后输入:
4!!awk '{print "New text",$0}'
再按回车,就会在第 4 到第 7 行(含)上加上前缀文本 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 会话的编辑缓冲区中的文件内容替换为每行的第一个空格分隔的字段,按升序排序并转换为大写,那么在按 Escape 之后输入:
:1,$!awk '{print $1}' | sort | tr [:lower:] [:upper:]
保存部分内容
可以保存当前编辑的文件的部分内容,方法是按 Escape,然后输入 :start,endw file
,其中的 start 是当前文件中要保存的第一行,end 是要保存的最后一行,w
表示希望写到另一个文件中(或者覆盖现有的文件),file 是指定的部分要保存到的文件。对于最后一行,可以使用 $
表示文件的末尾。可以在 w
后面使用两个大于号(>>
)表示希望把内容附加到文件中而不是覆盖文件。清单 12 中的示例把第 6 到第 9 行(含)附加到文件 /tmp/newfile 中。
清单 12. 把文件的部分内容保存到另一个文件中(附加而不是覆盖)
1 #
2 # Internet host table
3 #
4 ::1 localhost
5 127.0.0.1 localhost loghost
6 192.168.0.6 centos5
7 192.168.0.10 appserv
8 192.168.0.11 webserv
9 192.168.0.12 test
10 192.168.0.5 solaris10 # Added by DHCP
~
~
~
:6,9w >> /tmp/newfile
结束语
vi 编辑器是一个极其强大的工具,本文提供了一些技巧和诀窍,希望能够帮助您更高效地编辑文件。请记住,vi 还有更多不太为人所知的特性。祝工作愉快!
################
全局替换文本(vi命令模式下使用)
:%s/old/new/g 用new替换文件中的所有old。s为substitution,替换的意思。g为global。
编辑另一个文件(vi命令模式下使用)
:e otherfile 编辑文件名为otherfile的文件
为命令行编辑制定一个编辑器(UNIX shell命令)
bindkey -v 指定vi编辑器(用于 tcsh)
VISUAL=vi 指定vi编辑器(用于 ksh)
set -o vi 指定vi编辑器(用于 bash)
转 vi 技巧和诀窍:令人刮目相看的 10 个超酷命令的更多相关文章
- vi 技巧和诀窍~转IBM
复合搜索 1 #!/bin/ksh 2 # 3 echo "Starting" 4 file=${1} 5 6 echo ${file} 7 8 if [[ ${file} = 1 ...
- 10个你必须掌握的Linux超酷VI命令技巧
大部分Linux开发者对vi命令相当熟悉,可是遗憾的是,大部分开发者都只能掌握一些最常用的Linux vi命令,下面介绍的10个vi命令虽然很多不为人知,但是在实际应用中又能让你大大提高效率. 在使用 ...
- 10个你必须掌握的超酷VI命令技巧
摘要:大部分Linux开发者对vi命令相当熟悉,可是遗憾的是,大部分开发者都只能掌握一些最常用的Linux vi命令,下面介绍的10个vi命令虽然很多不为人知,但是在实际应用中又能让你大大提高效率. ...
- 【转】10个你必须掌握的超酷VI命令技巧
摘要:大部分Linux开发者对vi命令相当熟悉,可是遗憾的是,大部分开发者都只能掌握一些最常用的Linux vi命令,下面介绍的10个vi命令虽然很多不为人知,但是在实际应用中又能让你大大提高效率. ...
- Sublime Text编辑器的12个技巧和诀窍
本文为您提供Sublime Text编辑器的12个技巧和诀窍,深入挖掘这个看似简洁的代码编辑器,背后所隐藏的实现各种高级功能的无限可能. 1) 选择 以下是一些Sublime Text选择文本的快捷键 ...
- 12个不可不知的Sublime Text应用技巧和诀窍
本文为您提供Sublime Text编辑器的12个技巧和诀窍,深入挖掘这个看似简洁的代码编辑器,背后所隐藏的实现各种高级功能的无限可能. 1) 选择 以下是一些Sublime Text选择文本的快捷键 ...
- 12个Sublime Text应用技巧和诀窍
本文为您提供Sublime Text编辑器的12个技巧和诀窍,深入挖掘这个看似简洁的代码编辑器,背后所隐藏的实现各种高级功能的无限可能. 1) 选择 以下是一些Sublime Text选择文本的快捷键 ...
- 25条提高iOS App性能的技巧和诀窍
25条提高iOS App性能的技巧和诀窍 当我们开发iOS应用时,好的性能对我们的App来说是很重要的.你的用户也希望如此,但是如果你的app表现的反应迟钝或者很慢也会伤害到你的审核. 然而,由于IO ...
- Linux系统Vi/Vim编辑器的简单介绍、安装/卸载、常用命令
Linux系统Vi/Vim编辑器的简单介绍.安装/卸载.常用命令 1.介绍 vi(Visual Interface)编辑器是Linux和Unix上最基本的文本编辑器,工作在字符模式下.由于不需要图形界 ...
随机推荐
- struts2防止重复提交的标签
struts2 token 使用说明 --------------------------------------------------------------------------------- ...
- Lua高级教程Metatables
什么是Metatable metatable是Lua中的重要概念,每一个table都可以加上metatable,以改变相应的table的行为. Metatables举例 -- 声明一个正常的关系变量 ...
- 重新认识C++
By Jensen,2014.5.28 晚 一直觉得C++也没有什么高级的,但是看了知乎上有人问"怎么样才算精通C++"之后,我很惭愧,原来我的认识这么肤浅.所以我下定决心再学 ...
- Spring AOP实现声明式事务代码分析
众所周知,Spring的声明式事务是利用AOP手段实现的,所谓"深入一点,你会更快乐",本文试图给出相关代码分析. AOP联盟为增强定义了org.aopalliance.aop.A ...
- 希望获取到页面中所有的checkbox怎么做?
var domList = document.getElementsByTagName(‘input’); var checkBoxList = []; var len = domList.lengt ...
- 使用某些Widows API时,明明包含了该头文件,却报错“error C2065: undeclared identifier”
在使用一些新版本的API,或者控件的新特性(比如新版的ComCtl32.dll)的时候,你可能会得到“error C2065: undeclared identifier.“这个错误.原因是这些功能是 ...
- kvstore之mongodb为存储介质
配置config(连接mongo) mongo define('KVSTORE_STORAGE', 'base_kvstore_mongodb'); define('MONGODB_SERVER_CO ...
- 查询全国的省市信息<option>拼接
//修改页面获取省市信息 function getProvinceUSER_AREA1(){ $.ajax({ type:'post', url:'<%=path%>/user/findU ...
- UIScrollView 加载多个view view还可以交换顺序(2)
在上的代码中 UIview都在一个页面 要是每一个view对应一个页面 操作每一个view代码都在viewcontroller里面就会很乱,那么我们就将view重新做一下 创建想要的页面继承与view ...
- KVM 虚拟化基本搭建
KVM虚拟化技术 KVM是基于x86架构上Linux操作系统的全虚拟化解决方案 ,在Centos6.3系统中,kvm已经被集成到内核中,相当于使用内核来做虚拟机管理程序.由于KVM本身就工作于内核环境 ...