vim 笔记
vim 目录结构
- vim目录结构 以下针对 vim90, 有些文件夹可能没有,没有的话,可以自己新建一个
- after : plugin 加载完后,加载 after 中的内容
- autoload : 自动会运行的脚本
- bitmaps : 默认图标存放路径
- colors : 配色方案
- compiler
- doc : 插件文档,使用
:help
时可以用到 - ftdetect : filetype detection, vim 启动时执行,检测和设置文件的类型。
- ftplugin : plugin,autoload,ftplugin不同
- GvimExt32
- GvimExt64
- import
- indent : 自动缩进定义文件, 根据打开文件名字加载
- keymap
- lang : 界面显示语言
- macros : 宏示例
- plugin : 插件, 每次启动 vim 时都会加载
- spell : 拼写检查脚本
- syntax : 语法高亮
- tools : 工具
- tutor
vimrc 配置
配置文件在 ~/.vimrc
,将下面的设置写入 ~/.vimrc 中即可每次打开 vim 时都实现特特定的效果。也可以在打开 vim 后, 在命令模式下输入下面的内容也可以实现特定的效果,这种方式只会在当前打开的 vim 界面有效。
set hlsearch
: 设置搜索高亮,当查到字符串时高亮显示set nu
: 显示行号set nonu
: 取消行号显示set tags=tags
: 设置 tags 为当前文件夹下的 tagsset cursorcolumn
: 高亮所在列set cursorline
: 高亮所在行。高亮操作set runtimepath^=/home/chao/.vim/pack/vimwiki
: ^= 新增一个 runtimepath 路径,可以管理插件set enc=utf-8
: 设置 utf-8 编码syntax clear
: 取消高亮set guioptions
: 设置gui模式下菜单栏和导航栏是否显示set wrap
: 设置折行,长的行用多行显示,但是本质还是一行set nowrap
: 不设置折行,可能会出现一行太长,屏幕装不下的情况set guioptions+=T
: 显示工具栏set guioptions-=T
: 不显示工具栏set ignorecase
: 搜索时忽略大小写
vim 的几种模式
打开 vim 后,输入 :help vim-modes
便可以查看 vim 的几种模式,对于 vim 9.0.1425, 得到的结果是: 7种基本模式
- Normal mode : 正常模式,正常模式下可以输入所有的编辑命令,这也称之为命令模式
- Visual mode : 可视模式,这与正常模式类似,但是当使用移动命令(h,j,k,l等)时,会衍生出来一块高亮的区域。当使用非移动命令, 会对高亮部分内容生效。比如高亮了一块区域,然后输入
d
, 便会删除高亮的部分 - Select mode : 选择模式,这看起来最想 MS-Windows 的选择模式,键入可打印字符会删除选择并启动插入模式。
- Insert mode : 插入模式,在插入模式下,输入的文本会保存在 buffer 中,类 unix 输入的文本下会保存在为
.文件名.swp
中 - Command-line mode : 命令行模式, 也叫做 Cmdline mode, 可以在窗口下面输入一行文本。
:
用于 Ex 命令,?
用于搜索,/
用于过滤 - Ex mode : 与 Command-line mode 类似,但是输完一个命令后仍然在 Ex mode.
- Terminal-Job mode : 终端任务模式,在终端窗口交互式作业,输入的键转到作业,而作业的输出将显示到终端窗口 此外,还有 7 种额外的模式,这些是基本模式的变种, 包括
Operator-pending mode
,Replace mode
,Virtual Replace mode
,Insert Normal mode
,Terminal-Normal mode
,Insert Visual mode
和Insert Select mode
正常模式/命令模式
进入vim后即为正常模式
- ctrl+w, _ (shift+-) : 最大化窗口
- ctrl+w, = : 恢复窗口
- “+gP : 可以从剪贴板复制,gvim有效。
- u : 撤回一次更改,类似 windows 下的 ctrl + z
- ctrl + R : 取消一次撤回的更改,类似 windows 下的 ctrl + y
- ma : 生成一个标签 a (只在当前文件有效)
- `a : 跳转到标签 a
- delmarks a : 删除标签 a
命令行模式
命令模式下很多东西都可以写在 ~/.vimrc 中, ~/.vimrc 中的很多内容也都可以在命令行模式下执行,用:
启动命令模式
:set ft=c
: ft filetype:set runtimepath ?
: 查看 vim 的 runtimepath。:tags
: 列出所有标签:marks
: 查看设置过的标签:source ~/.vimrc
: 重新加载 vimrc 中的配置:set guifont=*
: gui环境下设置字体:g/example/d
: 删除所有包含example的行
可视模式
- u : 选择的内容小写
- U : 选择的内容大写
跳转
通过 tags
进行跳转
- bn : 跳转下一个记录
- bp : 跳转到上一个记录
- ma : 生成一个标签 a (只在当前文件有效)
- `a : 跳转到标签 a
- delmarks a : 删除标签 a
- marks : 查看设置过的标签
为 UVM 生成 tags
首先进入 uvm 源码的 src 目录,执行下列语句
ctags --languages=systemverilog -R .
就会在源码目录生成 tags 文件,然后编辑用户家目录的 .vimrc 文件,添加如下内容,注意 /opt/uvm/uvm-1.1d/src 为上面生成的 tags 文件路径:
set tags=./tags
set tags+=/opt/uvm/uvm-1.1d/src/tags
然后打开 systemverilog 文件就可以进行跳转了。
- tags : 列出所有标签
- ctrl + ] : 跳转到函数,类等
- ctrl + t : 返回跳转前的位置,如果有多次跳转,只能一次一次返回
跳转到文件中的目录
gf
: go to file:bd
: 返回到原来的文件:bn
: 跳转到下一个记录:bp
: 跳转到上一个记录
匹配
- \s : 匹配空格
多标签(tab)
此标签 (tab) 非彼标签 (tag) vim 可以添加标签,方便切换
:tabnew
: 新建一个标签,可以后街文件:tabopen
: 打开文件:tabedit
: 编辑文件
遇到的问题
编码设置,解决 windows gvim 菜单键乱码问题
" vimrc 中注释用 "
" 编码设置,解决 windows gvim 菜单键乱码问题。
set enc=utf-8
set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
" some conf
" ...
if(has("win32") || has("win95") || has("win64") || has("win7") || has("win10"))
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
endif
插件
存放插件的路径放在 runtimepath 中, 启动 vim 时, 会按照下面的步骤执行:
- 处理
.vimrc
文件 - 扫描
~/.vim
中的所有目录 - 查找包含
pack/*/start
中的插件
- 如果发现放在
start
下的插件没有作用, 看看改路径是否在runtimepath
中, 查看方式如下 : 打开 vim 后, 输入: set runtimepath?
即可查看 runtimepath, 如果没有, 则需要在~/.vimrc
中加入set runtimepath ^=/home/chao/.vim/pack/vimwiki
手动安装
插件安装 在 start
目录下的插件会自动执行,在 opt
目录下的插件需要通过 packadd xx
来加载插件
- 将插件放在
~/.vim/pack/*/start/
目录下 - 或者在
~/.vim/pack/
目录下创建一个目录,然后在该目录下创建一个start
目录,将插件放在start
目录下
vim安装vba格式的插件
以安装vimwiki为例, 首先打开 vimwiki.vba 文件
vim vimwiki.vba
然后执行下面的语句
:so %
:q
用到的一些插件
NERDTree
- vim 的一个树形文件浏览器插件
- NERDTree 打开 NERDTree 插件
其它暂未分类
- iabbrev 设置缩写, 可以在写在 plugin 或者 ftplugin 文件下对应的语言中
iabbrev pf `print()`
后面在相应的语言代码中输入 pf 然后按空格键,便会自动输入 print
宏
使用宏的步骤
- 先按
q
, 然后按任意一个字母, 如a
, 就可以录制宏 - 比如需要删除1,3,5,7等奇数行, 先输入
dd
删除一行, 然后输入2j
跳到下一行 - 结束宏录制, 按
q
- 使用宏, 按
@a
使用一次, 输入7@a
使用 7 次
key map
map <C-]> <S-*><C-w><C-]<C-w><S-t>
nnoremap <C-Left> :tabprevious<CR>
nnoremap <C-Right> :tabnext<CR>
nnoremap <C-h> :tabprevious<CR>
nnoremap <C-l> :tabnext<CR>
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k