https://github.com/vim/vim https://github.com/vim/vim-win32-installer/releases
https://github.com/akrawchyk/awesome-vim
https://github.com/SpaceVim/SpaceVim
https://github.com/mhinz/vim-galore
http://vimcolors.com/
colorscheme: http://vimdoc.sourceforge.net/htmldoc/syntax.html
cscope: https://sourceforge.net/projects/mslk/files/

install

  • 默认安装路径
    /usr/local/bin/vim+vimtutor
    /usr/local/share/vim/
    注意: .vimrc必须放在家目录,放在/etc/vimrc不奏效(/etc/vimrc.local),或者放在/usr/local/share/vim/vimrc
  • preconfigure
    http://vimdoc.sourceforge.net/htmldoc/usr_90.html#install
    python-devel(CentOS)/python-dev(Ubuntu) 依赖库
    ncurses-devel(CentOS)/ncurses-dev(Ubuntu) 依赖库
  • configure-options
  --with-compiledby="zhanglei"
  --prefix=/usr/local  # 可执行文件安装的目录,还会创建bin子目录.
  --datarootdir=PREFIX/share  # 一些帮助及主目录文件;
  --with-features=huge
  --disable-gui --without-x --enable-multibyte
  --enable-pythoninterp=yes --enable-python3interp=yes
  --with-python3-config-dir=PATH  # python3必须指定该项.如:/usr/local/lib/python3.4/config-3.4m
  --enable-cscope --disable-tclinterp --disable-selinux --disable-xsmp --disable-netbeans --enable-xim=no
  --enable-fail-if-missing  # 如果某些选项打不开就出错提示.
  --with-local-dir=/stranger  # 编译时额外的在/stranger/下搜索inclued+lib目录
  • winodws源码安装
    • https://github.com/vim/vim
    • 配置文件在vim74/src/Make_ming.mak!
    • 注意:Python2.7.10最后在链接libpython27.a时有bug,应换成Python2.7.9;
      DYNAMIC_PYTHON=yes,为no时链接libpython27.a可能不兼容!
    • mingw32-make -f Make_ming.mak

start-options

# -p --remote-silent :在新标签中打开文件,注意:不要使用--remote-tab-silent!
# -b :以2进制模式编辑文件.  -c :在读入任何源文件前,执行命令.
# -R :以只读模式编辑文件.  -o [num] :启动vim时打开num个窗口.默认为每一个文件打开一个窗口.
# -r [file] :未指定file时,列出可恢复的文件(异常终止文件的编辑).
vim +9 filename  # 打开文件并定位到第9行,也可以使用搜索.

vimrc

http://vimdoc.sourceforge.net/htmldoc/options.html
http://vimdoc.sourceforge.net/htmldoc/options.html#%27runtimepath%27
https://www.ibm.com/developerworks/library/l-vim-script-1/index.html

注意: 使用set设置变量时,等号两边不要使用空格!

注意: 使用这些变量都要用这种形式: expand('$HOME/.vim'.var).
要么就不要单独使用引号:'$HOME'表转化为纯字符串!

  • $HOME :%userprofile%\
  • $VIM :d:\usr\Vim\
  • $VIMRUNTIME :d:\usr\Vim\vim80\
  • $MYVIMRC :d:\usr\Vim\.vimrc
  • set option?:选项当前值 &:项设为默认值 !:转换选项 no:关闭选项 set all:列出所有选项
  • set wrap :自动换行,nowrap.
  • set fenc :或fileencoding,查看当前文件编码;
  • set ff=unix:转换文件格式DOSUNIX. nobomb:去掉BOM!

rgb.txt

这个文件是必须的,且必须放在$VIMRUNTIME中.color时会用到.

let do_syntax_sel_menu=1

必须在GUI模式才可用!默认是关闭的!开启后会严重拖慢启动速度!

会在[Syntax]菜单栏的第1个item显示所有支持的文件类型,以便手动识别某些未带扩展名的文件!

此选项需要 synmenu.vim + makemenu.vim 2个文件,只有gvim下有提供.

