vim操作备忘录
vim的书籍虽然看不不少,可是老是容易忘记,主要是自己操作总结过少,这个博客就主要用来记录一些比较常见的术语和操作,以防止自己再次忘记。
<leader>的含义
- <leader> 在vim中默认表示" \ "
- :let mapleader = “-” 可以通过以下命令修改成自己喜欢的键。
<c-p>
- 以<c-…开头的表示:ctrl + …按键一起按,例如<c-p> 就是ctrl + p 一起键入。
不加载任何vim插件,使用最原始的vim
vim -u NONE -N XXXX.CC
-u NONE 表示不加载.vimrc
-N vim nocompatible vi
windows下的插件均安装在xxxx\xxxx\vim80(版本号)\colors(以颜色主题为例)下
ubuntu下均在~/.vim/colors(以颜色为例),颜色主题启动均以colorscheme monokai 来启动。
ubuntu通过vundle进行管理,主体步骤.vimrc---->通过命令if filereadable(expand(xxx))找到vundle的配置文件,并source启动-------->.vim.bundles------------>set rtp+=xxxx\Vundle.vim 以及call vundle#begin(默认 .vim\bundle)寻找到各类插件
source xxx.vim 用于启动xxx.vim插件
vim中常用配置
退格
shiftwidth reindent 操作(<<和>>)时缩进的列数(这里的一列相当于一个空格)
tabstop 一个tab键所占的列数,linux 内核代码建议每个tab占用8列
softtabstop 敲入tab键时实际占有的列数。
expandtab 输入tab时自动将其转化为空格
一般用法 :set shfitwidth = 4 softtabstop = 4 expandtab 换行自动缩进4格,softtabstop表示键入tab按钮实际所占行数,本例所占4列,expandtab使得tab实际不满足所定义列数,则以空格来凑。
filetype 根据文件后缀名来确定文件所属类型,可以通过set filetype=cpp来强制制定文件所属类型。
:filetype on 打开 未改变 未改变
:filetype off 关闭 未改变 未改变
:filetype plugin on 打开 打开 未改变
:filetype plugin off 未改变 关闭 未改变
:filetype indent on 打开 未改变 打开
:filetype indent off 未改变 未改变 关闭
:filetype plugin indent on 打开 打开 打开
:filetype plugin indent off 未改变 关闭 关闭
要查看当前的状态,只需输入: >
:filetype查看不可见字符
:set invlist
:set nolistwindows 下的vim设置字体
c:\Program Files(x86)\Vim下的_vimrc 添加 set guifont=Consolas:h11
配置文件_vimrc与安装的插件文件夹colors不在一个文件中,其他均在Vim\vim80\ 之下
映射
- inoremap就只在插入(insert)模式下生效
- vnoremap只在visual模式下生效
- nnoremap就在normal模式下(狂按esc后的模式)生效
- 在vim打开文件norm6al模式下键入 :help nnoremap,得出以下提示
- :nn[oremap] {lhs} {rhs} |mapmode-n| :nn *:nnorem
- 在映射命令作用的模式中把键序列 {lhs} 映射为 {rhs}
- 以YouCompleteMe的映射跳转定义的使用用例如下:
- nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR> " 跳转到定义处
高效修改符号内的字符
ci’、ci"、ci(、ci[、ci{、ci< - 分别更改这些配对标点符号中的文本内容
di’、di"、di(或dib、di[、di{或diB、di< - 分别删除这些配对标点符号中的文本内容
yi’、yi"、yi(、yi[、yi{、yi< - 分别复制这些配对标点符号中的文本内容
vi’、vi"、vi(、vi[、vi{、vi< - 分别选中这些配对标点符号中的文本内容
it : 选择xml标签内部内容,例如,高亮tags
at:选择一对xml标签,例如,高亮所有内容
将工作区分割成窗口
- 分割窗口操作
命令 | 用途 |
---|---|
<C-w>s | 水平切分当前窗口,新窗口仍显示当前缓冲区 |
<C-w>v | 垂直切分当前窗口,新窗口仍显示当前缓冲器 |
:sp[lit] {file} | 水平切分当前窗口,新窗口中载入{file} |
:vsp[lit] {file} | 垂直切分当前窗口,新窗口中载入{file} |
- 在窗口间切换
命令 | 用途 |
---|---|
<C-w>w | 在窗口间切换 |
<C-w>h | 切换到左边的窗口 |
<C-w>j | 切换到下面的窗口 |
<C-w>k | 切换到上面的窗口 |
<C-w>l | 切换到右边的窗口 |
- 关闭窗口
Ex命令 | 普通模式命令 | 用途 |
---|---|---|
:clo[se] | <C-w>c | 关闭活动窗口| |
:on[ly] | <C-w>o | 只保留活动窗口 |
- 改变窗口大小
命令 | 用途 |
---|---|
<C-w>= | 使所有窗口等高等宽(常用于恢复) |
<C-w> - | 减少窗口中的一行 |
<C-w> + | 增加窗口中的一行 |
<C-w>_ | 最大化窗口中的行(高度) |
<C-w>| | 最大化窗口的列 |
[N]<C-w>_ | 窗口中的行(高度)设置为N |
[N]<C-w>| | 最大化窗口的列设置为N |
在标签中切换
浏览Quickfix列表
命令 | 用途 |
---|---|
:cnext | 跳转到下一项 |
:cprev | 跳转到上一项 |
:cfirst | 跳转到第一项 |
:clast | 跳转到最后一项 |
:cc N | 跳转到第N项 |
:copen | 打开quickfix窗口 |
:cclose | 关闭quickfix窗口 |
:cnfile | 下一个文件的第一项 |
:cpfile | 上一个文件的最后一项 |
ctrl+i:进入定义或声明之处
ctrl+o:跳出定义或声明之处
YCM中采用vim的jumplist
单词,字符串之间跳跃
b:反向跳跃到单词首字符
B:反向跳跃到字符串首字符
w:正向跳跃到单词首字符
W:正向跳跃到字符串首字符
e:正向跳跃到字符末尾字符
E:正向跳跃到字符串末尾字符
ge:跳跃到上一个字符末尾
gE:跳跃到上一个字符串末尾
显示
zt:当前行显示到顶部
zz:当前行显示到屏幕中间
3H:跳到顶部第三行
5L:调到底部第五行
面向字符,行,列操作
- v:面向字符,配合b,w,e,ge可以快速选择并且匹配
- caw,yaw,daw:面向单词级别的处理
- V:面向行处理,Vr|,将一行全部转换成|
- ctrl+v:面向列处理,c-v3j,连续选择下面三列同位置,包含最初一行
- shift+i 在所选高亮区域前插入,shift+a 在所选高亮区域后以为插入
- gv:重复选择上次的高亮区域
- gU{motion},motion比如:it,V等,大写所选内容,gUgU大写所在行
- gu{motion},motion比如:it,V等,小写所选内容,gugu小写所在行
- i:当前光标前插入,I行首插入
- a:当前光标后插入,A行末插入
- o:切换高亮选区的活动端
vim比较文件方法
- #最简单的方法
- vimdiff FILE_LEFT FILE_RIGHT #方法1
- vim -d FILE_LEFT FILE_RIGHT #方法2
- vim FILE_LEFT
- :vertical diffsplit FILE_RIGHT #方法3
- [c #反向跳转
- ]c #正向跳转 下一个不同点
- :set noscrollbind #不需要同步移动
- :diffupdate 更新之后,需要手动同步
- #如果已经用split方式打开了两个文件file1,file2,又想比较两文件的不同。分别在两个窗口里面输入命令:
- :diffthis
- 合并文档:
- dp 将差异点的当前文档内容应用到另一文档(diff put)
- do 将差异点的另一文档的内容拷贝到当前文档(diff get)
- 上下文的展开和查看
- 比较和合并文件的时候经常需要结合上下文来确定最终要采取的操作。Vimdiff 缺省是会把不同之处上下各 6 行的文本都显示出来以供参考。其他的相同的文本行被自动折叠。如果希望修改缺省的上下文行数为3行,可以这样设置:
- :set diffopt=context:3
- 可以用简单的折叠命令来临时展开被折叠的相同的文本行:
- zo (folding open, z这个字母看上去比较像折叠的纸)
- 然后可以用下列命令来重新折叠:
- zc (folding close)
常见需要掌握的vim操作
- 不按Esc而是按[或者c,速度快很多
- 学会几个定位键的区别:0, $, {, }, g, G, w, e, b…
- o, O分别是当前位置下面/上面插入一个新行并进入插入状态
- Shift+V选定几行,然后用 一起移动
- Ctrl+V选定行首或行尾的字符,然后用shift+i做插入,或者shift+x做删除
- 学会用y,d 和p, P做粘贴剪切
- 学会用^W的窗口操作。打开文件用sp或者vs
- 学会记录宏的命令。用q加任意键开始录制,再按q保存。然后可用@加这个任意键回放,在@前加数字可定义回放次数。
- "."重复上一个命令,“u"取消上一个命令,”^r"反取消
- ^n, ^p用buf里的关键词补全。
- 学会搜索替换":%s/要搜的东西/要换成的东西/g"
- 任何时候移到一个单词上按#的话可以高亮这个文档里所有一样的单词
- 用“/”做搜索, 按n或N 上一个/下一个
- ":!命令 &“可直接运行这个命令,用”:!命令 %&"如果你想让这个命令对当前所编辑文件做操作。
- 任何时候可用":cd %:p:h"来切换目录到当前编辑文件所在目录。
vimscript中不错的语句小结
- "打开或读取python相关的程序,才高亮所有python语法
- autocmd BufRead,BufNewFile *.py let python_highlight_all = 1
- au FileType python setlocal formatprg=autopep8\ -
- autocmd FileType c,cpp,java,go,php,javascript,puppet,python,rust,twig,xml,yml,perl autocmd BufWritePre <buffer> :call <SID>StripTrailingWhitespaces()
- autocmd ! 清除vimcrc组全部的自动命令
- #快捷键函数映射
- map <F3> :call FormatSrc()<CR><CR>
- func FormatSrc()
- exec "w" "保存文档
- if &filetype == 'py' || &filetype == 'python'
- exec "r !autopep8 -i --aggressive --aggressive %" ”读取该命令执行后的结果
- endif
- exec "e! %" “编辑当前文件:无论缓存区里是否已经更改,考虑多人编辑文档的情况
- endfunc
- noremap <F3> :Autoformat<CR> "f3映射到命令autoformat
- au BufWrite * :Autoformat "保存文档前执行autoformat
- "使得formatprg带有参数
- au FileType python let &l:formatprg='autopep8 -a -a -'
- "au FileType python setlocal formatprg=autopep8\ -