用vim进行c/c++开发

本文中无法输入反斜杠,用\代替。

冒号进入的是EX commands.

更新帮助::helptags ~/.vim/doc

使用vba脚本:打开脚本文件后:so %

GVim的缓存菜单和许多对缓存处理的插件都无法正确刷新由菜单项恢复出来的会话!

on ubuntu. if ctags needed, "sudo apt-get install exuberant-ctags".

if ruby needed, "sudo apt-get install vim-nox", while python and perl will also be installed.

on windows, download ctags application and add it to %PATH%. downloadgvim built with ruby, python and perl and install ruby (path export needed).

插件:

 

pathogen允许插件放在自己的子目录,以免放在一起混淆。

Plug能下载、更新插件。https://github.com/junegunn/vim-plug。:PlugUpdate [name...] 安装或更新插件。:PlugUpgrade自更新。:PlugStatus检查更新状态。

使用trinity插件(它整合了另三个插件:source explorer, taglist and NERD tree。其中NERDTree需要用自己的版本)形成类似Source Insight的界面。用ctags --languages=-all --language=+c,c++,java --recurse=yes *建立标签文件,以便这些插件使用;用find . -name "*.c" -o -name "*.h" -o -name "*.cpp" -o -name "*.java" >cscope.lst建议文件列表后,用cscope -Rbqkv -i cscope.lst建立标签文件,以便查找标签的所有引用处。进入vi(命令行可以加-t 标签,或进入入用:ta 标签),:TrinityToggleAll开启界面,^w+方向键在各窗口间移动。

winmanager也有三个小窗口。回车打开目录或文件;o开新窗口打开文件;O在已有窗口打开文件;p预览;i切换大小、时间排序;s选择排序列;r反向排序;-到父目录;c进入目录;R文件重命名;D删除文件;f把目录加为最爱。
推荐设置是map :FirstExplorerWindow 
    map :BottomExplorerWindow 
    map ,wm :WMToggle

cscope_macros使cscope功能更好用。^\s搜索当前符号的所有引用;^\g查找当前符号定义;^\c查找当前函数的调用处;^\t查找当前文本;^\e用egrep查找当前字;^\f打开“当前”文件;^\i查找所有“包含”“当前”文件的文件(find files that include the filename under cursor);^\d查找当前函数调用的函数(find functions that function under cursor calls)

code_complete对生成的tag文件有特殊要求。

vi内置了omnicomplete,在.vimrc中加入下面内容打开(需要配置filetype on):set ofu=syntaxcomplete#Complete。要支持Java,需要javacomplete插件,并根据说明修改.vimrc。通过^x^o弹出选择菜单。通过Eclim能使用Eclipse的功能,但是需要编译。

vjde支持C/C++和Java,快捷键,vv未见生效,菜单可用。可以重构/refactor:\rf或\em将当前变量改为成员域;\rl将当前变量改为局部变量;\rp或\ep将当前变量加为方法的参数。\ai自动为当前字添加导入。\je将当前字由全路径使用改为导入使用。:VjdeNclass生成一个类;:VjdeNmain生成一个接口;:VjdeNprop生成一个属性。:Vjdei显示类或类成员的信息;:Vjdegd到声明处。\fr修正未声明的异常抛出;\ft修正异常处理;\jt加异常处理代码。

tagbar在左侧窗口显示文件中所有函数名及参数。[Space]显示函数原型;o折叠;s切换排序方式;x切换窗口大小;q关闭。

bufexplorer管理缓存器。\be当前窗口打开;\bs水平分窗口打开;\bv垂直分窗口打开。

EasyGrep在文件中查找词。\vv查找当前词,包括有前后缀的;\vV查找当前词,整词查找;\va,同\vv,不清除之前的结果;\vA,同\vV, 不清除之前的结果;\vr查找当前词并询问替换为什么;\vo或:GrepOptions设置参数;:Grep 要查找的内容;:GrepAdd 要添加到之前结果的要查找的内容;:Replace 查找内容 替换内容;:ReplaceUndo。SearchInBuffers将上次在本缓存进行的搜索对所有缓存进行。:SIB显示。

findfiles查找文件名,相当于find . -iname;解决内置:find只能找单个文件的不足。:Find 文件名 参数;\Find以当前词为文件名。回车打开,o打开文件并关闭结果窗口,q关闭结果窗口。

MarksBrowser显示所有标记行。:MarksBrowser打开。回车跳转,d删除。

Visual Mark高亮显示某些行。mm切换高亮;F2到下一高亮行;s-F2到上一高亮行,但是可能与其它功能键冲突。有高亮行存在时,屏幕最左侧会多一列空白。

mark高亮显示多个关键字。\m(取消)高亮当前字(可针对选块);\r输入要高亮的正则表达式;\n取消高亮当前字;\N取消高亮所有字;\*跳到下一当前(或上次的)高亮的关键字;\/跳到下一高亮的关键字。在高亮关键字上按*时会按插件逻辑进行跳转。:MarkSave和:MarkLoad可以保存、读取高亮情况。可以设置是否自动保存高亮情况。需要ingo-library

vimim方便中文输入,自带输入法。gi进入输入模式前激活输入法,标题栏显示备选字。输入模式下按^_开关输入法,按^^切换输入法,按^u删除所有输入内容。进行过搜索后,再用n搜索,则也会按拼音查找。

Renamer将文件名读入,编辑后生效。:Renamer打开。

project通过.vimprojects管理项目,可以打开所有文件、在所有文件中搜索。:Project打开。\c新建条目;\C新建包括子目录的条目;\r更新当前条目;\R更新包括子条目的当前条目;[Enter]折叠条目或打开文件;\s或s-[Enter]水平分隔窗口打开文件;\S水平分隔打开所有文件;\o或^Enter打开文件并关闭多余窗口;\v或m-[Enter]打开文件且光标停留在管理窗口;[Space]切换窗口大小;\[up]或^[up]将文字或条目上移;\[down]或^[down]将文字或条目下移;\I显示当前文件全路径;\w不再管理当前条目下所有文件;\W不再管理当前条目和子条目下所有文件;\g在当前条目下所有文件中搜索;\G在当前条目和子条目所有文件中搜索;\E打开当前目录。

