2008年3月18日星期二

Vim : vi improved 笔记

配置注记 Customizing the Editor
可以在文件末尾搞一行
/* vim: set expandtabs : */
用vim编辑该文件的时候会自动读入为临时的配置。
set paste一般可以在粘贴的时候格式正常点。
:set pastetoggle= 设置paste选项切换的按键为F12。
:set wildignore=*.o,*.bak设置通配符匹配时忽略.o跟.bak类型的文件。
一些:命令Complete Command-Mode (:) Commands
:/beach/+1, /seashore/-1 delete 删除/beach/跟/seashore/之间夹的所有行。
:1,3 copy 4 把第1行到第3行的内容拷到第4行之后。
:1,3 move 4 把第1行到第3行的内容移到第4行之后。
:%s/abc/efg/p 后面的p修饰符指示打印出有被修改的行。
:&表示重复上一条:s替换指令。
:&g表示重复上一条:s替换指令,并且修饰符为g。
:@:重复上一条:指令。
:@@重复上一条:@register指令。
:5put a把寄存器a里的内容放到第五行后面。
:5put !a把寄存器a里的内容放到第五行前面。
:100ka在第100行处做标记a。
:normal cwDONE 下一个正常模式的指令。


查看帮助
字符替换
r替换单字符,比如5rz就是从光标处开始把连续5个字符都换成z。
但如果是5r,光标处5个字符只会被替换成一个换行符。
假设abcdefg初始光标在处:
如果是5rz:
azzzzg
如果是5r:
a
g
调用外部程序对文本块进行过滤
就是调用外部程序处理当前文本块,然后用处理后输出的内容替换之前的文本块。
比如:
!10Gsort
就是调用sort排序当前行到第10行的文本块。
!!date
则是将当前行内容替换为外部程序date的输出内容。
分割窗口编辑新文件时顺便找找关键字
:split +/printf three.c
相当于分割出一个新窗口编辑three.c,并将光标定位到其中第一个printf出现的地方。
指定分割窗口的行数
:3 split alpha.c
割出一个高为3行的窗口用于编辑alpha.c。
而split的命令格式为:窗口大小 split +命令 文件名
:count split +command file
查找宏or变量的定义
[CTRL-I, ]CTRL-I
跳到下一个光标所在的词出现的地方,除了当前文件外,#include包含的文件也会进去查。
[CTRL-I是从文件首部开始找
]CTRL-I是从当前光标处开始往下找
gd, gD
gd是查找光标所在的本地变量定义点
gD是查找光标所在的全局变量定义点
]CTRL-D, [CTRL-D
]CTRL-D是查找光标所在的宏的下一个定义点
[CTRL-D是查找光标所在的宏的上一个定义点
]d, [d, ]D, [D
[d是查找光标所在的宏的首个定义点
]d是查找光标所在的宏的下个定义点
[D是从头开始列出光标所在的宏的所有定义
]D是从当前开始列出光标所在的宏的所有定义
查看man手册
假设光标所在的词为mkdir。
K:等价于man mkdir
2K:等价于man 2 mkdir
ascii/16进制/8进制码
正常模式下显示光标所在字符的ascii/16进制/8进制码:
ga

移动文本 Moving Text
将希望移动的文本块首行和末行分别标记为a,b。
光标移到你想放置的新位置上,执行:
:'a,'b move .
以单个词为单位的跳转 Move to the End of a Word
针对words:
w:往前->跳到单词首部
e:往前->跳到单词尾部
b:往后<-跳到单词首部
ge:往后<-跳到单词尾部
还有B,E,gE啥的,主要是针对WORDS
The term word means a string of characters defined by the 'iskeyword' option.The
term WORD means any sequence of non-whitespace characters.
重复单字符搜索
比如用fx查当前行的x字符。
;是往前->继续查
,是往后<-继续查
光标移动记录
:jump查看光标移动记录列表
CTRL-O光标跳转到移动记录列表中上一个位置
光标跳转到移动记录列表中下一个位置
当前窗口光标移动
H:光标移动到当前窗口首行
2H:光标移动到当前窗口第2行
M:光标移动到窗口中部的行
L:光标移动到当前窗口末行
2L:光标移动到当前窗口倒数第2行
滚动窗口
CTRL-Y:往上滚1行
CTRL-E:往下滚1行
CTRL-U:往上滚半屏
CTRL-D:往下滚半屏
CTRL-B:往上滚一屏
CTRL-F:往下滚一屏
调整视窗
z<Enter>将当前行调整为窗口首行,光标移到行中首个非空字符处
zt将当前行调整为窗口首行,光标在行中的位置不变
z-将当前行调整为窗口末行,光标移到行中首个非空字符处
zb将当前行调整为窗口末行,光标在行中的位置不变
z.将当前行调整为窗口正中,光标移到行中首个非空字符处
zz将当前行调整为窗口正中,光标在行中的位置不变
大小写切换
~切换光标处单个字符的大小写
3g~l切换光标开始3个字符的大小写
g~fx切换光标开始直到第一个字符x的大小写
g~~切换整行字符的大小写
gUU整行切换成大写

尽可能少吃字符 Repeating as Little as Possible \{-}
在成功匹配的前提下尽可能少吃字符
例子:
a\{-}与a*相对,a*是尽可能多吃字符
a\{-,5}
a\{-3,5}
本地标记&全局标记
a-z是本地标记,比如在file1某处ma,在file2某处ma,二者是独立的。
A-Z是全局标记,比如在file1某处mA,现在在file2下面'A,就会跑回file1的A标记处。
插入模式下的文本输入
CTRL-U:删除当前行中光标左边<-的所有内容
CTRL-W:删除当前行中光标左边<-的一个词
CTRL-Left:光标移到左边<-最近的一个词
CTRL-Right:光标移到右边->最近的一个词
CTRL-Home:光标移到文件开头
CTRL-End:光标移到文件末尾
CTRL-A:输入上回输入的内容
CTRL-@:输入上回输入的内容,并退出编辑模式
CTRL-Y:输入光标处上一行的字符
CTRL-E:输入光标处下一行的字符
CTRL-R a:输入寄存器a内的内容
CTRL-O dw:转为正常模式执行dw指令,然后返回插入模式
指定=代码格式化时调用的外部程序
:set equalprg=/usr/local/bin/indent
此后调用=时,会用indent整理代码,而不是用vim内置的格式化工具。
可视模式选中内容 Repeating a Visual Selection
gv重复选中上次选中的内容(正常模式也可用)
aw选中下一个词,后面有空格也选上
2aw选中下两个词,后面有空格也选上
iw选中下一个词,后面有空格不算
2iw选中下两个词,后面有空格不算
as/is类似aw/iw,不过是选句子
ap/ip是选段落。
还有a(/a[/a{/a<一堆,类推之
o是使得光标在选中区域的起点和终点间来回切换
O是使得光标在块选中区域中当前行的起点和终点间来回切换
光标位置跳转
CTRL-O:光标跳到列表中上一个位置
CTRL-I:光标跳到列表中下一个位置
设置make调用的程序
gf根据光标所指文件名打开文件
set makeprg=nmake指定输入:make命令时执行nmake
假设当前编辑的文件为file.c
set makeprg=make\ %使得输入:make命令时执行make file.c
set makeprg=make\ %:r.o使得输入:make命令时执行make file.o
文件名相关
% 当前文件名
光标所在处文件名
一些文件名相关的修饰符:
:p 将文件名转为绝对路径
:~ 将绝对路径转为缩写的版本
:. 在可能的情况下把路径转为当前目录的相对路径
:h 取出目录路径
:t 取出单独的文件名
:r 取出单独的、不含扩展名的文件名
:e 取出文件扩展名
可以用:echo expand("%:r")测试看看

命令批处理 Executing Vim in a Script or Batch File
vim -e -s -c "%s/1/2g" -c "wq" file
vim -es file < script.vim
-e 表示以命令模式执行-c的命令
-s 表示安静执行,不提示信息。
script.vim的内容可以类似:
:%s/aaa/bbb/g
:wq
vim -w script file
vim -W script file
-w表示将编辑file时输入的命令写入script文件,如果script之前内容不为空,则进行内容添加。
-W表示将编辑file时输入的命令写入script文件,如果script之前内容不为空,则进行内容覆盖。
vim -s script file
-s 表示以正常模式执行-w录制得到的script中的命令
注:script中的回车会使光标下移一行

函数跳转
假设已经用ctags -R *.c生成了tags文件。
:tag foo是跳转到foo函数定义处。
:tags是列出已经跳转的路径。
:tag是往前跳,:2tag是往前跳两步。
CTRL-]是往前跳,2CTRL-]是往前跳两步。
CTRL-T是往回跳,2CTRL-T是往回跳两步。
:tag /^foo是跳转到以foo开头的函数定义处(正则匹配)。
:tselect foo是列出名字包含foo的所有函数,列完后会让你挑到底要跳到哪里去。
与tselect结果相关的跳转命令还有trewind,tlast,tnext,tprevious那些。

自动补齐
一般补齐:
CTRL-P往后查找补齐
CTRL-N往前查找补齐
以CTRL-X开始后面再加修饰符的话可以限制补齐的内容:
CTRL-D 宏定义
CTRL-F 文件名
CTRL-K 目录
CTRL-I 当前文件及#include的文件
CTRL-L 一整行
CTRL-] 标签
输入CTRL-X之后还可以用CTRL-Y/CTRL-E把屏幕上下滚一滚。

g CTRL-G可以看当前文件的行,列,单词数,字符数,字节数。


查找宏or变量的定义
[CTRL-I, ]CTRL-I
跳到下一个光标所在的词出现的地方,除了当前文件外,#include包含的文件也会进去查。
[CTRL-I是从文件首部开始找
]CTRL-I是从当前光标处开始往下找
gd, gD
gd是查找光标所在的本地变量定义点
gD是查找光标所在的全局变量定义点
]CTRL-D, [CTRL-D
]CTRL-D是查找光标所在的宏的下一个定义点
[CTRL-D是查找光标所在的宏的上一个定义点
]d, [d, ]D, [D
[d是查找光标所在的宏的首个定义点
]d是查找光标所在的宏的下个定义点
[D是从头开始列出光标所在的宏的所有定义
]D是从当前开始列出光标所在的宏的所有定义

ascii/16进制/8进制码
正常模式下显示光标所在字符的ascii/16进制/8进制码:
ga

移动文本 Moving Text
将希望移动的文本块首行和末行分别标记为a,b。
光标移到你想放置的新位置上,执行:
:'a,'b move .
以单个词为单位的跳转 Move to the End of a Word
针对words:
w:往前->跳到单词首部
e:往前->跳到单词尾部
b:往后<-跳到单词首部
ge:往后<-跳到单词尾部
还有B,E,gE啥的,主要是针对WORDS
The term word means a string of characters defined by the 'iskeyword' option.The
term WORD means any sequence of non-whitespace characters.
重复单字符搜索
比如用fx查当前行的x字符。
;是往前->继续查
,是往后<-继续查
光标移动记录
:jump查看光标移动记录列表
CTRL-O光标跳转到移动记录列表中上一个位置
光标跳转到移动记录列表中下一个位置
当前窗口光标移动
H:光标移动到当前窗口首行
2H:光标移动到当前窗口第2行
M:光标移动到窗口中部的行
L:光标移动到当前窗口末行
2L:光标移动到当前窗口倒数第2行
滚动窗口
CTRL-Y:往上滚1行
CTRL-E:往下滚1行
CTRL-U:往上滚半屏
CTRL-D:往下滚半屏
CTRL-B:往上滚一屏
CTRL-F:往下滚一屏
调整视窗
z<Enter>将当前行调整为窗口首行,光标移到行中首个非空字符处
zt将当前行调整为窗口首行,光标在行中的位置不变
z-将当前行调整为窗口末行,光标移到行中首个非空字符处
zb将当前行调整为窗口末行,光标在行中的位置不变
z.将当前行调整为窗口正中,光标移到行中首个非空字符处
zz将当前行调整为窗口正中,光标在行中的位置不变
大小写切换
~切换光标处单个字符的大小写
3g~l切换光标开始3个字符的大小写
g~fx切换光标开始直到第一个字符x的大小写
g~~切换整行字符的大小写
gUU整行切换成大写

光标移到当前word下一次出现的地方

*

光标移到当前变量或函数定义处

gd

显示当前word的man page

K

生成代码高亮的html文件
vim -c "so syntax/2html.vim|wqa" test.pl

转换所有字符为小写
:%!tr A-Z a-z

当前屏幕跳转
H 跳到屏幕顶部,M 跳到屏幕正中,L 跳到屏幕底部

跨行匹配
\_ 表示允许匹配换行符,\_. 表示匹配任意字符

光标处数字加1
CTRL+A

行内查找
f,F,t,T时,当前所在的字符是不看的。
比如abcdabcdabcd,假设当前光标在第一个b处,敲2fb之后,光标将停在第三个b处。

查看当前光标所在位置
CTRL-G,会返回当前文件名,光标所在行号,列号,总行数等等

滚屏
CTRL-U:上滚半屏,CTRL-D:下滚半屏

编辑多个文件时跳到首个/末个文件
首个文件用:first或:rewind,末个文件用:last

录制宏
假设a为宏名,则以qa开始,中间正常编辑,以q结束录制。以@a调用刚刚录制的宏。 参考:vim 的键盘宏

用d删除文本
d /abc 从光标所在位置开始删除文本,直至出现abc
d fc 从光标所在位置开始删除文本,直至出现字符c,同时c字符也被删除。
d tc 从光标所在位置开始删除文本,直至出现字符c,c字符不会被删除。

已打开文件a后,水平diff继续打开文件b
首先vim a,命令模式下:diffsplit b

cw跟dw的差别
cw:删掉当前的词,不去管这个词后面的空格,进入insert模式。
dw:删掉当前的词,还有这个词后面的所有空格。

输入特殊字符
用:digraphs看字符表,CTRL-K再加上表中映射的键就能出来了。
比如π就可以用CTRL-K-p-*四个键打出来。

文本断行
set textwidth=70 输入时自动在70列断行
gggqG 整理全文
<Visual>gq 整理选中的内容
:%s/\%75c/\r 在第75列断行

跳转到函数开头/末尾
一般可以用 [{ 或 ]} ,也可以加上数字如 3[{ 。
还有其他可用于块跳转:
  • [( 和 ])
  • [m 和 ]m
  • [M 和 ]M
  • [[ 和 ]]
添加行号
来源:vim 小技巧 : 行數的顯示與利用
yjchou Says:
April 16th, 2007 at 6:36 pm
如果行號想靠右對齊的話,可以用下面這一行 (假設以五個字元對齊)
:%s/^/\=printf("%*d", 5, line("."))/g
后面的g应该可以省掉:
:%s/^/\=printf("%*d", 5, line("."))/

看颜色列表,见hacking vim - Changing Color Scheme
To see a complete list of color groups, use the command :
:so $VIMRUNTIME/syntax/hitest.vim
参见match命令,如:
:match ErrorMsg /^Error/

非贪婪模式匹配
Vim里面的 .\{-} 相当于Perl里面的 .*?
其中,\{-} 对应于 *?


ctrl-l或ctrl-r 整理屏幕
ctrl-^ 跳转到上一个文件
:4,8w! 将4-8行内容替换为当前文件的内容
:w >> ~/test.txt 将当前内容添加到~/test.txt中
2+ 往下移两行
:7 到第7行
ctrl-g 显示当前行数、文件总行数
3H 当前屏幕第3行
3L 当前屏幕倒数第3行
z-Enter 把当前行搞到屏幕顶
z.把当前行搞到屏幕正中
z-把当前行搞到屏幕底
:.!date 把当前行的内容替换成date指令输出的内容
:5,8!date 把5-8行的内容替换成date指令输出的内容
:%!date 把当前文件的内容替换成date指令输出的内容
( 上一句
) 下一句
{ 上一段
} 下一段
:%y 把当前文件所有内容拷下来
:g/London/y 把当前文件中含London的行拷下来

没有评论:

发表评论