vim用了几年了,很多东西都还是不知道,最近找了点别人的PPT或文章来看,然后管它知道不知道,先做笔记再说。这次的笔记是一个PPT:《VIM - Hack Your Editor!》的内容,作者为yzlin:
1、vim的四个模式
普通模式:移动
插入模式:修改文本
可视模式:选择内容
命令模式:执行命令行
2、移动
h, j, k, l - 左,下,上,右
ctrl+f - 向上翻页
ctrl+b - 向下翻页
0 - 行首
$ - 行末
gg - 首行
G - 末行
ngg/nG - 正数第n行
n% - 假设文档共100行,则移动到第22行,即从开始算的百分比。
3、文件操作
:wq<CR> - 保存并退出
:x<CR> - 同上,保存并退出
ZZ - 保存并退出,注意,这里没有冒号。即直接输入而不是命令模式下。
:q<CR> - 直接退出,不保存。
ZQ - 直接退出,不保存。这里也没有冒号,是普通模式下直接输入。
4、文本操作
基本用法:
i - 光标前插入数据。
I - 行首插入数据。
a - 光标后插入数据。
A - 行末插入数据。
o - 在下边新插入行。
O - 在上边新插入行。
s - 删除字符并进入输入模式。删除的内容保存在寄存器中。
S - 删除行并进入输入模式。删除的内容保存在寄存器中。
c - 通常用法为c{motion},作用为删除motion指定的文本并进入插入模式。比如c$,删除从光标位置到行尾的字符并进入插入模式;ct!,删除从光标位置到下一个感叹号的位置(不包括感叹号),然后进入插入模式。删除的内容保存在寄存器中。
cc - 删除指定的行数。删除的内容保存在寄存器中。
C - 从当前位置起删除本行余下的部分,并再删除n-1行。类似于命令c$,最后进入插入模式。删除的内容保存在寄存器中。
r - 把光标下的字符换成{char}。5r<CR>则将五个字符替换为一个换行符。
R - 进入修改模式,每个键入的字符都将替换光标下的一个字符。
d - 通常用法为d{motion},作用为删除motion指定的文本。删除的内容保存在寄存器中。
D - 从当前位置起删除本行余下的部分,并再删除n-1行。删除的内容保存在寄存器中。
dd - 删除若干行。删除的内容保存在寄存器中。
yy - 复制若干行。复制的内容保存在寄存器中。
p - 将寄存器中的内容复制在光标之后。
P - 将寄存器中的内容复制在光标之前。
高级用法:
gi - 返回上次编辑的位置。
n - 这里的n代表任意一个数字,可以作为上边文本操作命令的前缀,表示重复执行n次。
5、可视化模式(v)下的文本操作
w - 从当前位置开始,选择一个单词。
iw - 选择当前位置所在的整个单词。选取多个单词时,单词之间的空白也被算作一个单词。
i' - 从当前位置向后选择第一对单引号中的内容,不包括单引号。同理如i",i<等。
a' - 从当前位置向前选择第一对单引号中的内容,包括单引号。
注:可以使用 set iskeyword来定义单词分隔符。
6、举例
dw - 删除单词,空白字符不计入单词数。
diw - 删除单词,空白字符也算一个单词。
cw - 删除单词,并进入插入模式。空白字符不计入单词数。
ciw - 删除单词,空白字符计入单词数。
di"/di'/di[/di{/di(/dit - 删除一对标签中的所有字符,不包含引号。其中,dit所对应的标签为HTML/XML标签。
ci"/ci'/ci[/ci{/ci(/cit - 见上一条。
da"/da'/da[/da{/da(/dat - 见上一条,da'和di'的区别在于删除的内容是否包含引号。
ca"/ca'/ca[/ca[/ca(/cat - 见上一条。
gui" - 将双引号中的字符变为大写。
gua[ - 将中括号中的内容变为小写。
7、可视模式
v - 字符选择模式。
V - 行选择模式。
ctrl-v - 块选择模式。
注:使用了ctrl-v后,再再使用大写的A或I就可进入插入模式。
8、文本查找
set wrapscan - 继续搜索直到文件的尾部。
set incsearch - 在输入查找的同事就对内容进行匹配,并显示匹配的位置。
set ignorecase - 不区分大小写。
9、窗口分割
ctrl-w + s/v - 水平/垂直分割
ctrl-w + h/j/k/l - 移动到左/下/右/上的窗口
ctrl-w + ctrl-w - 移动到右/下方的窗口
ctrl-w +/-/=/_ - 增加/减少/等分/最大化窗口
10、多个标签页操作
tabedit <file> - 在新的标签页中编辑文件。
tabnew - 新建一个标签页。
tabclose - 关闭当前标签页。
tabprev - 切换到前一个标签页。
tabnext - 切换到后一个标签页。
tabmove <index> - 将当前标签页移动到index标签页之后。
tabnext <index> - 切换到某个标签页。
set showtabline=2 - 设置是否显示标签页的标签。0为不显示,1为只有当多余两个的时候才显示,2为总是显示。
11、热键设置
nmap <LEADER>tc :tabnew<CR> - tabnew映射为tc。
nmap <LEADER>te :tabedit<SPACE> - tabedit映射为te。
nmap <LEADER>tm :tabmove<SPACE> - tabmove映射为tm。
nmap <LEADER>tk :tabclose<CR> - tabclose映射为tk。
nmap <C-H> :tabprev<CR> - tabprev映射为ctrl+h。
nmap <C-L> :tabnext<CR> - tabnext映射为ctrl+l。
注意:
a、<LEADER>如果未指定则为'\',可以通过let mapleader = "key"的方式来指定。
b、nmap和map的区别在于:nmap只能工作与普通模式下,而map可以工作在普通,可是,选择模式下。
12、快速切换功能
autocmd TabLeave * let g:LastUsedTabPage = tabpagenr()
function! SwitchLastUsedTab()
if exists("g:LastUsedTabPage")
execute "tabnext " g:LastUsedTabPage
endif
endfunction
nmap tt :call SwitchLastUsedTab()<CR>
注意:
a、 tabpagenr()为获取当前标签页的编号。
b、 function表示定义一个新的函数,而后边的感叹号表示覆盖之前出现的同名函数,并且不报错。如果不指定感叹号,则会报错。
c、autocmd中的tableave表明在离开标签页之前将g:LastUsedTabPage设定为当前标签页的编号。
d、这段的意思是执行tt命令时切换到下一个标签页。
13、折叠
set foldenable - 开启折叠选项。
set foldmethod=syntax (manual, indent) - 选择折叠的方式,自动还是手动。
set foldlevel=10000 - 设定折叠的级别。为0则关闭所有折叠。
set foldcolumn=3 - 如果非0,则指定宽度列在窗口的一侧显示。指示折叠的打开和关闭。
nnoremap <SPACE> za - 将空格映射为打开和关闭折叠。
14、拼写检查
Spell checking on/off - 设置打开或关闭拼写检查。
set spell/set nospell - 开启或关闭拼写检查。
set spelllang=en - 以英文的形式进行拼写检查。
hi SpellBad term=underline cterm=underline ctermfg=red - 设置高亮显示拼写错误。
map <F5> :set spell!<CR><BAR>:echo “Spell check: “ . strpart(“OffOn”, 3 * &spell, 3)<CR> - 设置热键F5为拼写检查。
15、杂项
set showcmd - 在屏幕的最后一行显示命令。
set backup - 设置是否需要备份。
set backupdir=$HOME/.vim/backup - 设置备份的目录。
set tabstop=4 - 将tab设置为4个空格的宽度。
set shiftwidth=4 - 将缩进设置为4个空格。
set softtabstop=8 - 一个tab表现为4个空格。
set expandtab/noexpandtab - 在缩进和遇到tab键时使用空格替代。
set list - 将不可打印字符显示出来。
set listchars=tab:>-,trail:-,eol:$,nbsp:%,extends:>,precedes:<
- 设置不可打印字符在需要显示时显示的状态。 比如tab显示为'>-'
其中:
a、eol:行末。
b、tab:制表符。
c、trail:尾部的空格。
d、extends:最后一列显示的字符,当关闭wrap时,超出了屏幕的右侧还存在文本。
e、precedes:第一列显示的字符。当关闭wrap时,超出了屏幕左侧还存在的文本。
f、nbsp:不能折行的空格。non-breakable space。
noremap <LEADER>st :set list<CR> - 映射显示标记为st。
noremap <LEADER>ct :set nolist<CR> - 映射不显示标记为ct。
autocmd BufReadPost *
\ if line(“‘\’”) > 0 && line(“‘\””) <= line(“$”) |
\ exe “normal g`\”” |
\ endif
打开一个文件后,自动跳转到上次退出时的位置(这些信息保存在~/.viminfo中)。
vim scp://HOST//PATH/TO/FILE - 通过网络来编辑文件。
C-a/C-x - 如果光标下边是数字的话,会对数字进行递减/递增操作。
16、编码辅助功能
set showmatch - 设置匹配模式,类似易于光标在左括号上会显示右括号的位置。
hi MatchParen ctermbg=yellow - 匹配到的括号显示为黄色。
% - 显示一对匹配的模式(括号)。如果光标在模式内,则定位到左括号;光标在模式外,则定位在右括号。
17、vimrc编写注意事项(跨平台)
windows - has(“win32”) & has(“win64”)
mac - has(“mac”) & has(“macunix”)
unix - has(“unix”)
使用augroup和autocmd来个性化文件设置。