bashsupport在新建脚本文件时会自动产生模板,在gvim下扩展出菜单;在vim下通过快捷键操作。\sc加入case块;\sf加入for块;\si或\sie或\sei加入if块;\ss加入select块;\st加入until块;\sw加入while块;\sfu加入function块;\se加入echo-e块;\rr运行脚本;\rc检查语法;\re使脚本可执行。

obvious-resize更简便地更改窗口大小。通过设置快捷键设置更改窗口大小的键。

conque-term分窗口运行shell命令。:ConqueTerm 命令 在当前缓存器运行。:ConqueTermSplit和:ConqueTermVSplit水平和垂直分窗口运行。插入状态可与命令交互,正常状态操作命令结果。

NERDTree(Trinity版本):q关闭;o打开或关闭当前节点;O打开子目录;cd修改当前目录(CWD)到光标所在目录;C将当前目录设置为显示的最上层目录;P到最上层目录;p到上一层目录;K到第一个子成员;J到最后一个子成员;t在新标签中打开;T在新标签中后台打开;e用netrw打开;!执行;列表键拆分打开;g列表键拆分预览;:Bookmark 名称;:BookmarkToRoot 名称;:RevealBookmard 名称(需要该节点处于显示状态);:OpenBookmark 名称(会导致Trinity显示异常);:ClearBookmarks 名称;:ClearAllBookmarks

favex将当前文件或目录加入收藏夹以便以后直接打开::FExplore在当前窗口打开收藏夹;:FSplit在新窗口打开收藏夹;:FFile收藏当前文件;:FDirectory收藏当前目录。在收藏夹窗口,h显隐帮助;回车在当前窗口打开;o在新窗口打开;O在上一窗口打开;d删除条目;q关闭收藏夹所在窗口。

VimCommander双窗口文件管理界面。,vc启动。F3用系统接口预览,F4编辑文件,F5复制,F6移动,F7建立目录,F8或DEL删除,TAB切换窗口,F10退出,INS选中文件,+多选,-多不选,^t前一目录,^y后一目录,^r刷新,BACK到父目录,^左或右在对应窗口打开对应目录。

