vi高级应用

vi高级应用

linux 2008-10-29 23:33:53 阅读39 评论0   字号: 订阅

 

find ./ -name "*.doc" -exec rm {} /;



2,用find , grep, xargs 的组合

 find | grep .doc$ | xargs -i rm {}



  看上去,第一个简单一些,但很类似,不过如果要实现:
  删除那些没有指定后缀的文件,那用find的时候,文件名的匹配,似乎要麻烦一些,而用后者就来得很轻松。

find | grep -v .doc$ | xargs -i rm {}

 

1.交换两个字符位置
xp
其实就是删除光标当前字符(x),然后再将缓存的字符贴出(p)

2.上下两行调换
ddp
实际就是(dd)删除当前行,(p)后即将缓存的行贴出

3.把文件内容反转
:g/^/m0
找到每一行,然后m移动到当前第一行的上面

4.上下两行合并
J
实用性:高,shift+j

5.删除所有行
dG
(d)为删除,(shift+g)到文件尾,因此这命令效用为从光标处删除至文件尾
那么删除到文首呢?对了,如果知道gg可以将光标移至文首,那么dgg便是删除到文首了
类似的还有:
dw -- 删到词尾
db -- 删到词头
daw -- 删除光标所在词(较有用)

如果你用 "c" 代替 "d",这会变成修改命令;而改用 "y",则变成拷贝命令,等等等等。

6.从当前位置删除到行尾
d$
(d)删除,$ (即 shift+4)为行尾,^( 即 shift+6)为行头,依此类推,d^删除至行头
更为简洁的命令为D,对了,就是shift+d,就这么简单

7.从当前位置复制到行尾
y$ 如果要粘贴到其他地方 p 就可以了
同上

由于vi 是建立在 EX 上的 所以 当键入 : 时就来到了 EX 命令状态

8.
:ab string strings
例如 ":ab usa United States of America" ,
当你在文件里插入 usa 时
United States of America 就蹦出来了
其实执行的是":abbreviate"命令,用":unabbreviate"命令解除缩写,要删除全部缩写用":abclear"

9.
:map keys new_seq
定义你当前 键盘命令
键映射,我前面的tips有用到

10.
:set [all]
vi or ex 的编辑状态
如 显示每行 :set nu
set,就是set,不显示行号":se nonu"

11.
在命令状态下,nyy表示拷贝从光标行起的下n行内容,p表示paste,可刚复制的内容粘贴在光标处的
下面。
讲的太不清楚了,n用数字代替,即将后面的指令重复执行n次,yy为复制,nyy复制n行

12.
单个字符替换用r,覆盖多个字符用R,用多个字符替换一个字符用s,整行替换用S
实用性:高,S等于我常用的cc或C

13.
:%s/old_word/new_word/g
这个指令是于在整个文件中替换特定字符串
替换,用法是这样:":起始行,结束行s/搜索串/替换串/gc" 从起始行到结束行,把所有的搜索串替换为替换串,最后那个"c"为开启交互式替换,%为全文

14.光标控制
k:上移 nk 上移n行
j:下移 nj 下移n行
光标移动,还有h:左移  l:右移,不过我更喜欢用上、下、左、右,嘿嘿

将光标移到第n行,按下 mk
将光标移到第m行,按下 "ay'k
即将第n到m的行存到a寄存器,以此类推,b,c........寄存器等
这样就可以将你常用的需要复用的内容粘贴到不同的寄存器中以备用
想粘贴到某处,直接将光标移到某地,按下 'ap 即可,以此类推,b,c........寄存器等

在当前屏幕中
H 跳到第一行
M 跳到中间一行
L 跳到最后一行
当前屏幕的光标控制技巧,助记方法为:Head、Middle、Last

