脚踏实地
全部博文(230)
分类: LINUX
2010-01-07 10:12:55
http://easwy.com/blog/archives/advanced-vim-skills-catalog/
非常好的链接
VIM中常用的替换模式总结:
1,简单替换表达式
:%s/four/4/g
“%” 范围前缀表示在所有行中执行替换。最后的 “g” 标记表示替换行中的所有匹配点。如果仅仅对当前行进行操作,那么只要去掉%即可
用 “\<” 来指定匹配单词开头:
:%s/\
显然,这样在处理 “fourty” 的时候还是会出错。用 “\>” 来解决这个问题:
:%s/\
如果你在编码,你可能只想替换注释中的 “four”,而保留代码中的。由于这很难指定,可以在替换命令中加一个 “c” 标记,这样,Vim 会在每次替换前提示你:
:%s/\
2,删除多余的空格
要删除这些每行后面多余的空格,可以执行如下命令:
:%s/\s\+$//
“\s\+$”表示行末($)前的一个或者多个(\+)空格(\s)。替换命令的 “to” 部分是空的:”//”。这样就会删除那些匹配的空白字符。
3,匹配重复性模式
星号项 “*” 规定在它前面的项可以重复任意次,和windows中的*不一样阿!
/a*
匹配 “a”,”aa”,”aaa”,等等。但也匹配 “” (空字串),因为零次也包含在内。星号 “*” 仅仅应用于那个紧邻在它前面的项。因此 “ab*” 匹配 “a”,”ab”,”abb”,”abbb”,等等。如要多次重复整个字符串,那么该字符串必须被组成一个项。组成一项的方法就是在它前面加 “\(”,后面加 “\)”。因此这个命令:
/\(ab\)*
匹配: “ab”,”abab”,”ababab”,等等。而且也匹配 “”。
要避免匹配空字串,使用 “\+”。这表示前面一项可以被匹配一次或多次。
/ab\+
匹配 “ab”,”abb”,”abbb”,等等。它不匹配 后面没有跟随 “b” 的 “a”。
要匹配一个可选项,用 “\=”。 例如:
/folders\=
匹配 “folder” 和 “folders”。
4,指定重复次数
要匹配某一项的特定次数重复,使用 “\{n,m}” 这样的形式。其中 “n” 和 “m” 都是数字。在它前面的那个项将被重复 “n” 到 “m” 次 (|inclusive| 包含 “n” 和 “m”)。例如:
/ab\{3,5}
匹配 “abbb”,”abbbb” 以及 “abbbbb”。
当 “n” 省略时,被默认为零。当 “m” 省略时,被默认为无限大。当 “,m” 省略时,就表示重复正好 “n” 次。例如:
模式 匹配次数
\{,4} 0,1,2,3 或 4
\{3,} 3,4,5,等等
\{0,1} 0 或 1,同 \=
\{0,} 0 或 更多,同 *
\{1,} 1 或 更多,同 \+
\{3} 3
5,查找匹配
在一个查找模式中,”或” 运算符是 “\|”。例如:
/foo\|bar
这个命令匹配了 “foo” 或 “bar”。更多的抉择可以连在后面:
/one\|two\|three
匹配 “one”,”two” 或 “three”。
如要匹配其多次重复,那么整个抉择结构须置于 “\(” 和 “\)” 之间:
/\(foo\|bar\)\+
这个命令匹配 “foo”,”foobar”,”foofoo”,”barfoobar”,等等。
再举个例子:
/end\(if\|while\|for\)
这个命令匹配 “endif”,”endwhile” 和 “endfor”。
查找块
\_.* :匹配多个换行符
\@!: 遇到某个标识符停止
/key\_.*key:匹配多行
------------------大小写的问题--------------
用vim处理字符的大小写转换
vim中大小写转化的命令是gu或者gU
形象一点的解释就是小u意味着转为小写;大U意味着转为大写.
剩下的就是对这两个命令的限定(限定操作的行,字母,单词)等等
1、整篇文章大写转化为小写
打开文件后,无须进入命令行模式。键入:ggguG
解释一下:ggguG分作三段gg gu G
gg=光标到文件第一个字符
gu=把选定范围全部小写
G=到文件结束
2、整篇文章小写转化为大写
打开文件后,无须进入命令行模式。键入:gggUG
解释一下:gggUG分作三段gg gU G
gg=光标到文件第一个字符
gU=把选定范围全部大写
G=到文件结束
3、只转化某个单词
guw 、gue
gUw、gUe
这样,光标后面的单词便会进行大小写转换
想转换5个单词的命令如下:
gu5w、gu5e
gU5w、gU5e
4、转换几行的大小写
将光标定位到想转换的行上,键入:1gU 从光标所在行 往下一行都进行小写到大写的转换
vim中的粘贴板:
vim(我这是GVIM)有17个粘贴板,分别是"、 0、1、2、...、9、-、*、+、. 、 : 、/:: ;用:reg命令可以查看各个粘贴板里的内容。在vim中简单用y只是复制到“(双引号)粘贴板里,同样用p粘贴的也是这个粘贴板里的内容;
要将vim的内容复制到某个粘贴板,需要退出编辑模式,进入正常模式后,选择要复制的内容,然后按"Ny完成复制,其中N为粘贴板号(注意是按一下双引号然后按粘贴板号最后按y),例如要把内容复制到粘贴板a,选中内容后按"ay就可以了,有两点需要说明一下:
VIM内部("):”号粘贴板(临时粘贴板)比较特殊,直接按y就复制到这个粘贴板中了,直接按p就粘贴这个粘贴板中的内容(也可以说是VIM专用吧);
与外部程序交互(*/+):+号粘贴板是系统粘贴板,用"+y将内容复制到该粘贴板后可以使用Ctrl+V将其粘贴到其他文档(如firefox、gedit)中,同理,要把在其他地方用Ctrl+C或右键复制的内容复制到vim中,需要在正常模式下按"+p;
要将vim某个粘贴板里的内容粘贴进来,需要退出编辑模式,在正常模式按"Np,其中N为粘贴板号,如上所述,可以按"5p将5号粘贴板里的内容粘贴进来,也可以按"+p("+* 也行)将系统全局粘贴板里的内容粘贴进来。
返回之前的位置:
两个单引号''或者Ctrl-O
关于映射的更多内容需要参考:
:h key-notation
:h map
Insert Command-line Lang-Arg ~
:map! :noremap! :unmap! :mapclear! yes yes -
:imap :inoremap :iunmap :imapclear yes - -
:cmap :cnoremap :cunmap :cmapclear - yes -
:lmap :lnoremap :lunmap :lmapclear yes* yes* yes*
跳转到函数、变量定义处:
[+ctrl+i 跳转到函数、变量和#define
[+ctrl+d 跳转到#define处
ctrl+i 向前跳到前几次光标位置
ctrl+o 向后跳到后几次光标位置
vim 跳到函数开头或结尾:[[对于{不单独一行的程序是无法跳转到函数开头的。
1: 跳到函数头 [{
2: 跳到函数尾 ]}
$1自动加小括号
函数体跳转:
[[
]]
[]
][
{}
' 跳转前的位置
" 最后编辑的位置
[ 最后修改的位置的开头
] 最后修改的位置的结尾
`. – 跳转到上次修改的行、列位置。
‘. – 跳转到上次修改的行位置。
5.如何查看系统信息?
cat /proc/meminfo(cpuinfo/pci...)
6.查看目录的大小?
du -sh dir
9.在多级目录中查找某个文件的方法?
1 find /dir -name filename.ext
2 du -a | grep filename.ext
3 locate filename.ext
10.用ls只列出目录?
ls -lF | grep ^d
ls -lF | grep /$
ls -F | grep /$
11. 关于vim分割窗口的大小
vim 竖向分割窗口时调整窗口大小的操作
看过的教程中,关于分割窗口的操作,一般都只说到横向分割窗口的各种操作:
CTRL_W + 窗口边界上移
CTRL_W - 窗口边界下移
CTRL_W _ 将当前窗口调到最大
CTRL_W = 平分窗口
可是我多数时候倾向用vsp。这时,按键是不同的:
CTRL_W < 窗口边界左移
CTRL_W > 窗口边界右移
CTRL_W | 将当前窗口调到最大
CTRL_W = 平分窗口,这个快捷键是通用的。
12. 保存工程的状态
else
gvim $1
fi
当用gvim编辑完后,退出是,文件是以当前子窗口的名字保存窗口信息的,所以下次打开时,要用那个窗口名字作为gvims的参数.
这样的话, 对于一个项目的编辑非常有用. 例如: 我们现在做一个项目,名字是storm. 我们切换到项目storm所在的目录,运行 gvims storm. 这样就会打开一个gvim窗口,然后我们用 命令 :new storm.c 回车, 然后有输入命令 :vert new storm.h. 然后调整窗口大小,编辑,保存. 现在我们这个gvim窗口里有三个子窗口,一个显示storm, 一个显示storm.c,一个显示storm.h. 这时,我们切换到storm的编辑窗口,然后我们输入命令 :qa 退出gvim. 过了几天,我们可能要重新编辑项目storm,这是 你在任一个目录下(不一定是 项目storm的目录), 输入shell命令
gvims storm (如果你还记得你的项目名字是storm的话 (= ). 当gvim运行后,你会发现你的gvim显示的状态就象你几天前没退出一样. enjoy!
13. 关于引入session后mark.vim 失效的问题
13.1 我在gvim中用的是dessert配色方案,需要在/usr/share/vim/vim72/colors/desert.vim的最后加入就可以
" For mark.vim plugin
highlight def MarkWord1 ctermbg=Cyan ctermfg=Black guibg=#8CCBEA guifg=Black
highlight def MarkWord2 ctermbg=Green ctermfg=Black guibg=#A4E57E guifg=Black
highlight def MarkWord3 ctermbg=Yellow ctermfg=Black guibg=#FFDB72 guifg=Black
highlight def MarkWord4 ctermbg=Red ctermfg=Black guibg=#FF7272 guifg=Black
highlight def MarkWord5 ctermbg=Magenta ctermfg=Black guibg=#FFB3FF guifg=Black
highlight def MarkWord6 ctermbg=Blue ctermfg=Black guibg=#9999FF guifg=Black
13.2 据说一个mark.vim的bug
gvim 7.1.298 for Windows,mark.vim 现在按 \m 不灵或者全都高亮成前景色 ???
不知道哪里把 :hi MarkWord 的高亮设置清掉了,把 mark.vim 开头的六个
:hi 设置移到 function! s:InitMarkVariables() 函数的
let g:mwHistAdd = "/@"
后就好了。
14 TagList 常用命令
o 在一个新打开的窗口中显示光标下tag
u 更新taglist窗口中的tag
s 更改排序方式,在按名字排序和按出现顺序排序间切换
x taglist窗口放大和缩小,方便查看较长的tag
+ 打开一个折叠,同zo
- 将tag折叠起来,同zc
* 打开所有的折叠,同zR
= 将所有tag折叠起来,同zM
[[ 跳到前一个文件
]] 跳到后一个文件
q 关闭taglist窗口
15. 关于fileExplorer
http://www.cnblogs.com/ifys/archive/2010/10/24/1860610.html
winmanager自带的fileexplorer这个插件实在是比较差。最重要的一点是fileexplorer不能自动更新,如果通过其他的途径修改了文件夹中的内容,fileexplorer是不会显示的。相对而言Nerd_Tree功能就比较强大了。下面要把Nerd_Tree加入winmanager。
Nerd_tree:下载解压,打开NERD_tree.vim,按照winmanager的说明,在最后加入下面代码:
"Used by winmanager {{{1
let g:NERDTree_title = "[NERDTree]"
function! NERDTree_Start()
exe 'NERDTree'
endfunction
function! NERDTree_IsValid()
return 1
endfunction
同时把在vimrc中:
let g:winManagerWindowLayout='NERDTree|TagList,BufExplorer'
至于”nerdtree 多一个buffer“,一搜便解决方案,我不折腾了,具体可参考:
我的vim 7.0在切换到其它缓冲区然后再切换回来时,原来被标记的文本会失去高亮。而作者说他并不存在此问题。如果你存在类似的问题,可以打上我所加的补丁:
--- easwy/mark.vim 2006-12-01 13:02:18.000000000 +0800 +++ plugin/mark.vim 2007-03-23 10:22:02.000000000 +0800 @@ -440,6 +440,43 @@ endif endfunction +" easwy add +" return the mark string under the cursor. multi-lines marks not supported +function!RedoMarkWord() + " define variables if they don't exist + call s:InitMarkVariables() + + let i = 1 + while i <= g:mwCycleMax + if b:mwWord{i} != "" + " quote regexp with / etc. e.g. pattern => /pattern/ + let quote = "/?~!@#$%^&*+-=,.:" + let j = 0 + while j < strlen(quote) + if stridx(b:mwWord{i}, quote[j]) < 0 + let quoted_regexp = quote[j] . b:mwWord{i} . quote[j] + break + endif + let j = j + 1 + endwhile + if j >= strlen(quote) + return -1 + endif + + " highlight the word + exe "syntax clear MarkWord" . i + exe "syntax match MarkWord" . i . " " . quoted_regexp . " containedin=ALL" + endif + let i = i + 1 + endwhile +endfunction + +augroup markword + autocmd! + autocmd BufWinEnter * call RedoMarkWord() +augroup END +" easwy end + " Restore previous 'cpo' value let &cpo = s:save_cpo
用法:
保存该patch到某一目录,例如:/tmp/mark.vim.patch
cd到你的.vim目录:cd ~/.vim
运行命令:cat /tmp/mark.vim.patch | patch -p0
由于用的是最新版1.1.8-g注意要把b:mwWord 改成 g:mwWord
×××关于颜色的设置参考:http://easwy.com/blog/archives/advanced-vim-skills-syntax-on-colorscheme/
我用的是新建color目录,名为desert_my.vim
可以知道安装插件有4种方式:
Bundle 'tpope/vim-fugitive'
Bundle 'Lokaltog/vim-easymotion'
Bundle 'L9'
Bundle 'FuzzyFinder'
Bundle 'git://git.wincent.com/command-t.git'
Bundle 'file:///Users/gmarik/path/to/plugin'
几个常用的命令:
:BundleInstall 安装插件
:BundleInstall! 更新插件
:BundleClean(!) 卸载不在.vimrc配置列表中的插件
:BundleSearch(!) 搜索插件
:BundleList 显示已安装插件列表
在windows下用:BundleSearch 这个命令时碰到一个问题:
从错误提示可以看到:curl 和 wget 两者都不可用,只需要其中一个就可以。对于curl,可以去curl的官网http://curl.haxx.se/下载,还有个简单的解决办法,因为要用Vundle插件,肯定就已经安装了Git,在git的bin目录下有curl.exe,所以只需要把该bin目录放到path路径下,即可。
保存退出后,打开一个vim窗口。在命令模式下输入
:BundleList //会显示你vimrc里面填写的所有插件名称
:BundleInstall //会自动下载安装或更新你的插件。
要删除一个插件也很简单,先在~/.vimrc中移除该插件条目,然后进入vim执行命令:BundleClean。嘿嘿,vundle将自动清除掉插件的文件夹!
PS: 和 这两个网站上都是vim-scripts的插件,即你只需在vimrc中添加你想要的插件名称即可。
22. YouCompleteMe的安装
按照http://blog.csdn.net/dongjideyu/article/details/12617351来安装
YCM需要最新版本Vim(7.3.584)的支持,从代码编译Vim的方法看这里。
使用Vundle安装 youcompleteme后,需要先编译才能使用。
cd ~/.vim/bundle/YouCompleteMe
要在源码文件夹中 git submodule update --init --recursive
./install.sh --clang-completer
语意补全要正确工作,需要配置好.ycm_extra_conf.py文件,模板在这里。可以把这个文件放在项目的根目录下,打开项目文件时,YCM会循环向上搜索并加载这个文件,或者在vimrc文件中加入
let g:ycm_global_ycm_extra_conf = 'your path to .ycm_extra_conf.py'
如果.ycm_extra_conf.py中include path等配置没有问题,YCM已经可以工作了。
注意:在一些老的Linux版本上建议直接手动编译,首先确定下载下来的libclang能不能链接好?
ldd /data/home/×××/.vim/bundle/YouCompleteMe/third_party/ycmd/libclang.so
如果不行的话首先要编译自己平台下的libclang,平台为centos 6.5,
1. 下载三个组件
,然后要整理一下目录。一系列mv
llvm+clang+compiler-rt 是分开的,llvm+clang 是必需的。假设 llvm 在 llvm 目录下,那么 clang 应该是在 llvm/tools 下,compiler-rt 是在 llvm/projects 下
点击(此处)折叠或打开
22.1 如果libstdc++的版本低于15就会出”在vim启动时SetUpPython“的问题,
可以通过在.bashrc中添加
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib64/"
来解决
因为更新版本的gcc会把新版本的 动态库 放到 /usr/local/lib64下面
通过命令 "#strings /usr/local/lib64/libstdc++.so.6.0.19|grep GLIBCXX“可以来验证
22.2 打开.c .cpp .py文件直接卡死 Freeze
在vimrc中增加 let g:loaded_youcompleteme=1 就可以了
YCM的配置参考:http://www.cnblogs.com/zhongcq/p/3630047.html
22.3 通过运行:ycmDebugInfo发现The ycmd server SHUT DOWN
然后看提示的log, 会显示RuntimeError: Error importing ycm_core. Are you sure you have placed a version 3.2+ libclang.[so|dll|dylib] in folder "/home/×××/.vim/bundle/YouCompleteMe/ third_party/ycmd"? See the Installation Guide in the docs. Full error: libedit.so.2: cannot open shared object file: No such file or directory
解决办法:
用install.sh安装的libclang的版本,显示是下载的libclang 3.5, 但是会引起Crash。
这个没搜到什么靠谱的办法,预测自己的版本肯定是偏低,拷贝了一个别人自己编译的libclang.so(也是在相同的位置)放到自己的目录/.vim/bundle/YouCompleteMe/third_party/ycmd下面,就OK了
另外,我也重编了clang,估计上面替代一下就好了:
22.4 如果系统内的libclang 的版本是比较低的
貌似是 低于3.3,需要重新编译出更新的clang.so.
参考: />
可以用Git下载,注意各个目录的位置。
22.5 修改timeout的值,有些编译很慢的文件会显示超时
.vim/bundle/YouCompleteMe/python/ycm/client/completion_request.py
22.6 开启debug
let g:ycm_server_use_vim_stdout = 1
let g:ycm_server_log_level = 'debug'
Then start gvim/macvim (not console vim) from the console. As you use Vim, you'll see the ycmd debug output stream in the console. Try to trigger semantic completion with this setup.
默认0.5 可以改成2
23. 配合YCM的两个插件
一个很好的配置参考:http://www.cnblogs.com/zhongcq/p/3642794.html
23.1 syntastic
一款支持多语言的实时语法检查插件。在 syntastic 的作用下,编码中、编译前,所有语法错误都将被抓出来并 呈现给你。
24. NERD Commenter注释插件
以C/C++文件为例,详析的使用方法,请:h NERDCommenter。在Normal或者Visual 模式下:
,ca,在可选的注释方式之间切换,比如C/C++ 的块注释/* */和行注释//
,cc,注释当前行
,c,切换注释/非注释状态
,cs,以”性感”的方式注释
,cA,在当前行尾添加注释符,并进入Insert模式
,cu,取消注释
Normal模式下,几乎所有命令前面都可以指定行数
Visual模式下执行命令,会对选中的特定区块进行注释/反注释
25. 关于高亮在会话中不灵的问题
需要把/usr/share/vim/vim73/colors/中的比如desert.vim 文件拷到自己的.vim目录下,然后修改为desert_my.vim,并且在此文件的
let g:colors_name="desert"
后面修改为如下的内容
"let g:colors_name="desert"
let g:colors_name="desert_my"
">>>>>新加的部分,需要在g:colors_name的后面
" 解决会话中无法高亮颜色的问题
hi MarkWord1 ctermbg=Cyan ctermfg=Black guibg=#8CCBEA guifg=Black
hi MarkWord2 ctermbg=Green ctermfg=Black guibg=#A4E57E guifg=Black
hi MarkWord3 ctermbg=Yellow ctermfg=Black guibg=#FFDB72 guifg=Black
hi MarkWord4 ctermbg=Red ctermfg=Black guibg=#FF7272 guifg=Black
hi MarkWord5 ctermbg=Magenta ctermfg=Black guibg=#FFB3FF guifg=Black
hi MarkWord6 ctermbg=Blue ctermfg=Black guibg=#9999FF guifg=Black
"书签高亮
" For showmarks plugin
hi ShowMarksHLl ctermbg=Yellow ctermfg=Black guibg=#FFDB72 guifg=Black
hi ShowMarksHLu ctermbg=Magenta ctermfg=Black guibg=#FFB3FF guifg=Black
然后再在.vimrc中指定一下colorscheme desert_my就可以了, source后进入vim文件可以用:colorscheme来验证一下
26. ultisnips的模式补全
ultisnips实际上并没有带各种Snippets,所以需要指定存放的地址。
vimrc里面的配置,另外如果输入:UltiSnipsEdit并没有出现对应的模板,而是all.snippets,这个是由于Your filetype plugin indent on must come after all Bundle directives.
所以要把BUndle的那些东西放在vimrc的最前面
具体参考 />
let g:UltiSnipsSnippetsDir = '~/.vim/bundle/vim-snippets/UltiSnips'
"插入模式下直接通过ii键来触发UltiSnips的代码块补全
let g:UltiSnipsExpandTrigger="ii"
""iI弹出UltiSnips的可用列表,不常用的, 所以这里设置成了特殊的iI映射
let g:UltiSnipsListSnippets="iI"
"II跳转的到下一个代码块可编辑区
let g:UltiSnipsJumpForwardTrigger="II"
""OO跳转到上一个代码块可编辑区
let g:UltiSnipsJumpBackwardTrigger="OO"
模板是在~/.vim/bundle/vim-snippets/UltiSnips/
28. 替代Fuzzy found和lookupfile的 CrlP
/>
Basic Usage
Run :CtrlP or :CtrlP [starting-directory] to invoke CtrlP in find file mode.
Run :CtrlPBuffer or :CtrlPMRU to invoke CtrlP in find buffer or find MRU file mode.
Run :CtrlPMixed to search in Files, Buffers and MRU files at the same time.
Check :help ctrlp-commands and :help ctrlp-extensions for other commands.
Once CtrlP is open:
Press
Press
Press
Press
Use
Use
Use
Use
Use
Run :help ctrlp-mappings or submit ? in CtrlP for more mapping help.
Submit two or more dots .. to go up the directory tree by one or multiple levels.
End the input string with a colon : followed by a command to execute it on the opening file(s):
Use :25 to jump to line 25.
Use :diffthis when opening multiple files to run :diffthis on the first 4 files.