1.vi的使用
vim指令介绍
一般指令模式(command mode)
以vi打开一个文件就直接进入一般指令模式了。
编辑模式(insert mode)
在一般模式可以删除、复制等,但是不能编辑文本内容的。需要按下"i、I、o、O、a、A、r、R"任一个字母后才能进入编辑模式。
指令列命令模式(command-line mode)
在一般模式中输入": / ?"的其中一个就可以将光标移动到最底下那一行。在这个模式中,你可以读取、存盘、批量取代字符、离开vi、显示行号等动作。
1.常用的vi命令
[Ctrl] + [f] :屏幕向下移动一页,相当于[Page Down];
[Ctrl] + [b] :屏幕向上移动一页,相当于[Page Up];
0或[Home]键 :移动到这一行最前面到字符处;
$或[End]键 :移动到这一行最后面的字符处;
G :光标移动到这个文件到最后一行;
gg :光标移动到这个文件到第一行;
[n] + [Enter]/[G] :n为数字,光标向下移动n行;
[/] + [字符] :向光标下方寻找为"字符"的字符串;
[?] + [字符] :向光标上方寻找为"字符"的字符串;
n :表示重复上一个搜索的动作;
N :与n相反,为反向进行前一个动作。例如:/stu,按下N后表示向上搜寻;
: n1,n2s/word1/word2/g :n1、n2都是数字,表示在n1与n2行之间寻找word1这个字符串并替换为word2。如果不写n1、n2表示对当前行操作,如果是:%s/word1/word2/g表示对全文进行替换;
: n1,n2s/word1/word2/gc :同上,只不过在替换对时候需要用户确认;
x、X :在当前光标,x表示向后删除1个字符,X表示向前删除1个字符;
nx/X :n为数字,表示连续向后/向前删除n个字符;
dd :删除光标所在对那一行;
ndd :n为数字,删除光标所在的向下n行;
yy :复制光标所在的那一行;
nyy :n为数字,复制光标所在的向下n行;
p :p为将已复制的数据在光标的下一行粘贴;
u :撤销,复原前一个动作;
[Ctrl] + [r] :恢复"u"撤销掉的内容;
. :重复前一个动作;
:r filename :读取一个文件filename的内容到当前文件;
:e! :在做了很多到编辑后,可以还原到原本的文件内容;
:! [command] :不离开vim下,执行命令。例如 :! ls /home。
2.一般指令模式切换到编辑模式到可用按钮
i、I :进入插入模式。i表示"在光标前插入",I表示在"当前所在行的第一个非空格处开始插入";
a、A :进入插入模式。a表示"在当前光标的下一个字符处开始插入",A表示"从光标所在行的最后一个字符处开始插入";
o、O :进入插入模式。o表示"在当前光标的下一行开始插入",O表示"在当前光标所在处的上一行开始插入";
r、R :进入替换模式。r表示"替换光标所在的那一个字符",R表示"一直替换光标所在的字符",按下r、R后直接输入要替换的字符即可;
3.一般指令模式切换到指令模式
:w :将编辑后的数据保存;
:w! :若文件为只读时,强制写入该文件。写入是否成功,和你的权限有关;
:q :退出;
:q! :退出不保存;
:wq :保存并退出;
:w + [filename] :将编辑的数据另存新档;
:set nu :显示行号;
:set nonu :取消显示行号;
2.vim的暂存档、救援恢复与开启时的警告信息
当我们正在编辑文件的时候,系统宕机该怎么处理呢?
当我们使用vim编辑时,vim会在当前目录产生一个.filename.swp的文件。你对文件的编辑会被记录到这个暂存档中。
如果我们在vim一个文件的时候,出现"found a swap file by the name xxx.swp"的字样,说明可能有以下几个问题:
问题1:可能有其他人或程序同时在编辑这个文件。由于Linux是多人多任务的环境,所以很可能有很多人同时在编辑一个文件。因此vim会出现这样的警告。
解决1:让别人将他的vim结束,继续你的处理;
解决2:选择开启成为只读文件,也就是在出现警告页面输入"O"即可;
问题2:在前一vim中,因为某些特殊原因导致vim中断
解决:在警告页面你可以按下"R",此时vim会载入xxx.swp的内容。不过要注意的是xxx.swp不会自动删除,需要手动删除,否则每次打开都会出现警告。
这个警告页面有6个按钮信息:
[O]pen Read-Only :打开次文件为只读档。
[E]dit anyway :正常的方式打开你要编辑的文件,并不会载入存盘的内容,不建议使用,很容易出现多个编辑者同时修改文件的情况。
[R]ecover :加载暂存盘的内容。需要手动删除.swp文件。
[D]elete it :你确定暂存档是无用的,可以使用它把暂存档删除。
[Q]uit :按下q离开vim。
[A]bort :忽略这个编辑行为。
3.vim的其他功能
vim具有颜色显示的功能,并且支持许多程序语法。
3.1 区块选择(Visual Block)
我们怎么样搞定一个区块的范围?举个例子,有以下格式的文件:
如果我想把host1,host2等等复制以下,并加到每一行的后面怎么做?也就是每一行的结果是"192.168.1.2 host2.class.net host"。
我们可以使用区块选择,当我们在一般命令模式下按下v或者V或者[Ctrl] + v时,我们会进入区块选择模式。
区块选择的含义:
v :字符选择,会将光标经过的地方反白选择;
V : 行选择,会将光标经过的行反白选择;
[Ctrl] + v :区块选择,可以用长方形的方式选择;
y :将反白的地方复制起来;
d :将反白的地方删除掉;
p :将刚复制的区块,在光标所在处贴上;
现在来实操以下:
1.使用vim xxx.txt打开文件;
2.使用光标移动到第一行到host的h处,然后按下[ctrl] + v,进入Visual Block模式;
3.将光标移动到最底部,此时光标移动过到区域会反白;
4.此时按下y进行复制,反白的地方会消失;
5.将光标移动到第一行的最右边,用编辑模式向后按两个空格键,回到一般命令模式后,按下p进行粘贴;
3.2 多文件编辑
相关的按键有:
:n :编辑下一个文件
:N :编辑上一个文件
:files :列出当前这个vim开启的所有文件
如果想要将刚刚的xxx.txt文件的IP复制到你到/etc/hosts文件中,该怎么操作呢?
1.通过"vim xxx.txt /etc/hosts"指令打开两个文件;
2.在vim中使用":files"查看编辑的文件有哪些,然后按下任意键回到一般命令模式中;
3.在第一行输入"4yy"复制4行;
4.在vim环境下输入":n"会来到第二个编辑的文件;
5.在/etc/hosts文件中按下"G"到最后一行,再按下"p"粘贴;
6.按下多次的"u"来还原原本的文件数据;
7.按下":q"退出;
3.3 多窗口功能
相关功能键:
:sp [filename] :开启一个新窗口。如果想要在新窗口打开另一文件,就加入filename。否则只输入":sp"时,出现的时同一个文件在两个窗口。
[Ctrl] + w + ↓ :注意,按键的按法是:先按下[Ctrl]不放,再按下w后放开所有的按键,然后再按下向下箭头,则可移动到下方到窗口。
[Ctrl] + w + ↑ :同上,光标移动到上面到窗口。
[Ctrl] + w + q :结束当前的窗口。
3.4 vim的挑字补全功能
相关的功能键:
注意:以下的用法都在在插入模式下,输入开头字母在使用以下操作。
[Ctrl] + x -> [Ctrl] + n :通过目前正在编辑的这个"文件的内容文字"作为关键词,补充补齐。
[Ctrl] + x -> [Ctrl] + f :以当前目录内的"文件名"作为关键词,补充补齐。
[Ctrl] + x -> [Ctrl] + o :以扩展名作为语法补充,以vim内建的关键词,补充补齐。
3.5 vim环境设定与记录 ~/.vimrc ~/.viminfo
当我们重复编辑同一个文件,第二次进入文件时,光标就在上次离开的那一行上。为什么会这样?
因为vim会主动将你曾经做过的行为记录下来,记录动作的文件就是:~/.viminfo。
而对vim文件环境的设定,就是编辑~/.vimrc了。以下时vim常见的环境设定参数:
:set nu/nonu :设定与取消行号;
:set hlsearch/nohlsearch :设定是否将搜索的字符串反白;
:set autoindent/noautoindent :设定是否自动锁进;
:set backup :设定是否自动储存备份档。一般是nobackup。
:set ruler :设定是否显示右下角的一些状态栏;
:set showmode :是否要显示"INSERT"之类的左下角的状态栏;
:set backspace=(012) :如果backspace为0或1时,在进入编辑模式后仅能删除刚刚输入的字符,设为2时,可以删除任意值;
:set all :显示目前所有的环境参数设定值;
:set :显示与系统默认值不同的设定参数;
:syntax on/off :是否依据程序相关语法显示不同的颜色;
:set bg=dark/light :设定主题颜色;
以上可以在文件的一般命令模式下设定,如果在~/.vimrc文件中设定的话,去掉":"即可。
4.vim的使用注意事项
4.1 中文编码问题
关于乱码,你需要考虑以下:
你的Linux系统默认支持的语言数据:这与/etc/locale.conf有关;
你的终端的语言:这与LANG、LC_ALL属性有关;
你的文件原本的编码;
开启终端机的软件;
4.2 DOS与Linux下编码的不同
我们在DOS下的文件使用在Linux下面,就执行不了了。怎么做?
可以下载dos2unix包。
4.3 语言编码转换:iconv
指令介绍:
[~] iconv --list
[~] iconv -f 原本编码 -t 新编码 filename [-o newfile]
选项与参数:
--list :查看所有支持的编码;
-f :from,原本编码;
-t :to,新编码;
-o file :如果想保留原文件,使用-o + 新档名,可以建立新编码文件;