vim配置(usr_05.txt)
vim的配置选项和键盘映射关系都在一个名为vimrc的文件中。:edit $MYVIMRC
直接打开当前用户使用的vim配置文件。:version
显示vim版本信息,其中”user vimrc file"部分指定的是当前用户使用的vim配置文件。
如果创建新的vimrc文件,最好在第一行添加如下代码,可以在定制vimrc文件前初始化vim:source $VIMRUNTIME/defaults.vim
插件
插件就是一个vim脚本文件,以.vim作为文件后缀名,在标准插件目录下的所有插件脚本都会在vim启动时候自动被加载。
插件有两种类型:全局插件(适用于所有种类的文件)和文件类型插件(仅适用于某一种文件类型的插件)。
添加插件的方法:获取一份拷贝并且放到正确的目录下。
添加插件文档的方法:把帮助文本文件,例如:doit.txt,放到~/.vim/doc目录下,然后执行命令:helptags ~/.vim/doc
。之后,就可以调用帮助命令查看文档了:help doit
。
全局插件的位置:
- $VIMRUNTIME/plugin
- $VIMRUNTIME/macros
- $~/.vim/plugin
文件类型插件的位置:$VIMRUNTIME/ftplugin。
配置选项的类型
- 有些选项类似于开关,只可开或关,一般加前缀
no
表示关闭该选项,例如::set hlsearch
和:set nohlsearch
。 - 另有些选项需要在=后设置值,用逗号分隔。
常用的配置选项
:set backup
使得在重写文件时候,让vim自动保存一个同名且带“~”前缀的备份。:set undofile
会在当前文件中保存多层级的撤销信息,使得关闭再打开文件后可以撤销关闭文件前的修改。:autocmd FileType text setlocal textwidth=78
当一行的文本长度达到78列时候,自动换行;这个命令包含两部分:
-
autocmd FileType text
是一个autocommand,意思是当文件类型被设置为text之后,执行后面的命令。 -
set local textwidth=78
就是被自动执行的命令,。
:set history=#
指定vim保存的历史命令的个数和历史搜索模式的个数。例如::set history=200
。:set ruler
表示永远再右下角显示当前光标的位置。:set showcmd
表示在右下角显示未完成的命令。例如,正常模式下输入f
,右下角会显示f,再输入e
,右下角的f会消失。:set wildmenu
表示在用<Tab>
键来补全命令时候,如果可能的命令多于一个,就在倒数第二行显示所有可能的命令。:set display={"" | truncate | lastline | uhex}
指定当屏幕的最后一行无法完全显示的时候,如何显示:
-
truncate
用@@@显示在最后一行表示还有部分没有显示完全; -
lastline
用@@@显示在最后一行最后三列来表示
:set incsearch
一边输入搜索字符串,一边高亮显示匹配情况。:set nrformats=alpha,octal,hex,bin
设置光标所在字符或单词可以识别的数值类型,按下CTRL-A
键进行加法或CTRL-X
进行减法运算。:syntax on
启动语法高亮显示功能。:filetype plugin indent on
打开三个智能特性:filetype、plugin和indent:
-
filetype
意思是vim自动根据所编辑文件的后缀名来判断该文件是哪一种文件类型。 -
plugin
意思是vim判断文件类型之后自动寻该文件类型对应的插件文件并应用。 -
indent
意思是vim判断文件类型之后自动寻找该文件类型对应的缩进规则文件并应用。
:map
列出所有的命令映射。:options
打开一个新的窗口,一行一个地解释vim配置选项。
在设置vim配置选项时,加上&
在选项后可以将其重新设置为默认值。例如::set iskeyword&
。:set wrap
设置将很长的一行折叠显示;:set sidescroll=#
设置当滚动显示被折叠的文本时,往侧面滚动#个字符。:set whichwrap=b,s,<,>,[,]
设置移动光标时候允许移动到上一行末尾或下一行开头:
-
b
表示backspace。 -
s
表示空格键。 -
<
和>
表示左右箭头键。 -
[
和]
表示插入模式下的左右箭头键。
:set list
用^
显示无法明显显示的字符,用\$
表示换行符;:set listchars=eol:$,tab:>-,trail:-
设置用什么字符显示哪些不能明显显示的字符。:set iskeyword=@,48-57,_,192-255
设置哪些字符可以作为单词的一部分:
-
@
表示所有字母。 -
48-57
表示ASCII字符48到57即0到9。 -
192-255
表示ASCII字符192到255即所有可打印的拉丁字符。
:set cmdheight=#
设置在vim下方用#行显示消息,会挤占编辑区的空间,所以这是个需要妥协各个功能需求的选项。
语法高亮显示(usr_06.txt)
:syntax enable
启用语法高亮显示。
语法高亮支持的语法插件在$VIMRUNTIME/syntax目录下。
不显示彩色的原因:
- 终端不支持。
- 终端支持但是vim不知道终端支持;可以通过Linux命令
setenv TERM xterm-256color
来告诉vim当前的终端支持彩色。 - 文件类型没有识别出来;可以通过两种办法解决:
- 在vim中设置
filetype
,例如::set filetype=fortran
。 - 在文件中的第一行或最后一行加上模式行注释,例如:
# vim: syntax=make
。
- 在vim中设置
- 文件类型没有对应的高亮显示插件;可以通过以上办法解决。
彩色显示有误现象:
- 彩色文本很难识别。多半是因为vim猜错了背景颜色,可以通过在vim中设置背景色解决:
:set background=dark
。 - 颜色没显示对。多半是因为vim边加载文件边解析文本,节省时间的同时会搞错关键字或文本等,可以通过按
CTRL-L
或者来回翻几页来解决。
:colorscheme evening
设置名为evening的颜色主题。支持的颜色主题插件在$VIMRUNTIME/colors目录下。:runtime syntax/colortest.vim
打开新的窗口显示所有颜色组合。:syntax clear
临时关闭语法高亮功能,打开另个文件再回来,就会又重新启用语法高亮功能。:syntax off
关闭所有vim的buffer中的语法高亮功能。:TOhtml
在新的窗口中显示当前文本转换为html文件之后的样子,方便在浏览器里显示或打印。
编辑多个文本(usr_07.txt)
如果修改了当前文件,但是并没有保存修改,这时再切换文件会报错。:write [filename]
将当前文件的内容另存为名为filename
的文件,如果没有指定filename
则保存当前文件。:set autowrite
让vim自动保存每次对文件的修改。:edit[!] {filename}
打开名为filename
的文件,同时放弃当前文件的任何未保存的修改;如果没有!则不打开文件,同时提示有修改没有保存。:hide edit {filename}
缓存当前文件的所有未保存的修改,同时打开名为filename
的文件。
vim命令行中指定的文件名相关的命令:
-
args {filename}
将vim命令行参数中的文件列表替换为filename
;如果没有指定filename
则显示vim命令行参数中的文件列表。 -
:next
切换到下一个文件;wnext
先保存当前文件的修改,再切换下一个文件。 -
:previous
切换到前一个文件;wprevious
先保存当前文件的修改,再切换。 -
:#next
切换到当前文件以后第#个文件。 -
:#previous
切换到当前文件以前第#个文件。 -
:last
切换到最后一个vim命令行参数中指定的文件。 -
:first
到第一个vim命令行参数中指定的文件。
CTRL+^
在相邻的两个已打开的文件之间来回跳转。`"
光标停在上一次跳转离开当前文件时的位置。`.
跳转到当前文件上一次作出修改的位置。
标记
vim可以记录当前光标所在位置到vim预留的存储空间中,这些位置称为标记,用单个字母表示。m<a-z>
创建作用于当前文件的标记。m<A-Z>
创建作用于所有文件的标记。marks [mark]
查看名为mark
的标记的位置;如果没有指定mark
则是列出所有标记的位置。
寄存器
vim可以保存一些临时的文本或宏命令到vim预留的存储单元中,将来可以用于粘贴文本或回放宏命令,这些存储单元称为寄存器。
寄存器一半用单个小写字母表示,当用大写字母时候表示追加修改该寄存器。"
是将寄存器用于文本操作的命令。"{reg}y{motion}
把motion
移动跨过的文本拷贝到reg
寄存器里;例如:"ayw
把一个单词拷贝到a
寄存器里。"{reg}p
把reg
寄存器里的文本拷贝到当前光标所在位置。例如:"bp
把b
寄存器里的文本拷贝到当前光标处。"AY
将当前行的文本追加到名为a
的寄存器里。
其它
vim -r {filename}
自动检测并恢复上次崩溃的文件。vim -R {filename}
以只读模式用vim打开名为filename
的文件;如果试图修改会有警告信息,但是仍然可以修改;如果修改后想保存修改,需要用:w!
来强制保存修改。vim -M {filename}
以只读模式用vim打开名为filename
的文件,同时禁止修改和保存;用:set modifiable
来允许修改;用:set write
来允许保存。:saveas {filename}
将当前文件另存为名为filename
的文件,同时在vim的buffer中,当前文件也被重命名为filename
,同时也会在文件系统上创建该文件。:file {filename}
再vim的buffer中将当前文件另存为名为filename
的文件,不会影响操作系统上的文件名;只有当保存后才会创建名为filename
的文件。
分割窗口(usr_08.txt)
窗口
:[#] split [filename]
在当前屏幕的上方新创建一个窗口来编辑名为filename
的文件,这个新窗口有#行那么高,光标落在新窗口上;如果没有#则新窗口占当前窗口高度的一半;如果省略filename
则两个窗口都显示当前文件的内容;如果窗口多于两个,并且没有指定#时候,新创建窗口后,所有窗口都会平分当前屏幕的高度。CTRL-W w
在多个窗口之间跳转。:close
关闭当前窗口,但是不会退出vim。:only
关闭其它窗口,只保留当前窗口。:new
新开一个空白窗口,不在里面打开任何文件。[#]CTRL-W +
当前窗口的高度增加#行;没有指定#时候只增加1行。CTRL-W -
当前窗口的高度减少#行;没有指定#时候只减少1行。[#]CTRL-W _
当前窗口的高度变成#行;没有指定#时当前窗口高度为一行。:set winheight=#
指定所期望的最小的窗口高度为#行。:set winminheight=#
硬性规定最小的窗口高度为#行。:set equalalways
指定新创建窗口时,所有窗口平分当前屏幕高度。:vsplit
类似:split
,不同的是,新窗口创建在屏幕左边,而不是上面;vnew
在屏幕右侧创建新的窗口,不打开任何文件。CTRL-W <h | j | k | l | t | b>
光标移动到左/下/右/上/左上/右下边窗口。CTRL-W <K | H | J | L>
将当前窗口移动到最上/右/下/左边窗口,同时宽度或高度占满整个屏幕。:qall
关闭所有窗口并退出vim,等同于:quit all
;:wall
把所有窗口中对应的文件都保存;:wqall
保存所有窗口文件并退出;:qall!
不保存地强制退出。vim -o one.txt two.txt three.txt
在vim中打开三个文件,并将每一个文件显示在独立的一个窗口中;窗口高度等分屏幕高度;vim -O ...
类似,窗口宽度等分屏幕宽度。:all
将vim命令行参数里指定的文件都显示出来,一个文件一个窗口。CTRL-W CTRL-^
创建新的窗口,在新的窗口中显示buffer中别的文件。:set splitbelow
设置vim默认的新窗口创建位置为当前窗口下方;:set splitright
设置vim默认的新窗口创建位置为当前窗口右方。
在创建新窗口命令前用一些限定符来限定新窗口创建位置:
-
:leftabove {cmd}
或者:aboveleft {cmd}
新窗口创建位置在当前窗口左上方。 -
:rightbelow {cmd}
或者:belowright {cmd}
新窗口创建位置在当前窗口右下方。 -
:topleft {cmd}
新窗口创建位置在vim显示屏的顶部或左部。 -
:botright {cmd}
新窗口创建位置在vim显示屏的底部或右部。
tab
:tabedit {filename}
在新的tab中打开名为filename
的文件,新tab的窗口全部覆盖当前窗口,只保留两个窗口的tab头部在顶端。:tab split
将当前文件在新的tab中打开。gt
在不同tab中切换。:tabonly
只保留当前tab,关闭其他tab。
文件对比
vimdiff {file1} {file2}
用比较模式对比两个文件,文件的不同点由不同颜色高亮表示出来,大片内容相同的文本行被折叠。:vertical diffsplit temp.txt~
是在vim内部用对比模式对比文件。zo
打开折叠的文本行;zc
关闭折叠的文本行;]c
跳转到下一个有不同内容的行;[c
跳转到上一个有不同内容的行。:diffupdate
更新高亮显示修改后的两个文件,使得修改后的效果可以显示。dp
当前光标所在文本块的内容不同时,将不同的文本块从当前窗口放置到另一窗口,并替换掉另一窗口中原有内容;:do
将不同文本块从另一窗口放到当前窗口,并替换掉当前窗口原有的内容。
修改大量文本(usr_10.txt)
宏
宏是指共同完成一个操作的、有顺序的一系列命令。
宏存放在vim的寄存器里,也就是说寄存器里存放的文本可以当成文本来使用,还可以当成正常模式下的命令来用。q
是和宏有关的命令。
录制宏分三步:
-
q{reg}
指定名为reg
的宏,并开始录制宏命令包含的各种操作; - 各种vim命令;
-
q
结束宏命令操作的记录,保存宏。
#@q{reg}
把名为reg
的宏播放#次,既是将该宏包含的vim各种操作命令重复#遍。@@
播放上次使用的宏(播放就是使用)。qA{cmd}q
将cmd
表示的一系列操作步骤追加到名为a
的寄存器里。例如:qA/the<Enter>q
。
替换
:[range]substitute/from/to/[flags]
搜索并替换文本。
- substitue可以用s简写代替。
- range指定替换命令的作用范围:
- 省略的话就是只作用于当前行.
-
%
表示整个文件,例如::%s/the/these/
。 -
{#1},{#2}
表示当前文件的第#1行到第#2行。 -
#
表示当前文件的第#行。 -
.
表示当前行。 -
$
表示最后一行。 -
{pattern-sep-1}{pattern-1}{pattern-sep-1},{pattern-sep-2}{pattern-2}{pattern-sep-2}
表示开始行在当前行以前,用pattern-1
能搜索到的第一处匹配点所在行,结束行在开始行以后,用pattern-2
能搜索到的第一处匹配点所在行,pattern-sep-1
和pattern-sep-2
是模式匹配分隔符,不能相同。例如:?^Chapter?,/^Chapter/s=grey=gray=g
。 -
range+#
表示range
行往下#行;range-#
表示range
行往上#行。例如:.+2,$-10 s/View/Graph/g
-
{mark1},{mark2}
表示mark1
和mark2
的两个标记的位置之间。例如:‘t,‘b
。 -
‘<
表示最近一次可视化选择范围的开始位置(所在行);‘>
表示最近一次可视化选择范围的结束位置(所在行)。
-
from
指定被替换的文本或正则表达式,例如:s/^the/these/
。 -
flags
指定替换命令的效果:- 省略的话表示如果某一行出现了两个
from
的话,只替换第一个from
为to
。 -
g
表示如果某一行出现了两个from
的话,两个from
全部替换成to
。 -
p
表示输出最后替换的那一行到状态栏。 -
e
表示没有找到from
不是错误。 -
c
表示每一次替换都提示,要求指定下一步操作(y/n/a/q/l/^E/^Y)
:-
y
: Yes,替换本次。 -
n
:No,本次不替换。 -
a
:All,以后的每一次都替换,且不要再提示了。 -
q
:这一次也不替换了,而且以后不再继续以后的替换。 -
l
:这次是最后一次替换,而且以后不再继续替换了。 -
CTRL-E
:向上翻一行。 -
CTRL-Y
:向下翻一行。
-
- 省略的话表示如果某一行出现了两个
global命令
[range]global/{pattern}/{command}
在range
范围内,对于能匹配到pattern
的行,应用command
命令;command
命令都是命令模式下的命令。例如::g+//+s/foo/bar/g
。
可视化块选择模式
$
将可视化选择的文本块中的每一行都拓展到该行末尾,并且当上下移动时候也会默认直接选中到新行的末尾,同时如果新行更短的化可能会选中以前没有选中的行;h
停止$
的这种选中到行尾的效果。I{string}<Esc>
把string
表示的输入字符串插入到选择块中的每一行的选择开头处,块中包含着的空行和未选中的行不受影响。O{string}<Esc>
把string
表示的输入字符串插入到选择块中的每一行的选择结尾处,块中包含着的空行和未选中的行受影响:会插入空格保证结果string出现在每一行相同列。c{string}<Esc>
把string
表示的输入字符串替换选择块中的每一行的选中内容。C{string}<Esc>
把string
表示的输入字符串替换选择块中的每一行的选中开始处到该行结尾处间的内容。~
选中内容大小写反转;U
选中内容变大写;u
选中内容变小写。>
选中内容右移一个shift位置;<
选中内容左移一个shift位置。J
选中内容包含的所有行变成一行,替换每一行的换行符、前置空白符和后置空白符为一个空格;gJ
只删除换行符,保留前置空白符和后置空白符。
文件内容读写
:[range]read {filename}
将名为filename
的文件内容复制到当前文件range
处。例如::10r temp
;range
为0时候,复制到第一行(大多数命令不接受0作为行号)。:{range}write {filename}
将当前文件的range
范围内的文本写入名为filename
的文件中去;:write! {filename}
强制覆盖式写文件;:write >> {filename}
追加而不是覆盖。
gq{motion | text-object}
把当前行到motion
或text-object
所跨过的文本行(不足一行按一行算)以textwidth
指定的行宽进行格式化;gq
是格式化命令;text-object
例子有ap
既一个段落,as
一句话。gU{motion}
将motion
跨过的文本变大写;gu{motion}
将motion
跨过的文本变小写;g~{motion}
将motion跨过的文本大小写反转;guu
将当前行的文本变小写;gUU
将当前行的文本变大写;g~~
将当前行的文本大小写反转。
!{motion}{program}
将motion
所跨过的文本传给名为program
的外部命令,并将program
产生的输出替换掉这些文本;例如:!5jsort
。!!{program}
将当前行传给名为program
的外部命令,并将program
产生的输出替换当前行;例如:!!date
。:[range]read !{program}
将program
执行的结果复制到range
指定行(没有range
就是指当前行的下一行);例如::0read !ls
。:{range}write !{program}
将range
指定范围内的文本作为参数传给名为program
的外部命令,并将结果显示在状态栏;例如:.,.+1write !wc
。
技巧(usr_12.txt)
搜索时候,\<
表示单词起始位置,\>
表示单词结束位置。
用反向引用来给特定文本换位置,例如:%s/\([^.]*\), \(.*\)/\2 \1/g
可以将Last, First
变成First Last
。:{range}move #
把range
范围内的行移动到第#行。g<CTRL-G>
统计整个文件的单词。
删除后置空白字符:%s/\s\+$/
。