vim学习笔记

  • 入门
    • vim模式:(界面左下角有显示)
    • api帮助文档
    • Ctrl+S造成vim假卡死
    • 基本指令
    • operator操作符
    • motion动作
    • 移动
      • 水平移动(行内)
      • 垂直移动(行间)
    • 编辑
      • 基础命令
      • 拓展命令
      • 大小写
      • 加a减x
  • 进阶篇
    • 寄存器register
    • 宏macro
    • 编辑
    • buffer、window、tab
    • vim 目录结构
    • .vimrc配置文件
    • vim插件管理器
    • vim 插件安装失败问题解决方案
    • vim插件
    • VimScript
  • vim实战练习
    • 游戏
    • 工具
  • neovim
  • SpaceVim
  • linux 命令
  • ubuntu
  • vim辅记图
  • 参考
  • 致谢

入门

vim模式:(界面左下角有显示)

普通模式 (Normal-mode)  默认模式,进入方式:esc、C-[ 、C-c
插入模式 (Insert-mode) i、a、o、I、A、O
命令模式 (Command-mode) /、?、!
可视模式 (Visual-mode)  v 选择字符
可视模式 (Visual-Line-mode)  V 选择整行
可视模式 (Visual-Block-mode)  C-v 块选择模式,可以列选择
替换模式(Replace-mode) R
普通-插入模式(Normal-Insert-mode) C-o 切换到该模式。执行一次普通模式后,自动回到插入模式

api帮助文档

Vim帮助文档使用方法 :help xxx

如::help diw

"dl"    delete character (alias: "x")           dl
"diw"   delete inner word                       diw
"daw"   delete a word                           daw
"diW"   delete inner WORD (see WORD)            diW
"daW"   delete a WORD (see WORD)                daW
"dgn"   delete the next search pattern match    dgn
"dd"    delete one line                         dd
"dis"   delete inner sentence                   dis
"das"   delete a sentence                       das
"dib"   delete inner '(' ')' block              dib
"dab"   delete a '(' ')' block                  dab
"dip"   delete inner paragraph                  dip
"dap"   delete a paragraph                      dap
"diB"   delete inner '{' '}' block              diB
"daB"   delete a '{' '}' block                  daB

再如: :help keycodes

notation meaning             equivalent  decimal     value(s)    ~
-----------------------------------------------------------------------
<BS>      backspace           CTRL-H    8             *backspace*
<Tab>     tab                 CTRL-I    9             *tab* *Tab*
<CR>      carriage return     CTRL-M   13             *carriage-return*
<Return>  same as <CR>                              *<Return>*
<Enter>       same as <CR>                              *<Enter>*
<Esc>     escape              CTRL-[   27             *escape* *<Esc>*
<Space>       space                        32             *space*

Ctrl+S造成vim假卡死

Ctrl + S 只是停止向终端输出而已
Ctrl + Q 恢复

基本指令

count operator count motion
3 dycv 5 iw

  • operator:干什么
  • count:干多少次
  • motion: 在哪干

The motion commands can be used after an operator command, to have the command operate on the text that was moved over. That is the text between the cursor position before and after the motion. Operators are generally used to delete or change text.

:h operator 查看操作符
:h motion 查看动作。一个移动光标的命令

hjkl 左下上右
wb 下、上个词u 撤销操作undo
C-r (Ctrl + r) 重做redo

operator操作符

符号 含义
delete 删除
change 修改(删除并进入插入模式
yank 复制
visual 选中并进入visual模式

motion动作

  • i/a 区别:inner / around

  • iw / aw : 选中单词 (普通模式),如diw/daw 删除单词

    i a 例子 例子
    foo "foo" di" : ""
    (foo) (foo) di(di)dib() da(da)dab :
    {foo} {foo} di{di}dib{} da{da}daB :

    其他符号,如 '<[ 等同理。

移动

水平移动(行内)

normal模式的操作

w/W 词头
b/B 上个词头,反向跳到词头
e/E 词尾
ge/gE 上个词尾
f字母 跳到字母
t字母:跳到字母前
F字母:向前跳到字母
T字母:向前跳到字母后的字母
; 重复操作上个命令
, 撤销上个操作回退
0 行首
^ 非空行首
g_ 非空行尾
$ 行尾
# 跳到当前光标所在单词上一个词
* 跳到当前光标所在单词下一个词

垂直移动(行间)

gg 跳到全文开头(相当于1G,首行)
G 跳到全文结尾行首非空(尾行)% 当前文件所有行(:%d<CR> 删除所有行)空 当前行
n+/n- 光标下、上移n行
C-d/C-f 向下翻半/1页
C-u/C-b 向上翻半/1页
:10/10G 跳到第10行
:%<CR> /:$<CR> 跳到文件最后一行行首
zz 将当前行设为屏幕居中
/正则字符串+回车 正向跳到匹配字符串,追加n,正向下一个;追加N,反向下一个
?正则字符串+回车 反向跳到匹配字符串,追加n,正向下一个;追加N,反向下一个:noh[lsearch] 移除搜索高亮
# 跳到当前光标所在单词上一个词
* 跳到当前光标所在单词下一个词

编辑

基础命令

dd 删除一行
yy 复制一行 yank即为copy
cc 删除一行并进入插入模式di{或di}或diB 删除{}中所有内容
diw 删除当前词,无论光标位置在词的哪个位置
dw 删除一个单词
dt) 删除当前到)前字符
d$ 删除当前字符到行尾字符
D 删除当前字符到行尾字符
vf) 向右高亮直到),含)
vt) 向右高亮直到)前一字符
cw 删除词当前字母之后部分并进入插入模式
ciw 删除当前词并进入插入模式
ct字母  删除到字母前的字符,不删除字母,并进入插入模式
C 删除当前字符到行尾字符,并进入插入模式
x 删除单个字符
r字符 替换当前字符,相当于删除+插入+返回normal模式
R字符串 替换字符串,需要返回normal模式结束替换
s 删除单个字符并进入插入模式
S 删除整行,并进入插入模式
o 向下一行插入空行,回车换行<CR>,尽量使用<Esc>o替换
O 向上插入空行
p 光标后粘贴
P 光标前粘贴
:w 保存
:q 退出
:q! 强制退出
:wq/ZZ/:x 保存并退出