vimexplorer带目录树的文件管理界面。:VE启动。Q退出;t切换是否显示另一窗口;回车用默认关联应用打开;退格 到父目录;^i到下一目录;^o到前一目录;r刷新;R重命名;yy拷贝;xx剪切;dd删除;DD强行删除;F加到收藏;f显示收藏;u预览;U关闭预览;^g输入路径;空格切换是否选中;Mc全不选;Mr选中指定的;sy拷贝选择的;sx剪切选择的;p粘贴;=比较选中的两个文件;e在新标签打开;+f新建文件;+d新建目录;g/查找;^TAB在左右窗口间切换;H切换是否显示隐藏文件;m字母 将当前路径放到寄存器;`字母 跳到寄存器对应的目录;J显示寄存器中的路径;;c在当前路径打开shell;;e启动其它文件管理器。

yankring: 可将\p定义为:YRShow

fencview自动检测文件内码:FencAutoDetect

NERD_commenter可以加多行注释。\cc加单行注释;\c空格切换单行注释;\cu取消注释;\cy拷贝所选行后再单行注释;\cA在行尾加"然后进入插入模式;\c$在当前位置插入"。closetag自动完成XML标签。^_启动。

DirDiff递归比较两个目录。:DirDiff 目录 目录。s同步(可针对选块);u刷新;x设置不包含;i设置忽略;a设置比较参数,如-w是忽略空白;q关闭。在比较模式下最好使用vim内置快捷键,脚本的有问题:\dg(vim使用\do)得到差别;\dp施行差别;\dj(vim使用]c)到下一差别;\dk(vim使用[c)到前一差别。

increment产生递增序列。:范围Inc [s开始数] [i增长数] [r不变数] [w数字右对齐] [f以字符填充对齐] [h十六进制] [o八进制] [p替换模式]。默认模式为@,从0开始,每加一个(不变数)数增长1(增长数)。

VisIncr:Produce increasing/decreasing columns of numbers, dates, or daynames. select a column with ^v, :l or :l -1 to make the numbers increasing or decreasing. :IA for ASCII.

moveline将当前行移动一行。\fu向上;\fd向下。

stripper可删除行末空格。:Stripper will strip trailing whitespace

tabular根据分隔符分列对齐连续几行。:Tabularize /分隔符

wc计算字数。:WC显示。

rainbow_parentheses用不同色彩显示多层次括号

vim-markdown在.md文件中的链接上,gx打开浏览器

asciitable显示ASCII码表。:Asciitable或:Asctable以十进制显示;:AsctableH以十六进制显示;:AsctableO以八进制显示。\a后加8、10、x、16按不同进制显示。vim内置g8快捷键也可以以十六进制显示当前字符UTF-8码;ga或:ascii显示当前字符的ASCII码。

chartable显示ASCII码表。\ct显示。b切换十、十六进制;q关闭。

proc显示运行进程。\ps显示。\k结束进程,\\选择,\Esc不选所有,\s按当前列排序,\a显示所有,\u只显示用户的进程(默认),\c按处理器占用排序,\m按内存占用排序,\p刷新,\q关闭显示。

calendar显示日历。:Calendar在左显示;:CalendarH在下显示。左右键换屏;上下键换年(只能换到前、后一年);t返回当日;q关闭;?显示帮助。

ccase支持clearcase。:ctsta关联缺陷;:ctco签出;:ctci签入;:ctunco取消签出;:cthist显示记录。

vcscommand支持CVS, SVN, git等等。快捷键前缀默认为\c但是可以考虑设置为,cvs。下面的单个字母是快捷键后缀。a :VCSAdd;n/N :VCSAnnotate[!]与:VCSBlame[!]相同;c :VCSCommit[!]如果使用惊叹号,则附加消息为空;D :VCSDelete与:VCSRemove相同;d :VCSDiff可以有零至两个参数;i :VCSInfo对git无效;g :VCSGotoOriginal;l :VCSLog;:VCSRevert丢弃本地修改;r :VCSReview在新窗口显示无本地修改版本内容;s :VCSStatus;u :VCSUpdate;v :VCSVimDiff

gitgutter在git库内的文件会在最左边显示一列当前行与库版本是否有差异的标记。jump between hunks with [c and ]c. You can preview, stage, and undo hunks with hp, hs, and hu respectively.

fugitive支持git。:Gedit HEAD显示分支情况;:Gdiff比较,:Gread获取所有区别;:Gstatus显示状态,D比较差别,-重置文件,p查看差别并加入本地提交,C提交到本地;:Gcommit提交到本地;:Ggrep搜索目录或日志;:Gmove移动;:Gremove删除。

cfname快速找到当前函数。,ff在命令行显示函数原型的一行;,fb跳到函数首;,fe跳到函数尾;,ft跳回去;,fz折叠当前函数;,fo不折叠当前函数。

undotree Gundo以树状图显示撤销列表及内容。\ut或:GuntoToggle打开或关闭。q关闭。

vimcalc计算器。:Calc启动。写表达式,回车计算。可以用let 变量=值。以下的冒号也是插入模式下内容,不表示进入命令模式。:dec以十进制显示结果;:hex以十六进制显示结果;:oct以八进制显示结果;:int以整型显示结果;:float以浮点型显示结果;:vars显示所有变量;:q退出计算。**为幂(右向左优先级计算);!为阶乘;可以用<<,>>,算符=。内置了一些高级计算,如abs,pow。内置了一些变量,如e,pi,phi黄金分割率,ans上一结果。

vim-session可配置为启动时自动打开之前的文件。

auto-pairs自动补全另一半括号并回到括号中。写后半括号后,自动跳到已经自动补的括号之后。

vim-go 为Go代码添加功能:
gd或^]或:GoDef 标记 跳到当前或指定标记的声明或定义处
:GoRun 编译并运行当前包
:GoBuild 编译当前包
:GoInstall 安装当前包
:GoTest 运行测试
:GoInfo 显示当前位置标记的类型信息
:GoRename [新名] 将当前位置的标记改名
:GoCallees或:GoCallers或:GoCallstack 显示函数调用关系
:GoIfErr 自动填充err非零时返回的语句
当前配置为\加以下:gd=go-doc gv=go-doc-vertical i=go-info e=go-rename rt=go-run-tab rs=go-run-split rv=go-run-vertical

vim-lsp:解析语法,和vim-go似乎重合(能利用neovim新特性,以弹框显示)。默认配置就能显示语法错误。
:LspDefinition 跳到定义处
:LspHover 弹框显示信息
:LspPreviousErrort和:LspNextError 跳到上、下一错误
:LspPreviousReference和:LspNextReference 跳到上、下一引用处
:LspPeekDeclaration或:LspPeekDefinition或:LspPeekImplementation或:LspTypeDefinition 在预览窗口或弹框显示声明或定义或实现或类型定义
:LspReferences 找到所有引用
:LspRename 重命名

ale自动格式化、验证、编译Go文件

vi集成了zip.vim, tar.vim

vi内置补全文字功能:^p和^n分别按正反查找补全替补(complete选项设置)。

netrw是内置功能。如果编译目录,就会调用它。用mf标记文件。

 

以下不推荐。

OmniComplete自动补全可能会非常慢。

AutoComplPop比omnicomplete更好用。YouCompleteMe更强大,但是需要编译,安装复杂。不及deoplete。

denite是unite的新项目,需要python。
unite方便打开文件。:Unite 后加以下一个或多个显示不同内容:bookmark书签;file目录文件;file_mru最近文件;buffer缓存;tab标签;change, command, directory_mru, file_point, file_rec, history/yank, jump, jump_point, launcher, line, mapping, menu, output, process, register, resume, session, source, window, ……

NeoYank + easy clip可能也能方便使用剪贴板,需要denite

使用lusty-explorer智能根据键入内容显示文件名,以便打开文件。\lf 打开文件管理器;\lr根据当前文件目录打开文件管理器;\lb打开缓存器管理器;\lg搜索缓存器。^t在新标签页中打开;^o水平分窗口打开;^v垂直分窗口打开。^n选择下一个匹配;^p选择上一个匹配;^f选择下一列;^b选择上一列。^u清空提示。对于文件管理器:^w上一级目录;^r刷新目录;^a打开当前表格中所有;^e根据路径和文件名新开缓存器。需要ruby。

FuzzyFinder在多处查找并打开。:FufBuffer;:FufFile;:FufConverageFile默认在当前目录和子目录中查找,所以非常慢;:FufDir;:FufMruFile(默认不可用);:FufMruCmd(默认不可用);:FufBookmarkFile;:FufBookmarkDir;:FufTag;:FufBufferTag(启动时自动对缓存器生成标签);:FufTaggedFile;:FufJumpList;:FufChangeList;:FufQuickfix;:FufLine;:FufHelp。^w删除输入的前一词。^s和^^调入前一个或后一个历史。回车直接打开,^j水平分窗口打开,^k垂直分窗口打开,^l新开标签页打开。^/^/在模糊匹配和部分匹配间切换;^t和^y在下一个或上一个模式间切换。有些模式中可以^@预览。,cf =FufFileWithCurrentBufferDir列当前文件目录;,cb=FufBuffer列缓存;,ct=FufTaggedFile列标签文件

howmarks自动在屏幕左侧多两列显示标记,与Visual Mark冲突,且拷贝折行时会变为两行。\mt切换显示;\mo打开;\mh删除一个标记;\ma删除所有标记;\mm到下一标记。可以设置是否整行高亮显示。

vimCU方便加或删注释(#)。,#加注释;,3删注释。

comments加或删注释(单行)。^c加注释;^x去注释;s-v选中多行,然后^c或者^x。

autoproto在c文件中,键入函数名和左括号时自动显示函数声明,之后输入有些问题。

grep查找内容或文件名。:Grep查找;:GrepAdd将新查找结果附加到上次结果之后;:Rgrep递归查找;:RgrepAdd;:Bgrep在所有缓存器中查找;:BgrepAdd;:GrepArgs在vi命令行参数的文件中查找;:GrepArgsAdd;F/Rf/E/Re/A/Ra-grep(-Add)。后面加三部分可选参数:grep选项、搜索模式、文件名(在缓存器或命令行参数的文件中查找时不可用)。grep选项如:-i忽略大小写;-w匹配词。搜索模式默认为当前单词,会有提示,届时可以修改;两侧会自动加分界符,如果模式中间有空格或多词,应该不写搜索模式,在提示时写。无文件名时会有提示,默认为*。:colder和:cnewer在多个结果窗口间切换。:cnext和:cprev在多行间切换。:copen重新打开结果窗口。需要grep

TagsParser,在保存文件后即时更新标签文件,并在自己的动态标签窗口中更新显示。

recent记录历史文件。:Recent打开记录。自动载入。

RecentFiles也记录历史文件。,fr打开记录。不自动载入。

CtrlP打开文件、缓存或历史。^P(建议换为比如,cp)或:CtrlP [目录]打开,基于当前文件目录;:CtrlPBuffer查找缓存;:CtrlPMRU查找历史。^f和^b在三个模式间切换;^d只查找文件名或全路径;^r使用正则表达式;^y建立新文件(含路径中的新目录);^z(取消)标记,^o打开选择的文件。g:ctrlp_working_path_mode=0为使用vim当前目录;1为使用当前文件的目录(默认);2为使用当前文件或最近的上层目录,如果其中包含.git目录或.vimprojects等。因为打开文件列表时递归子目录,所以可能非常慢。

tselectfiles打开文件,tselectbuffer打开缓存。:TSelectBuffer查找缓存;:TSelectFilesInSubdirs查找文件,基于当前文件目录,可加上指定目录作为参数,文件多时会慢;:TSelectFiles查找文件(如果之前没用过TSelectFilesInSubdirs,则会显示大量错误)。需要tlib

不推荐Command-T与lusty-explorer类似,但是不仅需要ruby,而且需要ruby编译。

不推荐archive打开压缩文件,没有集成的好用,可能支持的格式多些,要求java:回车开关目录或打开文件;o开关目录或询问文件打开方式;E用:edit打开;S在新拆分的窗口打开;T在新标签打开;p移到上级目录;P移到当前目录下最后一个成员;i显示文件信息;:AsList列表显示

sudo在vim中用高权限编辑。vim sudo:文件路径 或在vim中:e sudo:文件路径。对gvim支持不好。建议用sudo -e编辑文件。

oc 比vim-lsp优秀,能补全GO函数参数、在参数间跳转,但是安装、配置复杂,过于强大。

sessionman在文件菜单扩展出会话菜单项。与showmode=-c功能冲突,导致显示match x of x,从而隐藏vim-go的提示。
add this to .vimrc to go to last file(s) if invoked without arguments.
autocmd VimLeave * nested if (!isdirectory($HOME . "/.vim")) |
  \ call mkdir($HOME . "/.vim") |  
  \ endif |
  \ execute "mksession! " . $HOME . "/.vim/Session.vim"
autocmd VimEnter * nested if argc() == 0 && filereadable($HOME . "/.vim/Session.vim") |
  \ execute "source " . $HOME . "/.vim/Session.vim" 

Syntastic有助于Go程序开发。配置为保存时自动编译检查等,保存文件时需要编译,所以很慢:
set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*
let g:syntastic_always_populate_loc_list = 1
let g:syntastic_auto_loc_list = 1
let g:syntastic_check_on_open = 1
let g:syntastic_check_on_wq = 0
"let g:syntastic_go_checkers = ['golint', 'govet', 'errcheck']
"let g:syntastic_mode_map = { 'mode': 'active', 'passive_filetypes': ['go'] }
let g:syntastic_go_checkers = ['govet', 'errcheck', 'go']
编译出错后,错误显示在location list,所以在各个错误间移动需要用:lprev和:lnext
因为默认每次打开、保存时都编译验证,所以会导致vim变慢。需要设置let g:syntastic_mode_map = { "mode": "passive", "active_filetypes": [], "passive_filetypes": [] }

 

编译:

:set makeprg=编译器名 [参数]  设置编译器,如gcc\ %,其中百分号表示当前文件名,反斜杠表示空格需要转义

:make 参数

:cc 显示错误消息

:cr或:cfirst或:cfir 显示错误消息并定位到首

:clast或:cla 显示错误消息并定位到尾

:cw 显示错误消息,如果没有错误则关闭错误消息窗口

:ccl 关闭错误消息窗口

:cnext或:cn 跳到上个错误

:cprev或:cp 跳到下个错误

:cnf 跳到下一错误文件

:cpf 跳回上一错误文件

:clist或:cl 显示错误列表(可保存十个)

:clist! 显示所有消息

:colder或:col到前一个错误列表

:cnewer或:cnew到后一个错误列表

:chistory或:chi 显示错误列表历史

:cbottom或:cbo 定位到最后一个错误

:cdo 命令 对quickfix中所有内容执行一遍命令

:cfdo 命令 对quickfix中所有文件内容执行一遍命令

:copen 打开窗口显示错误

:botright cwindow 当拆分屏幕后,全屏幕宽度显示错误窗口


:che  列出所有存在的包含文件。:che! 列出所有包含文件。
 

:cs -b 生成cscope.out

:cs add cscope.out 使用cscope.out

tags

^] 跳到当前词的定义处,如果已经选择了可视范围,则跳到该内容的定义处。^t回跳

:次数tag! 名 根据tags文件跳到该名的定义处

:tselect 名 列出与名相匹配的标签。如果不写名,则使用上一次的。:stselect则分割窗口显示。:tjump在结果唯一时跳转

g] 与^]相同,但是使用:tselect。g^]与^]相同,但是使用:tjump

:次数tf或tr 跳到第一个匹配的标签

:次数tn 跳到之后匹配的标签

:次数tp 跳到之前匹配的标签

:tl 跳到最后一个匹配的标签

:ltag 名 跳到对应标签(可为正则表达式,如没写,则用上次的)并将匹配的标签加到location list

quickfix & location list

A location list is a window-local quickfix list. The location list commands are similar to the quickfix commands, replacing the 'c' prefix in the quickfix command with 'l', except 'll'='cc', 'lne'='cn'
 `:lvimgrep`, `:lgrep`, `:lhelpgrep`, `:lmake` = `:vimgrep`, `:grep`, `:helpgrep`, `:make`

 

移动:

 

命令行参数 +数字 跳到指定行打开文件

+/内容 跳到文件第一个内容字符串出现处

^O 回跳

^I 前跳

:jumps 显示跳跃列表

^f 下翻一屏
zz 当前行移到屏幕中央
L 光标移到屏幕底
( 光标移到句首
`[ 到上次修改处首

 

^b 上翻一屏

^d 下翻半屏

^u 上翻半屏

^e 下翻一行

^y 上翻一行

 

H 光标移到屏幕顶

M 光标移到屏幕中央

- 光标移到上一行行首

+ 光标移到下一行行首

 

gm 光标移到行中央

) 光标移到下一句句首

