分类: 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)操作系统基础
历史记录:
将参考资料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 |
0 |
这是数字『 0 』:移动到这一行的最前面字符处 (常用) |
$ |
移动到这一行的最后面字符处(常用) |
H |
光标移动到这个屏幕的最上方那一行 |
M |
光标移动到这个屏幕的中央那一行 |
L |
光标移动到这个屏幕的最下方那一行 |
G |
移动到这个档案的最后一行(常用) |
nG |
n 为数字。移动到这个档案的第 n 行。例如 |
gg |
移动到这个档案的第一行,相当于 |
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 则: |
: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 列 (常用) |
d |
删除光标所在到第一行的所有数据 |
dG |
删除光标所在到最后一行的所有数据 |
d$ |
删除游标所在处,到该行的最后一个字符 |
d0 |
那个是数字的 0 ,删除游标所在处,到该行的最前面一个字符 |
yy |
复制游标所在的那一行(常用) |
nyy |
n 为数字。复制光标所在的向下 n 列,例如 20yy 则是复制 20 列(常用) |
y |
复制光标所在列到第一列的所有数据 |
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 的显示结果!例如 |
: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 完全一模一样~没有不同啦!
几个特色要讲:
区块选择(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 来转换一下格式啊!