拓展命令

gd 跳到定义 goto definition
C-] 跳到定义
gf 打开光标处所指的文件
:delmark a 删除a标签
[` /]` 跳到上一个、下一个小写字符标签 (vscode不支持)
mM 创建全局标签M(A-Z 大写字母为全局标签、唯一、可跨文件跳转,a-z 为局部标签、不唯一,仅当前文件内)
`M 跳到标签M (技巧:浏览代码前,先打个全局标签,好回来)
`. 跳到上次修改位置
'. 跳到上次修改位置所在非空行首(vscode中是跳到精确上次修改位置)
`^ 跳到最后一次插入插入位置 (vscode不支持)
gi 跳到最后一次插入模式位置 go to the last place you left insert mode
g; 上次修改位置,再执行则逃到上上词修改位置
g, 下次修改位置
C-o 跳到上次光标位置
C-i 跳到下次光标位置
[[ 跳到当前函数开头(cpp ok, java不可以)
]] 跳到下一个函数开头(cpp ok, java不可以)
H/M/L 屏幕不动,光标动,跳到屏幕顶部、中间、底部
zz/zt/zb 光标不动,屏幕移动,使当前行处于屏幕中间、顶部、底部
( /) 跳到上/下一句
{ /} 跳到上/下一段
% 跳到匹配符号处,{}、()、[] 等,当前光标在一处,跳到匹配处
g~~ 切换行所有字符大小写
xp 交换两字符
:qa! 关闭所有文件且不保存 quit all
:%d<CR>或ggdGggVGd 删除所有行,清空全文
:%y<CR>或ggvG$y或ggVGy 拷贝全文
J 把下一行与当前行连接成一行:marks 查看标签列表
:changes 查看修改列表
:jumps 查看跳转列表<< shift line left 左移
>> shift line right 右移
== 格式化当前行C-h 删除上一个字符
C-w 删除上一个词
C-u 删除上一行@: repeat last ex command
@@ after repeating it once, you can continue repeating with this

大小写

~ 将光标下的字母切换大小写
3~ 将后面3个字母切换大小写
g~~ 将当前行的所有字母切换大小写
gUU/guu 将当前行切为大/小写
guiw/guaw 将当前词改为小写
gUiw/gUaw 将当前词改为大写

加a减x

C-a 将本行光标或之后的首数字+1
C-x 将本行光标或之后的首数字-1
180<C-x>   "0px" -> "-180px"加减乘除四则运算:如计算 【20 * 3 + 2】,插入模式时执行 <C-r>=20*3+2<CR> 即可

进阶篇

寄存器register

" 无名寄存器(unnamed register)。""p 等价于 p命令,粘贴无名寄存器内容
0 复制专用寄存器(yank register)。"0,只保存y{motion}复制的内容,即上次复制的内容。而无名寄存器还会保存c、x、s、d操作数据。
1-9 delete registers
a-z 有名寄存器。named registers
_ 黑洞寄存器。"_d{motion}会执行真正的删除操作
+ 系统寄存器
* 系统寄存器"ay{motion} copy to register a 拷贝到寄存器a,小写会替换掉原寄存器内容
"Ay{motion} copy and append to register a 拷贝并追加到寄存器a,大写会追加内容
"ap paste from register a 粘贴寄存器a的内容
"add 删除当前行存到寄存器a
C-ra 插入模式时,从寄存器a粘贴内容
C-r0 从复制专用寄存器中粘贴内容
C-r% 插入当前文件名

宏macro

q{register} 开始录制 Start recording a new macro in {register}
q 停止录制 Stop recording macro
@{register} 应用宏 Replay macro in {register}
@@ 再次应用上次应用的宏 Replay the last macro that you executed
命令行模式执行宏a :'<,'>normal @a

编辑

. 重复上次操作(从插入模式到normal模),也称为 “.范式”,可认为是最简单的宏案例:一次复制,多次替换:1. yiw 2.viw"0p 3..(点范式) 4..案例:交换两个词:1. yiw 2.mm 3. viwp 4. `m 5. vwp
A 跳到行末并进入插入模式案例:对每行末尾都加上分号。1. A;<Esc>  2. j. 3. j. 4... (来自《Vim实用技巧》)
C 等价c$ 删除当前字符到行尾的所有字符并进入插入模式
s 等价cl 删除当前字符并进入插入模式
I 等价^i 跳到非空行首并进入插入模式
/正则表达式<CR> 正向查找匹配项,n查下一处,N查上一处。<CR> 即<Enter>回车键。
?正则<CR> 反向查
n/ N 正向/反向执行最后一次查找:sort 或 :%sort 全文排序
:'<,'>sort 对选区行排序
:sort u 去除重复行排序
:sort i 忽略大小写对所有行排序
:.,.+3sort 对当前行到下3行共4行数据进行排序
:sort n 对全文每行按照数字排序
:sort! 倒序C-h 插入模式时删除前一个字符
C-w 插入模式时删除前一个字
C-u 插入模式时删除到非空行首
命令行模式执行普通模式命令,如执行宏a:'<,'>normal @a  ,再如行尾插入分号 :'<,'>normal A"
命令行模式执行上一次命令行命令 :C-p
命令行模式执行下一次命令行命令 :C-n
C-o 普通-插入模式,1次普通模式操作后自动进入插入模式,插入模式时修改很有用 :h i_CTRL-O
C-r{register} 插入模式时粘贴指定寄存器数据,如C-r0。[:h i_CTRL-R] Insert the contents of a register.
C-r% 插入模式时插入当前文件名 C-n或C-p 代码提示,再次按C-n或C-p选择提示:t 复制行(如 :2,5t8 将2到5行复制到第8行下一行)
:.,.+5d 删除当前行到后5行(vscode支持)
:m 移动行 (如 :2,5m8,将2到5行剪切到第8行下一行,vscode不支持)
:copy(简写形式为 :co,等价缩写 :t)  拷贝(vscode不支持)
:2,5t. 将第2到5行拷贝到当前行下一行 (vscode不支持t点,可以为具体行号或标签)
:t6 将当前行拷贝到第6行下一行 (常用,vscode支持,:2,5t8 支持)
:t. 等价 yyp  (vscode不支持)
:t$ 把当前行复制到文件最后一行(vscode不支持)
:'<,'>t0 将高亮选中的开始到结束部分拷贝到文档开头
:move(简写 :m) 移动(剪切+粘贴)
:[range]move{address}
案例:对所有行尾加上分号:1. A ;<ESC> 2. jVG 3. :'<,'>normal .对高亮选区的每一行执行normal模式下的点命令
或上述3步改为1步完成:1. :%normal A ; 对全文按照普通模式,每行尾都增加分号// (vscode不支持)
或采用选择模式方案,选择所有行,然后A; 即 ggVGA;
或依然采用命令行模式方案,正则替换::1,$s/$/;/g 或 :%s/$/;/g 含义:范围1到最后一行每行都将行尾正则替换为分号 (vscode支持)
案例:对3到10行注释掉:1. :3,10 normal I// 3到10行执行普通模式I// (vscode不支持)
或 1. :3,10s/^/\/\//g (vscode支持)
:2,10s/hello/world/g  将2-10行内的hello全部都改为world(绝对行号)
:%s/hello/world/g 将全文的hello都改为world
:2,5s/aaa/bbb   将2到5行所有aaa都改为bbb
:.,.+5s/a/b    将当前行到下面第6行,共6行中所有a改为b
:5s/.*/-/g 将第5行所有字符都改为-
:%s/\<aa\>/AA/g 将单词aa改为AA,包含aa的单词不会替换
地址范围符号及含义:1 第一行$ 最后一行. 当前行% 所有行,即 :1,$'m 标签m所在行'< 选区开始'> 选区结束
flags替换标志位:g(global) 全局c(confirm) 替换前需确认n(number) 统计匹配次数而不进行替换
. 重复上次普通模式命令
@: 重复上次Ex命令
@@ 回放最近调用的宏<C-r><C-w> 命令模式时,快速拷贝光标下文本到命令行o 选择模式时,切换高亮选区端点
gv 重选上次的高亮选区
Vr- 将当前行字符改为横杠:r! echo {a..z} 插入26个小写字母,r表示读入,! 表示将执行shell命令,将右侧命令结果读入当前文件。

buffer、window、tab

  • 概念:

    • buffer: 打开的一个文件的内存缓冲区,实际文件编辑就是编辑的缓冲区。
    • window: buffer的可视化分割区域
    • tab: 组织Window为一个工作区
  • 优雅玩转Vim
  • 玩转Vim 从放弃到爱不释手
:e a.txt 打开a.txt
:ls 或 :buffers 或 :files 查看缓冲区,显示出缓冲区编号、状态(%当前缓冲区 a激活缓冲区 +已更改缓冲区 -不可改缓冲区 #交换缓冲区 )、名称(同文件名)、光标所在行号
:b n 跳到第n个缓冲区
:b buffer_name 加上tab补全跳转到指定缓冲区
:bp[revious] /:bn[ext] /:bf[irst] /:bl[ast] 跳转到上一个/下一个/第一个/最后一个缓冲区,也可按tab补全,如:bp<TAB> 会自动补全为:bprevious,简写也可以
:ball 打开所有缓冲区
:wall! 强制保存所有缓冲区
:qall! 强制退出所有缓冲区
:badd xx 添加缓冲区xx<C-w>s 或 :sp[lit] 水平分割窗口
<C-w>v 或 :vs[plit](vertical split) 垂直分割窗口<C-w>w 循环切换窗口
<C-w>h/j/k/l 切换到←/↓/↑/→窗口
<C-w>H/J/K/L 移动当前窗口向←/↓/↑/→<C-w>+ 增加窗口高度
<C-w>- 减少窗口高度
<C-w>= 所有窗口等宽等高
<C-w>_ 最大化当前窗口高度
<C-w>| 最大化当前窗口宽度
[N]<C-w>_ 当前窗口高度设置为[N]行
[N]<C-w>| 当前窗口宽度设置为[N]列
:h window-resize 查看文档:tabs 查看所有打开的tab,有 > 箭头的是当前tab,有 + 说明有修改未保存,并显示tab页编号供tabp/tabn使用
:tabnew 新建标签页
:tabe a.txt 在新标签页打开a.txt
:tabc 关闭当前的tab
:tabo 关闭所有其他的tab
:tabp[revious] 或 gT 上一个tab
:tabn[ext] 或 gt 下一个tab
:tabn[ext] [num] 或 [num]gt 切换到编号为[num]的标签页
<C-w>T 将当前窗口移动到新标签页

vim 目录结构

参考:https://blog.csdn.net/u014805066/article/details/62891949

.vimrc配置文件

查看配置文件方法:1)进入vim。2)执行 :version,即可看vim版本,也可看vimrc配置路径。个人配置路径如下:
linux: $HOME/.vimrc~/.vimrc
windows: $HOME\_vimrcC:\Users\用户名\_vimrc

