VIM常用操作, 插件和vimrc文件
1.常用操作
VIM作为文本编辑器,其强大之处,在我看来,首先就是快速的编辑能力,其次才是丰富的扩展插件。
所以掌握vim的快速编辑的方法是非常重要的,这里列举一些必须熟记的跟效率有关的操作.




<基本编辑操作>
上下左右移动:对应为上(K),下(J),左(H), 右(L);这个是基本要求,千万不要用方向键,用方向键的朋友伤不起~。
gg:跳到文档开头
G:跳到文档末尾
w:跳到下一个单词开头; 4w:跳到往后的第四个单词的开头,依次类推.
e:跳到下一个单词结尾
b:跳到上一个单词开头;4b:跳到往前的第四个单词的开头,依次类推.
0:跳到行的开头
^:跳到行的开头的第一个字符处
$:跳到行的末尾




<快速编辑操作>
=:快速调整当前行的缩进 gg=G:全文档快速缩进调整
Ctrl+p(Ctrl+n):快速补全命令,这个在写代码时非常有用,在编辑模式中, 输入几个字符后再输入此命令则 开始向上(下)搜 索开头与其匹配的单词并补齐, 不断输入此命令则循环查找. 此命令 会在所有在这个 vim 程序中打开的文件中进行匹配.
Ctrl+x+l:自动补全一行的内容,只在当前文档查找匹配的行,多个选项时通过快速补全命令选择.
Ctrl+x+f:自动补全目录.如我输入 c:\p,然后按Ctrl+x+f, 则得到 C:\Program Files\
abbr:缩写设置,如:abbr cmain int main(int argc, char** argv),则下次只要输入cmain后再输入其他非字母符号, 它就会自动扩展为int int main(int argc, char** argv)
qa:录制宏, 宏这个不多解释,就是为了重复执行一系列操作准备的,好一点的编辑器都可以录制宏.
q:结束录制
@a: 执行一次宏, 100@a:重复执行100次




<查找相关>
查找默认是区分大小写的,要不区分大小写的话,先:set ignorecase
f:在当前行查找字符,如fx查找x, ';'查找下一个, ','查找上一个.
/xxx: 向下查找xxx,xxx允许正则表达式
?xxx:向上查找xxx,xxx允许正则表达式
n:查找下一个
N查找上一个
*:查找并高亮当前光标下的单词.
g*:查找并高亮包含当前单词的字符串. 如"helloworld world", 光标在空格后的world上按g*, 则"helloworld"也会高亮
%:查找与光标所在处括号相匹配的反括号, 包括 () [] {}




<替换相关>
替换是vim的强项, 因为可以用正规表达式来匹配字符串.
替换表达式的一些字符含义:
%:全文档搜索
g:全部替换
c:替换前确认
以下提供几个例子.
:s/aa/bb/g :将光标所在行出现的所有包含 aa 的字符串中的 aa 替换为 bb, g表示全部匹配点都替换,没有g则只替换第一个匹配的
:s/\<aa\>/bb/g :将光标aaxy所在行出现的所有 aa 替换为 bb, 仅替换 aa 这个单词,类似于aaxy之类的不会被替换
:%s/aa/bb/g :将文档中出现的所有包含 aa 的字符串中的 aa 替换为 bb
:12,23s/aa/bb/g :将从12行到23行中出现的所有包含 aa 的字符串中的 aa 替换为 bb
:12,23s/^/#/ :将从12行到23行的行首加入 # 字符
:%s= *$== :将所有行尾多余的空格删除
:g/^\s*$/d :将所有不包含字符(空格也不包含)的空行删除.




<复制粘贴>
y 表示拷贝, d 表示删除, p 表示粘贴. 其中拷贝与删除是与光标移动命令
YY:复制整行
dd:删除整行
ddp:交换当前行和下一行
ggyG:表示复制整篇文档
ggdG:表示删除整篇文档
yw:表示拷贝从当前光标到光标所在单词结尾的内容.
dw:表示删除从当前光标到光标所在单词结尾的内容.
y0:表示拷贝从当前光标到光标所在行首的内容.
d0:表示删除从当前光标到光标所在行首的内容.
y$:表示拷贝从当前光标到光标所在行尾的内容.
d$:表示删除从当前光标到光标所在行尾的内容.
yfa:表示拷贝从当前光标到光标后面的第一个a字符之间的内容.
dfa:表示删除从当前光标到光标后面的第一个a字符之间的内容.




