:scriptnames 发现配置文件的位置
:edit ~/.vimrc 编辑该配置文件
vim说明文件的阅读:
CTRL-] 跳转到当前光标所在单词对应的主题
CTRL-O 回到前一个位置
复制一个样板vimrc文件(unix):
:!cp -i $VIMRUNTIME/vimrc_example.vim ~/.vimrc
复制一个样板vimrc文件:
:set compatible?
查看vim配置文件的所在位置:
:scriptnames 或 :version
拷贝vimtutor,并重命名:
vim -u NONE -c `e $VIMRUNTIME/tutor/tutor.cn` -c `w! TUTORCOPY` -c `q`
vim -u NONE -c "set nocp" TUTORCOPY
会话保存了整个Vim的外观. 视图保持一个窗口的属性
:mkview [num] "保存当前窗口的视图,num可以是1-9"
:loadview [num] "载入上次保存的视图,num可以是1-9"
:mkview ~/.vim/main.vim "保存当前的文件的视图到文件"
:source ~/.vim/main.vim "载入已存在的试图文件"
:set viminfo=string "string指代你要保存的东西.
其语法是一个选项字符跟一个参数. 一对对的选项/参数以逗号分隔",可用选项有:
: 要保存的冒号命令历史记录数
@ 要保存的输入历史记录数
/ 要保存的搜索命令历史记录数
r 可移动介质, 对此不会保存其标记信息(可以多次使用)
! 以大写字母开始并且不含有任何小写字母的全局变量
h 开始时禁用°hlsearch°选项
% 缓冲区列表(只有没指定文件参数启动Vim时才会恢复这些信息)
c 使用°encoding°选项中的方法进行字符编码转换
n viminfo文件的名字(必需是最后一个选项)
在Vim中用":wviminfo"和":rviminfo"命令来保存和恢复这些信息,
:wviminfo! ~/tmp/viminfo "保存一个viminfo的信息"
:rviminfo! ~/tmp/viminfo
"读取一个viminfo的信息,这样可用把其他文件的viminfo那来用"
:mksession vimbook.vim "创建一个会话文件"
:source vimbook.vim "恢复一个会话状态"
vim -S vimbook.vim "启动Vim时恢复某个会话"
sessionoptions 选项的设置如下,如::set sessionoptions+=resize
"恢复Vim窗口的大小"
blank 空窗口
buffers 所有的缓冲区, 而不仅是当前窗口中的
curdir 当前目录
folds folds, 包括手工创建的
help 帮助窗口
options 所以的选项和键映射
winsize 窗口大小
========================================================================================
二、 在普通模式下
移动光标:
h 左 j 下 k 上 l 右
gj 下,长字符串行折行时只移动下一个屏幕显示行
gk 上,长字符串行折行时只移动下一个屏幕显示行
w (小)向后(右)移动一个word,光标在word的首字母处,如3w,向后移动3个word
b (小)向前(左)移动一个word,光标在word的首字母处,如3b,向前移动3个word
e (小)向后(右)移动一个word,光标在word的尾字母处,如3e,向后移动3个word
ge (小)向前(左)移动一个word,光标在word的尾字母处,如3ge,向前移动3个word
W
(大)向后(右)移动一个word,光标在word的首字母处,如3w,向后移动3个word,但忽略其他边界字符
B
(大)向前(左)移动一个word,光标在word的首字母处,如3b,向前移动3个word,但忽略其他边界字符
E
(大)向后(右)移动一个word,光标在word的尾字母处,如3e,向后移动3个word,但忽略其他边界字符
gE
(大)向前(左)移动一个word,光标在word的尾字母处,如3ge,向前移动3个word,但忽略其他边界字符
$ (shift
4)移动到当前行行尾,同<End>功能键,可以使用"2$"记数,移动到下一行的行尾
^ (shift 6)移动到当前行的第一个非空白字符上,不接收记数移动
0 (数字)移动到当前行的第一个字符上,同<Home>功能键,不接收记数移动
f
(小)向后(右)搜索某一单字符,光标在被搜索字符上,如"fy",搜索下一个字符y的所在,可用";"向后重复查讯,用","向前重复查讯
F
(大)向前(左)搜索某一单字符,光标在被搜索字符上,如"Fy",搜索上一个字符y的所在,可用";"向后重复查讯,用","向前重复查讯
t
(小)向后(右)搜索某一单字符,光标在被搜索字符前,如"ty",搜索下一个字符y的所在,可用";"向后重复查讯,用","向前重复查讯
T
(大)向前(左)搜索某一单字符,光标在被搜索字符前,如"Ty",搜索上一个字符y的所在,可用";"向后重复查讯,用","向前重复查讯
% 跳转到与当前光标下的括号相匹配的字符上记数+%
跳转到正文的某个部分,如"50%"将会把光标定位在文件的中间
gg 跳转到第一行
G 跳转到最后一行,可用"23G"等跳转到指定的行
H 跳转到本屏幕的开始
M 跳转到本屏幕的中间
L 跳转到本屏幕的结尾
zz 把当前行置为屏幕正中央
zt 把当前行置于屏幕顶端
zb 把当前行置于屏幕底端
删除字符:
x (小)删除一个字符,"4x"删除4个字符
d (小) 后跟任何一个位移命令,
它将删除从当前光标起到位移的终点处的文本内容,如:dd 删除一行字符,dw
删除一个word,"d4w"删除4个word,"d2e"删除2个word到词尾,"d$"删除自当前光标到行尾的内容.
c (小)删除一个word后并进入Insert模式,如:cc 删除一行后并插入一行(同"c$")
r 输入一个字符用以替换当前光标下的那个字符
J (大)删除一个换行符
u (小)撤销操作
CTRL-R 重做(反转撤消动作)
U (大)撤销上一次的操作,包括对自己的上次操作
快捷方式:
x 代表dl(删除当前光标下的字符)
X 代表dh(删除当前光标左边的字符)
D 代表d$(删除到行尾的内容)
C 代表c$(修改到行尾的内容)
s 代表cl(修改一个字符)
S 代表cc(修改一整行)
编辑命令:
i (小)在当前光标之前插入文本
a (小)在当前光标之后插入文本
o (小)当前行的下面插入新一行
O (大)当前行的上面插入新一行
9k 上移9行,其他命令也可用数字+命令的方式实现,重复的编辑操作
ZZ (大)保存当前文件并退出
放弃编辑:
:q! 放弃所有的修改并退出
:e! 放弃所有修改并重新载入该文件的原始内容
求助:
:help 得到帮助文件的起始点,等同于F1功能键
:help {subject} 得到某个特殊主题的帮助,如::help
CTRL-A,查看关于CTRL-A的帮助
:help `command` 得到关于某个选项的帮助,如:help `number`
:help E37 得到某个错误ID号的帮助
三、 小技巧:
交换两个字母,"xp"
光标在字母时中间,删除整个单词,"daw";
并可以用"."重复操作来删除整个单词。"daw"即"Delete A Word"
修改整句话,即删除整句后加入一个空行,不包含句子后面的空格(是"Inner
Sentence"的缩写),"cis"
修改整句话,即删除整句后加入一个空行,包含了句子后面的空格(是"a
Sentence"的缩写),"cas"
修改整句话,即删除整句后加入一个空行,包含了句子后面的空白,"das"
用v进入visual模式,用as可以选择一个句子。
%s/\<oldword\>/newword/gc
"把文件中所有的oldword替换成newword,如果没有'c'则就不进行提示,"g"标志则指示替换操作将一行中所有出现的目标字串都进行替"
在filename1中打开filename2,并比较filename1和filename2
:edit filename2
:vertical diffsplit filename2
简单映射:使用":map"命令,把一连串Vim命令以一个按键来表示。":map"不带参数则列出已定义的映射。
:map <F5> i{<Esc>ea}<Esc>
"在一个word的前后加上大括号"其中<Esc>和<F5>为手工键入,而不是键盘上的功能键。当把一个vim功能键变为映射
键后,就失去了原有的意义,至到映射被删除。
对字符串行进行排序:
第一种方法:
/^firstline
j
:.,/^$/-1!sort
说明:上面的命令首先会跳转到第一行, 即开头是"firstline"的行,
然后再下移一行, 用sort程序过滤自该行直至下一个空行.
第二种方法:
在Visual模式下选择要排序的行然后用"!sort"命令
反转行序:
:g/^/m 0
说明:g是命令global,m是命令move
对一串连续的行进行反转行序:
:`t+1,.g/^/m `t
说明:首先移到第一行并以"mt"标记该行.然后移到最后一行执行命令
统计文件全部内容的字数:
先键入"g",再用CTRL-g
统计文件部分内容的字数:
方法一:
将光标移到要统计部分的开头处执行"g CTRL-G"命令,
然后移到要统计部分的末尾再用一次"g CTRL-G".
计算两次命令得到的当前word位置之差, 就得到这部分内容的字数统计
方法二:
使用Visual模式, 选择要统计的部分. 然后用"g CTRL-G".
在编辑脚本或程序时查找帮助页:
光标移到要查找帮助的关键字上,然后键入"K"(大写),Vim会对光标所在的词执行"man"程序。
让man页与vim在一个窗口中显示:
首先运行man对应的文件类型plugin(可以把它放到vimrc文件里):
:source $VIMRUNTIME/ftplugin/man.vim
然后可以使用vim的"Man"命令对某些字符进行查讯帮助,如:"Man 3
echo"查找man页第三节中的echo,通过CTRL-W来切换当前窗口。
消除所有行尾的多余空格:
:%s/\s\+$//
说明:指定的行号范围是"%", 即应用于每一行中.
":substitute"命令要查找的字串是"\s\+$".这会查找位于行尾的一个或多个空白字符,":substitute"命令的"to"部分是空内容:"//".
即把此类的空白都替换为空。
查找一个word在何处被引用:
编辑所有包含了"frame. counter"的C文件
vim \VimBacktick{}grep -l frame_counter *.c\VimBacktick{}
说明:"-l"参数, 所以该命令将只是列出包含了该词的文件名而不显示匹配的行。
如果你想查找所有C程序中的"error string", 就可以用下面的命令:
:grep error_string *.c
说明:跳转到下一个匹配的行使用":cnext"命令.跳转到前一个匹配的行可以用":cprev"命令,
":clist"命令则可以一次列出所有的匹配
注:内置的":grep"命令用到了外部命令grep(Unix)或findstr(Windows).
在":"号命令行中:
CTRL-C或<Esc> 可以放弃所有已经键入的命令.
"CTRL-D"可以列出未用<tab>补全的命令。
"CTRL-P"可以向前返回已经输入过的命令,效果如同<Up>
"CTRL-N"可以向后返回已经输入过的命令,效果如同<Down>
q: 在屏幕底部打开一个命令行(小)窗口. 该窗口的内容是历史记录,
最后一行是空行。对命令行窗口作出的修改不会被保存. 历史记录不会因此被改写.
可以用CTRL-Z来挂起vim,并回到shell中,之后可用"fg"来回到vim中。
执行shell命令:
在Vim中:
:!{program} 执行{program},如!ls,!pwd,!shell等
:r !{program} 执行{program}并读取它的输出
:w !{program} 执行{program}并把当前缓冲区的内容作为它的输入
:[range]!{program} 以{program}过滤指定的行
vim -x exam.txt "加密文件exam.txt"
vim -x -n file.txt
"加密file.txt文件,并不生成交换文件,注:Vim会把所有东西都放到内存里"
:setlocal noswapfile "可在编辑过程中禁止使用交换文件"
:X "(大写)设置对文件的加密"
:set key= "停止对一个文件的加密,把`key`选项设置为一个空字串"
vim -b datafile "编辑一个二进制文件"
:set display=uhex
"设置以十六进制格式显示不可打印字符,"ga"命令可以来查明当前光标下字符的本来面目"
g CTRL-G "可以获知光标所在字符是整个文件中第几个字节"
2345go "转到第2345个字节去"
使用xxd程序编辑二进制文件的过程:
1 用vim -b datafile 打开二进制文件
2 用":%!xxd"进行十六进制格式的转储
3 编辑完毕后使用":%!xxd
-r"反向转换,逆向转换时只有其十六进制形式被认为是有效的.
对可打印形式的改变会被转换程序忽略
:hide edit two.txt
"在编辑另一个文件时而又想不保存当前的文件时,可用隐藏缓冲区的编辑"
:buffers 或:ls "列出整个缓冲区列表,"
列出的缓冲区列表说明如下:
u 未被列出的缓冲区|unlisted-buffer|[[译: 既然未被列出你又怎么知道? :ls! %
当前缓冲区
# 上一次的活动缓冲区
l 被载入并显示在某窗口中的缓冲区
h 被载入但隐藏的缓冲区.
= 只读的缓冲区
- 不可编辑的缓冲区, 其中°modifiable°选项被关闭
+ 有改动的缓冲区
:buffer [num] "在当前窗口编辑缓冲区"
:sbuffer [num] "打开一个并列的窗口编辑缓冲区"
:bdelete 3 "一个缓冲区从列表中去除"
:bnext "跳转到下一个缓冲区"
:bprevious "跳转到前一个缓冲区"
:bfirst "跳转到第一个缓冲区"
:blast "跳转到最后一个缓冲区"
:{range}center [width] 让一个范围的行居中
:{range}right [width] 让一个范围的行右对齐
:{range}left [margin] 让一个范围的行左对齐,[margin]指左边留白的宽度
左右对齐的方法:
1.使用宏包:runtime macros/justify.vim
2.使用外部程序:%!fmt
合并多行文本:
:g/./,/^$/join
说明:
:g/./ 一个全局命令, 查找那些至少有一个字符的行.
,/^$/ 指定一个范围, 从当前行开始(非空行)直到一个空行.
join ":join"命令把指定范围内的行连为一行.
重新格式化文件:
1.先修改所要修改的内容
2.用"v"命令进入Visual模式
3.选定所要重新格式化的内容后键入"gq"
4.其他格式化方式:"gqap"格式化一段文本(段以空行为分界).
包括当前光标之前的部分,"gggqG"格式化整个文件
dp "两个文件的不同被消除了,
当前窗口中引起不同的内容被放到另一窗口中缺少这段内容的地方去了.
"dp"是"diff put"的缩写"
将光标移到右边的窗口, 到"changed"插入的位置.键入命令:do
vim也会消除了该位置的不同之处,"do"意为"diff obtain"
将"Last, First"改为"First Last",使用命令:
:%s/\([^,]*\), \(.*\)/\2 \1/
说明:替换操作的命令参数形如"/from/to/".
斜杠是用来分隔"from"和"to"的.对于"from"部分对应的内容:
第一个部分位于\( \)之间, 对应"Last" \( \)
匹配除逗号外的任何东西[^,]
任意次重复*
匹配", " ,
第二个部分位于\( \)之间, 对应"First" \( \)
任意字符 "."
任意次重复 "*"
在 对应"to"的部分我们指定了"\2"和"\1". 这在Vim中被称作反向引用.
它们可以用来指代此前在\( \)中匹配的内容. "\2"指代在第二个"\(
\)"中匹配的内容, 也就是"First"部分, "\1"则指第一个\( \)中的内容,即"Last"
部分.
:iabbrev ad advertisement
每次键入"ad"时都自动扩展为"advertisement",可以用":iab"代替完整的命令名":iabbrev"
:abbreviations 命令可以列出当前定义的所有缩写
:unabbreviate + 缩写词替换词
命令可以用于删除一个缩写,但输入之后它还会再做一次替换才会生效。:abclear有同样的效果。
:abbreviate errword rightword 可以更正错误的输入
CTRL-V
命令可以保证你键入的下一个字符被原封不动地被录入(如特殊字符),支持ASCII,十六进制(前面加o),八进制输入(前面加x),16bit或32bit的数字(前面加u)
通过输入连续的三个键"CTRL-K加两个字母"可以键入键盘上没有的字符,用:digraphs可以查看可用的连字符
========================================================================================
CRTL-G 显示正在编辑的文件的详细信息
CTRL-U 使文本向下滚动半屏
CTRL-D 使文本向上滚动半屏
CTRL-E 使文本向上滚动一行
CTRL-Y 使文本向下滚动一行
CTRL-F 使文本向后滚动一整屏(实际上是整屏去两行)
CTRL-B 使文本向前滚动一整屏
CTRL-O 跳转到更早些时间停置光标的位置(提示: O意为older).
CTRL-I 跳回到后来停置光标的更新的位置(提示:
I在键盘上位于O前面,作用同<Tab>键)
"CTRL-P" 对于重复的输入,按下"CTRL-P",
Vim会根据已经输入的部分向前寻找,补全整个词
"CTRL-N" 对于重复的输入,按下"CTRL-N",
Vim会根据已经输入的部分向后寻找,补全整个词
CTRL-X CTRL-F 文件名
CTRL-X CTRL-L 整行内容
CTRL-X CTRL-D 宏定义(也包括那些在include文件里定义的宏)
CTRL-X CTRL-I 当前文件和被当前文件include的文件
CTRL-X CTRL-K 来自一个字典文件的word
CTRL-X CTRL-T 来自一个thesaurus的word
CTRL-X CTRL-] tags
CTRL-X CTRL-V Vim的命令行
用`complete`选项来定制Vim在补全word时所用的策略,使用`ignorecase`选项,在搜索匹配的word时忽略大小写的不同。`infercase`.
它使搜索
匹配的word时忽略剩余部分的大小写。
在插入模式下,CTRL-Y会复制上一行的字母内容到当前行的光标处。
在插入模式下,CTRL-E会复制下一行的字母内容到当前行的光标处。
========================================================================================
简单模式搜索:(使用正则表达式)
^ 字符匹配一行的开头,如"/^word"只匹配出现在一行开头的word
$ 字符匹配一行的末尾,如"/word$"只匹配出现在一行末尾的word
注:"/^the$",只会匹配到一行的内容仅包含"the"的情况. 有空白字符也不行
.
匹配除换行符外的任何单字符,如"/wo.d","."可以用"\."来匹配,在normal模式下也可用来做重复的动作,
标记跳转:
m{mark}
将当前光标下的位置名之为标记"mark".从a到z一共可以使用26个自定义的mark.
定义后的标记不在屏幕上显示,只在Vim内部记录所代表的位置
`{mark} mark就是你定义的标记的名字,如用"ma"标记"a"处,用"`a"跳转到标记a处
` 进行此次跳转之前的起跳点
``
上次编辑该文件时光标最后停留的位置,跳回到上一个的出发点,可以在两点之间来回跳转
[ 最后一次修改的起始位置
] 最后一次修改的结束位置
:marks 列出已经标记过的标记列表
:jumps 列出曾经跳转过的位置列表
/string
用于向下搜索一个字符串,用"n"可以继续查找下一个,用"N"可以继续查找上一个
?string
用于向上搜索一个字符串,用"n"可以继续查找下一个,用"N"可以继续查找上一个
* 把光标定位于某个word上,对当前光标所在的word向下搜索
# 把光标定位于某个word上
/\<word\> 精确搜索单词word
查找一个文件:把光标置于所要查找的文件名上,然后键入"gf".当这个文件并不在工作目录下时,Vim会用在`path`选项中定义的目录去查找它.
该选项的内容是一个以逗号分隔的目录名列表,格式为::set
path+=c:/prog/include.
或通过:find filename来查找。
或通过":sfind"命令来替代":find"命令,在新窗口中打开。
========================================================================================
set nocompatible "设置默认模式为普通vim模式"
set backspace=indent,eol,start
"在Insert模式下退格键何时可以删除光标之前的字符.
选项中以逗号分隔的三项内容分别指定了Vim可以删除位于行首
的空格, 断行, 以及开始进入Insert模式之前的位置"
:set ignorecase 忽略大小写匹配
:set noignorecase 大小写的精确匹配
:set number 在每行的前面显示一个行号
:set nonumber 关闭行号显示
:set ruler 开启右下角的光标位置显示
:set noruler 关闭右下角的光标位置显示
:set hlsearch 高亮显示搜索结果
:set nohlsearch 关闭高亮显示搜索结果
:nohlsearch 去掉当前的高亮显示
:set incsearch 在键入目标字符串的过程中就同时开始搜索
:set wrapscan 搜索过程在文件内部循环进行(默认)
:set nowrapscan 搜索过程在文件内部只进行一次
set autoindent "在开始一个新行时对该行施以上一行的缩进方式."
set history=50 "设置冒号命令和搜索命令的命令历史列表的长度"
set ruler "总是在Vim窗口的右下角显示当前光标的行列信息"
set showcmd "在Vim窗口的右下角显示一个完整的命令已经完成的部分"
set incsearch "在键入要搜索的字串的同时就开始搜索当前已经键入的部分"
map Q gq "定义了一个"Q"命令映射到"gq"操作符命令,进入Ex模式"
filetype on "自动识别文件类型"
plugin on
"用文件类型plugin脚本,对某种文件类型来说最常用的选项可以放在一个Vim中叫文件类型plugin的脚本里.请参考|write-filetype-plain|"
indent on "使用缩进定义文件,请参考jfiletype-indent-onj和°indentexpr°选项"
"autocmd FileType text setlocal textwidth=78 "
autocmd FileType text "是一个自动命令.
它所定义的是每当文件类型被设置为"text"时就自动执行它后面的命令."
setlocal textwidth=78
"在当前行已超过78个字符时,让Vim可以自动断行,这种设置只对当前的一个文件有效."
:options "打开选项帮助窗口"
:help `wrap` "获得选项关键字的详细解释"
:set iskeyword& "恢复一个选项值的默认设置"
:set nowrap "控制长行是否折到下一行显示的命令是"
:set sidescroll=10 "查看左右10个字符的上下文"
:set whichwrap=b,s
"控制移动光标移动到行首或行尾时的操作,光标位于行首时按退格键会往回移动到上一行的行尾.
同时在行尾按空格键也会移动到下 一行的行首"
:set whichwrap=b,s,<,> "左右箭头键在遇到行的边界时可以转行,在normal模式下"
:set whichwrap=b,s,<,>,[,]
"左右箭头键在遇到行的边界时可以转行,在Insert模式下"
:set list "设置制表符成为可见的字符"
:set listchars=tab:>-,trail:- "使制表符以">---"显示, 同时行尾空格以"-"显示"
:set iskeyword
iskeyword=@,48-57,_,192-255 >
"定义了一个word中可以包含哪些字符,"@"在这里代指所有的字母.
"48-57"指ASCII码从48到57的那些字符, 即0到9.
"192-255"是可打印拉丁字母,要去除一个字符使用操作符"-=",要添加一个字符使用操作符"+=""
:syntax enable "打开色彩"
:set background="/dark" "设置背景颜色为暗色(或light亮色)"
:colorscheme evening
"选择颜色方案(evening),其他颜色方案在$VIMRUNTIME/colors目录中"
:source $VIMRUNTIME/syntax/2html.vim "把当前文件转到HTML格式"
:set autowrite "每当需要时就自动保存,不需要过问"
:set noautowrite "每当需要保存时,就过问"
:set backup "生成备份文件"
:set backupext=.bak "重新命名备份文件的后缀为.bak" 备注:
如果°backup°选项是关闭的但°writebackup°选项是打开的,
Vim还会生成一个备份文件. 但是, 一旦该文件被成功地保存它就会被自动删除.
:set patchmode=.orig "对原始文件进行备份"
:set backupext=.old "指定对原始文件进行备份的后缀"
:write >> logfile "把当前文件的内容追加到logfile文件中"
:set fileformats=unix,dos "Vim能自动识别的格式的集合"
:set fileformat? "查看当前的文件格式,在vim中有三种格式,分别是:unix
<LF>;dos <CR><LF>和mac <CR>"
:edit ++fileformat=unix|dos|mac file.txt
"强制指定文件file.txt的格式为unix,dos或mac,++fileformat可荐絬为++ff"
把一个dos格式的文件转换成unix格式可以通过以下两步完成:
:set fileformat=unix
:write
:set showmatch
"键入"闭括号"时显示它与前面的哪个"开括号"匹配,对于大,中,小括号都适用"
:set matchtime=15
"设置键入某个闭括号时,等待时间的长短,时间单位是十分之一秒"
:set textwidth=30
限制每一行能有多少个字符。注:`wrap`选项使Vim能显示需要折行的过长的行,
但只是为了显示的需要, 并不在文件中实际插入一个换行符
:set autoindent "自动插入缩进"
>> "增加一行的缩进量"
<< "减少一行的缩进量"
:set shiftwidth=4
"设置缩进量增减的单位,但会得到一个8字符的缩进,可以通过:set
softtabstop=4来控制缩进"
:set tabstop=3 "设置制表符的字符长度"
:retab 8 "重置制表符的长度为8"
========================================================================================
多文本编辑:
:edit otherfilename "编辑另一个文件,但需要事先保存原文件"
:hide edit otherfilename "编辑另一个文件,不需要事先保存原文件"
vim one.c two.c three.c
"启动时就指定要编辑的多个文件,使用next,next!或wnext转到下一个文件,使用pervious或wpervious转到上一个文件,使用
last转到最后一个文件,使用first转到第一个文件使用args可以查看正在编辑的文件名"
:args 1.c 2.h 3.h "重新定义编辑的文件列表"
CTRL-^ "跳转到刚刚编辑过的文件"
`" "返回上次离开该文件时光标所在的位置"
`. "返回最后一次对文件做出改动处"
vim -R file 以只读方式打开文件,同"view file",但可以使用!强制执行。vim -
:saveas "把现有的文件另存为一个新文件"
:winheight "设置一个期望的最小的窗口高度. "
:winminheight "设置一个强制的最小高度"
:winwidth "指定期望的最小窗口宽度"
:winminwidth "强制的最小窗口宽度."
:equalalways
"在每次打开或关闭窗口Vim都自动让所有窗口均摊屏幕上可用的高度和宽度."
:split "分割一个窗口为两个,可以通过split
newfile在新窗口中打开newfile,可以使用CTRL-W来切换当前窗口,使用CTRL-w
+或-来改变窗口的大小,使用:close来关闭窗口,使用:only可以关闭除当前窗口外的其他窗口"
:new "打开一个新窗口并开始编辑一个新的缓冲区"
:vsplit "创建新窗口位于当前窗口的左边"
:vnew "用于垂直分隔窗口并在其中打开一个新的空缓冲区"
:set scrollbind "设置多窗口同步滚动"
:set noscrollbind "取消多窗口同步滚动"
CTRL-W j "切换窗口到下面的窗口"
CTRL-W k "切换窗口到上面的窗口"
CTRL-W h "切换窗口到左边的窗口"
CTRL-W l "切换窗口到右边的窗口"
CTRL-W t "切换窗口到顶部窗口"
CTRL-W b "切换窗口到底部窗口"
CTRL-W K "向上移动窗口"
CTRL-W J "向下移动窗口"
CTRL-W H "向左移动窗口"
CTRL-W L "向右移动窗口"
:qall "退出所有窗口"
:wall "保存所有窗口"
:wqall "保存并退出所有窗口"
:qall! "强制退出所有窗口"
vim -o(小) filename1,2,3... "为每个文件打开一个窗口,水平排列"
vim -o(大) filename1,2,3... "为每个文件打开一个窗口,竖直排列"
vimdiff filename1 filename2 ... "显示文件间的不同之处"
zo "展开层叠显示"
zc "收起层叠显示"
]c "直接向前定位到下一个不同之处"
[c "直接向后定位到下一个不同之处"
:diffupdate "重新比较两个文件"
========================================================================================
四、 visual 模式 (按"v"可以进入Visual模式)
CTRL-V 对矩形的文本块为对象进行操作
o (小)让光标置于被选中文本的对角,如果时单独一列,就是上下移动。提示: o
代表other end另一头)
O (大)让光标在同一行的左右两个角之间移动
p
(小)把放入缓存的内容放到当前光标后面(提示:p即put).3p,可以把三分放入当前光标后。
P (大)把放入缓存的内容放到当前光标前面.
y
(小)把文本复制到一个寄存器中,该寄存器为vim私有的。该命令是一个操作符命令,如:"yy"复制一整行,"y2w"复制两个word,包括后面的空白字符,"ye"复制一个word,不包括后面的空白字符,"y$"复制当前光标至行尾.
Y (大)复制一整行。
c (小)
========================================================================================
五、 replace模式(大写的"R"可以进入替换模式):
replace模式下的例外是按下回车键并不会把当前字符替换为回车, 而是插入一个回车
小节:
x 删除当前光标下的字符("dl"的快捷命令)
X 删除当前光标之前的字符("dh"的快捷命令)
D 删除自当前光标至行尾的内容("d$"的快捷命令)
dw 删除自当前光标至下一个word的开头
db 删除自当前光标至前一个word的开始
diw 删除当前光标所在的word(不包括空白字符)
daw 删除当前光标所在的word(包括空白字符)
dG 删除当前行至文件尾的内容
dgg 删除当前行至文件头的内容 (用"c"命令代替"d"这些命令就都变成更改命令)
~ 改变当前光标下字符的大小写, 并将光标移至下一个字符.
这不是一个操作符命令(除非你设置了°tildeop° 3选项),
所以你不能让它与一个位移命令搭配使用.
但它可以在Visual模式下改变所有被选中的文本的大小写.
I 将光标置于当前行第一个非空白字符处并进入Insert模式
A 当光标置于当前行尾并进入Insert模式
六、 其他东东
:edit . "编辑当前的目录,可用的选项有:
" <enter> : 打开一个文件或目录~
" o : 为文件或目录打开一个新的窗口~
" O : 在前一个被访问过的窗口中打开指定的文件/目录
" p : 预览文件/目录~
" i : 切换大小/日期的列表显示~
" s : 选择一个排序键r : 逆向排序~
" - : 进入父目录c : 进入目录
" R : 文件重命名D : 删除文件
" :help help-explorer得到更多信息~
<Enter> 使用当前的窗口
o 打开一个新窗口
O 使用最近使用过的其它窗口[[译: 如果只有当前窗口就打开新窗口]]
p 同O, 但同时还将光标定位于该窗口中
参考|preview-window|
i 切换显示文件的大小和日期/时间信息
s 光标所在的条目作为排序键进行排序. 首先用i命令打开
对文件大小和日期的显示. 然后将光标移到任一文件的大小
上按下s. 此时所有的文件都将按其大小进行排序. 光标置
于日期上时按s则会按其日期进行排序.
r 逆向排序当前的排序列表(either size or date)
c 将当前目录切换到当前光标所在的目录名. 接下来使用":edit"
命令时就无需附加路径名了
R 更改当前光标下的文件, Vim会提示你输入一个新的文件名[[译:
不支持目录更名]].
D 删除当前光标下的文件名. Vim也会提示你进行确认[[译: 不支持目录的删除]].
关于编程常用快捷键:
[ [ = 移动到前一个行首的'{'字符上, 等价于?^{
] ] = 移动到下一个行首的'{'字符上, 等价于/^{
[ ] = 移动到前一个行首的'}'字符上, 等价于?^}
] [ = 移动到下一个行首的'}'字符上, 等价于?^}
{ = 到前一个空行上
} = 到下一个空行上
gd = 到当前局部变量的定义处(当前的意思是光标停留其上的单词).
* = 到与当前单词相同的下一个单词上
# = 到与当前单词相同的上一个单词上
'' = 到上次光标停靠的行
ctags:
[/home/someuser/src]$ ctags * "以源程序目录下所有文件作为参数"
[/home/someuser/src]$ vi -t foo_bar
"在命令行上启动vi程序时通过-t选项加要跳转的程序元素名"
灾难恢复
vim -r
"Vim会读取交换文件(这正是存放你已编辑的文件的地方)以及你的原文件的一些信息."
|swap-file| "关于交换文件的位置和命名"
|preserve| "手工刷新交换文件"
|swapname| "查看原文件及其交换文件的名字"
`updatecount` "连续击键多少次后做一次同步"
`updatetime` "多长时间之后做一次同步"
`swapsync` "同步交换文件时是否同时做一次磁盘同步"
`directory` "列出存放交换文件的目录"
`maxmem` "尚未写入交换文件的内容所受的内存限制"
`maxmemtot` "同上, 但是针对所有文件."
========================================================================================
注意"o"和"O"在Visual模式与Normal模式下行为迥异, 在Normal模
式下它们是在当前行的下面或上面插入一个新行.
========================================================================================注:汉字的空格不被视为空白字符
要改变Vim对word边界的定义, 请查看°iskeyword°选项
用%处理哪些括号可以由`matchpairs`选项来定义与滚屏相关的命令, 请参考jQ
scj.若要一直保持当前行的前后都有一些内容显示在屏幕上,
请参考`scrolloff`选项.
问题:在使用*键时,但如果要匹配一小片包含了几个word的文本呢?如何避免手工键入?
答案: Visual select, yank, :let @/=@", n
在使用:set hlsearch时,如果排除函数外别处同名变量的干扰呢? 答: j/\%<3lj
限定
========================================================================================添加一个plugin
plugin是一个Vim会自动载入执行的脚本.
把一个脚本放入你的plugin目录即可。分为:全局的plugin,和文件类型plugin
全局的plugin:
在|standard-plugin-list|有一个此类plugin 的列表.
另外请参考|load-plugins|.在$VIMRUNTIME/macros下的脚本是全局的,且必需以".vim"为扩展名
文件类型plugin:
Vim的发布版中已经包括了针对不同文件类型的相应plugin, 你可以使用":filetype
plugin
on"命令开启对它的应用.在$VIMRUNTIME/ftplugin目录下的则是专用于特定文件类型的
一些帮助:
|filetype-plugins| 关于文件类型plugin的文档以及如何避免映射引起冲突的信息
|load-plugins| 关于Vim启动过程中何时载入全局plugin
|ftplugin-overrule| 如何强制改变全局plugin中的设置.
|write-plugin| 如何写一个plugin脚本.
|plugin-details| 关于如何使用plugin或者解决你的plugin出现的bug.
|new-filetype| 如何检测新文件类型
========================================================================================常用选项:
vnoremap p <Esc>:let current_reg = @"<CR>gvs<C-R>=current_reg<CR><Esc>
"让"p"可以在Visual模式下以此前yank的内容替换当前选择的文本块"
if has("vms")
set nobackup
else
set backup
endif 在覆盖一个文件之前备份该文件. 但是对VMS系统除外,
因为该系统已经为文件保存了老的版本. 备份文件名由当前文件名
加后辍"~"组成. 请参考|07.4|
if &t_Co > 2 || has("gui_running")
syntax on
set hlsearch
endif 打开语法高亮功能, 前提是当前系统支持彩色显示.
`hlsearch`告
诉Vim高亮显示所有与最后一次搜索目标串相匹配的文本
autocmd BufReadPost *
\ if line("°\"") > 0 && line("°\"") <= line("$") |
\ exe "normal g`\"" |
\ endif 检查是否定义了标记"2,
如果定义了就跳转到这个位置去.
每一行前面的反斜杠表示该行是前一行命令的延续. 它可以避免
脚本中有些行变得过长