{ 光标移到段首(段以空行为标志)

} 光标移到段尾

`] 到上次修改处尾

f字符 光标移到行内下一字符处。前边加数字表示第几处出现。

F字符 光标移到行内上一字符处。前边加数字表示第几处出现。

t字符 光标移到行内下一字符之前。前边加数字表示第几处出现。

T字符 光标移到行内上一字符之后。前边加数字表示第几处出现。

; 重复执行f或F或t或T

, 反向重复执行f或F或t或T

$ 光标移到行尾。前边加数字表示从上一行数,多少行之后的行。

^ 光标移到行内首个非空格字符处

0 光标移到行首(无论是否是空格)

b 光标移到上一单词词首(含中间有标点的单词)

B 光标移到上一单词词首(不含中间有标点的单词)

w和W,e和E的区别也是含不含中间有标点的单词

ge 光标移到上一单词词尾

gg 到文首

G 到文尾。前边加数字则到对应该行号的行

数字% 到文件对应比例处

vaw 选择一个单词

vas 选择一个句子

 

vap 选择一个断落

^g 显示光标所在位置

 

其它Vi应用:

:cd

:pwd

:sh 打开shell

 

x 删除当前字符

X 删除前一字符

u 撤销

U 行内撤销

. 重复上一命令

ZZ 保存退出

ZQ 不保存退出

:c 关闭当前窗口

:hid 退出窗口而保存在缓存

:cquit或:cq 不保存退出并返回出错码

:r 文件名 读入文件内容。前边可以加范围,则插入到该位置之后:如果为0,则在当前行之上。文件名之前,可加文件格式参数

++ff=文件格式;++enc=编码;++bin 二进制;++nobin 重置二进制。这些参数也能用于打开、保存文件命令。

:r!命令 将命令结果输出到当前位置。前边可以加范围,则插入到该位置之后:如果为0,则在当前行之上。

令当前文件目录为当前目录:可以增加映射map ,cd :cd %:p:h:pwd

次数. 重复上一个编辑操作指定次数,默认为一次

|分隔多个命令

:'<,'>!命令 如果对选区执行命令,则选中内容作为命令参数并将结果替换选区

:!!命令 重复上次的:!命令

:.!命令 将shell命令结果插入到当前位置

利用nl命令对所有非空行编号 :%!nl 如果需要包含空行 :%!nl -ba

:* 或:@ 执行寄存器的内容

gI 到行首并进入插入模式(I类似,但是是到第一个非空字符)

gJ 合并行,且中间不加空格(区别于J)

范围g^g  显示范围内字数等信息。范围默认为全文

gf 打开光标处文件名的文件

gF 打开光标处文件并跳转到后面的行号

:enew 新建文件

:sav 另存为

:wa 保存所有

:wqa 保存所有并退出

:qa! 不保存任何并退出

:close 关闭文件

v 可视模式

V 可视行模式

^v 可视列模式,即选块

选块后,输入I或A加内容后ESC,可在选中的所有行前或后都加上该内容。

Tab不能输入列表符时,试试^vTab

K 显示当前函数的手册

:dia 显示全体字母(digraphs)列表:第一组两个字符是输入第二组字符用的,第三组字符是Unicode码。^K 字符一 字符二 或 字符一 退格 字符二 输入全体字母

 

输入、替换模式下

^[ 同Esc,回到普通模式
^c 回到普通模式
^@ 输入上次输入的内容,并回到普通模式

^a 输入上次输入的内容,不回到普通模式

^x^o 显示所有可能补全选项

^h 同Backspace

^w 删除左边的单词

^u 删除当前行内所有输入的内容

^i 同Tab

^j或^m 同Enter

^k 字符 后面可再加个字符。输入合体字母(digraph)

^n 下个关键字。如输入一个词后,在其位置之前,直接按此序列或输入头几个字符后按此序列,则可插入该词。

^p 上个关键字。如输入一个词后,直接按此序列或输入头几个字符后按此序列,则可插入该词。

^r 字符 插入对应的寄存器内容。

^t 本行增加一个缩进

^d 本行减少一个缩进

^v或^q 数字 输入对应ASCII的字符。十进制最多三个字符,直接输入;八进制最多三个字符,前缀o或O;十六进制最多两个字符,前缀x或X;前缀u能输入四位十六进制;前缀U能输入八位十六进制。

^x CTRL-X模式。输入任意字符则退出此模式并实际输入该字符。

^e 输入当前位置之下的字符

^y 输入当前位置之上的字符

^gk 上移一行并定位在之前开始修改的列。比如,在第二行第二列输入几个字符,按此序列,则移到第一行第二列。

^gj 下移一行并定位在之前开始修改的列。比如,在第二行第二列输入几个字符,按此序列,则移到第三行第二列。

上档或Ctrl加左、右方向键,移到前、后一词词首

上档加上、下方向键,上、下翻页

^o 临时执行一普通模式下的命令

^\o 临时执行一普通模式下的命令,且保持光标位置

 


EX Commands模式:保持在输入命令模式

Q 进入,不更新屏幕

gQ 进入,更新屏幕

:vi或:visual 退出

:范围a 在当前行下插入多行,以单独的.结束输入。后边如果加!,则执行时切换自动缩进设置。

:范围i 在当前行之上插入多行,以单独的.结束输入。后边如果加!,则执行时切换自动缩进设置。

 

比较

:diffupdate或:diffu或:dif 重新比较

:diffs或:diffsplit 文件名 开始与另一文件比较

:diffthis或:difft 将当前窗口比较

 

窗口 windows

命令行参数 -o 后加多个文件名 水平分割。改o为O则垂直分割

数字^ws 或 :数字sp 文件名 以指定高度--水平分割

数字^wn 或 :数字new 以指定高度新建空白窗口

数字^wv 或 :数字vs 文件名  以指定宽度|垂直分割

:数字vne 以指定宽度新建空白窗口

^w^(CTRL-W ^)分窗口并打开alternate,相当于:split #。如果有数字,则打开的是对应号的缓存

:vertical或:leftabove或:aboveleft或:rightbelow或:belowright或:topleft或:botright后加分窗口命令,可以对应方式或在对应位置打开

z数字 或 :res 数字 或 数字^w_ 设置当前窗口高度

:vertical res 数字 或 数字^w| 设置当前窗口宽度

^wf 开新窗口打开光标位置文件。^wF并转到文件名后的行

^w] 开新窗口打开当前标签

^wi 开窗口并定位到内容中第一个当前字,不包括注释的内容。:范围isplit 数字 /内容/ 则在该范围内查找

^wd 开窗口并定位到第一处包含当前字的宏。:范围dsplit 数字 /内容/ 则在指定范围查找

^wp 到上一窗口

^ww 到右或下窗口,如果没有则到左或上

^wW 到左或上窗口,如果没有则到右或下

^wt 到最左上窗口

^wb 到最右下窗口

^wx 交换当前和下个窗口

^wr 顺时针轮转窗口

^wR 逆时针轮转窗口

^wK 将窗口移到最上,宽度最大

^wJ 将窗口移到最下,宽度最大

^wH 将窗口移到最左,高度最大

^wL 将窗口移到最右,高度最大

^w= 所有窗口同等大小

^w-或:resize  -数字 减小当前窗口高度,默认为1。^w+或:resize +数字 则是增大

^w_或z数字或:resize 数字 设置当前窗口高度,默认为最大。

^w< 减小当前窗口宽度。^w>则是增大

^w|或:vertical resize 数字 设置当前窗口宽度,默认为最大

:mode 检测大小,重画屏幕

^wT 将窗口移到新标签页

^wc或^wq或^w^q 关闭或退出窗口

:on或^wo或^w^o仅保留当前窗口

:windo 命令 对所有窗口执行命令。如果有范围前缀(如数字)则只对该部分窗口执行。执行过程中遇到错误则停止。结束后最后一个窗口成为当前窗口。

:数字all 数字 或:数字sall 数字 重新规划屏幕,每个命令行参数打开一个窗口,关闭其它窗口。有数字的话,最多开对应个窗口

 

标签 tabs

:tabnew 打开标签

:tabclose 关闭标签

:tabnext 到下个标签

:tabprevious 到上个标签

:tabedit 文件名  新开标签编辑文件

^wgf 打开标签显示光标处文件。^wgF并转到文件名后行号处

:次数tab 命令 执行命令。如果其打开新窗口,则改为打开新标签。如果有次数,则在对应标签之后打开,否则在当前之后。

缓存 buffers

:buffers或:ls或:files 显示缓存器列表

:数字b   转到缓存器

:数字bd或bd 数字或数字,数字bd  关闭当前、指定或指定范围的缓存器。:bdelete 后可加用空格分隔的多个数字,来关闭多个缓存

:hide edit 文件名  新开缓存器编辑文件

:bfirst到首个缓存

:bnext到下个缓存

:bprev到上个缓存

:bufdo 命令 对所有缓存执行命令。如果有范围前缀(如数字)则只对该部分缓存执行。执行过程中遇到错误则停止。结束后最后一个缓存成为当前缓存。

:sbuffer 数字 分窗口并切换到该缓存
:sbnext 数字 分窗口并切换到指定个数之后的缓存
:sbNext或:sbprevious 数字 分窗口并切换到指定个数之前的缓存
:sbrewind或:sbfirst 分窗口并切换到首个缓存
:sblast 分窗口并切换到末个缓存

标记

小写字母文件内有效,大写字母所有文件间有效。数字从0到9表示最近关闭的文件中的位置。在移动到标记(`或')时,还可以使用:`是上一位置;"是同一寄存器上次退出时的位置;^是最近一次插入模式结束的位置;.是上一修改处;(和)是当前句首和句尾;{和}是当前段首和段尾。

