Chinaunix首页 | 论坛 | 博客
  • 博客访问: 19912383
  • 博文数量: 679
  • 博客积分: 10495
  • 博客等级: 上将
  • 技术积分: 9308
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-18 10:51
文章分类

全部博文(679)

文章存档

2012年(5)

2011年(38)

2010年(86)

2009年(145)

2008年(170)

2007年(165)

2006年(89)

vi

分类: LINUX

2006-12-27 10:10:48

Reference:

1.       UNIX Essentials Featuring the Solaris 9 Operating Environment SA-119

2.     鸟哥的 Linux 私房菜 基础篇 第10

3.       Linux 基础教程(1)操作系统基础

 

历史记录:

2006-12-27:

将参考资料2中的东东粗略拷贝过来,今后vi方面不许另建文档,除非看专门vi的书籍,则要将此部分整合进去.

 

一般模式: 移动光标的方法

h 向左方向键()

光标向左移动一个字符

j 向下方向键()

光标向下移动一个字符

k 向上方向键()

光标向上移动一个字符

l 向右方向键()

光标向右移动一个字符

如果想要进行多次移动的话,例如向下移动 30 行,可以使用 "30j" "30" 的组合按键, 亦即加上想要进行的次数(数字)后,按下动作即可!

[Ctrl] + [f]

屏幕『向下』移动一页,相当于 [Page Down]按键 (常用)

[Ctrl] + [b]

屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用)

[Ctrl] + [d]

屏幕『向下』移动半页

[Ctrl] + [u]

屏幕『向上』移动半页

+

光标移动到非空格符的下一列

-

光标移动到非空格符的上一列

n

那个 n 表示『数字』,例如 20 。按下数字后再按空格键,光标会向右移动这一行的 n 个字符。例如 20 则光标会向后面移动 20 个字符距离。

0

这是数字『 0 』:移动到这一行的最前面字符处 (常用)

$

移动到这一行的最后面字符处(常用)

H

光标移动到这个屏幕的最上方那一行

M

光标移动到这个屏幕的中央那一行

L

光标移动到这个屏幕的最下方那一行

G

移动到这个档案的最后一行(常用)

nG

n 为数字。移动到这个档案的第 n 行。例如 20G 则会移动到这个档案的第 20 (可配合 :set nu)

gg

移动到这个档案的第一行,相当于 1G 啊! (常用)

n

n 为数字。光标向下移动 n (常用)

一般模式: 搜寻与取代

/word

向光标之下寻找一个字符串名称为 word 的字符串。例如要在档案内搜寻 vbird 这个字符串,就输入 /vbird 即可! (常用)

?word

向光标之上寻找一个字符串名称为 word 的字符串。

n

这个 n 是英文按键。代表『重复前一个搜寻的动作』的意思。举例来说, 如果刚刚我们执行 /vbird 去向下搜寻 vbird 这个字符串,则按下 n 后,会向下继续搜寻下一个名称为 vbird 的字符串。如果是执行 ?vbird 的话,那么按下 n 则会向上继续搜寻名称为 vbird 的字符串!

N

这个 N 是英文按键。与 n 刚好相反,为『反向』进行前一个搜寻动作。 例如 /vbird 后,按下 N 则表示『向上』搜寻 vbird

:n1,n2s/word1/word2/g

n1 n2 为数字。在第 n1 n2 行之间寻找 word1 这个字符串,并将该字符串取代为 word2 !举例来说,在 100 200 行之间搜寻 vbird 并取代为 VBIRD 则:
:100,200s/vbird/VBIRD/g』。(常用)

:1,$s/word1/word2/g

从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 (常用)

:1,$s/word1/word2/gc

从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !且在取代前显示提示字符给使用者确认 (conform) 是否需要取代!(常用)

一般模式: 删除、复制与贴上

x, X

在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键) X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用)

nx

n 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符, 10x』。

dd

删除游标所在的那一整列(常用)

ndd

n 为数字。删除光标所在的向下 n 列,例如 20dd 则是删除 20 (常用)

d1G

删除光标所在到第一行的所有数据

dG

删除光标所在到最后一行的所有数据

d$

删除游标所在处,到该行的最后一个字符

d0