vim-bugs

  • hilight-txt
    注意: 此句会导致’自动定位到上次打开的位置’失效!
    autocmd BufRead,BufNewFile * setfiletype txt
  • encoding
    注意: 此句必须放在vimrc的接近开头位置,不然后面的某些映射(如’a-space’)很可能异常!
    set encoding=utf-8

vimscript

http://vimdoc.sourceforge.net/htmldoc/usr_41.html
http://vimdoc.sourceforge.net/htmldoc/autocmd.html

  • options
    encoding: vim的内部(如:菜单、buffer、消息)使用的编码,最好该选项放在vimrc开头!
    fileencoding: 当前编辑文件所使用的字符编码方式,写入文件时使用该编码保存
    fileencodings:vim自动探测文编编码的列表,启动时会依次据此解析加载的文件.如果探测到了就将fileencoding更新.
    termencoding: 只对console模式下的vim有效,指定vim所工作的终端的字符编码方式
  • autocmd
    VimEnter :after doing all the startup stuff
    VimLeave :before leaving vim, after(VimLeavePre:before) writing the viminfo file
    GUIEnter :after starting the GUI successfully
    CursorHold :the user doesn’t press a key for a while(CursorHoldI:in insert mode)
    CursorMoved:the cursor was moved in Normal mode(CursorMovedI)
    InsertEnter:starting insert mode;
    InsertLeave:when leaving insert mode
    ColorScheme:after loading a color scheme
    BufNew :just after creating a new buffer
    BufEnter :after entering a buffer
    BufLeave :before leave to another buffer
    BufWinEnter:when a buffer is displayed in a window
    BufWinLeave:before a buffer is removed from a window
    BufNewFile :starting to edit a file that doesn’t exist
    BufReadPre :starting to edit a new buffer, before reading the file
    BufRead :starting to edit a new buffer, after reading the file
    BufReadPost:starting to edit a new buffer, after reading the file
    BufWrite :starting to write the whole buffer to a file
    BufWritePre:starting to write the whole buffer to a file
    BufWritePost:after writing the whole buffer to a file
    FileWritePre:starting to write part of buffer to a file
    FileWritePost:after writing part of buffer to a file
  • variable
    v: vim-variable
    g: global-variable
    l: local-variable
    s: script-variable
    t: tabpage-variable
    w: window-variable
    b: buffer-variable
    a: function-argument

function

没有作用域限制的函数,必须以大写字母开头!

function! ToggleComment()
  let pos=getpos(".")
  let win=winsaveview()
  # 正则匹配,忽略大小写.注意:必须使用单引号.双引号还得转移写2次\\
  if getline(".") =~? '\s*\/\/'
     normal! ^2x
     let pos[2]-=1
  else
     normal! ^i//
     let pos[2]+=3
  endif
  call winrestview(win)
  call setpos(".",pos)
  startinsert
endfunction

function! LeaveInsertMode()
  if col('.') > 1
     return "\<Right>"
  endif
  return ""