:h option-list 查看所有设置选项
a-good-vimrc
.vimrc实用配置
https://github.com/wklken/k-vim/blob/master/vimrc
vim 配置 比较全

""""""""""""""""""""""""""""""""""""
"base
""""""""""""""""""""""""""""""""""""
let mapleader = "\<space>"
let g:mapleader = "\<space>"" 共享剪贴板,ubuntu中无法使用共享剪贴板的话,需要安装 sudo apt-get install vim-gtk vim-scripts
if has('clipboard')if has('unnamedplus')  " When possible use + register for copy-pasteset clipboard=unnamed,unnamedpluselse         " On mac and Windows, use * register for copy-pasteset clipboard=unnamedendif
endif" 防止粘贴代码格式错乱
nnoremap <leader><leader>p :set paste<CR>
nnoremap <leader><leader>np :set nopaste<CR>" 更新时间毫秒数
set updatetime=100
" 命令行行数
set cmdheight=1
" history文件中需要记录的行数, !编号执行历史命令
set history=1000
"" 行号
set number
set nowrap
" set relativenumber
" 取消文件备份
set nobackup
set nowritebackup
set noswapfile
" Always show the signcolumn, otherwise it would shift the text each time
" diagnostics appear/become resolved.
set signcolumn=yes
" 设置缩进
set cindent
set smartindent
"设置这个新代码会缩进,但粘贴代码缩进会错乱
set autoindent
":set paste 后再粘贴可不错乱
":set nopaste 这样再恢复自动缩进
set smarttab
set expandtab "tab键自动转换为空格
set tabstop=4 "设置tab宽度
set shiftwidth=4
set softtabstop=4
" 00x增减数字时使用十进制
set nrformats=set t_Co=256"关闭vi的一致性模式
set nocompatible
" 按TAB键时命令行自动补全
set wildmenu
" 文件在Vim之外修改过,自动重新读入
set autoread
" 设置自动保存内容
set autowrite
" 状态栏显示命令
set showcmd
" 移动到buffer的顶部和底部时保留行距
" set scrolloff=3
" 懒渲染
set lazyredraw
" 当前行高亮
set cursorline
" 高亮括号匹配
set showmatch"可以在buffer的任何地方->
"set mouse=a
"使用鼠标,类似office中->
"set selection=exclusive
"在工作区双击鼠标定位)
"set selectmode=mouse,key"检测文件类型
filetype on
"针对不同的文件采取不同的缩进方式
filetype indent on
"针对不同的文件类型加载对应的插件
filetype plugin on
"启用自动补全
filetype plugin indent on
" 语法高亮
syntax enable
" 不设置则在插入模式时无法用退格键和 Delete 键删除回车符
set backspace=indent,eol,start
" 自动补全
set completeopt=longest,menu" 搜索
set hlsearch
set incsearch
set ignorecase
set smartcase"https://stackoverflow.com/questions/11940801/mapping-esc-in-vimrc-causes-bizarre-arrow-behaviour/11940894#11940894
" 注意:该配置存在刚打开文件后,模式为替换模式问题
nnoremap <LEADER><CR> :nohlsearch<CR>
"noremap <ESC> :nohlsearch<CR>
"set t_u7=" 将默认实际行移动映射改为屏幕行移动,k原本为实际行,gk为屏幕行,实际一行文本过长可能有多屏幕行
nnoremap k gk
nnoremap gk k
nnoremap j gj
nnoremap gj j" 命令行模式时快速移动光标位置
cnoremap <C-a> <Home>
cnoremap <C-e> <End>" 交换 ' `
nnoremap ' `
nnoremap ` '" normal/ visual/ insert no Recursive map 非递归映射
inoremap jj <ESC>'^" 文件
nnoremap <leader>q :q<CR>
nnoremap <leader>w :w<CR>
nnoremap <leader>l :source $MYVIMRC<CR>
"nnoremap <leader>l :source ~/.vimrc<CR>
"nnoremap <leader>s :w !sudo tee %
"exe shell in normal mode
nnoremap <leader>r :r !" 为了可以多次粘贴
nnoremap <leader>p "0p
nnoremap <leader>P "0P
vnoremap <leader>p "0p
vnoremap <leader>P "0P" 切换buffer(:ls :bf[irst] :bl[ast] :bp[revious] :bn[ext])
nnoremap <slient> [b :bprevious<CR>
nnoremap <slient> [n :bnext<CR>" 切换window (<C-W>w)
map <C-j> <C-W>j
map <C-k> <C-W>k
map <C-h> <C-W>h
map <C-l> <C-W>l"window split use hjkl key
nnoremap sl :set splitright<CR>:vsplit<CR>
nnoremap sh :set nosplitright<CR>:vsplit<CR>
nnoremap sj :set nosplitbelow<CR>:split<CR>
nnoremap sk :set splitbelow<CR>:split<CR>"window size chage
map <UP> :resize +5<CR>
map <DOWN> :resize -5<CR>
map <LEFT> :vertical resize -5<CR>
map <RIGHT> :vertical resize +5<CR>"exe shell in normal mode
" 切换Tab
nnoremap <C-TAB> :tabnext<CR>
nnoremap <C-S-TAB> :tabprev<CR>" Move a line of text using ALT+[jk] or Command+[jk] on mac
nmap <M-j> mz:m+<cr>`z
nmap <M-k> mz:m-2<cr>`z
vmap <M-j> :m'>+<cr>`<my`>mzgv`yo`z
vmap <M-k> :m'<-2<cr>`>my`<mzgv`yo`z" 文档可编辑
set modifiable" 编码
set encoding=utf-8 "设置vim的工作编码为utf-8,如果源文件不是此编码,vim会进行转换后显示
set fileencodings=ucs-bom,utf-8,gbk,gb2312,utf-16,big5
set fenc=utf-8
set fencs=utf-8,gbk,gb2312
"解决consle输出乱码
language messages zh_CN.utf-8" 允许在有未保存的修改时切换缓冲区,此时的修改由 vim 负责保存,如果不设置可能文本编辑失败
set hidden" 1. :source ~/.vimrc 或 :source %
" 2. :PlugInstall
call plug#begin()
"小奶牛
Plug 'mhinz/vim-startify'
"主题
Plug 'morhetz/gruvbox'
Plug 'easymotion/vim-easymotion'
Plug 'tpope/vim-surround'
"文件目录树
Plug 'preservim/nerdtree'
"注释
Plug 'preservim/nerdcommenter'
"状态栏
Plug 'itchyny/lightline.vim'
"Plug 'vim-airline/vim-airline'
"Plug 'vim-airline/vim-airline-themes'
"撤回
Plug 'mbbill/undotree'
"语法补全工具
"; Plug 'neoclide/coc.nvim', {'branch': 'release'}
"比gdb更好用的调试工具
Plug 'puremourning/vimspector'Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'"翻译
Plug 'voldikss/vim-translator'"markdown
"Plug 'godlygeek/tabular'
"Plug 'plasticboy/vim-markdown'Plug 'tpope/vim-markdown'
Plug 'iamcco/markdown-preview.nvim', { 'do': { -> mkdp#util#install() }, 'for': ['markdown', 'vim-plug']}"表格工具
Plug 'dhruvasagar/vim-table-mode'call plug#end()""""""""""""""""""""""""""""""""""""
"lightline
""""""""""""""""""""""""""""""""""""
set laststatus=2
let g:lightline = {\ 'colorscheme':'wombat'\ }
set ttimeout ttimeoutlen=10""""""""""""""""""""""""""""""""""""
"easymotion
""""""""""""""""""""""""""""""""""""
" Disable default mappings
" Disable default mappingslet g:EasyMotion_do_mapping = 0
" 搜索时忽略大小写
let g:EasyMotion_smartcase = 1""""""""""""""""""""""""""""""""""""
"nerdtree
""""""""""""""""""""""""""""""""""""
nnoremap <leader>n :NERDTreeFocus<CR>
nnoremap <C-n> :NERDTree<CR>
nnoremap <C-t> :NERDTreeToggle<CR>
" 在文件树中定位到当前文件,配合 C-wp 再从文件树切回之前文件窗口
nnoremap <C-S-e> :NERDTreeFind<CR>
" 显示隐藏文件
let ERDTreeShowHidden=1
let NERDTreeIgnore = [ '\.git$', '\.svn$', '\.svn%', '\.swp%', '\.vscode%' ]" Exit Vim if NERDTree is the only window remaining in the only tab.
autocmd BufEnter * if tabpagenr('$') == 1 && winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif
" Close the tab if NERDTree is the only window remaining in it.
autocmd BufEnter * if winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif""""""""""""""""""""""""""""""""""""
"nerdcommenter
""""""""""""""""""""""""""""""""""""
"切换注释和取消注释
"[count]<leader>c<space> |NERDCommenterToggle|
"注释
"[count]<leader>cc |NERDCommenterComment|
"取消注释
"[count]<leader>cu |NERDCommenterUncomment|
"将注释分隔符添加到行尾并进入它们之间的插入模式
"<leader>cA |NERDCommenterAppend|""""""""""""""""""""""""""""""""""""
"gruvbox
""""""""""""""""""""""""""""""""""""
colorscheme gruvbox
set background=dark
"Use 24-bit (true-color) mode in Vim/Neovim when outside tmux.
"If you're using tmux version 2.2 or later, you can remove the outermost $TMUX check and use tmux's 24-bit color support
"(see < http://sunaku.github.io/tmux-24bit-color.html#usage > for more information.)
if (empty($TMUX))if (has("nvim"))"For Neovim 0.1.3 and 0.1.4 < https://github.com/neovim/neovim/pull/2198 >let $NVIM_TUI_ENABLE_TRUE_COLOR=1endif"For Neovim > 0.1.5 and Vim > patch 7.4.1799 < https://github.com/vim/vim/commit/61be73bb0f965a895bfb064ea3e55476ac175162 >"Based on Vim patch 7.4.1770 (`guicolors` option) < https://github.com/vim/vim/commit/8a633e3427b47286869aa4b96f2bfc1fe65b25cd >" < https://github.com/neovim/neovim/wiki/Following-HEAD#20160511 >if (has("termguicolors"))set termguicolorsendif
endif""""""""""""""""""""""""""""""""""""
"mbbill/undotree
""""""""""""""""""""""""""""""""""""
nnoremap <F5> :UndotreeToggle<CR>""""""""""""""""""""""""""""""""""""
"fzf
"unix:
"sudo apt-get install silversearcher-ag
"sudo apt-get install ripgrep
"windows powershell 管理员权限(ag需要代理):
"choco install ag
"choco install ripgrep
""""""""""""""""""""""""""""""""""""
nnoremap <Leader><Leader>f :Files<CR>
nnoremap <Leader><Leader>a :Ag<CR>
":Files [PATH] Files (runs $FZF_DEFAULT_COMMAND if defined)
":GFiles [OPTS]    Git files (git ls-files)
":GFiles?  Git files (git status)
":Buffers  Open buffers
":Colors   Color schemes
":Ag [PATTERN] ag search result (ALT-A to select all, ALT-D to deselect all)
":Rg [PATTERN] rg search result (ALT-A to select all, ALT-D to deselect all)
":Lines [QUERY]    Lines in loaded buffers
":BLines [QUERY]   Lines in the current buffer
":Tags [QUERY] Tags in the project (ctags -R)
":BTags [QUERY]    Tags in the current buffer
":Marks    Marks
":Windows  Windows
":Locate PATTERN   locate command output
":History  v:oldfiles and open buffers
":History: Command history
":History/ Search history
":Snippets Snippets (UltiSnips)
":Commits  Git commits (requires fugitive.vim)
":BCommits Git commits for the current buffer; visual-select lines to track changes in the range
":Commands Commands
":Maps Normal mode mappings
":Helptags Help tags 1
":Filetypes    File types""""""""""""""""""""""""""""""""""""
"vim-table-mode
""""""""""""""""""""""""""""""""""""
"从第二行开始按两个|则生成横线,之后每次按|则格式化
"设置焦点为竖线,而非十字线
let g:table_mode_corner='|'
"|-----------------|--------------------------|------------|
"| name            | address                  | phone      |
"|-----------------|--------------------------|------------|
"| John Adams      | 1600 Pennsylvania Avenue | 0123456789 |
"|-----------------|--------------------------|------------|map <Leader>tm :TableModeToggle"Tip: You can use the following to quickly enable / disable table mode in insert mode by using || or __:
function! s:isAtStartOfLine(mapping)let text_before_cursor = getline('.')[0 : col('.')-1]let mapping_pattern = '\V' . escape(a:mapping, '\')let comment_pattern = '\V' . escape(substitute(&l:commentstring, '%s.*$', '', ''), '\')return (text_before_cursor =~? '^' . ('\v(' . comment_pattern . '\v)?') . '\s*\v' . mapping_pattern . '\v$')
endfunctioninoreabbrev <expr> <bar><bar>\ <SID>isAtStartOfLine('\|\|') ?\ '<c-o>:TableModeEnable<cr><bar><space><bar><left><left>' : '<bar><bar>'
inoreabbrev <expr> __\ <SID>isAtStartOfLine('__') ?\ '<c-o>:silent! TableModeDisable<cr>' : '__'""""""""""""""""""""""""""""""""""""
"vim-markdown
""""""""""""""""""""""""""""""""""""
let g:markdown_fenced_languages = ['html', 'python', 'bash=sh']
let g:markdown_minlines = 100""""""""""""""""""""""""""""""""""""
"iamcco/markdown-preview.nvim
""""""""""""""""""""""""""""""""""""
"nmap <C-s> <Plug>MarkdownPreview
"nmap <M-s> <Plug>MarkdownPreviewStop
nmap <leader><leader>m <Plug>MarkdownPreviewToggle" set to 1, nvim will open the preview window after entering the markdown buffer
" default: 0
let g:mkdp_auto_start = 0" set to 1, the nvim will auto close current preview window when change
" from markdown buffer to another buffer
" default: 1
let g:mkdp_auto_close = 1" set to 1, the vim will refresh markdown when save the buffer or
" leave from insert mode, default 0 is auto refresh markdown as you edit or
" move the cursor
" default: 0
let g:mkdp_refresh_slow = 0" set to 1, the MarkdownPreview command can be use for all files,
" by default it can be use in markdown file
" default: 0
let g:mkdp_command_for_global = 0" set to 1, preview server available to others in your network
" by default, the server listens on localhost (127.0.0.1)
" default: 0
let g:mkdp_open_to_the_world = 0" use custom IP to open preview page
" useful when you work in remote vim and preview on local browser
" more detail see: https://github.com/iamcco/markdown-preview.nvim/pull/9
" default empty
let g:mkdp_open_ip = ''" specify browser to open preview page
" for path with space
" valid: `/path/with\ space/xxx`
" invalid: `/path/with\\ space/xxx`
" default: ''
let g:mkdp_browser = ''" set to 1, echo preview page url in command line when open preview page
" default is 0
let g:mkdp_echo_preview_url = 0" a custom vim function name to open preview page
" this function will receive url as param
" default is empty
let g:mkdp_browserfunc = ''" options for markdown render
" mkit: markdown-it options for render
" katex: katex options for math
" uml: markdown-it-plantuml options
" maid: mermaid options
" disable_sync_scroll: if disable sync scroll, default 0
" sync_scroll_type: 'middle', 'top' or 'relative', default value is 'middle'
"   middle: mean the cursor position alway show at the middle of the preview page
"   top: mean the vim top viewport alway show at the top of the preview page
"   relative: mean the cursor position alway show at the relative positon of the preview page
" hide_yaml_meta: if hide yaml metadata, default is 1
" sequence_diagrams: js-sequence-diagrams options
" content_editable: if enable content editable for preview page, default: v:false
" disable_filename: if disable filename header for preview page, default: 0
let g:mkdp_preview_options = {\ 'mkit': {},\ 'katex': {},\ 'uml': {},\ 'maid': {},\ 'disable_sync_scroll': 0,\ 'sync_scroll_type': 'middle',\ 'hide_yaml_meta': 1,\ 'sequence_diagrams': {},\ 'flowchart_diagrams': {},\ 'content_editable': v:false,\ 'disable_filename': 0,\ 'toc': {}\ }" use a custom markdown style must be absolute path
" like '/Users/username/markdown.css' or expand('~/markdown.css')
let g:mkdp_markdown_css = ''" use a custom highlight style must absolute path
" like '/Users/username/highlight.css' or expand('~/highlight.css')
let g:mkdp_highlight_css = ''" use a custom port to start server or empty for random
let g:mkdp_port = ''" preview page title
" ${name} will be replace with the file name
let g:mkdp_page_title = '「${name}」'" recognized filetypes
" these filetypes will have MarkdownPreview... commands
let g:mkdp_filetypes = ['markdown']" set default theme (dark or light)
" By default the theme is define according to the preferences of the system
let g:mkdp_theme = 'dark'""""""""""""""""""""""""""""""""""""
"vim-translator
""""""""""""""""""""""""""""""""""""
let g:translator_default_engines=['youdao', 'bing', 'haici']
let g:translator_target_lang='zh'
"" Echo translation in the cmdline
""nmap <silent> <Leader>w <Plug>Translate
""vmap <silent> <Leader>w <Plug>TranslateV
"" Display translation in a window
nmap <silent> <Leader>t <Plug>TranslateW
vmap <silent> <Leader>t <Plug>TranslateWV
"" Replace the text with translation
""nmap <silent> <Leader>r <Plug>TranslateR
""vmap <silent> <Leader>r <Plug>TranslateRV
"" Translate the text in clipboard
""nmap <silent> <Leader>x <Plug>TranslateX

vim插件管理器

vim插件管理器中佼佼者:vim-plug

  • sudo vim /etc/hosts

  • 199.232.28.133 raw.githubusercontent.com

  • curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

  • vim-plug下载地址访问不了解决方法:直接下载 plug.vim 并放到 vim的 autoload 目录即可 (linux: ~/.vim/autoload/plug.vim, windows: C:\Users\xxx\vimfiles\autoload\plug.vim )

  • :PlugInstall 安装。其他命令参考官文。

vim 插件安装失败问题解决方案

借助 github 代理服务器 https://ghproxy.com/ 实现访问 github 下载插件目的。在原有地址前加上 https://ghproxy.com/ 即可。

vim ~/.vim/autoload/plug.vim修改后如下:修改点1:let fmt = get(g:, 'plug_url_format', 'https://ghproxy.com/https://git::@github.com/%s.git')修改点2:\ '^https://ghprmxy.com/https://git::@github\.com', 'https://ghproxy.com/https://github.com', ''l

vim插件

vim 插件网站

  • vim官方
  • vimawesome
  • vim插件网
  • 小奶牛 vim-startify

  • spacevim

      配置插件
    
  • easymotion

      <leader><leader>s{char} search character everywhere<leader><leader>w start of words<leader><leader>b start of words backwards<leader><leader>bdw start of words everywhere. The bd stands for bidirectional<leader><leader>e end of words<leader><leader>ge end of words backwards<leader><leader>bdw end of words everywhere<leader><leader>j beginning of lines<leader><leader>k beginning of lines backwards<leader><leader>f{char} find character<leader><leader>F{char} find character backwards<leader><leader>t{char} until character<leader><leader>T{char} until character backwards
    
  • vim-sneak

    官方图:

  • vim-surround

      Press cs"' inside"Hello world!"to change it to'Hello world!'Now press cs'<q> to change it to<q>Hello world!</q>To go full circle, press cst" to get"Hello world!"To remove the delimiters entirely, press ds".Hello world!Now with the cursor on "Hello", press ysiw] (iw is a text object).[Hello] world!Let's make that braces and add some space (use } instead of { for no space): cs]{{ Hello } world!Now wrap the entire line in parentheses with yssb or yss).({ Hello } world!)Revert to the original text: ds{ds)Hello world!Emphasize hello: ysiw<em><em>Hello</em> world!
    

VimScript

VimScript 五分钟入门(翻译)
笨方法学Vimscript、中文译文、w3cschool

vim实战练习

游戏

  • vim 游戏 PacVim | 良许中文玩法博文| fatal error: curses.h: No such file or directory的解决办法 sudo apt-get install libncurses5-dev
  • vim游戏 vim-adventures | 玩法参考shanzhizi的博文

工具

  • windows版vim

  • Unix/Linux (推荐,vscode、idea可作为过渡期使用)

  • vscode

    安装插件 Vim、Learn Vim(推荐)

  • IDEA系列

neovim

SpaceVim

开箱即用的模块化 Vim IDE

linux 命令

C-a 跳到行首
C-e 跳到行尾
Alt-f 向前(forward)跳一个词
Alt-b 向后(back)跳一个词
C-h 向左删除一个字符
C-d 向右删除一个字符
C-w 向左删除一个词
Alt-d 向右删除一个词
C-u 删除光标左边所有字符
C-k 删除光标右边所有字符
C-L 清屏history 查看历史命令
!历史命令序号:执行指定历史命令
C-r 进入历史命令查找窗口,输入要查找的命令可快速选择历史命令
C-g 取消历史命令搜索cd - 将当前目录切换到上一次所在目录Shift-Insert 粘贴

ubuntu

  • 清华镜像

vim辅记图

  • vim经典

  • vim入门

  • 进阶版

  • 增强版

  • 文字版

  • Joe Martinez 总结图pdf

参考

  1. SpaceVim
  2. vim 教程网
  3. Vim 中文社区
  4. 《Vim实用技巧(第2版)》
  5. Vim 有什么奇技淫巧
  6. VimScript 五分钟入门(翻译)
  7. 笨方法学Vimscript、中文译文、w3cschool
  8. 优雅玩转Vim
  9. 玩转Vim 从放弃到爱不释手
  10. 史上最全Vim快捷键键位图(入门到进阶)
  11. 史上最全Vim快捷键键位图 – 入门到进阶
  12. 键位图–原版
  13. http://jrmiii.com/
  14. Ubuntu更换软件源
  15. a-good-vimrc
  16. 寓教于乐!一款游戏让你成为 Vim 高手!
  17. fatal error: curses.h: No such file or directory的解决办法
  18. VIM训练游戏
  19. Vim Cheat Sheet
  20. 如何让 vim 成为我们的神器——推荐
  21. 最佳 vim 配色方案

致谢

  1. Jaime González García

vim从入门到丝滑学习笔记相关推荐

  1. vim 从入门到丝滑

    vim 从入门到丝滑 文章目录 vim 从入门到丝滑 入门 进阶 Vim 中的各种字符串输入方式: 移动光标 拷贝/粘贴 Undo/Redo 搜索 保存/退出 高级 替换: 光标移动: 更高效的操作: ...

  2. 《Angular4从入门到实战》学习笔记

    <Angular4从入门到实战>学习笔记 腾讯课堂:米斯特吴 视频讲座 二〇一九年二月十三日星期三14时14分 What Is Angular?(简介) 前端最流行的主流JavaScrip ...

  3. 《Java Web开发入门很简单》学习笔记

    <Java Web开发入门很简单>学习笔记 1123 第1章 了解Java Web开发领域 Java Web主要涉及技术包括:HTML.JavaScript.CSS.JSP.Servlet ...

  4. unity3D-游戏/AR/VR在线就业班 C#入门访问修饰符学习笔记

    unity3D-游戏/AR/VR在线就业班 C#入门访问修饰符学习笔记 点击观看视频学习:http://edu.csdn.NET/lecturer/107 访问修饰符 public --公共的,在哪里 ...

  5. 【台大郭彦甫】Matlab入门教程超详细学习笔记二:基本操作与矩阵运算(附PPT链接)

    Matlab入门教程超详细学习笔记二:基本操作与矩阵运算 前言 一.基本操作 1.把matlab当作计算器使用 2.变量 3.控制格式输出 二.矩阵运算 1.矩阵 2.矩阵索引 3.使用:创建向量 4 ...

  6. 阿里云“7天实践训练营”入门班第二期学习笔记 第五天 在线编程挑战

    阿里云"7天实践训练营"入门班第二期学习笔记 第五天 在线编程挑战 吾辈,完全不会编程 以下内容全程来自阿里云社区的大佬分析讲解 原题目 知识点:搜索.字符串.位运算 有一天Jer ...

  7. 《Angular4从入门到实战》学习笔记(图文)

    <Angular4从入门到实战>学习笔记 腾讯课堂:米斯特吴 视频讲座 二〇一九年二月十三日星期三14时14分 What Is Angular?(简介) 前端最流行的主流JavaScrip ...

  8. 入门PCB设计AD9学习笔记8-PCB布板规则

    写作前面: 最近在学PCB设计,发现杜洋工作室的入门PCB设计讲的非常详细,适合初学者.由于是视频讲解形式,不利于后期再索引搜索各个知识点细节,所以这里做上笔记方便自己消化和之后内容的索引.惊喜发现已 ...

  9. 深度学习者的入门福利-Keras深度学习笔记

    Keras深度学习笔记 最近本人在github上发现一个不错的资源,是利用keras来学习深度学习的笔记,笔记内容充实,数据完善,本人亲自实操了里面的所有例子,深感收获颇丰,今天特意推荐给大家,希望能 ...

最新文章

  1. 区间内x的出现个数(主席树)
  2. 字符串,数组,定时器,form
  3. 为什么python安装不了numpy库_Python NumPy库安装使用笔记
  4. 谷歌趋势:“比特币”热度远不及2017年高点
  5. php 飞鹅云打印机_ThinkPHP飞鹅云打印接口
  6. Think in Java ---Chapter 8 多态 [基础的混凝土大厦]
  7. 微信小程序 学科竞赛比赛报名管理系统 Android hbuilderx App毕业设计
  8. 【合金装备xp热门主题】
  9. “情商”和“智商”究竟有哪些区别?
  10. SQL注入-入门需了解项目
  11. javascript数组——新建数组、访问数组、遍历数组的方法、数组对象的方法、冒泡排序算法、json的正反序列化
  12. java.lang.NoClassDefFoundError:无法初始化类org.hibernate.validator.internal.engine.ConfigurationImpl
  13. SDRAM的工作原理
  14. 让ie6,ie7,ie8支持 css3 的部分属性实现全兼容
  15. 基于深度学习的全色图像锐化(Pansharpening)论文及代码整理
  16. DHU 第一题 重排链表
  17. php 模拟蜘蛛,PHP模拟百度蜘蛛,伪造IP爬行网站,附源代码
  18. java---JUC并发包详解
  19. 递归算法经典实例python-Python进阶:递归算法
  20. python处理Excel列中的图片url地址批量下载至本地

热门文章

  1. Archlinux 安装Yaourt的方式
  2. 多级下料问题的建模 翻译
  3. 小米手机刷机鸿蒙,小米10升级鸿蒙系统刷机包
  4. 机器学习、计算机视觉神犇/大牛主页
  5. 救世之树服务端开服架设服务器搭建教程
  6. 二面深信服前端,秋招面经分享
  7. 4x root 红米_红米4X root教程_红米4X卡刷root包来获取root权限的方法
  8. 手机访问WEB项目图片404
  9. Python 画玫瑰花
  10. 鹏城实验室麒麟V10飞腾2000+体验