那个是数字的 0 ,删除游标所在处,到该行的最前面一个字符

yy

复制游标所在的那一行(常用)

nyy

n 为数字。复制光标所在的向下 n 列,例如 20yy 则是复制 20 (常用)

y1G

复制光标所在列到第一列的所有数据

yG

复制光标所在列到最后一列的所有数据

y0

复制光标所在的那个字符到该行行首的所有数据

y$

复制光标所在的那个字符到该行行尾的所有数据

p, P

p 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行! 举例来说,我目前光标在第 20 行,且已经复制了 10 行数据。则按下 p 后, 10 行数据会贴在原本的 20 行之后,亦即由 21 行开始贴。但如果是按下 P 呢? 那么原本的第 20 行会被推到变成 30 行。 (常用)

J

将光标所在列与下一列的数据结合成同一列

c

重复删除多个数据,例如向下删除 10 行,[ 10cj ]

u

复原前一个动作。(常用)

[Ctrl]+r

重做上一个动作。(常用)

这个 u [Ctrl]+r 是很常用的指令!一个是复原,另一个则是重做一次~ 利用这两个功能按键,您的编辑,嘿嘿!很快乐的啦!

.

不要怀疑!这就是小数点!意思是重复前一个动作的意思。 如果您想要重复删除、重复贴上等等动作,按下小数点『.』就好了! (常用)

进入编辑模式

i, I

插入:在目前的光标所在处插入输入之文字,已存在的文字会向后退; 其中, i 为『从目前光标所在处插入』, I 为『在目前所在行的第一个非空格符处开始插入』。 (常用)

a, A

a 为『从目前光标所在的下一个字符处开始插入』, A 为『从光标所在行的最后一个字符处开始插入』。(常用)

o, O

这是英文字母 o 的大小写。o 为『在目前光标所在的下一行处插入新的一行』; O 为在目前光标所在处的上一行插入新的一行!(常用)

r, R

取代:r 会取代光标所在的那一个字符;R会一直取代光标所在的文字,直到按下 ESC 为止;(常用)

上面这些按键中,在 vi 画面的左下角处会出现『--INSERT--』或『--REPLACE--』的字样。 由名称就知道该动作了吧!!特别注意的是,我们上面也提过了,你想要在档案里面输入字符时, 一定要在左下角处看到 INSERT/REPLACE 才能输入喔!

Esc

退出编辑模式,回到一般模式中(常用)

指令列命令模式

:w

将编辑的数据写入硬盘档案中(常用)

:w!

若档案属性为『只读』时,强制写入该档案。不过,到底能不能写入, 还是跟您对该档案的档案权限有关啊!

:q

离开 vi (常用)

:q!

若曾修改过档案,又不想储存,使用 ! 为强制离开不储存档案。

注意一下啊,那个惊叹号 (!) vi 当中,常常具有『强制』的意思~

:wq

储存后离开,若为 :wq! 则为强制储存后离开 (常用)

:e!

将档案还原到最原始的状态!

ZZ

若档案没有更动,则不储存离开,若档案已经经过更动,则储存后离开!

:w [filename]

将编辑的数据储存成另一个档案(类似另存新档)

:r [filename]

在编辑的数据中,读入另一个档案的数据。亦即将 filename 这个档案内容加到游标所在行后面

:n1,n2 w [filename]

n1 n2 的内容储存成 filename 这个档案。

:! command

暂时离开 vi 到指令列模式下执行 command 的显示结果!例如
:! ls /home』即可在 vi 当中察看 /home 底下以 ls 输出的档案信息!

:set nu

显示行号,设定之后,会在每一行的前缀显示该行的行号

:set nonu

set nu 相反,为取消行号!

 

空格和TAB不同

 

关于档案的回复与暂存盘

另外,其实 vi 是具有『可回复』功能的呢!那么 vi 凭什么帮我们进行回复的功能呢? 很简单啊!凭暂存档啊!举例来说,当我们编辑一个档案时,假设名称为 /tmp/passwd , 那么在这个 /tmp 底下就会有一个临时文件,档名为『 /tmp/.passwd.swp 』,这是一个隐藏档, 我们所进行的一些修改都会暂时存在这个档案当中,万一在档案修改过程中, 系统挂了,那么下次你再重新 vi /tmp/passwd 时,系统就会告诉您,是否需要回复『Recovery』成修改过程中的模样? 如果您按下 (R) ,嘿嘿!就可以将数据回复到修改过程的样子,而不是源文件啰! 这是个很有用的功能喔! ^_^