m字母 做标记。可以写单个字母、空格分开的多个字母、或减号分开的两个字母表示多个字母。

`字母 跳到标记。大写:所有文件;小写:当前文件。

delm字母 删标记。

:marks 显示标记列表

 

二进制文件

打开文件时加-b参数

:%!xxd

只能修改十六进制显示部分,不能修改字符显示部分

:%!xxd -r 刷新显示

正常保存文件即可

 

:%!xxd ——将当前文本转换为16进制格式。
:%!od ——将当前文本转换为16进制格式。
:%!xxd -c 12——将当前文本转换为16进制格式,并每行显示12个字节。
:%!xxd -r ——将当前文件转换回文本格式。

 

拼写检查

:set spell 打开检查。更详细,可有:setlocal spell spelllang=en_us

]s 移到下个拼写错误的词

[s 移到上个拼写错误的词

zg 将当前词加到词典

zw 将当前词加到错误词汇表

zug 将当前词从词典删除

zuw 将当前词从错误词汇表删除

:spe 词 将词加到词典

:spellw 词 将词加到错误词汇表

:spellu 词 将词从词典删除

z= 更正当前词

:spellr 将z=操作应用于本窗口所有出现处

^x 插入模式下,提示当前词的备选。^n和^p在备选间切换。

远程编辑

文件名处写 scp://用户名@地址:端口/文件名

如果编辑~/.ssh/config为

host 简称 User 用户名
Hostname 地址
Port 端口

则可以写 scp://简称/文件名

 

寄存器 registers

:registers或:reg或:dis 显示寄存器列表

在命令行,先按^r再写寄存器名,可输入其内容

"字母或数字等 指定下次操作使用的寄存器。后面可以写y命令、Y命令、p命令或P命令

" 无名寄存器 保存d、c、s、x、y命令删除或拷贝的内容,p命令粘贴时默认使用的寄存器

- 删除的少于一行的内容,且删除时不是根据%()`/?nN{}之一移动的