2.常用插件
<ctags>
这个其实不算插件,是一个独立的程序,需要安装这个程序放在系统Path所包含的目录中。
安装很简单,直接下载ctags.exe即可(Windows下),最简单就直接将ctags放在system32目录下。
为了操作方便,在vimrc中设置一些快捷键就可以了:
"-------------------------------------------cags------------------------------>>
map <F8> :!ctags -R --fields=+lS <CR> "生成tag文件,喜欢的时候就按一下F8"
"映射跳转快捷键,跳转到光标下单词的定义处,g]会列出跳转列表,如果需要自动跳转到第一个记录,则用map fj <C-]>"
map fj g]
"跳回之前的位置"
map ff <C-T>




<taglist>
这个插件用来查看当前文件定义的变量、函数等信息, 挺有用的,被用得很泛滥.
安装很简单,下载taglist.vim放入vim的plugin目录就可以了
在vimrc中简单设置一些选项:(更多设置自己输入:help taglist.txt查看哦,记得之前要将taglist.txt放入vim的doc目录哦)
"-------------------------------------------taglist-------------------------->>
"快捷键"
noremap <F11> :TlistToggle<CR>
"以下是一些taglist设置"
"设定windows系统中ctags程序的位置"
if MySys() == "windows"
"指定ctags程序的位置"
let Tlist_Ctags_Cmd = 'ctags'
elseif MySys() == "linux"
let Tlist_Ctags_Cmd = '/usr/bin/ctags'
endif
"不同时显示多个文件的tag,只显示当前文件的"
let Tlist_Show_One_File = 1
"如果taglist窗口是最后一个窗口,则退出vim"
let Tlist_Exit_OnlyWindow = 1
"在右侧窗口中显示taglist窗口"
let Tlist_Use_Right_Window = 1
"设置按照名称排序,这样或许找函数名会容易些"
Tlist_Sort_Type="name"
"vim启动时自动打开taglist窗口"
"Tlist_Auto_Open=1
"打开taglist时焦点自动转到taglist窗口"
"Tlist_GainFocus_On_ToggleOpen=1
"让taglist始终解释文件中的tag,不管taglist窗口有没有打开"
"Tlist_Process_File_Always=1




<NERD_tree.vim>
目录树, 同时还可以对文件进行vim的打开操作等.
安装跟上面的一样,下载NERD_tree.vim放入vim的plugin目录.
在vimrc中设置一下:
"-------------------------------------------NERD_tree.vim--------------------->>
"设置快捷键"
nmap <F2> :NERDTreeToggle<cr>



"禁用所有与NERD_tree有关的命令"
"let loaded_nerd_tree=1
"不显示指定的类型的文件"
"let NERDTreeIgnore=['/.vim$', '/~$']
"不显示隐藏文件(好像只在linux环境中有效)"
let NERDTreeShowHidden=0
"排序"
let NERDTreeSortOrder=['//$','/.cpp$','/.c$', '/.h$', '/.py$', '/.lua$', '*']
"不分大小写排序"
let NERDTreeCaseSensitiveSort=0
"设置窗口尺寸"
let NERDTreeWinSize=30
"是否显示行号"
"let NERDTreeShowLineNumbers=1
"是否显示书签"
"let NERDTreeShowBookmarks=1
"打开文件后, 关闭NERDTrre窗口"
"let NERDTreeQuitOnOpen=1
"高亮NERDTrre窗口的当前行"
let NERDTreeHighlightCursorline=1




<bufExplorer.vim>
用来切换vim当前打开的文件的.
安装如上,下载bufExplorer.vim放到vim的plugin目录下.
在vimrc中设置一下:
"-----------------------------------------bufExplorer.vim--------->>"
noremap zz :BufExplorer<CR>




安装了以上几个插件后,vim已经像模像样了,用起来也很方便了.<F2>打开目录浏览, <F11>打开taglist, <F5>生成tag,fj跳转,ff跳转返回 zz打开缓冲文件窗口




vimrc文件
vimrc文件配置得好的话,操作起来更方便快捷, 这个不多说了,附上我的vimrc文件:



-------------------------------------------基本设定------------------------->>
set fileencodings=ucs-bom,utf-8,cp936 "自动识别的文件编码
set nocompatible "不兼容vi
set magic
set ru "标尺信息
set ai "自动缩进
set sw=4 "自动缩进宽度
set ts=4
set dy=lastline "显示最多行,不用@@
set backspace=indent,eol,start
colo evening
sy on
set go= "无菜单、工具栏
set nobackup
set hlsearch
set incsearch
set hls
set showmatch
set autochdir "需要自动改变vim的当前目录为打开的文件所在目录则设置此项
set showcmd
set smartindent
set tags=tags; "设置tag文件的搜索路径
set tags+=/usr/include/tags;
filetype plugin on "支持插件
set cursorline "当前行有下划线
set virtualedit=onemore
"set number "需要显示行号则设置该项
"set path=.,/usr/include,include "vimgrep时额外的搜索路径
"highlight Comment ctermfg=gray "设置注释的颜色
"highlight Macro ctermfg=blue "设置宏定义的颜色
"hi Folded ctermfg=red ctermbg=darkblue
"hi FoldColumn guibg=green guifg=grey20 ctermfg=4 ctermbg=7



"-------------------------------------------快捷键设置----------------------->>
noremap <C-S> :update<CR>
noremap <F5> :w<CR> :!Python %<CR>



" 文件查找
noremap <F3> :vimgrep /<C-R>=expand("<cword>")<CR>/j *.txt *.cpp *.h *.py *.java *.lua<CR> \| :copen<CR>
noremap <F7> :vimgrep /<C-R>=expand("<cword>")<CR>/j **/*.txt **/*.cpp **/*.h **/*.py **/*.java **/*.lua<CR> \| :copen<CR>
noremap <C-F7> :vimgrep /<C-R>=expand("<C-R>+")<CR>/j **/*.txt **/*.cpp **/*.h **/*.py **/*.java **/*.lua<CR> \| :copen<CR>



" tabedit
nmap te :tabedit
nmap tn :tabnew<CR>
noremap <TAB> :tabn<cr>




"-------------------------------------------函数定义------------------------->>
fun! ToggleFold()
if foldlevel('.') == 0
normal! l
else
if foldclosed('.') < 0
. foldclose!
else
. foldopen!
endif
endif
" Clear status line
echo
endfun



"空格键折叠/展开折叠
noremap <space> :call ToggleFold()<CR>



function FoldBrace()
if getline(v:lnum+1)[0] == '{'
return 1
endif
if getline(v:lnum) =~ '{'
return 1
endif
if getline(v:lnum)[0] =~ '}'
return '<1'
endif
return -1
endfunction
if has("autocmd")
filetype plugin indent on
augroup vimrcEx
au!
autocmd FileType text setlocal textwidth=78
autocmd BufReadPost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\ exe "normal g`\"" |
\ endif
au BufReadPost *.h,*.hh,*.c,*.ec,*.cpp,*.hpp,*.ecpp,*.pc set foldexpr=FoldBrace()
au BufReadPost *.h,*.hh,*.c,*.ec,*.cpp,*.hpp,*.ecpp,*.pc set foldmethod=expr
au BufReadPost *.h,*.hh,*.c,*.ec,*.cpp,*.hpp,*.ecpp,*.pc set foldenable
au BufWinLeave *.ztx mkview
au BufWinEnter *.ztx silent loadview
au BufNewFile,BufRead *.txt setf txt
augroup END
endif



""弹出窗口,让用户输入要查询的字串
"在include 和 source目录中查找,你可以根据情况进行修改
function s:Searchwordzx()
let findstring = inputdialog("Search string: ",expand("<cword>"))
if findstring != ""
execute "vimgrep " findstring "*"
endif



endfunction



""========================================
""从sdir.txt中读入目录,并在这些目录下查找指定字串,
"”sdir.txt要和源程序放在同一个目录下。
function s:Searchwordglzx()
let searchstring = expand("<cword>")



let searchdir = ''
for line in readfile("sdir.txt",'',6)
let searchdir .= fnameescape(line).'*.[csh] '
endfor

if searchstring != ""
execute "vimgrep " searchstring searchdir
endif



endfunction