这也就是说,如果有一天,您去 /tmp 底下,执行 ls -al 时,发现到底下有两个档案, 档名分别为 passwd .passwd.swp 的话,那么 (1) 可能有人在编辑这个档案; (2) 之前您在编辑这个档案时,因为某些不知名的因素导致 vi 程序中断,则该暂存档就会存在。 如果是状态 (2) ,则此时您可以将该 .passwd.swp 档案删除,或者是,直接 vi /tmp/passwd , 在 vi 出现是否回复时,选择回复,然后储存更新 /tmp/passwd ,之后再将这个 /tmp/.passwd.swp 档案删除即可! 如果不删除的话,那么每次编辑这个档案,都会告知您该档案有问题啊! @_@

 

vim 的额外功能

其实,目前大部分的 distributions 都以 vim 取代 vi 的功能了! 如果您使用 vi 后,却看到画面的右下角有显示目前光标所在的行列号码, 那么您的 vi 已经被 vim 所取代啰~ 为什么要用 vim 呢?因为 vim 具有颜色显示的功能,并且还支持许多的程序语法 (syntax), 因此,当您使用 vim 编辑程序时( 不论是 C 语言,还是 shell script ), 我们的 vim 将可帮您直接进行『程序除错 (debug)』的功能!真的很不赖吧!^_^

如果您在文字模式下,输入 alias 时,出现这样的画面:

[root@linux ~]# alias

alias vi='vim'

这表示当您使用 vi 这个指令时,其实就是执行 vim 啦!如果您没有这一行,那么您就必须要使用 vim filename 来启动 vim 啰!基本上, vim 的一般用法与 vi 完全一模一样~没有不同啦!

 

几个特色要讲:

  1. 最底下一行说明这个档案的特色,包括 138 行,共 4506 字符等等。
  2. 那个 1,1 代表目前光标在第一行的第一个字符上。您可以看到第一行有个光标的存在啊!
  3. 那个 Top 则表示,这个画面是整个档案的最上方!

区块选择(Visual Block)

当我们按下 v 或者 V 或者 [Ctrl]+v 时, 这个时候光标移动过的地方就会开始反白,这三个按键的意义分别是:

区块选择的按键意义

v

字符选择,会将光标经过的地方反白选择!

V

行选择,会将光标经过的行反白选择!

[Ctrl]+v

区块选择,可以用长方形的方式选择资料

y

将反白的地方复制起来

d

将反白的地方删除掉

 

 

多档案编辑

假设一个例子,你想要将刚刚我们的 hosts 内的 IP 复制到您的 /etc/hosts 这个档案去, 那么该如何编辑?我们知道在 vi 内可以使用 :r filename 来读入某个档案的内容, 不过,这样毕竟是将整个档案读入啊!如果我只是想要部分内容呢?呵呵!这个时候多档案同时编辑就很有用了。 我们可以使用 vim 后面同时接好几个档案来同时开启喔!相关的按键有:

多档案编辑的按键

:n

编辑下一个档案

:N

编辑上一个档案

:files

列出目前这个 vim 的开启的所有档案


这个功能也很棒啊!

 

多窗口功能

指令列模式输入:『:sp {filename}』,那个 filename 可有可无, 如果想要在新窗口启动另一个档案,就加入档名,否则仅输入 :sp 时, 出现的则是同一个档案在两个窗口间!

您还可以利用『[ctrl]+w+j』及『[ctrl]+w+k』 在两个窗口之间移动呢!这样的话,复制啊、查阅啊等等的,就变的很简单啰~ 指令的功能有很多,不过,您只要记得这几个就好了:

多窗口情况下的按键功能

:sp [filename]

开启一个新窗口,如果有加 filename, 表示在新窗口开启一个新档案,否则表示两个窗口为同一个档案内容(同步显示)

[ctrl]+wj

