Vim学习笔记

VIM是一款神一样的编辑器,起初是Linux的标配编辑器,至于它的起源和好处我不想多讲,主要是我自己都搞不懂,我只是认为好东西肯定要花功夫之后你才会真正体会它的好,而我学它的原因只是因为我想像大神一样使用这等神一样的编辑器,好吧,最主要的是我想在Linux编辑一些东西。当然,多学一样东西,没什么坏处。

此笔记只是记录我平时用到的,一些高深的,可能就不写了,等以后真的用到了,再学习。

安装什么的咱就不说了,Linux的话,应该自带VIM了,如果没有的话,请自行搜索安装方法。如果是Windows的话,请下载安装gVim。如果是Mac的话,你肯定比我懂。

普通的编辑软件(比如记事本、EditPlus、Notepad++等)都没有模式,或者只有一种模式(编辑模式),而VIM不止一种,我这边自己定义为三种,Normal模式(正常模式)、Command模式(命令模式)、Edit 模式(编辑模式)。可能其他地方只分了两种,但是我说了这里是我自己这么归类而已,主要为了分清楚。

  • Normal模式(正常模式) 使用键盘的按键进行相关操作。
  • Command模式(命令模式) 通过输入冒号(英文的“:”),然后键入相关命令
  • Edit 模式(编辑模式) 进行编辑文本,与普通的一致。

我要记得就是正常模式的按键和命令模式的命令了。(纯手打,不复制粘贴)

另外,需要注意的是,如果您的配置文件更改过,可能会造成下面的一些快捷键失效,请检查自己的配置文件。

我再次声明下,这个这是给我自己学习记录使用的,可能有些错误之处,请参考大牛的文章。

正常模式

打开vim或者gVim就是处于正常模式了。如果不确定的话,多按几次Esc就会退回到正常模式。

以下的按键区分大小写,如果不愿意按大小写切换按键,可以按住Shift + 按键,即是大写。

  • [n]表示数字,比如3。
  • [c]表示一个字符,比如c。
  • [s]表示字符串,比如string。

h    光标向左移动一格,可带数字,比如3h,向左移动三格
j    光标向下移动一格 ,可带数字,比如3j,向下移动三格
k    光标向上移动一格 ,可带数字,比如3k,向上移动三格
l    光标向右移动一格 ,可带数字,比如3l,向右移动三格
Ctrl+F    向下翻一页
Ctrl+B    向上翻一页
gg    光标移动到第一行首字符
G    光标移动到最后一行首字符
[n]G    光标移动到第n行首字符
x    删除目前光标的字符
i    进入编辑模式,插入符在光标字符的前面
dd    删除当前行,并保存到剪贴板上(相当于剪切Ctrl+X)
[n]dd    删除当前行及下面的n-1行,共n行,并保存到剪贴板上,例如:3dd
y    复制当前行到剪贴板(相当于复制Ctrl+C)
[n]y    复制当前行开始共n行到剪贴板
p    粘贴剪贴板中到内容到光标下一行(相当于粘贴Ctrl+V)
[n]p    粘贴剪贴板中到内容到光标下一行n次
u    撤销(相当于Ctrl+Z)
Ctrl+R    恢复撤销的动作
w    光标移动到下一个单词的首字母上(中文的话以空格为单位),可加数字,比如3w,移动三次。
b    光标移动到上一个单词的首字母上(中文的话以空格为单位),可加数字,比如3b,移动三次。
e    光标移动到下一个单词的尾字母上(中文的话以空格为单位),可加数字,比如3e,移动三次。
ge    光标移动到上一个单词的尾字母上(中文的话以空格为单位),可加数字,比如3ge,移动三次。
$    移动光标到行尾,与键同效
^    移动光标到行首第一个非空白字符
0    移动光标到行首,与键同效
%    匹配与当前光标所指的括号对应的括号
[n]%    移动光标到文档的n%出,比如50%,表示中部
H    移动光标到顶部,Home
M    移动光标到中部,Middle
L    移动光标到底部,Last
Shift+ZZ    保存并关闭
/[s]    查找[s],需回车,按n表示下一个匹配的地方,N表示上一个匹配的地方,此处查找匹配大小写
*    查找当前光标单词
#    反方向查找当前光标单词

