写在前面
最近准备写个linux专题,大部分都是之前学习过程的笔记,真正梳理起来,发现非常困难,因为之前的笔记并非系统学习–都是片段,笔记也比较混乱,而且linux内容确实很多范围也很广。shell可以写、命令解释可以写、awk可以写……很多很多~但在写这些之前我想先说说linux下使用比较广泛的编辑器–vim。而且我相信在linux/uinux下工作的朋友们,大部分或者全部都需要用到vim。在此我并不想写常规的应用(度娘和goooogle一堆),而是写一些应用技巧,所以我默认你使用的系统已经预装了vim并且已经配置好^_^
准备
安装
现在系统有的预装了vim,有的并没有预装。若没有预装请到官网下载喜欢的版本或者使用源自动安装(步骤略)
配置
网上也有很多前辈调试号的配置,根据自己的偏好借鉴一个
帮助
一定要会查帮助文档,吃快餐当然可以去找找前辈翻译过的文献,特别是对E文阅读有难度的同学,可以缩短学习的进程。但是我建议还是看看原版的帮助手册,毕竟前辈翻译的文献也有各有自己的理解。
linux命令有困难找”男人”–man;vim有困难找help,命令缩写:h
在vim编辑器中不熟悉split的用法可以在不退出vim的情况使用
:h split
命令中的超链接跳转:Ctrl+]
搜索命令在这里也能使用,如果想查看相关关键字的命令帮助可以直接搜索,很方便~
重复执行相同操作技巧
.命令
格式:.
模式:在正常模式下使用,即任意模式下按ESC
帮助::h .
作用:命令快速执行上一次修改动作,上次修改可以指单个字符,整行,甚至是整个文件可以理解为一个微型的宏(但和宏是有区别的详见注意部分)
样例:在文档由正常模式进入插入模式并输入insert,按ESC回到正常模式;
vim hello.txt
hello vim!
执行在文档开头插入insert,并回到正常模式。
vim hello.txt
inserthello vim!
将光标移动到o和v之间的空格上执行.命令
vim hello.txt
inserthelloinsert vim!
. 命令可以重复执行多次
注意:为什么用插入模式举例,因为还有一个需要注意的地方–在插入模式中若移动光标会充值修改状态即如果使用了上下左右这些键,会产生一个新的撤销块,会对[.]命令有直接影响,你可以用上面的例子做实验,唯一不同的操作就是在文档开头插入insert的过程中移动光标,比如你输入”in”然后向右移动一次光标即插入的结果为inhsertello vim!最后执行第三步结果为hellosert vim!
宏
概述
宏是允许将一系列的操作录制下来,通过回放的方式执行相同操作;在不同的语言和工具中都有宏的概念比如C中有宏定义,excel中也有宏……
录制宏
格式:
录制宏:q{register}……q,其中……是实际执行的action
回放宏:@{register}或者@@
模式:在正常模式下使用,即任意模式下按ESC
帮助::h q
*q* *recording*
q{0-9a-zA-Z"} Record typed characters into register {0-9a-zA-Z"}
(uppercase to append). The 'q' command is disabled
while executing a register, and it doesn't work inside
a mapping. {Vi: no recording}
q Stops recording. (Implementation note: The 'q' that
stops recording is not stored in the register, unless
it was the result of a mapping) {Vi: no recording}
作用:命令快速执行相应寄存器中的修改动作,省去枯燥重复工作。
样例:
1、在文档由正常模式按下q,随后按下a({0-9a-zA-Z”}中的任意一个字符作为寄存器的标识),vim编辑器左下角会提示recording,即开始录制操作到寄存器a中;
2、执行一组操作;
3、按ESC返回正常模式,再次按q,结束宏录制;
回放宏
格式:回放宏:@{register}或者@@
模式:在正常模式下使用,即任意模式下按ESC
帮助::h @
*@*
@{0-9a-z".=*} Execute the contents of register {0-9a-z".=*} [count]
times. Note that register '%' (name of the current
file) and '#' (name of the alternate file) cannot be
used. For "@=" you are prompted to enter an
expression. The result of the expression is then
executed. See also |@:|. {Vi: only named registers}
@@ Repeat the previous @{0-9a-z":*} [count] times.
作用:命令快速执行相应寄存器中的修改动作,省去枯燥重复工作。
样例:
1、接上例:执行@a或者num@a 其中num是执行的次数,类似11x表示执行11次x
注意:当执行过一次宏之后若再次执行也可以通过@@命令,它是指执行上一次执行的宏命令
修改宏
操作步骤复杂或者简单,都避免不了误操作,那么对于一个十几步或者更长的操作在录制过程中出错了难道要重新录制?答案是no,因为宏提供了修改机制。
1、取出寄存器中的内容,以寄存器a为例,两种方式取出
1)G跳至文本最后一行,然后使用:put {register}这里的例子为:put a
2)G跳至文本最后一行,o新建行,ESC回到正常模式,使用”{register}p这里的例子是”ap将寄存器内容粘贴到最后一行
注意:p命令户把寄存器a的内容粘贴至当前行的光标之后,而:put会将寄存器内容粘贴至当前行的下方,无论寄存器保存的是面向行的还是面向字符的文本块。
2、编辑宏内容,与正常的文本编辑一样
3、将编辑后的宏内容复制回寄存器
1)”add(或者:d a)但是这么做可能会在以后导致问题。dd命令执行面向行的删除操作,因此,寄存器会包含一个拖尾字符^J,该字符表示一个航汉服,切在大多数情况下该字符都无关既要,但有时这个拖尾字符可能会改变宏的意义,为了保险起见,用面向字符的赋值操作把这些字符从文档赋值回寄存器会更安全。
2)使用”{register}y$:复制光标所在处到行尾除回车符之外的所有字符到寄存器。要复制全行可以将光标移至行首执行”ay$,最后我们要删除该行使用dd命令
可重复操作及回退
目的
操作
重复
回退
做出一个修改
{edit}
.
u
在行内查找下一指定字符
f{char}/t{char}
;
,
在行内查找上一指定字符
F{char}/T{char}
;
,
在文档中查找下一处匹配项
/pattern
n
N
在文档中查找上一处匹配项
?pattern
n
N
执行替换
:s/target/replacement
&
u
执行一系列修改
qx{changes}q
@x
u
快速替换
1、:%s/pattern/newchars/g或者1,n s/pattern/newchars/g
2、查找执行单个替换,然后用宏或者.命令,比如cw删除当前光标位置单词并进入插入模式,输入newword按ESC,定位下一个单词位置,使用.命令即可重复替换
注意:快速查找可以使用*:查找光标当前位置所在的关键字
命令模式
在按下: 键时,Vim 会切换到命令行模式。这个模式和shell 下的命令行有些类似,我们可以输入一条命令,然后按 执行它。在任意时刻,我们都可以按键从命令行模式切换回普通模式。
Ex命令
在命令行模式中执行的命令又被称做 Ex 命令,Vim 为几乎所有功能都提供了相应的Ex 命令可以通过:h ex-cmd-index查看
|:!| :! filter lines or execute an external command
|:!!| :!! repeat last ":!" command
……
|:xunmenu| :xunme[nu] remove menu for Visual mode
|:yank| :y[ank] yank lines into a register
|:z| :z print some lines
|:~| :~ repeat last ":substitute"
其中操作缓冲区文本的 Ex 命令
命令
用途
:[range]delete [x]
删除指定范围内的行[到寄存器x中]
:[range]yank [x]
复制指定范围的行[到寄存器x中]
:[line]put [x]
在指定行后粘贴寄存器x中的内容
:[range]copy {address}
把指定范围内的行拷贝到{address}所指定的行之下
:[range]move {address}
把指定范围内的行移动到{address}所指定的行之下
:[range]join
连接指定范围内的行
:[range]normal {commands}
对指定范围内的每一行执行普通模式命令{commands}
:[range]substitute/pattern/string/[flags]
把指定范围内出现{pattern}的地方替换为{string}
:[range]global/{pattern}/[cmd]
对指定范围内匹配{pattern}的所有行,在其上执行Ex 命令{cmd}
范围选取
Ex 命令的地址及范围的符号
符号
地址
n
文件的第n行
$
文件的最后一行
0
虚拟行,位于文件第一行上方
.
光标所在行
‘m
包含位置标记m的行
‘<
高亮选区的起始行
‘>
高亮选区的结束行
%
整个文件(:1,$的简写形式)
用行号作为地址
如果输入一条只包含数字的Ex 命令,那么 Vim 会把这个数字解析成一个地址,
并把光标移动到该数字所指定的行上
:10会调到10行
:10p跳到10行并打印
用地址指定一个范围
格式:
:{start},{end} ex
eg:
:2,5p
%
代表当前文章中所有行
用高亮选区指定范围
高亮文本,进入命令模式,命令行上就会预先填充一个范围:’
用模式指定范围
:/startString/,/endString/p
用偏移对地址进行修正
格式:
:{address}+n
eg:
:/startString/+1,/endString/p 其中匹配的行号是可以进行数学加减运算的
当前行.
.代表当前行
:2
:.,.+3p //实际操作为2-5行
复制和移动
:copy(简写:t或者:co)
:move(简写:m)
格式:
:[range]copy {address}
:[range]move {address}
eg:
命令
用途
:6t.
把第6 行复制到当前行下方
:t6
把当前行复制到第6 行下方
:t.
为当前行创建一个副本(类似于普通模式下的yyp)
:t$
把当前行复制到文本结尾
:’t0
把高亮选中的行复制到文件开头
执行普通命令
:normal 命令可以执行任意的普通模式命令
eg:
Vim 在文件每行的结尾都添加一个分号。在做此修改时会切换到插入模式,但是在修改完后Vim 会自动返回到普通模式。
:%normal A;
插入注释:
:%normal i//
注意:如果想要重复执行上次的普通模式命令用.命令;若要重复执行上次的Ex命令需要用@:
:寄存器总是保存着最后执行的命令行命令
在遍历缓冲区列表的条目时非常有用,用:bn[ext] 可以在列表中逐项正向移动,而:bp[revious] 命令则进行反向移动
vim中运行shell命令
:!{cmd}
:!ls
:!{cmd} 这种语法适用于执行一次性命令,但是如果想在 shell 中执行几条命令就需要:shell 命令来启动一个交互的 shell 会话(:h :shell)
:shell 命令是 Vim 提供的一个功能,它可以让我们切换到一个交互 shell 中。但是,如果Vim 自身是在终端中运行的话,那么我们也能直接访问终端内置的 shell 命令
*注意* 把缓冲区内容作为标准输入或输出
在用:!{cmd}时,Vim 会回显{cmd} 命令的输出。如果命令的输出很少或没有输出,这工作得很好;但如果命令会产生大量输出,这样回显用处不大。另外一种做法是我们可以用:read !{cmd} 命令,把{cmd} 命令的输出读入当前缓冲区中
:write !{cmd} 做相反的事。它把缓冲区内容作为指定{cmd} 的标准输入(参见:h :write_c)
命令
用途
:shell
启动一个shell (输入exit 返回Vim)
:!{cmd}
在shell 中执行{cmd}
:read !{cmd}
在shell 中执行{cmd} ,并把其标准输出插入到光标下方
:[range]write !{cmd}
在shell 中执行{cmd} ,以[range] 作为其标准输入
:[range]!{filter}
使用外部程序{filter} 过滤指定的[range]
未完待续……