按键的按法是:先按下 [ctrl] 不放, 再按下 w 后放开所有的按键,然后再按下 j ,则光标可移动到下方的窗口。

[ctrl]+wk

同上,不过光标移动到上面的窗口。

[ctrl]+wq

其实就是 :q 结束离开啦! 举例来说,如果我想要结束下方的窗口,那么利用 [ctrl]+wj 移动到下方窗口后,按下 :q 即可离开, 也可以按下 [ctrl]+wq 啊!

vim 环境设定

~/.viminfo

整体 vim 的设定值一般是放置在 /etc/vimrc 这个档案

vim 的环境设定参数

:set nu

还记得这个吧?!就是设定行号啊!取消的话,就是 :set nonu

:set hlsearch

这个就是设定是否将搜寻的字符串反白的设定值。 默认值就是 hlsearch ,如果不想要反白,就 :set nohlsearch

:set autoindent

是否自动缩排?autoindent 就是自动缩排, 不想要缩排就 :set noautoindent

:set backup

是否自动储存备份档?一般是 nobackup 的, 如果设定 backup 的话,那么当你更动任何一个档案时,则源文件会被另存成一个档名为 filename~ 的档案。 举例来说,我们编辑 hosts ,设定 :set backup ,那么当更动 hosts 时,在同目录下,就会产生 hosts~ 文件名的档案,记录原始的 hosts 档案内容~

:set ruler

还记得我们提到的右下角的一些状态列说明吗? 这个 ruler 就是在显示或不显示该设定值的啦!

:set showmode

这个则是,是否要显示 --INSERT-- 之类的字眼在左下角的状态列。

:set backspace=(012)

一般来说, 如果我们按下 i 进入编辑模式后,可以利用退格键 (backspace) 来删除任意字符的。 但是,某些 distribution 则不许如此。此时,我们就可以透过 backspace 来设定啰~ 当 backspace 2 时,就是可以删除任意值;0 1 时,仅可删除刚刚输入的字符, 而无法删除原本就已经存在的文字了!

:set all

显示目前所有的环境参数设定值。

:syntax (off|on)

是否依据程序相关语法显示不同颜色? 举例来说,在编辑一个纯文字文件时,如果开头是以 # 开始,那么该行就会变成蓝色。 如果您懂得写程序,那么这个 :syntax on 还会主动的帮您除错呢!但是, 如果您仅是编写纯文本文件,要避免颜色对您的屏幕产生的干扰,则可以取消这个设定 :syntax off

 

 

DOS Linux 的断行字符

[root@linux ~]# dos2unix [-kn] file [newfile]

[root@linux ~]# unix2dos [-kn] file [newfile]

参数:

-k  :保留该档案原本的 mtime 时间格式 (不更新档案上次内容经过修订的时间)

-n  :保留原本的旧档,将转换后的内容输出到新档案,如: dos2unix -n old new

范例:

 

范例一:将我们提供的 hosts 档案格式更新为 dos 格式。

[root@linux ~]# unix2dos -k hosts

unix2dos: converting file hosts to DOS format ...

# 此时 hosts 这个档案的时间不会改变,但是内容主要将断行字符修改成为 DOS CRLF 了。

 

范例二:将范例一已经变成 DOS 格式的 hosts 改名成为 hosts.dos ,并且转换 Linux

        格式到 hosts.linux

[root@linux ~]# mv hosts hosts.dos

[root@linux ~]# dos2unix -k -n hosts.dos hosts.linux

 

dos2unix: converting file hosts.dos to file hosts.linux in UNIX format ...

[root@linux ~]# ll

-rw-r--r--  1 root root      288 Aug  1 13:30 hosts.dos

-rw-------  1 root root      279 Aug  1 13:30 hosts.linux

# 嘿嘿!由于 DOS 格式当中多了 CR 字符,所以,档案比较大的啦!

因为断行字符以及 DOS Linux 操作系统底下一些字符的定义不同,因此, 不建议您在 Windows 系统当中将档案编辑好之后,才上传到 Linux 系统,会容易发生错误问题。 而且,如果您在不同的系统之间复制一些纯文本文件时,千万记得要使用 unix2dos dos2unix 来转换一下格式啊!



阅读(2311) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~