"===================================================================== 插件=============================================================
"-------------------------------------------ctags---------------------------->>
noremap <F8> :!ctags -R --fields=+lS <CR>
nmap fj g]
nmap ff <C-T>



"-------------------------------------------taglist.vim---------------------->>
noremap <F11> :TlistToggle<CR>



let Tlist_Show_One_File = 1
let Tlist_Exit_OnlyWindow = 1
let Tlist_Use_Right_Window = 1



"-------------------------------------------NERD_tree.vim-------------------->>
"设置快捷键"
noremap <F2> :NERDTreeToggle<cr>



"禁用所有与NERD_tree有关的命令"
"let loaded_nerd_tree=1
"不显示指定的类型的文件"
"let NERDTreeIgnore=['/.vim$', '/~$']
"不显示隐藏文件(好像只在linux环境中有效)"
let NERDTreeShowHidden=0
"排序"
let NERDTreeSortOrder=['//$','/.cpp$','/.c$', '/.h$', '/.py$', '/.lua$', '*']
"不分大小写排序"
let NERDTreeCaseSensitiveSort=0
"设置窗口尺寸"
"let NERDTreeWinSize=30
"是否显示行号"
"let NERDTreeShowLineNumbers=1
"是否显示书签"
"let NERDTreeShowBookmarks=1
"打开文件后, 关闭NERDTrre窗口"
"let NERDTreeQuitOnOpen=1
"高亮NERDTrre窗口的当前行"
let NERDTreeHighlightCursorline=1



"-------------------------------------------BufExplorer.vim------------------>>
noremap zz :BufExplorer<CR>

(1) 为什么别人的方法在我这里行不通?
(2) 如何找到上次编辑的文件?
(3) 如何复制粘贴?
(4) 如何在多个文件中进行 替换?
(5) 如何把fold一次全部打开?
(6) 如何选择、复制或者查找光标所在的单词?
(7) 如何计数搜索的字符串?
(8) 如何去掉高亮搜索?
(9) 如何解决linux下g vim中文菜单乱码的问题?
(10) 如何对所编辑的文件语法高亮显示?
(11) 如何快速插入多行数字0-99?
(12) 如何设置中文编码?
(13) 如何去掉或者插入^M这样的字符?
(14) 如何整体缩进一段代码(插入tab)?
(15) 如何合并两行?
(16) 如何设置缩进距离(tab宽度)?
(17) 如何让 VIM不生成备份文件(~文件)?
(18) 如何设置windows下g vim的字体?
(19) 如何设置 Vim的colorscheme



(1) 为什么别人的方法在我这里行不通?



估计这是最难回答的一个问题了。:-)
不过首先应该确定你的 VIM版本是否足够新,功能是否完整。使用 :version 命令查看你的 VIM版本以及功能。一个常见的情况,如果你用的是RedHat系统,请确定安装了 vim-enhance的rpm包,否则将是不完整的 VIM。



(2) 如何找到上次编辑的文件?



Ctrl+O (按两次)



(3) 如何复制粘贴?



复制
方法一:先ma标记当前位置为a,移动到新的位置,再y`a或者y'a复制从标记位置a到当前位置的内容。`和'的区别:`以字符为单位,'以行为单位。这个方法应该是所有vi都适用的



VIM下适用。粘贴p或P。区别:前者粘贴到光标后面,后者粘贴到光标前面。



替换?



vim来做。比如要对当前目录下的*.c文件进行 替换:
方法一:
for i in *.c; do
sed -i -e 's/oldvalue/newvalue/g' $i
done
方法二:
vim *.c
:argdo %s/oldvalue/newvalue/g



(5) 如何把fold一次全部打开?



zR 或者 :set foldlevel=999



(6) 如何选择、复制或者查找光标所在的单词?



VIM中用iw或者aw表示一个单词,两者稍有区别。
选择光标所在的单词:viw (v进入visual模式,然后iw)
复制光标所在的单词:yiw



查找的话就是两个很常用的明令:# 和 *



(7) 如何计数搜索的字符串?



替换命令把模式 替换成它自己。 Vim 报告的已 替换的数目就是模式出现的次数。例:
:set report=0
:%s/./&/g characters
:%s/\i\+/&/g words
:%s/^ lines
:%s/the/&/g "the" anywhere
:%s/\/&/g "the" as a word
你可能希望复位 'hlsearch' 或者使用 ":nohlsearch"。



