linux_shell笔记(四)

<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } -->

Linux 系统中最流行的 vi 克隆有 elvis nvi vile vim

vim 编辑器不是一个格式化文本的程序,它不能调整版面,也不具有复杂文字处理系统( openoffice.org )所具有的格式化输出功能。

Vimtutor 查看 vim 的使用说明。

>vimtutor

ESC....SHIFT+: q

 

vim 有两个操作模式:命令模式(也称普通模式)和输入模式。命令模式可输入 vim 命令,如删除文本的命令,退出 vim 的命令。可以通过输入命令将 vim 切换到输入模式。在输入模式中, vim 将接受用户输入的任何文本信息,并将他们显示在屏幕上。按下 ESC 键, vim 将返回到命令模式。

命令模式 -----> 插入,追加,打开,替换,修改 -----> 输入模式

命令模式 -----> 冒号‘ :’-----> 最后一行模式

输入模式 -----> 转义( ESC -----> 命令模式

最后一行模式 -----> 返回( RETURN -----> 命令模式

 

最后一行模式:在这种模式下,光标处于屏幕底部。当输入完命令按下 RETURN 键后, vim 将光恢复到原来位置。

:set number RETURN

:help RETURN

vim 区分大小写,输入命令时注意区分大小写。输入上面命令 ':' 将使 vim 由命令模式切换到最后一行模式。

 

输入模式( i/a ) 在输入文本前,必须通过 'i' 或者 'a' 键将 vim 由命令模式切换到输入模式。

命令模式下: CONTROL D 将光标下移半个窗口, CONTROL U 上移半个窗口。

命令 ‘ :q!’ 退出不保存。

vim 输入模式下,那些校正 shell 命令行的回退键具有同样的功能。这些键包括字符删除键 (CONTROL + H) 行删除键( CONTROL U ) 字删除键( CONTROL W

 

行删除键:当按下行删除键后,光标将往左移动,一直到达行开始处,其经过的字符将被删除。

字删除键:当按下字删除键后,光标将往左移到当前单词开始或者前一个单词的起始处左端,光标所经过的单词将被删除。

所以要保证删除当前行和 当前单词,需要将光标移动到当前行的最右端 或者 当前单词的末尾结束字符的后一个位置。

 

vim 处于命令模式下,可以使用 RETURN 空格键 方向键来移动光标 ,‘ h’ 左 ‘ j’ 上 ‘ k’ 下 ‘ l’ 右。

 

命令模式下删除文本:删除字符 ‘ x’ 删除光标所经过的字符 删除字‘ dw’ ,将光标移动到要删除字的第一个字符 ,输入该命令 删除行‘ dd’ 光标移动到要删除行的任意位置,输入该命令。 注意操作方式与输入模式下的区别,光标的位置的要求不同。

 

输入命令 'u' 来撤销操作, vim 编辑器将文本恢复到上一个命令执行前的状态。

输入命令 'U' 来修正一行的内容,让其恢复原始状态,撤销一行所做的更改。

输入命令 ':redo' 将重新执行被撤销的命令。

输入 'CONTROL+R' 来重新执行被撤销的命令。

添加文本:

插入‘ i’ 追加 'a' 打开 'o' 和‘ O’ o: 在光标所处行的下方打开一空白行,同时将光标移动到新行并切换到输入模式, O :在光标所处行的上方打开一空白行,同时将光标移动到新行并切换到输入模式

 

在编辑的过程中, vim 将编辑的文本放置在工作缓冲区的地方,当结束编辑时,必须将工作缓冲区的内容写到磁盘,这样才能将对文本的修改保存起来。

命令 'ZZ' 可以将新写入的内容保存到磁盘,并且结束编辑会话 vim 返回到 shell 控制符。如果不想保存所作的修改,那么可以使用命令 ':q!' 退出。命令 'wq' 写并退出。

 

':help feature ' 可以获得 feature 的相关信息。将光标移动到文档的活动链接, 按下 CONTROL +]即可跳到对应的链接文件。使用 CONTROL o 可返回到帮助文档 。也可以使用链接名替换 ':help feature ' 中的 feature 来获得单词对应特性的相关信息。帮助文档中 用两个‘ *’ 括起来的红色显示的标签表示可以用作替换 ':help feature ' 中的 feature 项字符串。

 

在命令模式下, vim 将输入的字符作为命令对待,并对每个命令做出回应,但不显示这些字符;在输入模式下, vim 将输入字符作为文本放置在正编辑的文本中;所有以冒号 ':' 开始的命令将使 vim 处于最后一行模式,冒号将光标移到屏幕的底部一行,输入的命令将在该行显示。

最后一行模式和命令模式除了光标位置不同外,还有一点不同,就是命令模式结束不必包含按下 RETURN 键,而最后一行模式结束命令必须按下 RETURN 键。

一些修改和替换命令首先工作的命令模式下,然后切换到输入模式下工作。

注意查看模式和 CAPSLOCK 键的状态

 

启动编辑会话时, vim 将要编辑的文件从磁盘读入工作缓冲区;在会话过程中, vim 将所作的修改保存在缓冲区而不修改磁盘上的文件,直到将工作缓冲区内容写回到磁盘。

>view filename

>vim -R filename

上面命令使用 vim 浏览文件而不修改文件。将不能把工作缓冲区的内容修改到原文件,但是可以写到其他文件。

 

窗口:多数窗口命令由 CONTROL W 后跟字母构成,

CONTROL W s(split) 分割,打开另一个窗口来编辑同一个文件;

CONTROL W n 打开一个新窗口编辑空白文档;

CONTROL W w 将光标在窗口间移动;

CONTROL W q 退出窗口。

 

>vim example.c example2.c

:next

:prev

:wq

:wq

 

>vim example.c

ESC

CONTROL+W n

:open example2.c

:q

:q

 

 

可以采用两种方式结束编辑会话:一种是保存编辑会话过程中所作的修改;一种是放弃编辑会话过程中所作的修改。在命令模式下输入‘ ZZ’ 或者 ‘ :wq’ 可以将所作修改保存后退出

如果不想保存所作的修改直接结束编辑会话,那么可以使用 ':q!' 命令。

:w filename’ 命令将所作修改写到磁盘文件 filename 。当用户没有某个文件的写权限时,使用该命令是很必要的。

 

vim 会将操作的交换文件临时存储起来。当使用 vim 编辑文件时,如果系统突然崩溃了,那么再次启动系统后,可以根据这些交换文件对文件进行恢复。

带选项‘ -r’ vim 会显示所有已经保存的交换文件,如果已经保存了所作的工作,那么可输入 vim -r 后跟文件名,这样就可以编辑工作缓冲区最近的副本。尽快使用 ':w filename ' 将工作区的应急副本写到磁盘上。

>vim -r

注意与选项 '-R'( 表征只读方式打开 ) 的区别。

>vim -r example.c

:w example2.c

:q

>rm .example.c.swp

 

可以跨越不同的度量单位来移动光标。移动光标的命令前面带上数字称为重复因子,光标跨越的个数将根据该数字确定。 3h 4l 3j 2k

j$ 移动光标到下一行结尾。

 

使用查找命令可以将光标从当前的某个字符移到该字符下一次出现的位置。

Fa ; ; ; fa ; ; ; ;

F 将光标从当前字符 a 移动到同一行上 a 的前一次出现的位置。 F 将光标从当前字符移动到同一行上 a 的下一次出现的位置。‘ ;’ 重复上一次查找命令。

 

 

w 是将光标往前移动一个字的距离。 e 也是将光标往前移动一个字的距离;

注意 w e 的区别:光标位于字的第一个字符和光标位于字的最后一个字符。

命令 b 也是将光标往回移动一个字。

W E B 移动方向与小写的 w e b 相同,只是以空白符区分字边界。

 

0 将光标移动到行的开始位置, $ 将光标移动到行的结束位置。

 

% 在同一嵌套层次内移到匹配的同类型括号。

 

')' '}' 可分别将光标向前移到下一个句子的开始和下一个段落的开始。 '(' '{' 则分别将光标向后移动到前一个句子的开始和前一个段落的开始。

 

H 将光标定位到屏幕顶部一行的最左端; M 将光标定位到屏幕的中间一行; L 将光标定位到屏幕的底部。

 

CONTROL d 组合键和 CONTROL u 组合键可将屏幕向下或向上滚动,显示半屏新文本, 在这些命令前加数字将按照输入数字的行数来滚动,在后面的会话中,每次使用该组合键都将按照该数字指定的行数滚动屏幕。直到再次修改滚动行数。

 

CONTROL f 组合键和 CONTROL b 组合键 显示一屏新文本。

 

nG ,将把光标定位到工作缓冲区的第 n 行。同 n gg

G ,把光标定位到文件最后一行。

gg ,把光标定位到文件的第一行。

 

插入命令,追加命令,修改命令和替换命令可以使 vim 切换到输入模式,在该模式下,可以向工作缓冲区中输入新文本内容。在文本输入完成后,可按下 ESCAPE 键返回到命令模式。

 

插入: i 在光标所在字符之前插入字符

追加: a 在光标所在字符之后插入字符, A 直接在行末添加字符。

为输入打开行: o/O 在当前行之下或之上打开一个新行并将光标定位到新行

文本替换: r/R 后跟字符将替换光标所在位置的字符,一个是替换一个字符,一个是连续替换。

 

输入模式下转义特殊字符: CONTROL V 可向文本中输入任何字符 如‘ CONTROL W’ 删除字 ‘ CONTROL U’ 删除行 以及 ‘ ESCAPE ’ 进入命令模式。

 

命令模式下删除和修改文本,

撤消, u 可将错误删除或修改的文本恢复。执行一次撤消命令只能撤销上一次对文本的操作。

删除, x 删除当前字符,前可使用重复因子删除当前行上从当前字符开始的后续多个字符。

 

删除, d 命令将把文本从工作缓冲区中删除,命令删除文本的多少取决于 d 后重复因子和度量单位的设定。 dw 删除到字的末尾 d3w 删除到第 3 个字的末尾 dd 删除当前行 5dd 删除从当前行开始的 5 行, d$ 删除到行的末尾。

 

修改文本 命令 c 可以将旧文本替换为新文本,其中新文本不一定与旧文本占据相同的空间。删除文本的多少取决于重复因子和度量单位的设定。它可以使 vim 进入输入模式。 cw 修改到字末尾, cc 修改当前行 5cc 修改当前行开始的 5 行, c$ 修改到行的末尾。

 

替换: s/S 可以将旧文本替换为新文本。命令 s 删除光标所在字符,使 vim 进入输入模式,然后可输入新内容直到按下 ESC 键, vim 将一个字符替换为刚输入的新内容。 S 修改当前行与命令 cc 相同。

用一个或多个字符替换当前字符 s

用一个或多个字符替换当前行 S

用一个或多个字符替换从当前字符开始的 5 个字符 5s

 

代字符~可以改变光标所在字符的大小写,从大写改为小写或者从小写改为大写。 5 ~将改变从当前光标位置开始的 5 个字符的大小写。

 

查找和替换 任何编辑器都具有的一个关键特性是:通过与正则表达式的匹配实现字符 字符串或者文本的查找和替换。

查找字符:命令 f 可在当前行查找指定字符 ,并将光标移到该字符的下一次出现的位置。分号;可以重复执行最后一个 f 命令

查找字符串:可以在整个工作缓冲区查找与正则表达式匹配的文本或字符串。斜杆 / 后跟要查找的文本按下 RETURN 键后, vim 便开始对字符串进行搜索。如果用?代替斜杆那么将查找字符串的前一次出现的位置。如果要搜索特殊字符需要在字符前加 / 以实现转义。

两种不同转义字符的方法:编辑文本时可以使用 CONTROL V 转义特殊字符,搜索字符串中使用反斜杆 / 实现转义特殊字符。这两种转义字符的方法是不可互换的。

n n 在不必输入搜索字符串的情况下,将重复上一次搜索。键 n 的搜索与上一次搜索完全相同,而建 N 则方向相反。键 n 是一个输入命令项。

/if

n n n n.. n.. n

?if

n n n n ..n n

 

vim 进行普通搜索时,输入斜杆或者问号后跟搜索字符串,按下 RETURN 键, vim 便开始搜索并将光标移到搜索字符串的下一次或者前一次出现的位置。当 vim 进行增量搜索时,输入斜杆或问号后,随着搜索字符串的输入, vim 将突出显示已输入字符串下一次或者前一次出现的位置。当突出显示的字符串恰是要查找的字符串时,按下 RETURN 即可将光标移动到突出显示的字符串的位置。

:set incsearch 可以将增量搜索打开。

 

由于搜索字符串是正则表达式,所以搜索字符串中的一些字符具有特殊的意义。

^ $ 两个特殊字符,除了这两个特殊字符以外,列表中的其他字符都可以通过 nomagic 参数关闭。

^ 行开始符,作为第搜索字符串的第一个字符时, vim 将每行的开始字符串与搜索字符串进行匹配。

例如: /^the 搜索以 the 开始的行。

$ 行结束符,与行的结束匹配。 /!$ 搜索以叹号结尾的下一行,命令 / $ 搜索以空格结束的行

. 任意字符指示符,可以与任意字符匹配,他可以出现在字符串的任意位置。 /l..e 可以查找到任何以包含 l 后跟任意两个字符和 e 的字符。

/> 字结束符,这两个字符与字的末尾匹配, /s/> 搜索以 s 结尾的字,通常情况下 / 是用来关闭字符特殊意义,而单独的 > 没有特殊意义,所以这里的 / 不是用来转义的。

/< 字开始符,这两个字符与字的开始匹配, //<The 用来查找下一个以 The 字符串开始的字。

* 0 个或多个出现,与某个字符的 0 次或者多次出现匹配。 /dis*m 将与以 di 后跟 0 个或者多个 s 和一个 m 字符串匹配。

[] 定义字符类,将两个或多个字符括起来与括号内的单个字符匹配。 /dis[kc] 查找 disk disc 下一次出现的位置

在定义字符类中,有两个特殊字符:脱字符 ^ 和连字符 - 。脱字符为左括号后的第一个字符时,定义了一个除后面字符的其他字符。连字符放置在两个字符之间表示字符范围。

/and 查找字符串 and 的下一次出现的位置。

//<and/> 查找字 and 的下一次出现的位置。

/^The 查找以 The 开始的下一行。

/^[0-9][0-9]) 查找以两个数字后跟括号开始的下一行。

//<[adr] 查找以 a d r 开始的下一个字。

/^[A-Za-z] 查找以字母开始的下一行。

注意与 shell 中使用的通配符的区别。 ? 单个字符, * 任意多个字符等。

 

/ignore/c 搜索字符串 ignore 并突略大小写 而对参数 set ic 与否没有影响。

:set ic

/ignore

:set noic

 

突略大小写搜索

:set ic

显示行号

:set number

高亮显示搜索结果

:set hls

增量搜索

:set is

 

字符串的替换

替换命令合并了查找命令和修改命令的功能。替换命令将首先查找某个字符串,与命令 / 的功能相同,允许查找前面一节讨论的特殊字符;当找到匹配的字符串时,替换命令用来修改该字符串。

:[g] [address] s/search-string/replacement-string[/option]

设定 address 如果替换命令不指定 address ,那么替换命令将仅搜索当前行 ;如果指定 address ,那么,替换命令将搜索对应行。也可以使用斜杆括起来的字符串作为 address vim 将对包含地址字符串的下一行进行查找和替换。如果在地址字符串前面加上 g ,那么 vim 将对包含字符串的所有行进行查找和替换。注意与放置在末尾的 g 不同,放置在末尾的 g 是在某行进行多个替换。

address 中的句点代表当前行,美元符号代表工作缓冲区中最后一行,百分号代表整个工作缓冲区。也可使用加减号进行 address 的算术运算。

5 5

77,100 77 100 行 包括 77 100

1,. 从工作缓冲区开始到当前行

.,$ 从当前行到工作缓冲区结束

1,$ 整个工作缓冲区

% 这个工作缓冲区

/pine/ 包含字符串 pine 的下一行

g/pine/ 包含字符串 pine 的所有行

.,.+10 当前行到后续 10

 

address 后跟的 s 代表命令是一个替换命令。 s 后的分割符代表 search-string 字符串的开始。 Search-string 格式与命令 / 中搜索字符串的格式相同,用分割符标志 search-string 的结束同时也标志 replace-string 的开始。 Replace-string 是用来替换匹配 search-string replace-string 中的 & 代表与 search-sting 匹配的文本; / 用来转义后面的特殊字符。

 

:s/bigger/biggest/ 当前行,第一次出现的字符串 bigger 替换为 biggest

:1,.s/Ch 1/Ch 2/g 当前行之前的所有行,所有的字符串 Ch 1 替换为 Ch 2

:1,$s/ten/10/g 所有行,所有的字符串 ten 替换为 10

:g/chapter/s/ten/10/ 所有出现 chapter 的行,第一次出现的 ten 字符串替换为 10

:%s//<ten/>/10/g 所有行,所有字 ten 替换为 10

:.,.+10s/every/each/g 当前行到后续的 10 行,所有字符串 every 替换为 each

:s//<short/>/”&”/ 当前行,第一次出现的字 short 替换为” short”

:/candle/s/wick/flame/ 下一次出现 candle 的行,第一次出现的字符串 wick 替换为 flame

:g/candle/s/wick/flame/ 所有出现 candle 的行,第一次出现的字符串替换为 flame

:g/candle/s/wick/flame/g 所有出现 candle 的行,所有的字符串 wick 替换为 flame

 

通常,替换命令只替换第一次出现的匹配项,如果要进行全局替换,或者说,要替换文本所有匹配项,那么可以在之后追加 g 选项。

 

CONTROL G 显示正编辑中的文件的名字和相关信息;同 :f 命令

 

句点 . 将重复执行最近一次的修改命令。

对于要修改工作缓冲区中的某个字或者短语的多次出现,这个命令非常有用。使用 / 搜索第一次出现的匹配字,利用 cw 修改该字,使用 n 可搜索下一次出现的该字,命令 . 将进行与上次同样的修改。不想修改可以继续 n 搜索。

//<i/>

RETURN 则将光标定位到第一次匹配项,

cw

进入输入模式,输入替换字符 j ESC 进入命令模式

n 继续搜索下一次 i 的出现, . 修改该字为 j

n . n . n n . n n n

 

 

命令 Yank,Put Delete

vim 编辑器具有一个通用缓冲区和 26 个命名缓冲区,可用这些缓冲区来存放编辑会话过程中文本。这些缓冲区对文本块的移动和复制非常有用。 Delete Put 剪切并粘贴, Yank Put 复制并粘贴。

Yank(y/Y) 将文本复制到缓冲区 复制文本到通用缓冲区,使用 Put 将通用缓冲区中的文本复制到工作缓冲区的另一位置。多次 Put 将进行多次复制。 yy 复制一行, yw 复制一个字。

Put(p/P) 从缓冲区复制文本 把文本从通用缓冲区复制到工作缓冲区中。当字符和字删除或复制到通用缓冲区后,命令 p 可以把他们插入到当前字符之后,命令 P 将其插入到当前字符之前。如果删除或复制的是行 句子或者段落, p 将内容插入到通用缓冲区光标所在行之后,而 P 则插入到光标所在行之前 Put 不改变通用缓冲区内容,所以可以多次 Put 命令将文本放置在工作缓冲区不同位置。

Delete 将删除文本复制到通用缓冲区 这样可以在执行撤销命令时恢复文本,也可以将删除的文本使用 Put 命令放置到工作缓冲区的另一个位置。 dw+p dd+p

可以利用命令 v 使 vi 进入可视,然后利用 hjkl 来控制方向选择所需复制或则删除的字符。

 

 

命名缓冲区 Delete Yank Put 命令都可以使用命名缓冲区, 26 个命名缓冲区是用 26 个字母表中的 26 个字母命名的,每个命名缓冲区可以存储文本的不同块,当使用时可以调用这些块。与通用缓冲区不同 vim 不改变命名缓冲区的内容,除非使用命令重写某个缓冲区。 Vim 将在整个会话期间都保持命名缓冲区中的内容不变。

如果 Delete Yank 命令之前加上双引号,那么 vim 编辑器将把文本存储在某个命名缓冲区中, kyy 将当前行复制到缓冲区 k 中,缓冲区使用小写字母, vim 将把删除或者移出的文本放置到对应缓冲区,缓冲区使用大写字母, vim 将把删除或者移出的文本追加到对应缓冲区的末尾。 利用这个特性可以将文件的不同部分收集并存储到某个位置。想在某个文档重复插入段落,句子和短语的情况,命名缓冲区显得非常有用。 kp k 缓冲区中的文本插入到光标所在行的下方。

这种技术为在文档中多次插入相同文本的情况提供了一种快捷便利的方法。

 

读文件 :r 命令是将文件读入到工作缓冲区。新创建的文件并不覆盖工作缓冲区中的任何文本,而是被定位到命令中指定的地址之后。 :[address] r [filename]

:$r example.sh

在文档结尾插入 example.sh 文件的内容。不指定地址,定位到当前行。不指定文件名则为当前正编辑文件。

:r example.sh

:r !ls

 

 

写文件 :w 命令将工作缓冲区的部分或者全部写到文件。使用地址可以将工作缓冲区的指定部分写入到由文件名指定的文件中。如果不指定地址和文件,那么将整个工作缓冲区的内容写回到正在编辑的文件,并更新磁盘文件。

:[address] w[!] [filename]

:[address] w>> filename

第二种格式是向已有文件追加文本。

 

可以通过设置 vim 参数定制 vim ,使其更符合自己的需要和习惯。

vim 中设置参数:输入命令 :set parameter_name

:set incsearch

 

 

shell 初始化文件中设置参数: VIMINIT 如果使用 bash ,可以在初始化文件 ~/.bash_profile 中输入下面格式的语句:

export VIMINIT='set param1 param2 …'

export VIMINIT='set autoindent number shell=/bin/bash wrapmargic=15'

VIMINIT vim 要读的 shell 变量。

vim 初始化文件中设置参数:用户可以在自己的主目录下创建文件 ~/.vimrc ,可在该文件中设置参数。

Set param1 param2 …

>cat >~/.vimrc

set ignorecase

set number

set shell=/bin/bash

set wrapmarg-in=15

 

:set all RETURN, 编辑器将显示全部的完整列表,并给出它们当前的值。

:set RETURN ,可显示选项列表。

 

:new 打开一个新的窗口来编辑文本文件。

:open filename 在当前窗口打开文件 filename

 

vim 中执行 shell 命令

在使用 vim 时,执行 shell 命令有多种方式。输入下面命令后 RETURN 键后可派生出一个新的交互式 shell

:sh

参数 shell 用来确定派生出那个 shell ,执行往 shell 可以通过退出 shell 返回到 vim( 通常情况下 CONTROL D 或执行命令 exit)

当使用 :sh 创建一个 shell 时,要确保用户还在使用 vim

输入下面命令,可以在 vim 中执行 shell 命令行,其中 command 为要执行的命令行, RETURN 结束输入,开始命令行的执行。

:!command

vim 派生出一个新的 shell 来执行 command ,当 command 执行完毕,新派生出的 shell 将返回到编辑器的控制。

 

也可以在 vim 中执行命令,用命令的输出来替换正在编辑文件的当前行的文本。 如果不想替换任何文本,那么,执行下面命令时,首先将光标移到空白行。

!!command

注意与下面指令的区别:上条指令替换当前行,下一条指令是在当前行之后插入命令输出。

:r !command

 

:e

CONTROL+D

:ed+TAB

vim 命令提示 与 补全

When typing a : command, press CTRL-D to see possible completions.

Press <TAB> to use one completion.

 

vim 的许多命令都是在文本块上进行操作的。文本块可大可小,可以是字符,也可以是段落,可采用度量单位来指定文件块的大小。在度量单位上加入重复因子可以指定多个度量单位。

字符:可以是可见的 也可以是不可见的, (TAB SPACE 特殊字符 )

字:由一个或者多个字符组成的字符串,它两端可以为以下各元素的任意组合 : 标点符号 空格 TAB 数字和换行符 vim 将每组相连的标点符号看作是一个字。 Pear!) “The 4 个字

 

>vimtutor -e

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章