15.
表8-2 删除命令
删除命令操作
d l 删除当前字符(与x命令功能相同)
d 0 删除到某一行的开始位置
d ^ 删除到某一行的第一个字符位置(不包括空格或TA B字符)
d w 删除到某个单词的结尾位置
d 3 w 删除到第三个单词的结尾位置
d b 删除到某个单词的开始位置
d W 删除到某个以空格作为分隔符的单词的结尾位置
d B 删除到某个以空格作为分隔符的单词的开始位置
d 7 B 删除到前面7个以空格作为分隔符的单词的开始位置
d) 删除到某个语句的结尾位置
d 4) 删除到第四个语句的结尾位置
d( 删除到某个语句的开始位置
d } 删除到某个段落的结尾位置
d { 删除到某个段落的开始位置
d 7 { 删除到当前段落起始位置之前的第7个段落位置
d d 删除当前行
d /t e x t 删除从文本中出现" t e x t"中所指定字样的位置,一直向前直到下一个该字样所出现的
位置(但不包括该字样)之间的内容
d fc 删除从文本中出现字符"c"的位置,一直向前直到下一个该字符所出现的位置(包括
该字符)之间的内容
d tc 删除当前行直到下一个字符" c"所出现位置之间的内容
D 删除到某一行的结尾
d $ 删除到某一行的结尾
5 d d 删除从当前行所开始的5行内容
d L 删除直到屏幕上最后一行的内容
d H 删除直到屏幕上第一行的内容
d G 删除直到工作缓存区结尾的内容
d 1 G 删除直到工作缓存区开始的内容

修改命令操作
c l 更改当前字符
c w 修改到某个单词的结尾位置
c 3 w 修改到第三个单词的结尾位置
c b 修改到某个单词的开始位置
c W 修改到某个以空格作为分隔符的单词的结尾位置
c B 修改到某个以空格作为分隔符的单词的开始位置
c 7 B 修改到前面7个以空格作为分隔符的单词的开始位置
c 0 修改到某行的结尾位置
c) 修改到某个语句的结尾位置
c 4) 修改到第四个语句的结尾位置
c( 修改到某个语句的开始位置
c } 修改到某个段落的结尾位置
c { 修改到某个段落的开始位置
c 7 { 修改到当前段落起始位置之前的第7个段落位置
c tc 修改当前行直到下一个字符c所出现位置之间的内容
C 修改到某一行的结尾
c c 修改当前行
5 c c 修改从当前行所开始的5行内容

.重复上一次修改!

表8-4 替换命令
替换命令操作
s 将当前字符替换为一个或多个字符
S 将当前行替换为一个或多个字符
5 s 将从当前字符开始的5个字符替换为一个或多个字符

vi替换使用规则:
:g/s1/s/s2/s3/g
第一个g表示对每一个包括s1的行都进行替换,第二个g表示对每一行包括s1的行所有的s2都用s3替换
s表示替换,s2是要被替换的字符串,他可以和s1相同(如果相同的话用//代替),s3是替换字符串


16.
fx
往右移动到 x 字符上
Fx
往左移动到 x 字符上
tx
往右移动到 x 字符前
Tx
往左移动到 x 字符后
(注意:以上四个命令中,其中x是键入的字符)
;
分号,配合 f 和 t 使用,重复一次
,
逗号,配合 f 和 t 使用,反方向重复一次
如果不结合;与,很不好用,nfx为移到第n个x字符上

17. vi 环境选项 Solaris ksh

noautoindent nomodelines noshowmode
autoprint nonumber noslowopen
noautowrite nonovice tabstop=8
nobeautify nooptimize taglength=0
directory=/var/tmp paragraphs=IPLPPPQPP LIpplpipnpbtags=tags /usr/lib/tags
noedcompatible prompt tagstack
noerrorbells noreadonly term=vt100
noexrc redraw noterse
flash remap timeout
hardtabs=8 report=5 ttytype=vt100
noignorecase scroll=11 warn
nolisp sections=NHSHH HUuhsh+c window=23
nolist shell=/bin/ksh wrapscan
magic shiftwidth=8 wrapmargin=0
mesg noshowmatch nowriteany

For C-Shell:
setenv EXINIT "set nu"
For Bourne or Korn Shell:
EXINIT="set nu"; export EXINIT
For Korn Shell Only (alternate method):
typeset -x EXINIT="set nu"
在 .profile 里设置 vi 的环境选项 , 以上均测试过
以上的查阅vim帮助文档,太多了不一一解释了

18.标记文本

mchar   用字母char标记当前光标的位置
`char   移至char所标记处
'char   移至char标记所在行的开头处
"     移至当前行上一次所在位置(在光标移动之后)――一个双引号
''    移至当前行上第一次所在位置的行的开头处(在光标移动之后)――两个单引号0.
头两个和最后一个就已经挺好用的了

19.
同时vi多个文件时,CTRL-SHIFT-6回到上一个文件,在本次vi的文件和上次vi的文件之间切换。
但是我发现一个BUG:在用CTRL-SHIFT-6切换到上一个文件后,用:args查看多文件vi状态时,
屏幕底部仍然显示目前vi的是刚才的文件。
(在HP-UX,Solaris,AIX上通过)
也可以使用:
:e#
进行切换
ctrl+shift+6=:e#回到上一个文件,哇哈哈,终于找到了,对应的是:next简写为:n到下个文件,用files貌似更能看清当前打开的文件列表

20.
sco 下VI 要在文本前同样的字符加用
%s/^/要加的内容/g 要在文本后同样的字符加
%s/$/要加的内容/g
汗,这样利用查找替换

21.
如何去掉文本中的 ^M 硬回车?不必用binary传回去再ascii传回来的方式,用shell或者unix语句实现。

cat filename |tr -d '/015' >newfile
不同的unix系统还存在一些其他不同的命令,如:doscp
sed 也可以实现这个功能.

dos2unix filename filename2
反之
unix2dos filename filename2

在vi 中用:$s/^M//g
^是crtl-V crtl-M
我常用的是dos2unix

22.如何在"unix命令行"下将一个文件的某字符串用另一个串换掉

sed 's/string1/string2/gp' file1 > file2


23.将/etc/hosts下所有的地址都ping 2次

1 #/usr/bin/sh
2 #grad /etc/hosts and ping each address
3 cat /etc/hosts|grep -v '^#' | while read LINE
4 do
5 ADDR=`awk '{print $1}'`
6 for MACHINE in $ADDR
7 do
8 ping $MACHINE -n 2
9 done
10 done

24.
到前一个函数[[ ,到下一个函数]] ,括号配对% ,交叉参考Ctrl_] (事先用ctags做索引),回来用e# ` 编辑一个函数:vi -t 函数名 ,编辑加密文本vi -X
%括号匹配我介绍过,:e#回来可以用ctrl+o替代,更优雅

25.
在插入模式下ctrl+p,自动补齐剩余单词,以赖规则:tags,以有的单词等等
还ctrl_n呢

 
  • 在编辑模式下,可通过gqap命令对注释自动断行(每行字符个数可通过命令模式下的"set textwidth=个数"设定)
  • 命令模式下输入数字可以直接跳到指定行,也可在打开文件时用“vim +数字 文件名”实现相同的功能。
  • 命令模式下的TOhtml命令可把C语言输出为html文件,结合syntax on,可产生比较好的web page把代码发布出去。
  • 先切换到可视模式(编辑模式下按字母v可切换过来),用光标选中一片代码,然后通过命令模式下的命令“s#^#//#g"把某一片代码给注释掉,这非常方便调试某一片代码的功能。
  • 命令模式下的”set paste“可解决复制本来已有缩进的代码的自动缩进问题,后可执行”set nopaste“恢复自动缩进。
  • 为了使用最新的vim特性,可用"set nocp"取消与老版本的vi的兼容。
  • 如发现变量命名不好,想在整个代码中修改,可在命令模式下用"%s#old_variable#new_variable#g"全局替换。替换的时注意变量名是其他变量一部分的情况。
  • 如果想把缩进和TAB键替换成空格,可考虑设置expandtab,即“set et”,如果要把以前编写的代码中的缩进和TAB键都替换掉,可以用retab。
  • 为实现关键字补全,输入一部分字符后,按下CTRL+P即可。比如先输入prin,然后按下CTRL+P就可以补全了。
  • 如果想在在编辑模式下查看Linux手册,可把光标定位到在某个函数,按下Shift+k就可以调出man,很有用。
  • 删除空行,在命令模式下输入g/^$/d,前面g命令是扩展到全局,中间是匹配空行,后面d命令是执行删除动作。用替换也可以实现,键入%s#^/n##g,意思是把所有以换行开头的行全部替换为空。类似地,如果要把多个空行转换为一个可以输入g/^/n$/d或者%s#^ /n$##g。
  • 注意使用一些有用的插件,比如ctags, cscope等,可以提高代码阅读、分析的效率。特别是open source的东西。
  •  

    你可能感兴趣的:(c,unix,shell,Solaris,dos,vim)