Usr_01.txt 关于用户手册
文本内(指用户手册文件)超链接跳转
光标移动到目标位置(非超链接的文本也可)
ctrl + ] // 前进
ctrl + o // 后退,可多次后退
超链接文本由两个竖线框出来,但一般为隐藏状态,可使用:set conceallevel=0
修改隐藏等级(可能还需要设置样式:hi link HelpBar Normal
)。
要使用此时提到的所有特性,需要Vim正确安装,并处于nocompatible模式即不兼容Vi。(使用
:set compatible?
命令检查vim安装状态)
另外可使用vimtutor可以快速浏览vim基础用法(vimtutor具体用法见文档)
超链接(tag)的定义可以使用星号。:hi link HelpStar Normal
可以显示出来,关于tag的用法见29.1
Usr_02.txt 使用Vim的第一步
gvim或vim命令运行Vim
gvim打开的是一个GUI编辑窗口,附带一个Menu,除此之外和vim在命令窗口中类似
vim file.txt // 若文件不存在则创建,新建的文件打开时vim编辑器窗口最下面命令行有提示
tilde(~)指明该行不存在于文件中(文件末尾之后)
插入与模式
vim有两种模式Normal和Insert,在Normal下的按键均为命令,此时按下i
进入编辑模式,通过ESC
返回到Normal模式。通过命令:set showmode
vim将在最下行显示当前的所处的模式。无论何时都可以使用ESC
到Normal模式。
移动光标
在Normal模式下使用hjkl
命令分别向左、下、上、中移动一行光标
hjkl在顺手的位置,避免去使用箭头浪费大量的时间
删除字符
使用x
在Normal模式下删除当前光标下的字符
使用dd
删除当前行
使用J
删除当前行尾的换行符(注意是大写的命令,一般需要按住shift)
撤销与恢复
u
撤销一次操作,ctrl+r
恢复,U
撤销当前行所有的操作
需要安装的Vim处在“Vim way”,而不是“Vi way”,即不兼容Vi的状态
追加
i
是在当前的光标字母之前插入,但此时不好应付末尾的情况,a
则是在当前光标的字符之后插入
插入新行
o
在当前行的下方插入一行新行
O
在上方插入新行
使用数字
可在任何的命令之前添加一个数字表示该命令的执行次数,如,9j
光标下移9行,3a!ESC
追加三个!。
退出
ZZ
命令仅退出当前的文档,而不是编辑器。
退出时,修改会自动保存
:q!
可直接退出不保存修改,:e!
可以不退出而重新加载原文档覆盖当前的所有修改。
寻求帮助
使用:help {subject}
命令查询帮助文档。
//默认查询在Normal状态下的命令如
:help x
:help deleting
:help index // 完整的vim命令索引
:help ctrl-a //查询ctrl在命令前加ctrl-
// 查询插入模式下的命令
:help i_ctrl-h
// 查询vim命令行参数
:help -t //即前面加-
//查询vim配置参数
:help 'number' //即使用单引号括起来
//其他特殊按键使用<>括起来查询
:help some<Tab> // tab补全,ctrl+d列出候选项
:help i_<Up>
其他的help的用法参见help-summary
Usr_03.txt 移动光标
单词为单位移动
w
向右移动一个单词
b
向左移动一个单词
均移动到单词的首字母。e
,ge
同样是向左右移动但移动到尾字母
关于选项
'iskeyword'
顾名思义该选项中的内容作为关键字,主要用于确定单词的边界方便用于搜索和匹配,比如这里的移动需要寻找单词边界、模式匹配查找、ctrl+]确定搜索内容的边界。使用:set iskeyword&
会将其内容重置为默认值,win32下为"@,48-57,_,192-255"
,192之后的为拉丁文不用管。
格式为:
"@,^a-z,48-57, -~,^,_,^"
,其中@
表示所有的大小写字母,a-z
表示a到z的字母但前面加了^
表示的排除,要表示^
需要放在最后,^,
放中间表示排除逗号,-~
表示空格到~,48~57
表示的ASCII码的数字(数字不能直接放到选项中需要使用对应的ASCII码),127以上的十进制值参见:help digraph-table
由于iskeyword
选项内容会对w
移动的单词边界造成影响(比如is/are
可以被认为是两个,也可以被认为是一个,关键在于/
字符是否在该选项中),所以如果只想通过空格区分那么使用W
移动到行首/行尾
$
移动到行尾,在前面可是添加数字:2$
表示移动到下一行的行尾
^
移动到该行第一个非空字符
0
移动到该行第一个字符
移动到行首的两个命令无法使用数字
移动到某个字符
fx
在当前行将光标跳转到查找到的第一个字符x(如果x存在),f
即find,可以在前面添加数字查找非第一个如3fl
查找当前行的第三个l。f
是从当前光标的位置开始查找的。
F
从后往前查找。
t
和f
命令一致,只是光标将停在查找到的字母前面,意为to。
T
表示从反方向查找
这四种命令执行后,都可以使用;
,,
命令下下一个或者上一个查找结果移动
可以使用
ESC
取消命令
匹配括号
当光标处于(
按下%
,会跳转到匹配的)
,反过来也行,同样对于[]
,{}
也生效。当光标不处于一个括号时,会先查找到第一个括号,然后指向其匹配。
跳转到指定行
33G
跳转到第33行,G
跳转到最后一行。1G
和gg
表示跳转到第一行。
50%
跳转到整个文件的50%的位置。
H
,M
,L
表示当前可看见行的高中低位置。
显示当前所在位置
ctrl+g
将会显示编辑的文件名、所在行、总行数、列位置等
"usr_03.txt" line 233 of 650 --35%-- col 45-52
,col有两个值,第一个表示以字符为单位的位置,后一个表示以屏幕位置,这里Tab
认为是一个字符,但屏幕宽度可能站4个字符。
set number
设置number选项会在每行前面显示行数。由于是布尔值使用set nonumber
关闭。
set ruler
设置ruler选项可以在右下角里显示当前的位置,格式和ctrl+g
产生的结果一样。
滚动屏幕
ctrl+u
将滚动块向上移动半屏幕即内容向下移动半屏幕,ctrl+d
将滚动块向下移动半屏幕。
ctrl+e
将滚动块向下移动一行,ctrl+y
将滚动块向上移动一行。
注意滚动块的方向和内容的方向相反
ctrl+f
向前滚动一屏,ctrl+b
向后移动一屏,即内容分别forward和backward
zz
将光标所在行放在屏幕中间。
zt
将光标所在行放在屏幕的top。
zb
将光标所在行放在屏幕的bottom。
简单查找
/string
然后按下<Enter>
查找string,之后按下n
向下一个查找移动,N
向上一个查找移动,?
和/
作用一样只是反向查找,此时n
的方向也是反的。
特殊字符的查找需要转义,包括.*[]^%/\?~$
使用
set ignorecase
忽略查找的大小写,要恢复设置为noignorecase即可。
命令历史记录,按下
/
后使用箭头上下即可得到查找历史,也可以先输入一个prefix后在使用箭头来补全。:
的历史记录同理
使用
*
代替string过长的情况,此时会使用当前光标下的关键字作为string执行查找(关键字的识别和iskeyword
的内容有关),并定位到当前的下一个查找。#
同理,只是查找方向相反定位到当前的上一个。
局部匹配(
/
执行的策略,比如/the
会匹配there
)与严格匹配,/\<the\>
表示严格查找the这个单词,\<
表示只查找以the开头的,\>
表示只查找the结尾的。*
,#
本身就是查找整个单词(执行严格匹配和/
不同),如果需要局部匹配可以使用g*
,g#
(同/
相同)
set hlsearch
和set nohlsearch
可以设置搜索结果是否高亮。如果只需要关闭此次搜索的结果高亮使用:nohlsearch
set incsearch
将在搜索输入时(即按下回车之前)就会高亮匹配的字符,incsearch
是一个bool量,关闭为noincsearch
。
set nowrapscan
则最后一个匹配项后无法跳转回第一个,也是一个bool量,默认开启的。
简单模式匹配查找(简单的正则表达式查找)
^
表示匹配处在行首的,$
表示匹配处在行尾的。如/^the$
只有当该行只存在一个单词the时才会匹配。
.
匹配任意单个字符。要匹配.
使用转义。
这里只说了非常简单的正则表达式的规则
使用marks(标记)
在使用前面介绍的命令进行跨行跳转时,vim会记住所有的跳转的位置,这些位置就叫做mark。通过:jumps
可以查看vim记录的所有跳转过的位置。
w
,e
,j
,k
,f
等并不会不记录
``
或者''
可以在当前和上一次的mark之间跳转,跳过去跳回来,两点之间跳转。`
和'
的区别在于,'
只会将光标放在行首,前者会记录光标具体的列数。
ctrl+o
则是向上一次mark跳转(o即older),ctrl+i
(Tab
等效)向下一次mark跳转,根据的就是:jumps
列表。
使用命名标记,
ma
为光标所在行设置标记a,可用标记为a-z的26个字母。然后使用'a
或者`a
跳转。特别适合于需要在关联的两部分内容的时候跳转,跳转后使用``
或者''
即可完成两部分快速跳转。
:marks
列出所有的标记。'
表示上一次的跳转,[
和]
表示最后一次修改的开始和结束位置。
Usr_04.txt 小修改
Operators and motions
即一个操作紧跟一个移动,或者说移动包含的内容作为操作的输入
即删除当前光标到将移动到的光标位置之间的文本。
dw // 假如当前光标在单词首部则删除该单词
d3w //删除三个单词(初始在单词首)
d$ //删除当前光标到文件尾的内容
关于目的光标位置下的这个字符,是否删除和移动光标的命令有关。如
w
移动到下个单词首部此时就不会删除不然这个单词就不全了。e
则会删除以把该单词删除干净。$
也会删除。
改变文本
c
和d
操作符类似,只是在删除之后会进入插入模式。
假设此时光标在单词首,
dw
删除的是该单词及近跟的空格(w
毕竟是到下个单词的首部),de
则只删除整个单词空格保留,这些都是显而易见的。特例在于cw
,c
其他都一样就是cw
有一点不同,此时的cw
表现的像ce
及j即跟着的空格不会删去。这是从Vi继承下来的特性
cc
类似dd
但是会保留缩进
某些常用的operator-motion的形式,直接给了单独的命令如下:
x stands for dl (删除光标下的字符)
X stands for dh (删除光标左边的符)
D stands for d$ (删除到一行的末尾)
C stands for c$ (改变到一行的末尾)
s stands for cl (改变一个字符)
S stands for cc (改变整行)
r
替换一个字符,按下r
后,直接输入一个字符代替光标下的字符,虽然s
也可以做到但r
不需要进入插入模式。3rx
表示将连着的三个字符都替换成x,如果x是Enter
则只会有一个Enter
。
重复一个改变
.
重复执行最近的一次改变。如要修改文中的多出four为five,可以执行如下的命令序列:
/four
cwfive
n
.
n
.
这些改变不包括在内:
u
、ctrl+r
、一切使用:
的命令
可见模式
v
进入visual mode,此时通过移动可以高亮选中的字符。适合于operator-motion操作中不好一次性定位的motion,故可视化选中后在执行。
V
进入行选择可视化模式,此时左右移动光标无效,整行整行的选择
ctrl+v
进入矩形选择可视化模式
在VisualMode时,使用o
切换选择哪边固定。在ctrl+v
的矩形选择下o
往对角跳转,O
往水平跳转
移动文本
同通过d
,x
删除的文本实际是被保存了下来,可以使用p
命令粘贴,dd
删除将放在下一行,其他的放在当前光标之后。P
放的位置和p
相反。
xp
,可以交换相邻的两个字符。
复制文本
y
opertor类似d
一样,只不过不会有任何改变,只是将选择的文本复制,然后可以使用p
粘贴。
yy
复制整行,等效于Y
使用剪切板(跨程序的复制粘贴)
GUI Vim提供相应的菜单项,包括复制、剪切、粘贴等。如果使用命令则只需在y
,p
之前添加"*
即可。
文本对象(text object)
继operator-motion之后,现在可以使用operator-text object了。比如aw
表示a word,is
表示inner sentence(不删除句尾空格),as
表示a sentence。
比如此时光标在单词的中间,就可以使用daw
直接删除该单词。
text-object也可以使用在Visual mode中。
替换模式
R
进入替换模。使用<Insert> key
可以在插入模式和替换模式之间替换。
(usr_04)总结
可以使用各种operator和movement组合。
但这里有一些命令只能单独使用:
~
改变当前字符的大小写,也可在Visual mode下改变选中的所有的大小写。
I
移动到非空行首,然后进入插入模式。
A
移动到行尾,然后进入插入模式。
Usr_05.txt 设置你的配置
vimrc文件
对于常用的设置可以写下来保存在vimrc文件中,vim在启动时将会执行vimrc中命令以应用设置。所有的在:
之后的命令都可以写在vimrc中。
如果vimrc已存在,可以执行
:edit $MYVIMRC
直接编辑
该章节中只包含基础的项,更详细的vim脚本信息在usr_41.txt中
vim初始化过程内容较多,具体参考starting.txt文档,这里给出vimrc相关的加载说明。
-u filename
指定文件作为vimrc,但会导致跳过某些初始化,并且不会初始化$MYVIMRC
system-vimrc
若存在则总是被读取用于初始化,一般在$VIM/vimrc
(该文件不一定存在)。具体路径也显示在:version
命令的输出中。即使读取了system-vimrc
也会读取用户vimrc。
对于用户自定义的vimrc,vim会自动搜索以下的路径,选择第一次找到的加载。(除此之外还有可能从环境变量加载,具体参考文档)
"$HOME/.vimrc" (for Unix) (*)
"$HOME/.vim/vimrc" (for Unix) (*)
"$HOME/_vimrc" (for Win32) (*)
"$HOME/vimfiles/vimrc" (for Win32) (*)
"$VIM/_vimrc" (for Win32) (*)
Note: For Unix and Amiga, when ".vimrc" does not exist,
"_vimrc" is also tried, in case an MS-DOS compatible file
system is used. For MS-Windows ".vimrc" is checked after
"_vimrc", in case long file names are used.
Note: For Win32, "$HOME" is checked first. If no "_vimrc" or
".vimrc" is found there, "$VIM" is tried. See |$VIM| for when
$VIM is not set.
vimrc加载总结
若存在system-vimrc
一定会被加载,但其不一定存在
然后从以上说的位置查找用户自定义vimrc(这些设置可以覆盖system-vimrc)
如果没有用户自定义vimrc,加载default.vim
vimrc_example.vim解释
参考文档
突然蹦了个vim脚本出来,语法太多现在看的糊里糊涂的,留着之后看
defaults.vim解释
default_example.vim包含了大多数人都喜欢的配置,特别适合新的用户。另外当没有用户自定义的vimrc时,会被默认加载。也可以在自定义的vimrc中source $VIMRUNTIM/defaults.vim
,在defaults的基础上添加自己的选项。
// 默认文件配置可以被跳过,只需要let skip_defaults_vim=1
//特别是在system-vimrc中(因为system-vimrc若存在是被默认加载的)
if exists('skip_defaults_vim')
finish
endif
// 指定在插入模式下的使用backspace等命令的删除行为
//eol表示只允许删除到断行处即最多只能删除到行首,无法删除到上一行
//start表示只能删除到插入的位置,也就是新增的能删,插入之前的无法删
//indent表示是否能删除自动缩进
set backspace=indent,eol,start
// 历史命令和搜索的条数
set history=200
// 右下角显示正在输入的命令
set showcmd
// 按下Tab后是否显示待补全的菜单(针对状态栏的命令即:,/等开头的命令)
set wildmenu
// key codes和mapping codes的等待时间
//在ESC按下后会等待超时,在使用远程终端时可以关闭提高响应速度
set ttimeout
set ttimeoutlen=100
// 如果最后一行被截断,显示@@@代替直接不显示
set display=truncate
// 即在搜索的输入过程中(回车之前),开始匹配
set incsearch
// 不要将0开头的数字识别为8进制
set nrformats-=octal
// 定义一个按键映射
map Q gq
// 语法高亮
syntax on
// 开启文件类型自动检测,根据扩展名或文件内容特征识别文件类型
//比如*.c被识别为c源程序文件,#!/bin/bash被识别为shell脚本
//文件类型会被用于语法高亮,执行特定的文件类型插件,使用不同的缩进规则等
filetype plugin indent on
简单映射
可以将一连串的命令绑定到一个按键上,如
// 将<F5>映射为 为单词添加{}的命令
:map <F5> i{<Esc>ea}<Esc>
注意:在实际输入时<F5>可以按<F5>键也可以直接输入'<F5>'字符串
对于<ESC>,可以先按下<Crtl-V>再按下<ESC>在map中输入,也可以直接输入字符串'<ESC>'
:map
命令列出当前的映射(至少是在Normal mode下的)
注意如果使用映射键和vim命令冲突则不会生效
一个可用的符号是\
,所以可以使用\p
,\c
等来做映射则不会冲突