0 拷贝命令y中最新的内容,除非命令指定了其它特定的

1-9 1是删除的一行以上或根据%()`/?nN{}之一移动的,或修改命令中最新的内容,9是最旧的

小写字母 指定寄存器。新内容替换旧内容

大写字母 指定寄存器。新内容添加到旧内容之后

_ 存往该寄存器则不实际保存;从该寄存器读也不返回数据

/ 搜索的模式

= 计算器。插入或命令模式下,^r=然后输入整数算式

:let @寄存器名="内容":修改寄存器内容

:范围co 地址 从范围处拷贝到地址处之下

:t 与:co相同

:范围m 地址 从范围处拷贝到地址处之下

以下四个只读寄存器只能在粘贴或^R命令使用

. 上次插入的文本

% 当前文件的名字

# 替换文件的名字

: 上次执行的命令行

 

 

范围

% 全局

} 一段

 

行号,行号

/< 单词首

/> 单词尾

 

录制与播放 

q小写字母 开始录制

q 结束录制

@小写字母 播放

:次数@小写字母 多次播放

 

文字变化

~ 转换大小写并右移光标
g~~或g~g~转换当前行大小写

guw 当前词变为小写
u 将选择部分变为小写
gugu或guu 当前行变为小写

gUw 当前词变为大写,是gU{motion}的一个特例
U 将选择部分变为大写
gUgU或gUU 当前行变为大写

数目^a 当前或之后下一个数字(或字母)增加指定数目,默认为一
数目g^a 对选择部分内数字(或字母)增加指定数目,默认为一

数目^x 当前或之后数字(或字母)减少指定数目,默认为一
数目g^x 对选择部分内数字(或字母)减少指定数目,默认为一

当nrformats选项包含:octal时,如果以0开头则为八进制,除非其中含有8或9;hex时,0x或0X开头的是十六进制,数字中最后一位字母或上次使用的情况决定新字母的大小写;alpha时,包含字母。

:sort 排序

gq范围 根据textwidth设置限制选区文字宽度

 

搜索与模式

/模式/偏移 正向搜索

?模式?偏移 反向搜索

偏移:

数字 或 +数字 向下指定行

-数字 向上指定行

e+数字 或 e-数字 匹配处最后向右或左移指定个字符

s+数字 或 e-数字 匹配处最开始向右或左移指定个字符

b+数字 或 b-数字 与 s+数字 或 e-数字 相同

模式:

默认不区分大小写。如果出现大写字符,则为区分大小写。如果表达式中在任何处有\C则区分大小写、\c则不区分大小写。

* 其前面的字符重复若干(包括0)次

+ 其前面的字符重复若干(不包括0)次。需要转义,用“\+”

= 其前面的字符可有可无。需要转义,用“/=”

(内容) 将内容分为同一个组,都需要转义\( \)

{次数} 其前面的字符重复指定次数。{需要转义,用“\{”

{次数,次数} 其前面的字符重复指定次数范围(含)之间,两个默认值分别为0次和无限制。{需要转义,用“\{”

{-} 重复尽可能少的次数。比如/a.\{-}b对于a1b2b得到a1b,而/a.*b得到a1b2b

| 或。需要转义,用“\|”

& 与。需要转义,用“\&”

[范围] 匹配范围内的任何一个字符,可以用“-”列出范围

[^范围] 匹配除范围内任一字符之外所有字符

. 任意字符

\a 大小写字母

\l 小写字母

\L 非小写字母

\u 大写字母

\U 非大写字母

\d 数字

\D 非数字

\x 数字或大小写字母

\X 非数字且非大小写字母

\f 可作为文件名的字符

\s 空格或列表符

\S 非空格且非列表符

\_上述被转义的字母 该字母对应字符或回车

\_s 空格或换行

\_a 字母或换行

\t Tab

\r Enter(CR)

\b Backspace(BS)

 

* 查找当前词,整词查找

# 反向查找当前词,整词查找

g* 查找当前词,非整词查找

g# 反向查找当前词,非整词查找。与#类似,但是不在词旁加/<和/>

n 重复上次搜索

N 重复上次搜索,但是反向

gd 到函数内声明处

gD 到全文中声明处

[i 到第一处当前字,不包括注释的内容。如果加数字,则到出现的指定次数处。]i则从当前位置开始计算。:范围isearch 数字 /内容/ 则在该范围内计算

[I显示所有包含当前单词的行。]I从当前位置开始查找。:范围ilist /内容/ 则在该范围内进行

[^i 跳到含当前字的第一行,不包括注释的内容。]^i则从当前位置开始查找。:范围ijump 数字 /内容/ 则在该范围进行

[d 跳到含当前宏定义的第一处宏定义。]d则从当前位置开始查找。:范围dsearch 数字 /内容/ 则在该范围内进行

[D 显示所有包含当前宏的宏的行。]D则从当前位置开始查找。:范围dlist  /内容/ 则在指定范围内进行

[^d 跳到含当前字的第一处宏定义。]^d则从当前位置开始查找。:范围djump 数字 /内容/ 则在指定范围内进行

 

外置搜索

:grep

内置搜索

:vim[grep][!] /{pattern}/[g][j] {file} 整个命令前加数字则表达最多搜索若干结果。!会不保存当前缓存更新结果。Other characters can replace / as enclosures. 如果只是一个简单字且不加g、j,亦可没有分隔符。{pattern} is a Vim search pattern. With 'g' every match is added. Without the 'j' flag Vim jumps to the first match. 当前文件的目录是%:h 或设置set autochdir随文件自动变换当前目录

:lv与:vim类似,只是使用location list而非quickfix list。

:vimgrepadd或:vimgrepa 添加而非清空结果到列表

:vimgrep 内容 % 或:lvim 内容 % 在当前文件中查找包含内容的行,分别用:copen和:lopen打开结果窗口,:cn, :cp, :lnext, :lprev移动。如果在所有缓存中查找,则前面加bufdo 。

 

替换(substitution)

:g/内容 或:g/内容/ 或:g/内容/p 显示所有包含内容的行(因为:g是对所有匹配行执行操作)。需要多个内容时,可以用\|分隔

:g/或:g//或:g//p或[I 显示所有搜索内容(因为省略了“内容”)的行。:g//p数字 则显示包括找到的行在内及之后的若干行。:g//#并显示行号

:g/内容/d 删除所有包含内容的行

:v/内容/d 或:g!/内容/d 删除所有不包含内容的行

:g/^\s*$/d 删除所有无内容行

:范围s/被替换/新内容/标志 次数

:范围g/模式/命令 在范围内符合模式的行中执行命令

:&或& 同:s 默认为行内一次

去除所有行尾空格 :%s/\s\+$// 其中,\s是空格和制表符,\+是任意多个

去除所有“//” :%s!\s*//.*!! 用感叹号作分隔符

去除所有“/*”……“*/” :%s!\s*/\ *\_.\{-}\*/\s*!!g 其中\_.匹配包含换行符内的所有字符,\{-}是任意多个(包括0)

 

标志:

& 上次的标志

c 每次替换都需要确认:y替换,l替换并结束替换,n不替换,ESC或q结束替换,a替换所有剩下的

e 不显示出错提示……

g 替换行内所有

i 忽略大小写

I 区分大小写

n 显示实际替换内容次数而并不实际执行替换

重复上次替换动作(忽略标志;如果想使用上次的标志,需要用:&&)

 

次数@ 执行上次命令行指定次数,默认为一次

 

^ 行中第一个字符处

$ 行尾

%^ 文件首

%$ 文件尾

%# 当前光标处

 

命令行

命令行参数 +命令 或 -c 命令 启动后执行该命令

or one word left
or one word right

^w 删除前边的词

^u 删除整行

^d 显示补全的所有可能

q: 显示历史,可以进行编辑

^r寄存器 将寄存器内容添加到命令行

| 连接多个命令

 

命令记录

q数字或字母 开始将操作记录到寄存器

Q数字或字母 开始将操作记录附加到寄存器

q 结束记录

次数@寄存器名 执行寄存器中的操作指定次数,默认为一次

 

neovim terminal

:terminal use a or i to enter insert mode. ^\n to return to normal mode. ^l (letter l in lower case) redraw

  • :vsplit term://zsh spawning a zsh  shell
  • :split term://htop spawning htop in a terminal
  • :edit term://bash spawning a bash shell

 

 显示当前文件的名

:!echo %

:!echo %:t:r 文件基本名

:!echo %:p 文件名绝对路径

:!echo %:h 文件所在目录

 

缩进

:范围le 缩进 将指定范围的行(默认为当前行)靠左进行指定缩进(默认为0)

gq动作 格式化

gqq 格式化当前行

gw与上两个gq使用类似

 >动作 缩进行,“动作”指如光标移动。前边可以加数字指定几行

>> 缩进一行

>% 缩进区块

>`字母 缩进到标记处