以下为我不是很常用到的一些快捷键

a    进入编辑模式,插入符在光标字符的后面
o    进入编辑模式,插入符在光标字符的另起一行开头
O    进入编辑模式,插入符在光标字符的另起上一行一行开头
J    删除当前行的换行符,下一行移到本行末尾
f[c]    在当前行,移动光标到以后的字符[c]上。
F[c]     在当前行,移动光标到前面的字符[c]上。
t[c]    在当前行,移动光标到以后的字符[c]前一个字符上。
T[c]    在当前行,移动光标到前面的字符[c]前一个字符上。
Ctrl+G    查看当前行在文档中的位置,例如40%
Ctrl+U    向下翻半页
Ctrl+D    向上翻半页
zz    把当前行至于屏幕中央
zt    把当前行至于屏幕顶部
zb    把当前行至于屏幕底部
?[s]    反方向查找[s],需回车,按n表示下一个匹配的地方,N表示上一个匹配的地方,此处查找匹配大小写
F1    查看帮助文档,Ctrl+]和Ctrl+O,分别是跳转到链接的内容和返回。
``    此次光标位置和上次光标位置来回切换
Ctrl+O    跳转到前一次光标位置
Ctrl+I    跳转到后一次光标位置
m[c]    标记当前光标位置为[c],比如ma
`[c]    跳转到标记为[c]的光标位置
'[c]    跳转到标记为[c]的行首

这里看起来命令很少,但是由于这些命令都可以自由组合,且有些命令支持数字,即多次操作,故组合之后会超多。用到熟练确实很难,但是也同样能够事半功倍。

命令模式

当在正常模式下(可多按几次Esc就会退回到正常模式)输入冒号“:”(英文状态下),即在最下面可以显示你的输入的,此模式为命令模式。然后输入相关指令再敲回车即可,以下的命令中最后都要敲回车。

VIM正常模式

:q    关闭不保存
:q!    强制关闭并不保存
:w    保存但不退出
:w!    强制保存
:wq    保存并关闭
:wq!    强制保存并关闭
:help    查看帮助文档,Ctrl+]和Ctrl+O,分别是跳转到链接的内容和返回。
:e ..\_vimrc    打开上级目录中的_vimrc文件中

以下是一些不常用到的命令

:set ignorecase        忽略大小写
:set noignorecase    匹配大小写
:set hlsearch        高亮显示搜索结果
:set nohlsearch        关闭高亮显示搜索结果
:nohlsearch        关闭此次高亮
:set incsearch        开启即打即找搜索功能
:set noincsearch    关闭即打即找搜索功能
:set wrapscan        开启到达底部从头搜索功能
:set nowrapscan    关闭到达底部从头搜索功能

上面的命令如果是在命令行中运行的话,那么就只针对这次的效果,为了以后每次都是这样的效果,可以对设置保存在vim启动文件中,Linux的话是在~/.vimrc,Windows是在$Vim/_vimrc。

以下配置文件是我从网上http://www.ruchee.com上搜集到的,针对自己的情况进行了稍作修改。可以参看下。

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
" ----------------- Author: Ruchee" ----------------- Email: admin@ruchee.com" ----------------- WebSite: http://www.ruchee.com" ----------------- Change: Laycher" ----------------- WebSite: http://www.laycher.com" ----------------- Date: 2013-01-11" ----------------- For Windows " Ctrl + H --光标移当前行行首 [插入模式]" Ctrl + J --光标移下一行行首 [插入模式]" Ctrl + K --光标移上一行行尾 [插入模式]" Ctrl + L --光标移当前行行尾 [插入模式]" Ctrl + C --单源文件编译 [已配置 C/C++]" Ctrl + R --单源文件运行 [已配置 C/C++ Ruby Bash]" Ctrl + ] --转到函数定义" Ctrl + T --返回调用函数" Ctrl + E --一步加载语法模板和作者、时间信息" ESC + H --Normal模式下开启Devhelp查询功能 " --关键字补全" --整行补全" --全能补全" Tab键 --插入模式下语法结构补全 [snipMate插件]" Shift + Insert --向Vim中粘贴从别处复制的内容 " u [小写] --单步复原 [非插入模式]" U [大写] --整行复原 [非插入模式] " jj --保存文件并留在插入模式 [插入模式]" kk -n返回Normal模式 [插入模式]" nt --打开NERDTree [非插入模式]" tl --打开TagList [非插入模式] " za --打开或关闭当前折叠" zM --关闭所有折叠" zR --打开所有折叠 " :se ft=cpp --手动选择语法高亮 [:set filetype=cpp 或 :set syntax=cpp 亦可] " :%!xxd --转储二进制文件,以十六进制形式显示" :%!xxd -r --还原二进制文件 " ---------- 主要插件详细用法说明 --------------------- " :Tlist --呼出变量和函数列表 [TagList插件]" :LoadTemplate --呼出语法模板 [Load_Template插件]" :AuthorInfoDetect --添加作者、时间等信息 [NERD_commenter && authorinfo插件] " ---------- snipMate [全局可用的补全关键字] ----------"" cprt --插入版权信息 [助记:copyright]" date --插入当前时间" fiok --插入文件的最后修改时间 [助记:file ok]" desc --插入文件描述 [助记:description]" 更多关键字可自行查看vimfiles/snippets下的各个文件 [Linux下为~/.vim/snippets] " ---------- a.vim [自动切换C/C++同名头文件] ----------"" :A --切换同名头文件并独占整个屏幕" :AS --切换同名头文件并垂直分屏,头文件在上" :AV --切换同名头文件并水平分割,头文件在左 " ---------- mark.vim [追踪高亮指定关键字] ------------"" \m --normal模式下,在想要高亮的单词上面敲击\m即可高亮或取消高亮该单词" :Mark --取消所有高亮" :Mark abc --指定高亮单词 abc 或取消高亮 abc " ---------- NERDTree [智能文件浏览器] ----------------"" :NERDTree --启动NERDTree插件" o [小写] --切换当前文件或目录的打开、关闭状态" u --打开上层目录" p [小写] --返回上层目录" P [大写] --返回根目录" K --转到当前目录第一个节点" J --转到当前目录最后的节点" m --显示文件系统菜单 [增、删、移]" ? --弹出帮助菜单" q --退出该插件 colorscheme desert " 着色模式:灰色背景set guifont=YaHei_Consolas_Hybrid:h11:cGB2312 " 字体 && 字号"set go=e " 显示立体标签页set autoindent " 自动对齐set backspace=2 " 设置退格键可用set cindent shiftwidth=4 " 自动缩进4空格set autoindent " 自动对齐set ai! " 设置自动缩进set smartindent " 智能自动缩进set shiftwidth=2 " 换行时行间交错使用2空格set cindent shiftwidth=2 " 自动缩进2空格set nu! " 显示行号set ignorecase "忽略大小写"set showmatch " 显示括号配对情况set mouse=a " 启用鼠标set ruler " 右下角显示光标位置的状态行set incsearch " 开启实时搜索功能set hlsearch " 开启高亮显示结果set nowrapscan " 搜索到文件两端时不重新搜索set nocompatible " 关闭兼容模式set vb t_vb= " 关闭提示音set hidden " 允许在有未保存的修改时切换缓冲区set autochdir " 设定文件浏览器目录为当前目录set foldmethod=syntax " 选择代码折叠类型set foldlevel=100 " 禁止自动折叠set laststatus=2 " 开启状态栏信息set cmdheight=1 " 命令行的高度,默认为1,这里设为2"set showmatch " 显示括号配对情况"set cursorline " 突出显示当前行"set nowrap " 设置不自动换行"set writebackup " 设置无备份文件set nobackupset list " 显示Tab符,使用一高亮竖线代替set listchars=tab:\¦\ ,set tabstop=2 " 设置Tab键的宽度 [等同的空格个数]set expandtab " 将Tab自动转化成空格 [需要输入真正的Tab键时,使用 Ctrl+V + Tab] syntax enable " 打开语法高亮syntax on " 开启文件类型侦测filetype indent on " 针对不同的文件类型采用不同的缩进格式filetype plugin on " 针对不同的文件类型加载对应的插件filetype plugin indent on " 启用自动补全 if has("gui_running")"au GUIEnter * simalt ~x " 窗口启动时自动最大化"winpos 20 20 " 指定窗口出现的位置,坐标原点在屏幕左上角"set lines=20 columns=90 " 指定窗口大小,lines为高度,columns为宽度"set guioptions-=m " 隐藏菜单栏"set guioptions-=T " 隐藏工具栏"set guioptions-=L " 隐藏左侧滚动条"set guioptions-=r " 隐藏右侧滚动条"set guioptions-=b " 隐藏底部滚动条"set showtabline=0 " 隐藏Tab栏endif "set backup"set backupext=.bak"set patchmode=.orig " 保存原始文件为 文件名.orig" set writebackup " 设置无备份文件set nobackupset autochdir " 设定文件浏览器目录为当前目录"set nowrap " 设置不自动换行set foldmethod=syntax " 选择代码折叠类型set foldlevel=100 " 禁止自动折叠 set laststatus=2 " 开启状态栏信息set cmdheight=1 " 命令行的高度,默认为1,这里设为2" 每行超过80个的字符用下划线标示" au BufRead,BufNewFile *.s,*.asm,*.h,*.c,*.cpp,*.cc,*.java,*.cs,*.erl,*.hs,*.sh,*.lua,*.pl,*.pm,*.php,*.py,*.rb,*.erb,*.vim,*.js,*.css,*.xml,*.html,*.xhtml 2match Underlined /.\%81v/" 记住上次光标的位置au BufReadPost * if line("'\"") >1 && line("'\"") <= line("$") ¦ exe "normal! g`\"" ¦ en" 打开上次的文件单引号加0,上上次单引号加1 " 设置编码set fenc=utf-8set encoding=utf-8set fileencodings=utf-8,gbk,cp936,latin-1" 解决菜单乱码source $VIMRUNTIME/delmenu.vimsource $VIMRUNTIME/menu.vim" 解决consle输出乱码language messages zh_CN.utf-8 " For Haskell:let hs_highlight_delimiters=1 " 高亮定界符:let hs_highlight_boolean=1 " 把True和False识别为关键字:let hs_highlight_types=1 " 把基本类型的名字识别为关键字:let hs_highlight_more_types=1 " 把更多常用类型识别为关键字:let hs_highlight_debug=1 " 高亮调试函数的名字:let hs_allow_hash_operator=1 " 阻止把#高亮为错误 " ======= 引号 && 括号自动匹配 ======= " :inoremap ( ()i :inoremap ) =ClosePair(')') :inoremap { {}i :inoremap } =ClosePair('}') :inoremap [ []i :inoremap ] =ClosePair(']') ":inoremap < <>i ":inoremap > =ClosePair('>') :inoremap " ""i :inoremap ' ''i :inoremap ` ``i function ClosePair(char)if getline('.')[col('.') - 1] == a:charreturn "\"elsereturn a:charendifendf " ESC + H Normal模式下开启Devhelp查询功能function! DevHelpCurrentWord()let word = expand("")exe "!devhelp -s " . word . " &"endfunctionnmap h :call DevHelpCurrentWord() " MiniBufExplorer 多个文件切换 可使用鼠标双击相应文件名进行切换let g:miniBufExplMapWindowNavVim=1let g:miniBufExplMapWindowNavArrows=1let g:miniBufExplMapCTabSwitchBufs=1let g:miniBufExplModSelTarget=1 " :Tlist 调用TagListlet Tlist_Show_One_File=1 " 只显示当前文件的tagslet Tlist_Exit_OnlyWindow=1 " 如果Taglist窗口是最后一个窗口则退出Vimlet Tlist_Use_Right_Window=1 " 在右侧窗口中显示let Tlist_File_Fold_Auto_Close=1 " 自动折叠 " TxtBrowser 高亮TXT文本文件au BufRead,BufNewFile *.txt setlocal ft=txt " :LoadTemplate 根据文件类型自动加载模板let g:template_path='~/.vim/template/' " snipMate Tab智能补全let g:snips_author='Laycher' " :AuthorInfoDetect 自动添加作者、时间等信息,本质是NERD_commenter && authorinfo的结合let g:vimrc_author='Laycher'let g:vimrc_email='i@laycher.com'let g:vimrc_homepage='http://www.laycher.com' " Ctrl + H 将光标移到当前行的行首imap I " Ctrl + J 将光标移到下一行的行首imap jI " Ctrl + K 将光标移到上一行的末尾imap kA " Ctrl + L 将光标移到当前行的行尾imap A " Ctrl + E 一步加载语法模板和作者、时间信息map :LoadTemplate:AuthorInfoDetectGiimap :LoadTemplate:AuthorInfoDetectGivmap :LoadTemplate:AuthorInfoDetectGi " Ctrl + S 保存当前文件并留在插入模式 [插入模式]map :wimap :wavmap :w" imap :wli " kk 返回Normal模式,不执行保存 [插入模式]imap kk l " nt 打开NERDTree窗口,在左侧栏显示 [非插入模式]map nt :NERDTree " tl 打开Taglist窗口,在右侧栏显示 [非插入模式]map tl :Tlist " ======= 编译 && 运行 ======= " " 编译源文件func! CompileCode()exec "w"if &filetype == "c"exec "!clang -std=c99 % elseif &filetype == "cpp"exec "!clang++ -std=c++98 % elseif &filetype == "java"exec "!javac %<.java"elseif &filetype == "haskell"exec "!ghc --make % elseif &filetype == "lua"exec "!lua %<.lua"elseif &filetype == "perl"exec "!perl %<.pl"elseif &filetype == "python"exec "!python %<.py"elseif &filetype == "ruby"exec "!ruby %<.rb"elseif &filetype == "sh"exec "!bash %<.sh"endifendfunc " 运行可执行文件func! RunCode()exec "w"if &filetype == "c" ¦¦ &filetype == "cpp"exec "! ./%<"elseif &filetype == "java"exec "!java %<"elseif &filetype == "lua"exec "!lua %<.lua"elseif &filetype == "perl"exec "!perl %<.pl"elseif &filetype == "python"exec "!python %<.py"elseif &filetype == "ruby"exec "!ruby %<.rb"elseif &filetype == "sh"exec "!bash %<.sh"endifendfunc " Ctrl + C 一键保存、编译" map :call CompileCode()" imap :call CompileCode()" vmap :call CompileCode() " Ctrl + R 一键保存、运行" map :call RunCode()" imap :call RunCode()" vmap :call RunCode() " ======= VimWiki ======= " " 设置编码let g:vimwiki_w32_dir_enc = 'utf-8' " 使用鼠标映射let g:vimwiki_use_mouse = 1 " 不要将驼峰式词组作为 Wiki 词条let g:vimwiki_camel_case = 0 " 声明可以在wiki里面使用的HTML标签let g:vimwiki_valid_html_tags='b,i,s,u,sub,sup,kbd,br,hr,div,del,code,red,center,left,right,h2,h4,h5,h6,pre,script,style' let g:vimwiki_list = [{\ 'path': '~/mysite/wiki',\ 'path_html': '~/mysite/html/',\ 'html_header': '~/mysite/template/header.html',\ 'html_footer': '~/mysite/template/footer.html',\ 'auto_export': 1,\ 'nested_syntaxes': {'Clang': 'c', 'C++': 'cpp', 'Lisp': 'lisp', 'Ruby': 'ruby', 'SQL': 'sql', 'Bash': 'sh', 'Vim': 'vim', 'Make': 'make', 'CMake': 'cmake', 'JS': 'javascript', 'CSS': 'css', 'HTML': 'html', 'XML': 'xml'},}] source $VIMRUNTIME/vimrc_example.vimsource $VIMRUNTIME/mswin.vim"设置鼠标运行模式为WINDOWS模式behave mswin

VIM相关网站:

  • VIM官网(被墙) http://www.vim.org/
  • VIM相关技巧 http://vim-tips.com/
  • 善用佳软的教程 http://xbeta.info/vim-tutorials.htm

VIM整理的相关文档打包(点此下载)

>> 若为原创,转载请注明: 转载自Laycher's Blog

>> 本文链接地址: Vim学习笔记(2013-08-04)

>> 订阅本站: http://feed.feedsky.com/laycher