`
ninghuan
  • 浏览: 9106 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

Vim 学习笔记

    博客分类:
  • Vim
阅读更多
引用
曾经尝试过学习 Vim 和 Emacs, 都没坚持几分钟, 一直都在用 Eclipse/Netbeans/Komodo Edit, 刚无聊玩了下Emacs, 没弄明白, 又玩了下Vim, 感觉 快记下来


显示行号, 配置文件还不知道怎么改
:set nu

运行命令
:!command

:tabnew 新 Tab,

i 插入模式, o/O 所在行下/上方插入行, a/A 光标后/当前行末尾插入,

r+X, 用 X 替换当前字符,

(x) + Shift-G 跳转到该行, (x)行出错了? 跳过去

:r file, 插入别的文件内容到光标位置后, 小模板应该不错, :read 缩写?


移动(上下左右): (x)jkhl, 到单词末尾(包括/不包括空格): w/e, 当行末 $,

:wq!

删除字符 x; 删除行 dd, 删除单词 dw(超强大), 删除到行末 d$,
撤销 u/U, Ctrl-Z/Ctrl-R
将删除插入到光标之后 p,



vimrc, 只在第一行插入了 set nu 别的还不熟悉

:edit ~/.vimrc UNIX
:edit $VIM/_vimrc WINDOWS

:read $VIMRUNTIME/vimrc_example.vim
  • 大小: 170 KB
  • 大小: 66.1 KB
  • 大小: 82.3 KB
分享到:
评论
2 楼 ninghuan 2009-05-20  
vim多窗口之奇妙境界

参考资料:http://www.linuxpk.com/doc/vim/usr_08.html#usr_08.txt

准备创建一个新文件
$ vim 1.txt

创建一个新文件(会在屏幕的上方开一个新的窗口)
: new 2.txt

再创建一个新的文件(会在屏幕的上方左侧再开一个窗口)
: vsplit 3.txt

切换到文件1.txt的区域

按下CTRL+WW
再按,知道光标进入 1.txt的编辑区域即可

再创建一个新的文件(这个文件将把1.txt的编辑区域给分成两块)
: split 4.txt

如果想关闭某个窗口,按下CTRL+WW切换过去,然后
: close
最后一个只能退出哦
:q

总结:
new 创建新窗口
split 水平分割窗口
vsplit 垂直分割窗口
close 关闭窗口
CTRL+WW 跳转到其他窗口

okay. 好好玩!更多有意思的东西,看vim的手册
$ vimtutor
或者看这个
http://www.linuxpk.com/doc/vim/

---------------------------
补充一个重要的东西:如何恢复文件

假如你正在编辑一个文件,不小心强制退出了vim的编辑窗口(可能是你按了CTLL+C,也可能是机器慢得要死,你关掉了,也可能是突然掉电),那么,vim会给你保存一个用于恢复的隐藏文件,这个文件有个.swap后缀。如果发现你在退出之前做过的修改没有保存,那么请不要担心,用下面的方法可以恢复。

打开的时候加个-r参数,并保存
$ vim -r file_name
:w

之后,删除这个隐藏文件 .file_name.swap,下次就不会再提示你恢复啦,记得隐藏文件是以 . 开头的。
1 楼 ninghuan 2009-05-20  
VIM高级命令集锦

原帖地址:http://www.linuxsir.org/bbs/showthread.php?threadid=46167
(为方便记忆,falcon有补充,见大部分括号里的内容,建议对着后面几楼的VIM键盘图和一张速记图练习,勤学苦练终有成效!)

(在命令行下输入: vim 文件名, 开始执行下面的操作,文件里头最好有些内容)

1.交换两个字符位置
xp (x是把当前字符删除掉,p是复制一下,自然就跟后面的字符交换位置啦)

2.上下两行调换
ddp (这个类似上面,dd是删除当前行,p是复制,自然就把前后两行替换啦)

3.把文件内容反转
:g/^/m0/ (貌似第一行替换不了,你在某行执行一下:mN N为行号,看看是不是当前行跑到第N行啦[所以:mN大概是把当前行移动到指定行吧],g是扩展命令到全文,也就是说,对后面所有包含有^[行首哦,很抽 象吧]的行,都m0一下,你想想是啥效果,自然是后面的行都跑到前面去啦,仔细想想 :g/./m0/ 的效果应该一样,.可以匹配任意的字符哦,即包含有任意字符的行都要执行m0)

4.上下两行合并
J (字母j的大写哦)

5.删除所有行
dG (d是删除,G代表行末,实际上删除当前位置之后的所有行啦)

6.从当前位置删除到行尾
d$ ($是行尾,那就是删除到行尾罗,如果要删除第几行到第几行呢 :n,md,如果要删除从当前开始的几行呢 ndd)

7.从当前位置复制到行尾
y$ 如果要粘贴到其他地方 p 就可以了(y是用来粘贴的,类似d命令,如果要粘贴几行可以nyy)

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

8.
:ab string strings
例如 ":ab usa United States of America" ,
当你在文见里插入 usa 时
United States of America 就蹦出来了(如果有些东西太长懒得写,这样挺好)

9.
:map keys new_seq
定义你当前 键盘命令 (很多快捷方式就是map出来的)

10.
:set [all]
vi or ex 的编辑状态
如 显示每行 :set nu (显示行号啦,不过要保存行号的话,可以用nl或者cat -n来显示文件,然后重定向,如果要用nl显示空行的话,要加-b a 参数呢)

11.
在命令状态下,nyy表示拷贝从光标行起的下n行内容,p表示paste,可刚复制的内容粘贴在光标处的
下面。

12.
单个字符替换用r,覆盖多个字符用R,用多个字符替换一个字符用s,整行替换用S

13.

:%s/old_word/new_word/g
这个指令是于在整个文件中替换特定字符串
(如果只想替换某个范围内的字符呢,有两种灵活的办法:第一种是把上面的%换成指定行N或者一个行的范围N,M,另外一种是先切换到可视模式[按下 ESC,然后按下V],然后用光标和方向键选中一片文本,然后执行上面的命令, hello,有个重要的内容得提示一下,/只是个分界符,你可以换成你感兴趣的或者方便的,比如#,对啦,如果old_word或者new_word里头 有/,得加上\转义一下,否则vim的解释器就莫名其妙啦,不过方便些,就把分界符换成#好啦。)

14.光标控制(所以,如果不小心把键盘上的方向键砸坏了,不用担心vim用不了)

k:上移 nk 上移n行
j:下移 nj 下移n行
h: 左移
l: 右移


将光标移到第n行,按下 mk
将光标移到第m行,按下 "ay'k
即将第n到m的行存到a寄存器,以此类推,b,c........寄存器等

这样就可以将你常用的需要复用的内容粘贴到不同的寄存器中以备用


想粘贴到某处,直接将光标移到某地,按下 'ap 即可,以此类推,b,c........寄存器等

在当前屏幕中
H 跳到第一行
M 跳到中间一行
L 跳到最后一行

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 使用,反方向重复一次


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 的环境选项 , 以上均测试过


18.标记文本

mchar 用字母char标记当前光标的位置
`char 移至char所标记处
'char 移至char标记所在行的开头处
" 移至当前行上一次所在位置(在光标移动之后)――一个双引号
'' 移至当前行上第一次所在位置的行的开头处(在光标移动之后)――两个单引号
(感觉某个地方有意思,先按下ESC,用"m字符"标记一下,随时想回去看看,用`或'加上m后的字符,对啦,是不是还没介绍跳到指定行号的行呢,按下 ESC,再按下":行号",或者用vim打开的时候:vim +行号 文件,这个很有用呢,在编译的时候编译器告诉我们哪行有语法错误啦,这样就很快定位到出错的行啦)

19.
同时vi多个文件时,CTRL-SHIFT-6回到上一个文件,在本次vi的文件和上次vi的文件之间切换。
但是我发现一个BUG:在用CTRL-SHIFT-6切换到上一个文件后,用:args查看多文件vi状态时,
屏幕底部仍然显示目前vi的是刚才的文件。
(在HP-UX,Solaris,AIX上通过)

也可以使用:
:e#
进行切换

20.在文本前/后加内容

在文本前加东西
%s/^/要加的内容/g (如要注释一片字符,可以选中一片内容,然后替换前导字符为#, 按下ESC,按下字母v,移动光标选中一片字符,然后按下: vim会自动补'<,'>,我们再加s/^/#/g就okay,如果在C语言里头要注释一片内容,想想怎么弄?)

在文本后加东西
%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

(其实这个命令最管用, "cat 带有控制字符的文件 | col -b" ,非常感谢sigsegv11师兄,呵呵)

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

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

(sed强大得让我不好意思,适合于字符串替换等操作,如果想熟悉的话,先了解下正则表达式;如果是替换单个字符,用tr哦。这里有篇资料很不错建议看看:http://www.ibm.com/developerworks/cn/linux/shell/sed/sed-1/index.html)

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 -c 2
9 done
10 done

(怎么都开始讲shell啦,cat命令是显示文本的,grep用来查询字符串的[非常伟大的一个东西],read是读取一行的,while...do... done和for.in...do...done是循环结构,"ping -c N ipaddress"是给某个地址发几个数据包,awk同样是个非常伟大的家伙,用来处理文本数据库,很厉害)

24

到前一个函数[[ ,到下一个函数]] ,括号配对% ,交叉参考Ctrl_] (事先用ctags -R做索引),回来用e# ` 编辑一个函数:vi -t 函数名 ,编辑加密文本vi -X
(阅读源代码的利器,当然cscope基于ctags,自然是处于蓝,胜于蓝的啦,想学习,看手册吧,或者快速入门:
A. 到一个源代码的目录结构下cscope -Rbkq,生成索引
B. 打开vim,执行 : help cs-find,看看帮助,自然就知道怎么用啦)

25
在插入模式下ctrl+p,自动补齐剩余单词,以赖规则:tags,以有的单词等等
(恩,懒鬼的利器)

相关推荐

Global site tag (gtag.js) - Google Analytics