endfunction
inoremap <silent> ,, <c-r>=LeaveInsertMode()^M^[

map

http://vimdoc.sourceforge.net/htmldoc/map.html
http://vim.wikia.com/wiki/Mapping_keys_in_Vim_-_Tutorial_(Part_2)

ENTER ESC BACKSPACE DELETE 因为在ex中早有预定义,故要想将这些键作为命令的一部分,

应该配合C-V作为前缀符.在命令映射中,C-V被显示成 ^ 字符,这与普通的^字符不同!

^[ ESC:按住c-v 都松开后 + esc

^M 换行:按住c-v 都松开后 + enter

^H 退格:按住c-v 都松开后 + Backspace

:map: nmap + vmap; map a b; map c a; <==> map c b;

:noremap: 不递归

:nmap: 只在normal模式生效; nnoremap

:vmap: 在visual+select模式生效; vnoremap

:xmap: 只在visual-mode生效

:smap: 只在select-mode生效

:imap: insert模式有效; inoremap

:cmap: command模式有效; cnoremap

:omap: operater模式,即类似于d’‘这些组合命令.

:unmap: 删除指定映射; nunmap vunmap iunmap cunmap

:mapclean: 删除map的所有映射; nmapclear vmapclear imapclear cmapclear

CtrlKey

<k0>-<k9> 小键盘0到9;

<F5>: 键盘F5键,…

<S-...> Shift + 大小写无所谓,下同

<C-...> Control +

<A-...> Alt +<a+>>:Alt + Shift + .

<M-...> Alt +

<C-A-a> Ctrl + Alt + a

options

<silent> 执行键绑定时不在命令行上回显

<unique> 如果该映射或者缩写已经存在则该命令会失败.

<leader> 自定义命令起始符,默认是 \

demos

let mapleader = ","
map [options] CtrlKey :silent! Fun^M

shortcut-multiwindow

水平或垂直平分窗口,可平分n等份. 前面加上一个v变为垂直平分

Terminal状态下alt键很难识别,需换成Ctrl.

:hid: 隐藏当前窗口,除非是他是当前唯一可见的

:on: 使当前窗口为唯一可见的窗口

:sp file: 等价于:new file; 增加一个水平窗口(下方)打开文件file; :vsp :vsplit

:vnew file: 增1个垂直平分窗口,打开文件file

:resize +n: 向下(正向环)增加当前窗口尺寸n行, -n

c-w-s: :sp上开一个新窗口(n:空的文件) 垂直:vsp

c-w-q: 关闭当前窗口,缓冲区仍在(:close/:quit),c-w-c(放弃改变) o:关闭所有其他窗口

c-w-j: 向下选择窗口,k,h,l.为配合tmux切换pane(c-l/h)就不做其他映射了

c-w-t: 最左上方的窗口 b:最右下角 p:最后一个访问(previous)

c-w-w: 所有的窗口间循环移动,W:反向;可添加A-k/j<leader>k/j. C-j/k留给tmux.

c-w-r: 向下轮转窗口(rollup) R:上

c-w-x: 与下方向窗口交换位置,与下方的第三个窗口交换位置:3c-w-x

c-w--: 减少当前窗口(水平)尺寸1行,减少的尺寸分给它的下邻居; +:增加当前窗口尺寸1行,增加的尺寸取自它的下邻居.

c-w-<: 减少当前窗口(垂直)尺寸1列,减少的尺寸分给它的右下邻居; >:增加

c-w-=: 均分所有窗口

shortcut-insert-mode

数字一般表示重复次数如循环开启9行,输入内容:9o<input>ESC

图形界面下可以添加这些导航键: A-jkhl

为了方便可添加映射:

  ,,(quit insert-mode) ,s(保存+重载vimrc) ,c(ab命令,插入注释/**/) ,j(复制当前行)
  ,h(cut to begin) ,l(cut to end) ,u(undo,或添加映射:C+u) ,r(Return,R:上回车)

c-[: 退出到normal模式,光标定位到前面(最好加一个映射:’,,’),==esc.

c-c: 退出到normal模式,光标定位到前面,==esc.

c-o: 临时退出插入模式,光标定位到后面,操作完成后还会自动返回插入模式!!

c-a: Ahead e:End b:Left f:Right h:Backspace w:Backspace-a-word

c-p: previous cmd-line history n:next cmd-line history

c-y: 复制上一行同列的字符到本行来 e:复制下一行同列的字符到本行来

c-t: 当前行向右缩进 c-i:insert-TAB

c-k: 插入组合字符,如:除号’-:’,加减’+-’,平方'2S’,Copyright’Co’

register

reg: 显示所有寄存器的内容. :reg a显示寄存器a的内容.

a-z: 26个命名寄存器,可存放 y d x s c 大写字母表示追加到该寄存器.

1-9: 最后1个yank存放在寄存器0,以此类推..该寄存器独立,不与上面的冲突.

c-r: 准备粘贴寄存器内容..

  • +: 系统寄存器.
  • *: 系统寄存器,但缩进会出问题.
  • ": 匿名寄存器,也是默认寄存器
  • 0: 上次yank的内容,上上次是1,最多到9!
  • %: 当前的文件名 . :上次插入的文本
  • :: 上次的ex命令 / :上次搜索的pattern
  • =: 表达式的结果 _ :类似于/dev/null.
  • w: 如在搜索模式下:可以补全当前光标下单词!
  • "ayiw: 复制当前单词到寄存器a
  • "2p: 粘贴寄存器2的内容,利用重复命令.可以自动增加序号.配合u撤销便可找到具体!
  • "f4yy: 将当前行及后续3行文本复制到寄存器f中

macro

宏默认是顺序执行的,也就是遇到1个失败,后面全部失败,并退出.

想针对每行执行宏(出错时并不退出)应该使用 :'<,'>normal @a

  • qb: 将vim命令(q!,ZZ等肯定记录不上)存到寄存器b中.再次输入q以便退出.
  • qB: 追加命令到宏B.
  • @b: 执行寄存器b中的宏命,前面可以加次数.
  • @@: 执行最近一次录制的宏,此处是 @b.

shortcut-common-mode

注意: 当映射 Alt+space 键为系统键的时候一定要把coding等设置放在前头!

注意: dd yy cc >>: 这些重复的命令一般表示作用于当前行.

  • F2: toggle菜单 F4:toggleNerdTree,a-1. F5:toggle-tagbar,a-2.
  • F8: NextColorTheme,shift+F8; F11:maxmize window; a-4:toggle-QFixWindow
  • ZQ: 不保存而退出(当前buffer) :q!
  • ZZ: 保存改变而离开(当前buffer) :x
  • :e!: 放弃修改重新载入文件
  • :wa: write所有改变的文件,或者:wall.
  • :xa: save所有改变的文件并exit. :qa! :忽略所有改变并退出!
  • .: 重复上一次操作对缓冲区的修改
  • u: 撤销上一次编辑对缓冲区的修改 U:撤销对当前行的所有编辑动作
  • c-r: 恢复上一次的操作,包括使用u被撤销的. c-l:重绘屏幕
  • c-g: 显示当前的文件与行编号
  • c-f: PgDn,forward; c-b:PgUp,backward
  • c-d: 下半页down(cmdmode是激活自动补全,输入开头的字符+tab可自动补全); c-u:上半页up
  • c-]: tags进入定义(结果会少很多); c-t:返回到声明(c-o更常用!); g]:cstag进入定义,结果可能会很多
  • c-o: Back(hjkl这些不算,可跨文件,只针对当前活动的窗口); c-i:Forth.
  • c-y: 下翻,看上面的. c-e:上翻,注意:终端无法区别shift+spacespace!
  • c-s: suspend(vim) c-q:quit-suspend(vim)

  • i: 光标之前添加 I:行首添加 a:光标后添加 A:行尾添加 o:下一行添加 O:上一行添加 J:合并当前行与下1行
  • r: 准备替换光标所在处的单个字符,自动退出; R:进入替换模式,需要自己退出. gr:视tab为实际的空格数.
  • s: 删除当前字符,进入插入模式. S:删除整行,进入插入模式
  • C: 删除光标所在处字符到行尾进入插入模式,或c$. cc:删除整行,进入插入模式 ct):删除光标所在处字符到下一个’)‘符之前
  • D: 删除到行尾,或者d$ dd:删除当前行,ndd删除当前行到下方n行 dG:删除当前行后所有 :m,nd:删除第m-n行 ddp:交换当前行与下1行
  • Y: 复制光标所在的行 :m,ny 复制第m-n行
  • p: 粘贴到下1行或光标后 P:上1行或光标前 put:始终粘贴到下一行 gp:粘贴后光标位于新文本的开头!
  • ~: 大小写转换 g~~(当前行全部大小写翻转)
  • gu: 小写,如gue(到词尾) guu:当前行全部小写 gU:大写 g~:大小写
  • <<: 减小缩进 »:增加缩进 =:自动缩进
  • C-a: add递增1.如果以0开头默认为八进制.可以’set nrformats=‘来强制都为十进制!
  • C-x: sub递减1,如果想指定大小请如下格式:‘10’,即在原来的数字上递减10! 光标无需在数字上,能自动寻找当前行的第1个数字.增强:https://github.com/tpope/vim-speeddating

  • /old/+m: 向后搜索old,转到old后的第m行.默认从当前位置的下一个位置开始搜索.
  • /old/e: 向后搜索old,将光标定位到搜索到的目标的结尾,即old结尾.
  • 0: 行首,$:行尾,^:当前行的第1个非空字符 :下移1行第1个非空字符,或+ -:上移1行,到第1个非空字符
  • *: 向后(#向前)搜索光标所在处的词并定位下一个单词(不区分大小写) g*:部分匹配 选区搜索: https://github.com/nelstrom/vim-visual-star-search
  • '': 最近位置的行首(上下左右移动的不算)! 'x:跳转到书签x所在行的第1个字符
  • ` `: 最近位置(最好与’互换) `.:最近改变位置的行首 `^:最近插入位置 `<:最后选择范围的起始 `x:书签x所在处(mx:设置书签a-zA-Z)
  • g;: Back到最近改变的地方,可递归,等价于`. g, :Forth
  • gi: 快速定位到上次插入模式离开的地方,并进入插入模式!
  • gj: 在display-line间移动.默认不加g是real-line.加上g前缀的都表示display-line,其他组合类比.
  • gg: 文首, G:文尾 nG:移至第n行,或:n; n|:移至第n列
  • gd: 跳转到定义/高亮匹配所有光标下的单词
  • gD: 跳转到局部变量的定义处,gVim可能不管用
  • gJ: 不会在合并的行中间添加空格分隔符
  • ga: 显示当前光标下字符的ASCII码以及8进制16进制数值

  • %: 配对的圆括号+花括号+方括号;配合matchit插件可以实现html-tag标签的跳转!
  • (: (sentence)当前或上一个段落或空行的开头.
  • }: (paragraph)下一个空行的开头.
  • [[: (section)上一个{的地方!
  • w: 下一个词或标点之首,可含空格; W:同w但不包括标点、括号等!
  • b: begin,前一个或当前词的词首; B:同上但不包括标点等
  • e: end,当前词或标点之尾,已在尾部或其右边的,就定位到下个尾部,可含空格; E:同e上但不包括标点; ge:反方向
  • fx: 移动光标到下一个出现字符x的地方, ;分号继续向下, ,逗号表反向查找.只在当前行!
  • Fx: 移动光标到前一个出现字符x的地方, 分号;继续向前(只在当前行)
  • tx: 移动光标到下一个出现字符x之前的地方
  • ]s: jump to the next spelling error [s z=(SuggestCorrections)

  • H: 屏幕左上角(High), nH:屏幕最顶往下第n行;
  • M: 光标移到屏幕中央, nL:屏幕底端往上第n行(Low);
  • zz: 将光标移动到屏幕中心(或z.) z<Enter>:定位光标所在的行到屏幕顶端; z-:将光标移动的到屏幕最后一行;
  • zR: 打开所有折叠. za zj zk
  • zM: 全部折叠.

列编辑,可使用jkhl…

  • v: 以字符为单位选择! V:行选择,终端下可能没有! c-v:列块选择模式
  • I: 列首插入,在选择块的前端插入;写完退出时生效; A:列尾插入 J:连接所选行
  • s: 删除+替换,或者c. r:每个被选择的字符都替换成输入的那个字符. d:删除,或者x.
  • o: 交换始终位置!即固定活动端,使起始点变为活动端.
  • gv: 再次选中上次选择的范围!
  • 选择1个对象
    • a: 包含单词右侧的空格或括号本身或段落下方的空行!如果当前就处于空行则自动被纳入到下1个object! 如果右侧(或下方)没有了空行,则会纳入左侧(或上方)的空格(或空行)!
    • i: 表示inner,表示a的反面,若不想包含上面的情况请使用i!
    • ciw: 删除光标下的单词,并进入插入模式!
    • griw: 替换当前单词但不覆盖原有寄存器的值(常用!可配合.重复替换),注意:依赖于ReplaceWithRegister插件(go replace).
    • vi(: 选中括号内的所有字符,不包括括号本身,也可以写作vib,B表大括号.类比: {} [] <> " ’ `
    • vat: 选中一个tag(xml中),包括标签本身.
    • vap: 选择1个paragraph(空行结尾),包含下方的空行(若下方无空行,则视图包含上方的);
    • vas: 选择1个sentence,可类比p,但除了光标本身就位于空行的情形外,该操作始终不包含空行!
    • gUit: 将tag中的内容全部大写,注意这样写可完美配合dot-cmd,使用先进入viusal模式的手法会出现瑕疵!
  • Surround
    • cs"<q>: “hello” –> hello
    • cst': <q>hello</q> –> ‘hello’
    • ds': ‘hello’ –> hello
    • ysiw]: hello –> [hello]
      左方括号是两边加空格; 有空格:’([{’ 无空格:’)]}’
    • cs[{: [hello] –> { hello }
    • yss): { hello } –> ({ hello })
      s:sentence表当前整行!
    • ds{ds(: ({ hello }) –> hello

shortcut-buffer

%:h<TAB>: 当前文件路径

:jumps: 列出当前所有的jumps,可以回退前进!

:changes: 列出当前buffer的所有改变行.使用g;(Back)或g,跳转!

:sav f: 把当前文件存为f并打开它

:badd f: 把file添加到buf列表

:bd: 删除当前文件所占用的buf(先unload).可自定义a-q或q.

:bun: 使当前buf所在窗口不展示或:bunload

:ls: 当前的buf列表.或:buffers 或:files.

:bn: 下一个buf/窗口.bnext.可增加定义a-l和l

:bp: 上一个一个buf/窗口.可自定义a-h和h

:bf: 跳转到第1个buf:bfirst. :bl:跳转到最后一个buf:blast

:sb3: 水平平分当前窗口,打开并跳转到第3个buf. sbnext sbn sbp sbf sbl..

:b3: 跳转到第3个buf,包括前两者,数字前面可以有空格

:b m: 跳到第一个以m开头的文件所在的buf

shortcut-tab

:tabnew f: 新建1个标签(c-w-t),编辑文件f,或 tabedit tabe

:tabclose: 关闭当前标签,或 tabc,可自定义c-c、,tc;

:tabonly: 关闭其他所有标签,或 tabo

:tabnext: 下一个标签,或c-PgDn、tabn、gt

:tabp: 上一个标签,或c-PgUp、tabprevious、tabNext、tabN、gT

:tabfirst: 第一个标签,或tabrewind tabr

:tablast: 最后一个标签,或tabl

:tabmove: 移动标签,或tabm [N]:移动到第N个标签之后,0:第一个.不写参数:最后一个

ex

大部分同sed程序,可参见’script/shell+regex’.

:%S/facilit{y,ies}/building{,s}/g
表将全部的facility替换为building,全部的facilities替换为buildings!

\m 除了 $^.* 之外,元字符都要转义如 '\(\) \{\} \<\>' (尖括号表\b).

\M 除了$^之外,元字符都要转义.相当于 set nomagic

\v 表正则表达式的元字符无需转义,这几个符号仍需转义: / \

\V 表所有符号都符号化,但这几个除外: / \ ?

  • flags
    • c: 要求确认. q:quit l:替换最后1个匹配然后退出 a:替换余下的所有匹配
    • g: 替换当前行中每个匹配
    • e: 忽略错误(No match..),
    • i: 忽略大小写. I:大小写敏感.
    • n: 只打印行号,不执行替换,会遮掩c选项.
    • #: 打印包含模式的行+行号. p:只打印包含模式的行.
  • syntax
    • :\v[range]s/{pattern}/{string}/[flags] 搜索行中pattern表示的字符!
    • :\v[range]g|v/{pattern}/{cmd1|cmd2|..} range中搜索具有pattern的行,g!等价于v表不具有pattern的!在这些行上执行cmd.
  • range
    • .: 当前行; $:最后1行 %:当前文件,即每1行
    • +: 相对于当前行(光标所在行)之后多少行,无数字表示1行;如 -,+ 表上下方各1行共3行
    • ;: 分号前的数字会被当成当前行,如:100;+5表示100-105行
    • '<,'>normal [cmd]: 表示在高亮选区执行命令.
  • pattern
    • %&&: 等价于 g& ,最后一个 & 是上次的flag.表示全文执行上次的ex.
    • \zs \ze: 用来截取搜索pattern.比如像要查找引号字符串但只想匹配引号内的: "\zs[^"]+\ze"
    • %(regex): 表示该子项不参与 \1,\2…等的分配(默认是从左到右分配,而不是从里向外,有点不合理).
  • string
    • ~: 上一次调用: s 时的string!
    • \0: 整个匹配的结果或者 &.
    • \1: 引用子正则表达式1,从左到右而不是从里向外;
    • \u: 使后1个字符大写,小写 \l;
    • \U: 使后面的所有字母大写,直到出现\e(或\E)为止,小写\L.
    • \r: insert a carriage return; \t….
    • \={Script}: 将返回的结果作为string.

demos

:@ 上次执行的Ex命令
:!! 重复上个系统命令
:= 文件总行数或打印行号
:3p 显示第3行

:3,18d 删除3-18行
:.,+4m6 当前行及其之后的4行移动到第6行之后
:2;6t9 将2-8行copy-to第9行之后

:shell 开启一个shell-session,使用exit退出shell会话!

:normal {cmd} 执行normal-mode的命令.在对每行执行命令前,vim会把光标定位到行首.

:[range]!{cmd} 指定的范围作为输入传递给cmd执行+将输出替换到那个范围!排序去重文件: :%!sort -u

:[range]write !{cmd} 将指定的范围作为输入传递给cmd执行!如追加到: :w >>./doc/file

:[where]read !{cmd} 将命令执行的结果读到指定位置的下1行(不指定表当前光标).若直接r1个文件表读取文件.

Plugins

https://github.com/VundleVim/Vundle.vim

https://github.com/morhetz/gruvbox

https://github.com/scrooloose/nerdtree

https://github.com/scrooloose/nerdcommenter

https://github.com/vim-airline/vim-airline

https://github.com/vim-airline/vim-airline-themes

https://github.com/romainl/vim-qf

https://github.com/majutsushi/tagbar

https://github.com/mhinz/vim-startify

https://github.com/qpkorr/vim-bufkill

https://github.com/godlygeek/tabular

https://github.com/Stormherz/tablify

https://github.com/ervandew/supertab

https://github.com/SirVer/ultisnips 注意,必须依赖下面的vim-snippets!

https://github.com/honza/vim-snippets

https://github.com/plasticboy/vim-markdown

https://github.com/travisjeffery/vim-auto-mkdir

https://github.com/ntpeters/vim-better-whitespace ,tw :trim-whitespace 删除代码中多余的空格

https://github.com/octol/vim-cpp-enhanced-highlight

https://github.com/tpope/vim-surround

https://github.com/tpope/vim-repeat

https://github.com/tpope/vim-speeddating

https://github.com/tpope/vim-fugitive

https://github.com/airblade/vim-gitgutter

https://github.com/Xuyuanp/nerdtree-git-plugin

https://github.com/vim-scripts/a.vim

https://github.com/vim-scripts/txt.vim

https://github.com/vim-scripts/nginx.vim

https://github.com/vim-scripts/VisIncr

https://github.com/vim-scripts/AutoComplPop

https://github.com/vim-scripts/OmniCppComplete

https://github.com/vim-scripts/DoxygenToolkit.vim

https://github.com/jiangmiao/auto-pairs

https://github.com/AndrewRadev/linediff.vim

https://github.com/mbbill/undotree

https://github.com/kien/ctrlp.vim

https://github.com/mattn/emmet-vim

https://github.com/gko/vim-coloresque

https://github.com/ryanoasis/vim-devicons

https://github.com/xolox/vim-misc

https://github.com/garbas/vim-snipmate

https://github.com/tomtom/tlib_vim

https://github.com/MarcWeber/vim-addon-mw-utils

airline不显示分支

let g:airline#extensions#branch#enabled=1

NERDTree

syntax\nerdtree.vimhi def link NERDTreeExecFile Title –> List

nerdtreetagbar都可以配合/搜索定位.

,nt: ToggleNERDTree,或自定义为: a-1

cd: pwd设为当前标签路径

D: 删除当前书签!

B: 显示或隐藏书签栏!

:Bookmark: 添加书签

定位

u: 使当前根节点向上一层,cd..;

C: 使当前目录或当前文件所在的目录为根目录!

p: 定位到当前节点的父节点. P:定位到当前节点的根节点

K: 定位到当前节点的第一个兄弟节点. c-K:当前节点的上一个兄弟节点!

J: 定位到当前节点的最后一个兄弟节点. c-J:当前节点的下一个兄弟节点!

打开或关闭(x)文件夹或在新的标签中打开文件

o/enter

O:递归打开文件夹!

go :在当前标签且后台打开文件!

i:上开窗口打开当前文件== :sp gi

s:左开窗口打开当前文件. gs

其他

q: quit

A: maxmize

r: 递归refresh当前节点

I: 是否显示隐藏文件

f: 是否应用过滤

F: 是否显示文件

tagbar

需要ctags产生的tags文件

,tb: ToggleTagbar

,dt: 需添加该映射,DoTags!

Spa: 显示函数原型,或鼠标悬停

Ent: 进入定义处,或双击

p: 定位到定义处,光标还是停留在tagbar

c-p: 上一个顶层tag,c-n

+-: 或 zc/zo 或鼠标点击 +-:Unfold/Fold oza:toggle =*:关闭或打开所有的tag;

s: 改变排序的方式

x: toggle maxmize

q: quit

UltiSnips

该插件比较恼人(严重依赖Python),可使用vim-snipmate代替:

Plugin 'MarcWeber/vim-addon-mw-utils'
Plugin 'tomtom/tlib_vim'
Plugin 'garbas/vim-snipmate'
Plugin 'vim-snippets'  

ctags/UltiSnips.cnf: 该文件是用来支持TagBar的,不能删!

ii: active自动补全

激活自动补全的关键字

  • C/C++
    main for fori wh do if el eli ife..
    printf fprintf fun td(typedef)..
    cl(class) map(std::map) vector tp(template)
  • python
    #! class def..

DoxgenTookit & NERD_Comment

,cf: 添加函数注释,需自定义

,ca: 添加文件注释,需自定义.author

,cc ,cs ,c<SPACE>

ctrlp

tab: autocomplete; s-tab:toggle focus between match/prompt window

F5: refresh the math window

F7: wipe the MRU list. del marked entries

c-p: 进入速查窗口,一下命令均指示在该窗口

c-f: forward. c-b :backward

c-n: next string in the prompt’s history

c-p: prev string in the prompt’s history

<CR: open in current window.

c-t: open in new tab

c-c: exit. ESC

c-j: down c-h:left c-k :up. c-l:right

c-u: clear the input field. c-w c-a c-e

c-r: toggle regex/string mode

c-d: toggle fullpath/filename

Tabular

:Tabularize /<要对齐的符号>

,a=: align according to = ,a:: …

Tablify

首先得选中.默认的分隔符是 | ,可以自己指定.

元素中的\n用于给当前元素换行,该行会加宽!

,tl: 或者,tt;转变为table,左对齐

,tr: 右对齐

,tc: 中间对齐

,tu: unformat table

,ta: select all table

,tS: sort format table

当光标在表格中时

,tK: move current row up

,tJ: move current row down

,tL: move current column right

,tH: move current column left

Visincr

首先得选中某一列,默认使用第一行的数组作为starter.

I: 表示靠左对齐,右补空格(padding). II:则相反.

zfill: 表示用什么填充(padding)默认是空格,zfill通常指定0.

:I[I] [# [zfill]]: #表递增的step,默认值1,可以是负值以便递减.

:IYMD [# [zfill]]: year/month/day,类比IMDY,IDMY

:IA(字母) :IM(月份) :ID(星期:Sunday..) :IPOW(指数,默认2)

:IB(二进制) :IO(八进制) :IX(16进制) :IR(ROME)

colorscheme-switcher

xolox的colorscheme-swither貌似有问题

默认切换后恐有bug,修改如下;但切换时丢失问题依旧:

inoremap <silent> <F8> <C-O>:PrevColorScheme<CR><C-O>:syntax on

nnoremap <silent> <F8> :PrevColorScheme<CR> <bar> :syntax on

,nc: NextColorScheme