VIM 学习笔记
初识VIM
第一次接触VIM 应该是在刚接触 UBUNTU 的时候。当时,按照网站上的教程,安装了vim 工具。打开 vim 后,一脸懵,输入文字,发现没有任何反映,有时候偶尔输入一两个字母,也找不到规律,只是看到光标奇怪的跳动,文字奇怪的变化。
VIM的简单操作
后来,慢慢了解到vim的一些简单操作: 打开vim后,按 “i” 可以进入编辑模式,此时可以正常输入要写入的信息,最后,按退出编辑模式,按下“: w q”退出vim。此后, 在终端中,我开始慢慢使用vim修改一些文件的内容,当然,仅仅是一些小修小改,如果遇到大面积改动的话,我还是更倾向于使用 VScode*或者其他 UI 编辑器。最主要原因还是因为,这些编辑器可以大面积复制和粘贴。
快捷键 | 说明 |
---|
i | 在光标处进入插入模式 | I | 在行首进入插入模式 | a | 在光标后进入插入模式 | A | 在行尾进入插入模式 | o | 在下一行插入新行并进入插入模式 | O | 在上一行插入新行并进入插入模式 | gi | 进入到上一次插入模式的位置 | <esc> | 退出插入模式 |
VIM快捷建
当我看到 VIM 的一些快捷键操作的的时候,vim仿佛焕发了全新的光芒: 借助于Normal模式下的快捷建操作,可以对文档进行快速操作,比如: 按下 “x” 可以删除光标下的字符,“3x” 就可以从光标处连续删除3个字符;按下“dd”可以直接删除一整行内容……
缓存操作
快捷键 | 说明 |
---|
:e <filename> | 新建buffer打开文件 | :bp | 切换到上一个buffer | :bn | 切换到下一个buffer | :bd | 删除当前buffer |
窗口操作
快捷键 | 说明 |
---|
:sp <filename> | 横向切分窗口并打开文件 | :vsp <filename> | 竖向切分窗口并打开文件 | <c-w>h | 跳到左边的窗口 | <c-w>j | 跳到下边的窗口 | <c-w>k | 跳到上边的窗口 | <c-w>l | 跳到右边的窗口 | <c-w>c | 关闭当前窗口 | <c-w>o | 关闭其他窗口 | :only | 关闭其他窗口 |
光标移动
快捷键 | 说明 |
---|
h | 上下左右移动 | j | 上下左右移动 | k | 上下左右移动 | l | 上下左右移动 | 0 | 光标移动到行首 | ^ | 跳到从行首开始第一个非空白字符 | $ | 光标移动到行尾 | <c-o> | 跳到上一个位置 | <c-i> | 跳到下一个位置 | <c-b> | 上一页 | <c-f> | 下一页 | <c-u> | 上移半屏 | <c-d> | 下移半屏 | H | 调到屏幕顶上 | M | 调到屏幕中间 | L | 调到屏幕下方 | :n | 跳到第n行 | w | 跳到下一个单词开头(标点或空格分隔的单词) | W | 跳到下一个单词开头(空格分隔的单词) | e | 跳到下一个单词尾部(标点或空格分隔的单词) | E | 跳到下一个单词尾部(空格分隔的单词) | b | 上一个单词头(标点或空格分隔的单词) | B | 上一个单词头(空格分隔的单词) | ge | 上一个单词尾 | % | 在配对符间移动, 可用于()、{}、[] | gg | 到文件首 | G | 到文件尾 | fx | 跳转到下一个为x的字符 | Fx | 跳转到上一个为x的字符 | tx | 跳转到下一个为x的字符前 | Tx | 跳转到上一个为x的字符前 | ; | 跳到下一个搜索的结果 | [[ | 跳转到函数开头 | ]] | 跳转到函数结尾 |
文本编辑
快捷键 | 说明 |
---|
r | 替换当前字符 | R | 进入替换模式,直至 ESC 离开 | s | 替换字符(删除光标处字符,并进入插入模式,前可接数量) | S | 替换行(删除当前行,并进入插入模式,前可接数量) | cc | 改写当前行(删除当前行并进入插入模式),同 S | cw | 改写光标开始处的当前单词 | ciw | 改写光标所处的单词 | caw | 改写光标所处的单词,并且包括前后空格(如果有的话) | ct, | 改写到逗号 | c0 | 改写到行首 | c^ | 改写到行首(第一个非零字符) | c$ | 改写到行末 | C | 改写到行末(同 c$) | ci" | 改写双引号中的内容 | ci' | 改写单引号中的内容 | ci) | 改写小括号中的内容 | ci] | 改写中括号中内容 | ci} | 改写大括号中内容 | cit | 改写 xml tag 中的内容 | cis | 改写当前句子 | ciB | 改写’{}'中的内容 | c2w | 改写下两个单词 | ct( | 改写到小括号前 | x | 删除当前字符,前面可以接数字,3x代表删除三个字符 | X | 向前删除字符 | dd | 删除当前行 | d0 | 删除到行首 | d^ | 删除到行首(第一个非零字符) | d$ | 删除到行末 | D | 删除到行末(同 d$) | dw | 删除当前单词 | dt, | 删除到逗号 | diw | 删除光标所处的单词 | daw | 删除光标所处的单词,并包含前后空格(如果有的话) | di" | 删除双引号中的内容 | di' | 删除单引号中的内容 | di) | 删除小括号中的内容 | di] | 删除中括号中内容 | di} | 删除大括号中内容 | diB | 删除’{}'中的内容 | dit | 删除 xml tag 中的内容 | dis | 删除当前句子 | d2w | 删除下两个单词 | dt( | 删除到小括号前 | dgg | 删除到文件头部 | dG | 删除到文件尾部 | d} | 删除下一段 | d{ | 删除上一段 | u | 撤销 | U | 撤销整行操作 | CTRL-R | 撤销上一次 u 命令 | J | 连接若干行 | gJ | 连接若干行,删除空白字符 | . | 重复上一次操作 | ~ | 交换大小写 | g~iw | 替换当前单词的大小写 | gUiw | 将单词转成大写 | guiw | 将当前单词转成小写 | guu | 全行转为小写 | gUU | 全行转为大写 | gg=G | 缩进整个文件 | =a{ | 缩进光标所在代码块 | =i{ | 缩进光标所在代码块,不缩进"{" | << | 减少缩进 | >> | 增加缩进 | == | 自动缩进 | CTRL-A | 增加数字 | CTRL-X | 减少数字 | p | 粘贴到光标后 | P | 粘贴到光标前 | v | 开始标记 | y | 复制标记内容 | V | 开始按行标记 | CTRL-V | 开始列标记 | y$ | 复制当前位置到本行结束的内容 | yy | 复制当前行 | Y | 复制当前行,同 yy | yt, | 复制到逗号 | yiw | 复制当前单词 | "+y | 复制当前选中到系统剪切板 | 3yy | 复制光标下三行内容 | v0 | 选中当前位置到行首 | v$ | 选中当前位置到行末 | vt, | 选中到逗号 | viw | 选中当前单词 | vi) | 选中小括号内的东西 | vi] | 选中中括号内的东西 | viB | 选中’{}'中的内容 | vis | 选中句子中的东西 | gv | 重新选择上一次选中的文字 | :set paste | 允许粘贴模式(避免粘贴时自动缩进影响格式) | :set nopaste | 禁止粘贴模式 | "?yy | 复制当前行到寄存器 ? ,问号代表 0-9 的寄存器名称 | "?p | 将寄存器 ? 的内容粘贴到光标后 | "?P | 将寄存器 ? 的内容粘贴到光标前 | :registers | 显示所有寄存器内容 | :[range]y | 复制范围,比如 :20,30y 是复制20到30行,:10y 是复制第十行 | :[range]d | 删除范围,比如 :20,30d 是删除20到30行,:10d 是删除第十行 | ddp | 交换两行内容:先删除当前行复制到寄存器,并粘贴 |
文件操作
快捷键 | 说明 |
---|
:w | 保存文件 | :w <filename> | 按名称保存文件 | ZZ | 保存文件(如果有改动的话),并关闭窗口 | :e <filename> | 打开文件并编辑 | :saveas <filename> | 另存为文件 | :r <filename> | 读取文件并将内容插入到光标后 | :r !dir | 将dir命令的输出捕获并插入到光标后 | :close | 关闭文件 | :q | 退出 | :q! | 强制退出 | :wa | 保存所有文件 | :cd <path> | 切换Vim当前路径 | :new | 打开一个新的窗口编辑新文件 | :enew | 在当前窗口创建新文件 | :vnew | 在左右切分的新窗口中编辑新文件 | :tabnew | 在新的标签页中编辑新文件 |
使用外部程序
快捷键 | 说明 |
---|
! | 告诉vim正在执行一个过滤操作 | !5Gsort<Enter> | 使用外部sort命令对1-5行文本排序 | !! | 对当前行执行过滤命令 | !!date<Enter> | 用"date"的输出代替当前行 |
宏录制
快捷键 | 说明 |
---|
qa | 开始录制名字为a的宏 | q | 结束录制宏 | @a | 播放名字为a的宏 | 100@a | 播放名字为a的宏100次 | :normal@a | 播放名字为a的宏直到自动结束 |
实用命令
快捷键 | 说明 |
---|
/pattern | 从光标处向文件尾搜索 pattern | ?pattern | 从光标处向文件头搜索 pattern | n | 向同一方向执行上一次搜索 | N | 向相反方向执行上一次搜索 | * | 向前搜索光标下的单词 | # | 向后搜索光标下的单词 | :s/p1/p2/g | 替换当前行的p1为p2 | :%s/p1/p2/g | 替换当前文件中的p1为p2 | :%s/<p1>/p2/g | 替换当前文件中的p1单词为p2 | :%s/p1/p2/gc | 替换当前文件中的p1为p2,并且每处询问你是否替换 | :10,20s/p1/p2/g | 将第10到20行中所有p1替换为p2 | :%s/1\\2\/3/123/g | 将“1\2/3” 替换为 “123”(特殊字符使用反斜杠标注) | :%s/\r//g | 删除 DOS 换行符 ^M | :g/^\s*$/d | 删除空行 | :g/test/d | 删除所有包含 test 的行 | :v/test/d | 删除所有不包含 test 的行 | :%s/^/test/ | 在行首加入特定字符(也可以用宏录制来添加) | :%s/$/test/ | 在行尾加入特定字符(也可以用宏录制来添加) | :sort | 排序 | :g/^\(.\+\)$\n\1/d | 去除重复行(先排序) | :%s/^.\{10\}// | 删除每行前10个字符 | :%s/.\{10\}$// | 删除每行尾10个字符 |
帮助
快捷键 | 说明 |
---|
h tutor | 入门文档 | h quickref | 快速帮助 | h index | 查询Vim所有键盘命令定义 | h summary | 帮助你更好的使用内置帮助系统 | h pattern.txt | 正则表达式帮助 | h eval | 脚本编写帮助 | h function-list | 查看VimScript的函数列表 | h windows.txt | 窗口使用帮助 | h tabpage.txt | 标签页使用帮助 | h tips | 查看Vim内置的常用技巧文档 | h quote | 寄存器 | h autocommand-events | 所有可能事件 | h write-plugin | 编写插件 |
其他
快捷键 | 说明 |
---|
vim -u NONE -N | 开启vim时不加载vimrc文件 | vimdiff file1 file2 | 显示文件差异 | vim -R filename | 以只读方式打开(阅读模式) |
有了这些快捷键,VIM修改文件的速度大幅度提高,所以,vim成为了在终端下修改字符文件的一大利器。vim快捷指令有很多过于复杂,所以对于新手不太友好,只能慢慢练习,熟能生巧。而且,实际中很多跨文件操作,只依靠vim自身,很难实现。
VIM 参数配置
在之前的操作中,进入vim后,通常需要手动开启行号(即:在Normal模式下,输入":set nu"),这显然不是最佳效果,所以,我开始了解vim配置文件。
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 通用设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
let mapleader = "," " 定义<leader>键
set nocompatible " 设置不兼容原始vi模式
filetype on " 设置开启文件类型侦测
filetype plugin on " 设置加载对应文件类型的插件
set noeb " 关闭错误的提示
syntax enable " 开启语法高亮功能
syntax on " 自动语法高亮
set t_Co=256 " 开启256色支持
set cmdheight=2 " 设置命令行的高度
set showcmd " select模式下显示选中的行数
set ruler " 总是显示光标位置
set laststatus=2 " 总是显示状态栏
set number " 开启行号显示
set cursorline " 高亮显示当前行
set whichwrap+=<,>,h,l " 设置光标键跨行
set ttimeoutlen=0 " 设置<ESC>键响应时间
set virtualedit=block,onemore " 允许光标出现在最后一个字符的后面
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 代码缩进和排版
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set autoindent " 设置自动缩进
set cindent " 设置使用C/C++语言的自动缩进方式
set cinoptions=g0,:0,N-s,(0 " 设置C/C++语言的具体缩进方式
set smartindent " 智能的选择对其方式
filetype indent on " 自适应不同语言的智能缩进
set expandtab " 将制表符扩展为空格
set tabstop=4 " 设置编辑时制表符占用空格数
set shiftwidth=4 " 设置格式化时制表符占用空格数
set softtabstop=4 " 设置4个空格为制表符
set smarttab " 在行和段开始处使用制表符
set nowrap " 禁止折行
set backspace=2 " 使用回车键正常处理indent,eol,start等
set sidescroll=10 " 设置向右滚动字符数
set nofoldenable " 禁用折叠代码
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 代码补全
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set wildmenu " vim自身命名行模式智能补全
set completeopt-=preview " 补全时不显示窗口,只显示补全列表
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 搜索设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set hlsearch " 高亮显示搜索结果
set incsearch " 开启实时搜索功能
set ignorecase " 搜索时大小写不敏感
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 缓存设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set nobackup " 设置不备份
set noswapfile " 禁止生成临时文件
set autoread " 文件在vim之外修改过,自动重新读入
set autowrite " 设置自动保存
set confirm " 在处理未保存或只读文件的时候,弹出确认
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 缓存设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set mouse=a
set selection=exclusive
set selectmode=mouse,key
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
经过配置之后的vim,就比较像一款编程工具了,首先,可以设置自己喜欢的颜色主题,这样,看代码更加方便。其次,行号不需要再手动开启,最主要的是,可以通过参数配置,开启鼠标,通过鼠标,跳转光标。也可以跟系统共用剪切板,将文档中的内容,复制到其他地方。
快捷键的重映射
在vim中,有些快捷键按起来比较困难,比如,复制选择区内容到剪切板(快捷键为 “ “+y ” ,没错,先按下shift键,再依次按下 ” + 键,最后松开shift 按下 y 键 ),这么复杂的按键组合,显然不适合常用,所以,就需要对按键组合进行重映射。
" 查看vimplus的help文件
nnoremap <leader>h :view +let\ &l:modifiable=0 ~/.vimplus/help.md<cr>
" 打开当前光标所在单词的vim帮助文档
nnoremap <leader>H :execute ":help " . expand("<cword>")<cr>
" 重新加载vimrc文件
nnoremap <leader>s :source $MYVIMRC<cr>
" 安装、更新、删除插件
nnoremap <leader><leader>i :PlugInstall<cr>
nnoremap <leader><leader>u :PlugUpdate<cr>
nnoremap <leader><leader>c :PlugClean<cr>
" 分屏窗口移动
nnoremap <c-j> <c-w>j
nnoremap <c-k> <c-w>k
nnoremap <c-h> <c-w>h
nnoremap <c-l> <c-w>l
" 复制当前选中到系统剪切板
vmap <leader><leader>y "+y
" 将系统剪切板内容粘贴到vim
nnoremap <leader><leader>p "+p
重映射不仅可以映射某些按键组合,还可以映射某些自定义功能。在这些快捷键的加持下,vim的操作更加快捷
VIM 插件
让VIM功能更上一层楼的,是VIM的扩展插件,这些拓展插件,让使用者可以完全脱离鼠标,只用键盘,就可以完成所有工作。
既然要安装插件,那就需要有专门的程序区管理这些插件,当下,vim主要使用vim_plug的管理插件。
vim插件管理器
mkdir -p ~/.vim/autoload/
cp plug.vim ~/.vim/autoload/plug.vim
在vimawesome上有很多vim插件,使用者可以在该网站查找自己想要的插件。 常用的插件有以下几种:
taglist.vim “标签列表(函数列表)
NERDTree.vim "目录树
OmniCppComplete.vim " 语法补全,不如 youcompleteme 功能强大
VimGDB.vim
LookupFile " 查找文件
snipMate " 模板操作
MRU "最经访问文件
VIM 辅助辅助软件
sudo apt-get install universal-ctags
sudo apt-get install cscope
sudo apt-get install vim-gtk
sudo apt-get install xdotool
sudo apt install ack-grep
VIM新手推荐入门
新手在配置vim的过程中,会遇到各种各样的的问题,比如:快捷键冲突、奇奇怪怪的bug,甚至会出现和预想南辕北辙的情况。所以,比较推荐安装其他人配置好的vim, 等对 vim 足够熟悉后,再考虑组建适合自己的 vim
git clone https://github.com/chxuan/vimplus.git ~/.vimplus
cd ~/.vimplus
./install.sh
安装 markdown-preview
将Plug 'iamcco/markdown-preview.nvim', { 'do': { -> mkdp#util#install() }, 'for': ['markdown', 'vim-plug']} 加入到vimrc中然后在vim里运行 :PlugInstall下载markdown-preview插件
安装npm sudo apt install nodejs npm , nodejs --version 有输出表示成功
运行 :call mkdp#util#install()
最后用vim打开个md文件,输入:MarkdownPreview看到预览则成功
|