(8) 如何去掉高亮搜索?



方法一::nohlsearch
方法二:/awertgvcxz (查找一个肯定不存在的字符串)
设置了高亮搜索(:set hlsearch)以后,可以通过 :set nohlsearch 永久地关闭高亮显示,也可以通过 :nohlsearch 暂时关闭高亮显示,下次搜索时将自动恢复高亮。



vim中文菜单乱码问题?



vim6.3为例
:source $ VIMRUNTIME/delmenu. vim
:source $ VIMRUNTIME/menu. vim



vimrc



vim或者啥也不source都是乱码
注:这里的source指的是 vim自己的source命令,和bash shell的source无关



(10) 如何对所编辑的文件语法高亮显示?



需要解释的是,VI有很多变种,它本身并没有这种功能,提供这种功能
往往是其各种衍生版本,比如说 vim。下面就 vim中如何语法高亮简单解释一下。



首先,确定一下你所用的操作系统,如果是windows,那么默认的配置文件
就可以工作了。如果还不行,可以用鼠标从syntax菜单下选择一下适合你的
文件类型(新版本的g vim默认把文件类型选择关闭了,需要点开,然后按照开头字母选择类型)
如果是linux,那么确认一下是否是redhat。如果是redhat,那么需要安装
vim-enhanced的rpm包。这些都做了以后,可以用:syntax on来打开语法高亮。
必要时可以用:set filetype=...来设定你的文件类型。
如果使用图形界面,比如g vim,那么syntax on和set filetype的操作可以
用鼠标在菜单中选择,同windows下。
如果是在控制台中使用 vim,还应当确定你的终端设置支持颜色。



(11) 如何快速插入多行数字0-99?



在命令行中输入以下代码,或者先把代码保存到一个外部文件,然后source这个文件:
let i = 0
while i < 100
put = i
let i = i + 1
endw
如果位数不足需要在前面补零,可以用Ctrl-V块选择,然后I插入0。



(12) 如何设置中文编码?



vimrc中作如下设置,可以实现界面以及显示字体采用gb2312,遇到utf8文件时自动做转换:
set encoding=prc
set fileencoding=prc
set fileencodings=utf8,prc
需要注意的是,按照上面的设置,如果你打开一个空的(0字节)或者是纯7bits的文件,这时 VIM将 认为是utf8编码的文件,如果你往里面输入中文,存盘的时候也将是utf8。因此你可能需要在存盘之前 :set fileencoding=prc 把编码改回来。另外,对于纯7bits的文件,由于认成了utf8,每次打开存盘的时候都要做一次转换,会比较慢,所以如果你很长一段时间不会接触 utf8的话,可能暂时把 fileencodings一行注释掉比较好。
[警告]:转换可能会造成信息丢失!如果你需要编辑的是重要的系统文件,最好把fileencodings 一行暂时注释掉。



(13) 如何去掉或者插入^M这样的字符?



VIM的插入模式或者命令行中用输入^M这样的特殊字符,例如输入
:s///g
实际显示是
:s/^M//g
就可以去掉文件中所有的^M。同理,要在文件中输入^M只要按即可。



vim内部就可以做这件事情。首先打开文本,然后
set fileformat=unix再从新保存该文件覆盖原文件就可以去除:^M了



(14) 如何整体缩进一段代码(插入tab)?



选中一段代码,< 或 > 或 2< 或 3> ……



(15) 如何合并两行?



合并两行的键是 J
另外,如果你设置了
set backspace=2
你就可以用backspace或者delete很方便的删到上一行或者下一行。



(16) 如何设置缩进距离(tab宽度)?



set tabstop=8
set shiftwidth=8



VIM不生成备份文件(~文件)?



set nobackup 更多细节请看 :help backup。另外,也可以不关掉backup而是设置backupdir将备份文件统一存放到一个目录下,比如 set backupdir=C:\Program\ Files\ Vim\tmp

vim的字体?

:set guifont=* 出选择字体对话框, 选好了后, 再 :set guifont? 看,最后把guifont的设置写进 vimrc就行了。

vim的colorscheme


vimrc文件。colorscheme的. vim文件在$ vim$/colors/文件夹里面,可以在 www.vim.org



下载各种colorscheme。




转载于:https://blog.51cto.com/noworry/1104493