:范围> 次数

< 取消缩进,替换上述>操作

= 自动缩进,替换上述>操作

:范围le 缩进级数  左对齐到指定缩进级数(默认为0)

]p 粘贴时自动缩进

={ 自动缩进当前区块

== 自动缩进当前行

gg=G 自动缩进所有

:set cindent 设置C语言风格自动缩进

:set autoindent 设置按上行缩进

:set expandtab 设置将制表键转换为空格

:set no设置项 取消设置

:set softtabstop=缩进 设置自动缩进时,缩进会使用此值对应的空格数或制表

:set shiftwidth=缩进 自动或手动缩进时采用此值

 

选项

定义某一文件的特定选项:比如在c代码文件开头写/* vim: set tabstop=4 shiftwidth=4 expandtab: */(:help modeline查看对应帮助)

:set - shows vars different from defaults
:set all - shows all values
:set foo? - shows the value of foo
:set foo+=opt - add opt to the value w/o changing others
:set foo-=opt - remove opt from value
:set foo& - reset foo to default value
:setlocal foo - only the current buffer

textwidth 重新自动设置文本宽度时的值

equalalways或ea 新开窗口时所有窗口大小相同(否则只会与当前窗口平分区域)
eadirection 默认equalalways对横竖方向均有效,ver则只设置高度,hor则只设置宽度
winheight或wh 当前窗口最高。0为不设置
winwidth或wiw 当前窗口最矮
winminheight和winminwidth 窗口最小高、宽
cmdheight或ch 命令行高度

formatoptions t根据textwidth自动折行;c在代码中自动对注释折行、插入合适的注释标志;r在注释中回车时自动插入合适的注释标志;q允许用gq命令重新格式化文本宽度;n识别编号列表,编号行的下一行的缩进由数字后的空白决定;2一段的第二行的缩进决定缩进;l超过textwidth时不重新格式化;m在多字节字符之间允许折行;M拼接两行时在多字节字符间不插入空格。默认为tcq,宜在.vimrc中加入“set formatoptions+=mM”

布尔型变量加前缀no为相反设定。
backup 布尔型,默认关。修改文件前备份。
backupcopy  unix默认为yes,其它默认为auto。yes:备份并重写原文件;no:重全名并新建文件;auto:自动选择此两种。
backupdir  unix默认为.,~/tmp,~/,DOS、Win32默认为.,c:/temp,c:/temp。
backupext  默认为~,VMS是_。
backupskip  默认为/tmp/*,$TMPDIR/*,$TMP/*,$TEMP/*。不备份一些文件。
writebackup 布尔型,有+writebackup特性时默认开,其它默认关。覆盖文件前先备份,成功覆盖后删除备份。
binary  即将修改二进制文件。亦可通过命令行参数-b使用。

confirm 布尔型,默认关。在因缓存未保存赞成失败时,显示对话框。

diffopt  比较模式使用的选项。

errorbells  布尔型,默认关。在出错时响铃。

indentkeys  默认为0{,0},:,0#,!^F,o,O,e

nrformats  默认为octal,hex。

number  布尔型,默认关。显示行号。

showbreak  默认为空。在转行的行首显示字符串。

showfulltag 布尔型,默认关。插入状态下,补全时显示更多信息。

visualbell 布尔型,默认关。响铃时显示可视效果。

wrap 布尔型,默认开。

你可能感兴趣的:(开发与应用,vim)