1)命令
gf ,可以从光标指定的文件位置打开对应文件
ctrl+6 :可以在两个文件之间穿梭 (http://codego.net/7434/)
ctrl+o :返回上一个操作
:bf 返回vi打开的第一个文件tab
:bd 关闭
2)gv *.txt -p (tab方式打开)
vsp:竖向分屏,
sp:
ctrl+w+w:各个屏之间切换
3)vim中verilog的设置和跳转
与Verilog有关的Vim实用技巧
http://kellen.wang/zh/useful-skills-of-vim-while-coding-verilog/
cd project
ctags -R *
然后ctrl+]对应的模块名,即能跳转,ctrl+t跳回
或者ctrl+鼠标左键或者右键,进行进出
https://blog.csdn.net/g_brightboy/article/details/16830395 (这个也不错)
vim插件ctags的安装和使用
https://blog.easwy.com/archives/exuberant-ctags-chinese-manual/
https://blog.csdn.net/jianzhengzhouzjz/article/details/8290284
ctags
(1)到下载ctags源码ctags-5.6.tar.gz(2)解压并安装tar zxvf ctags-5.6.tar.gzcd ctags-5.6./configure && make && make installctags -R *
C-]
- go to definition
C-T
- Jump back from the definition.C-W C-]
- Open the definition in a horizontal split Add these lines in vimrc
map <C-\> :tab split<CR>:exec("tag ".expand("<cword>"))<CR>
map <A-]> :vsp <CR>:exec("tag ".expand("<cword>"))<CR>
C-\
- Open the definition in a new tab
ctrl+\ 就能打开一个新的tab
A-]
- Open the definition in a vertical split alt+]就能列模式打开
After the tags are generated. You can use the following keys to tag into and tag out of functions:
Ctrl-Left_MouseClick
- Go to definition
Ctrl-Right_MouseClick
- Jump back from definition
键入 :help tags 可以看到帮助
------------------------------
在.vimrc中
1)set tags=tags; ##;不能省
:set tags+=./tags, ./../tags, ./*/tags (用逗号区分)
set autochdir
(2) $ vi -t tag (请把tag替换为您欲查找的变量或函数名,就能打开对应的文件)
nnoremap t :tag<space>
nnoremap [] ?\.<cr>wviwy*#/);<cr>%bb<c-]>/<c-r>"<cr>
</cr></c-r></c-]></cr></cr>键盘上快速按下[和]这两个键
------------------------------------------------------------------
https://segmentfault.com/a/1190000002586896
linux 配置ctags
http://ctags.sourceforge.net/
tar zxvf ctags-5.8.tar.gzcd ctags-5.8.tar.gz./configure (如果没有根权限,就./configure --prefix=$HOME (安装到自己的用户目录下) make sudo make install
安装完成后,可执行 ctags --version 查看ctags
[mario@localhost ~]$ ctags --versionExuberant Ctags 5.8, Copyright (C) 1996-2009 Darren HiebertCompiled: Jan 23 2015, 18:22:41 Addresses:, http://ctags.sourceforge.net Optional compiled features: +wildcards, +regex
Catgs 应用
https://blog.csdn.net/g_brightboy/article/details/16830395
进入项目中,如项目在/home/server/path/Test
ctags -R
会在当前目录下生成一个tags文件 或者 进入你想放置tags文件的位置,然后执行
ctags -R /home/server/path/Test
这样,这个项目的tags就会在当前目录下生成tags
然后在~/.vimrc 中添加 :
set tags+=/home/server/path/Test/tags或者 在vim中运行命令::set tags+=/home/server/path/Test/tags 即可。然后可以使用ctrl + ] 就可以自动跳至函数定义处,而Ctrl + t 可以返回上次查看位置。这样就可心快带在代码里定位了
2)http://www.cnblogs.com/wangkangluo1/archive/2012/04/12/2444952.html
键盘移动 (Move)
一切都从键盘的移动
k -> 上 upj -> 下 downh -> 左 leftl -> 右 rightz -> 重画屏幕,当前光标变成屏幕的第一行 (redraw current line at top of window)CTRL-f -> 跳到下一页 (page down)CTRL-b -> 跳到上一页 (page up)
3)http://blog.chinaunix.net/uid-23381466-id-93905.html
1、多文件查找 1.1、grep 直接在vim中输入:grep abc * 这是直接调用unix下的grep命令
1.2、vimgrep 基本用法就是 :vimgrep /匹配模式/[g][j] 要搜索的文件/范围 :vim[grep][!] /{pattern}/[g][j] {file} ... g 和 j 是两个可选的标志位,g表示是否把每一行的多个匹配结果都加入。j表示是否搜索完后定位到第一个匹配位置。 要搜索的文件 可以是具体的文件路径,也可以是带通配符的路径比如 *.as **/*.as ,**表示递归所有子目录。 要搜索的文件和或搜索范围都可 以写多个,用空格分开。例子:
:vimgrep /\/ **/*.as 搜索当前目录以及所有子目录内as文件中的 "flash":vimgrep /an error/ *.c 就是在所有的.c文件中搜索an error。:vimgrep/an error/* 意思是查找当前目录下的文件中的an error,不包括子目录1.3、定位 输入上述的命令后,可以像输入:make命令,那样定位匹配到的文件位置 :cnext (:cn) 下一个匹配位置 :cprevious (:cp) 上一个匹配位置 :cwindow (:cw) quickfix窗口,可以选择匹配的文件位置 :cl(:clist) 查看所有匹配的位置2、多文件替换(arg) a、加入要处理的文件 :args *.txtb、输入对上述文件的动作 :argdo %s/hate/love/gc | update (这里将hate替换成love,update表示要写入到文件中,否则只作替换而不写入)
4)http://www.vimer.cn/archives/218.html/comment-page-1
这个网站似乎不错
---其他网站---
Vim中也可以像普通ide那样的在多个文件中查找的功能,用的是:vimgrep这条命令,格式如::vimgrep /AAA/ **/*.* 。执行这条命令后,可以通过:cw命令打开匹配的窗口进行查询结果的查看。
另外,vim还可以通过args命令对多个文件进行批量操作。可以参考下面这篇文章:
Vim(gvim)中怎么实现多文件的查找和替换呢?当时确实一直没有考虑过这个问题,因为一直在linux下都有grep,sed这样强力的工具,并不需要vim来实现这样的操作,但是也有很多朋友在windows下也使用gvim来进行编辑,那么就很有必要研究一番了。
第一,多文件查找
vimgrep是vim自带的一个工具,类似于grep的用法就可以实现。比如要在当前目录查找word,使用如下:
1 | :vimgrep word * |
如果想要递归查找所有下级目录里面,那么就用
1 | :vimgrep word ** |
另外,如果想要在使用是快捷查找当前光标下的字母,则只需要在vimrc中添加如下代码:
1 2 3 4 5 6 | "对搜索的设置 map ft :call Search_Word()<CR>:copen<CR> function Search_Word() let w = expand("<cword>") " 在当前光标位置抓词 execute "vimgrep " . w . " *" endfunction |
通过vimgrep查找到的结果会生成到quickfix中,如下图:
第二,多文件替换
实际上只要如下两个命令即可(假设要将当前目录下所有扩展名为.txt/.cpp的文件中的hate替换成love):
1 2 | :args *.txt *.cpp :argdo %s/hate/love/gc | update |
就可以完成啦。解释如下,
1 | :args *.txt *.cpp |
这样写会扫描当前目录下的.txt 和 .cpp文件,并加入到参数列表。但是这样写只会稻苗当前目录,如果想要递归扫描所有下级目录的话,用
1 | :args **/*.txt |
如果只想扫描下一级目录(即不扫描当前目录)的话,用
1 | :args */*.txt |
而
1 | :argdo %s/hate/love/gc | update |
是将参数列表中的所有文件的hate提换成love,并写入硬盘(如果没有|update,就不会写入,但相应的替换也会被中断)。
最后强调一点,使用替换命令的时候,一定记得备份,因为替换是直接写入硬盘滴哦……
好啦,希望这篇文章对大家有用~
2) ttp://www.cnblogs.com/end/archive/2012/06/12/2546757.html
下面写的还没用过~看了大家的分享觉得这几个还不错
:n1,n2 co n3: 将n1行到n2行之间的内容拷贝到第n3行下
:n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下 :n1,n2 d: 将 n1行到n2行之间的内容删除 :n1,n2 w!command: 将文件中n1行至n2行的内容作为command的输入并执行之, 若不指定n1,n2,则表示将整个文件内容作为command的输入方式2的优点在可以直接使用nyy和pp命令在各个窗口的文件之间进行拷贝和粘贴,操作比较方便。
3
http://s99f.blog.163.com/blog/static/3511836520124314212876/
4 http://blog.jobbole.com/87481/
提高 Vim 使用效率的 12 个技巧
提高 Vim 使用效率的 12 个技巧
1. 使用空格键做为Leader(热键)
Leader
是个非常有创意的设计,通过不同按键的顺序操作可以执行各种命令,而不需要通过组合键的方式,自从使用Leader
之后我就很少使用ctrl-xxx
的这种组合键。
长久以来我都是使用 ,
做为Leader
,直到我意识到我可以使用键盘上更加好用的捷按键:空格键(<Space>)。
1 | let mapleader = "\<Space>" |
这个完全颠覆了我的 Vim 操作效率,我现在可以使用双手任何一个大拇指进行操作,同时其它手指可以保持在键盘的主键区。因为 Leader
相当容易使用,所以我就将各种常用的操作进行了 Leader
映射。
2. 将最常用的操作映射到 Leader 操作
我首先识别出最经常使用的操作,并将它们映射到 Leader 操作,我经常是这么使用的:
使用 <Space>o 创建一个新文件:
1 | nnoremap <Leader>o :CtrlP<CR> |
使用 <Space>w 保存文件(比 :w<Enter> 明显快得多):
1 | nnoremap <Leader>w :w<CR> |
使用 <Space>p 与 <Space>y 进行剪切板拷贝、粘贴:
1 2 3 4 5 6 | vmap <Leader>y "+y vmap <Leader>d "+d nmap <Leader>p "+p nmap <Leader>P "+P vmap <Leader>p "+p vmap <Leader>P "+P |
使用 <Space><Space> 进入 Vim 编辑模式:
1 | nmap <Leader><Leader> V |
我强烈建议你找到最常用的操作并将其映射到 Leader 。
3. 使用区域扩展功能
为插件 做按键映射:
1 2 | vmap v <Plug>(expand_region_expand) vmap <C-v> <Plug>(expand_region_shrink) |
这样我就可以:
- 按一次
v
选择一个字符。 - 再按一次
v
自动扩展选择一个单词。 - 再按一次
v
自动扩展选择一段代码。 - …
- 以此类推…
- 按<
C-v>
回退上一次的选择操作。
虽然 vvv 貌似比 vp 的操作更慢,但使用这种方式时,我压根就不需要考虑当前要选择哪些以及应该使用哪个组合键进行操作。
这么一来 v
把诸如 viw
, vaw
, vi"
, va"
, vi(
, va(
, vi[
, va[
, vi{
, va{
, vip
, vap
, vit
, vat
, … 这些操作都给替代了,这下你懂了吧。
4. 找到文本查找操作工具
我一直都不喜欢 Vim 中的查找和替换操作,直到我在 找到了以下的配置:
1 2 3 | vnoremap <silent> s //e<C-r>=&selection=='exclusive'?'+1':''<CR><CR> :<C-u>call histdel('search',-1)<Bar>let @/=histget('search',-1)<CR>gv omap s :normal vs<CR> |
这个直接替代了我常用的操作序列:
- 使用
/something
查找 - 使用
cs
替换第一个,然后按<Esc>
键 - 使用
n.n.n.n.n.
查找以及替换余下匹配项。
PS: 也可以考虑使用 Vim 7.4 提供的 命令。
5. 尝试更多更棒的键盘映射
我每天都在使用这几个快捷操作键,估计这已经帮我省出了几个月时间。
自动跳转到粘贴文本的最后
使用 ppppp
进行多行多次粘贴操作
1 2 3 | vnoremap <silent> y y`] vnoremap <silent> p p`] nnoremap <silent> p p`] |
避免缓冲区的内容在粘贴后被覆盖
通过以下的配置可以避免缓冲区的内容被删除的文本内容所覆盖(放到~/.vimrc
文件的最后)
1 2 3 4 5 6 7 8 9 10 | " vp doesn't replace paste buffer function! RestoreRegister() let @" = s:restore_reg return '' endfunction function! s:Repl() let s:restore_reg = @" return "p@=RestoreRegister()<cr>" endfunction vmap <silent> <expr> p <sid>Repl() |
译注:这里没有Title,估计是作者漏了,加了个。
在文件中快速跳转
- 通过
12<Enter>
跳转到第 12 行 (12G
我觉得不称手) - 按 <Enter> 跳到行文件末尾。
- 按 <Backspace> 回到文件开始。
1 2 | nnoremap <CR> G nnoremap <BS> gg |
快速选择粘贴的文本
1 | noremap gV `[v`] |
关闭无聊的窗口提示
1 | map q: :q |
6. 提高单元测试执行效率
我用 插件以及相应的 tmux 配置来进行我的测试。
vim-room
缺省使用 <Leader>r
执行测试,由于我已将 Leader 映射为 <Space>
,因此我通过 <Space>r
来运行测试工具。
由于测试在 tmux 的单独窗口运行,因此我可以边看测试进展共修订我的代码。
7. 使用 Ctrl-Z 返回 Vim
我经常要在shell下执行一些命令,我通过 Ctrl-Z
挂起 Vim ,在完成 shell 命令执行之后,通过 <Enter>
重新回到 Vim 。
使用 fg
退回 Vim 让我觉得难受,我只想通过 Ctrl-Z
在 Vim 与 Shell 之间切换,不过我没有找到解决方法,因此我写了个在 ZSH 下完美运行的脚本:
1 2 3 4 5 6 7 8 9 10 11 | fancy-ctrl-z () { if [[ $#BUFFER -eq 0 ]]; then BUFFER="fg" zle accept-line else zle push-input zle clear-screen fi } zle -N fancy-ctrl-z bindkey '^Z' fancy-ctrl-z |
如果你将上述代码放到 ~/.zshrc
文件中,你就可以在 shell 与 Vim 之间快速切换,你真值得去试试看。
8. 正确地配置 Tmux
在 OS X 下使用 Tmux 和 Vim 工具非常不方便,因为:
- 系统的剪切板处理功能很弱
- Vim 与 Tmux 的窗口切换操作不同
- Tmux 下执行命令的热键不同 ( 使用
C-b
) - 在 Tmux 中拷贝模式超难用
我花了非常多的时间去修正上述配置,具体可以见以下:
配置使用 <C-Space>
作为 tmux 的热键
有些人习惯使用 <C-a>
作为热键,不过我是用这个热键回到行首,所以我这里就不细说了。使用 <C-Space>
的方式会更好用,原因我一会再说:
1 2 3 | unbind C-b set -g prefix C-Space bind Space send-prefix |
使用 <Space>
进入拷贝模式
设想一下,使用 <C-Space><Space> 就可以直接进入 Tmux 的拷贝模式有多方便。
1 2 | bind Space copy-mode bind C-Space copy-mode |
使用 y
和 reattach-to-user-namespace
(基于 OSX)
在使用系统的剪切板之前,你需要先执行 brew install reattach-to-user-namespace
1 2 | bind-key -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy" |
使用
你要使用 <C-h>
,<C-j>
,<C-k>
,<C-l>
这几个快捷键在 vim 和 tmux 的各种窗口内快速切换。
同时我建议使用 <C-Space>l
和 <C-Space>j
的映射配置来进行 Tmux 窗口分割操作,这个绝对比用 <C-Space>%
和 <C-Space>|
来得快:
1 2 3 4 5 | bind j split-window -v bind C-j split-window -v bind l split-window -h bind C-l split-window -h |
参看我的 文件,这里有更多的干货。
9. 提高 Git 工程中 Ctrl-P
的执行效率
将下面的内容添加到你的 .vimrc
文件中(配置使用 <Ctrl-P> 来使用 git 或 silver 查找工具来自动补全):
1 2 3 4 5 6 7 8 9 10 11 | let g:ctrlp_use_caching = 0 if executable('ag') set grepprg=ag --nogroup --nocolor let g:ctrlp_user_command = 'ag %s -l --nocolor -g ""' else let g:ctrlp_user_command = ['.git', 'cd %s && git ls-files . -co --exclude-standard', 'find %s -type f'] let g:ctrlp_prompt_mappings = { 'AcceptSelection("e")': ['<space>', '<cr>', '<2-LeftMouse>'], } endif |
我建议使用 插件。
10. 使用包管理器
是一个强大的管理 Vim 插件的工具:
- 你不需要手工管理 git 的子库(submodules)
- 能够并行地安装以及更新插件
- 它支持 这类需要 build 的插件 NeoBundle 'Valloric/YouCompleteMe', { 'build' : { 'mac' : './install.sh', }, }12345NeoBundle 'Valloric/YouCompleteMe', {'build' : {'mac' : './install.sh',},}
- 出同样支持 这类支持打补丁的插件: NeoBundle 'rking/pry-de', {'rtp': 'vim/'}1NeoBundle 'rking/pry-de', { 'rtp': 'vim/'}
11. 充分使用 Vim 的插件的优点
- (ag.vim 也不错)
- 主要使用
:Gblame
- 并加上以下配置: NeoBundle 'bling/vim-airline' let g:airline_theme='powerlineish' let g:airline_left_sep='' let g:airline_right_sep='' let g:airline_section_z=''12345NeoBundle 'bling/vim-airline'let g:airline_theme='powerlineish'let g:airline_left_sep=''let g:airline_right_sep=''let g:airline_section_z=''
我是个 Ruby 程序员,所以我还使用一些 Ruby 的插件:
- (使用
var
,vir
查找 ruby 代码块) - 配置以下映射 nmap sj :SplitjoinSplit<cr> nmap sk :SplitjoinJoin<cr>
12. 在服务器上快速配置 Vim
我经常需要服务上使用 Vim 进行配置,不幸的是 Vim 的缺省配置相当不合理。
一种方案是使用 插件来生成压缩包,不过这个对我来说不够好用。我写 的插件来对 Vim 做合理的初始化(特别是对 Ruby 开发者),这个插件配置 Vim 只使用 ~/.vimrc
作为配置文件,同时它还包含了优化的配色、包管理工具以及多种开发语言的语法着色。
这意味着我不需要手工配置服务器上的 ~/.vim
目录,而是通过以下操作就可以方便地在服务器上配置 Vim 环境:
1 | git clone --recursive https://github.com/sheerun/vimrc.git ~/.vim |
我还写了个 ,用于快速配置我的开发环境。
思考
用好 Vim 的关键在于,你要在软件开发过程中不断发现你所遇到的 Vim 问题,并积极处理它们。
处理方法可以是在 .vimrc
中添加键盘映射,或是在 google 上查找解决方案,要不就在 IRC 上提问,或者其他方法。
你用什么方法提高了 Vim 的使用效率?
想了解更多?
哈,雇我做你的 Vim 顾问吧,给我写个邮件吧。
4)
I should probably add this to vim.org as a Plugin or something at some stage.
Drop all this stuff in your .vimrc and then 'gf' will jump to the file + linenumber, and 'gsf' will split the window then jump to the file + line number.
==============================================================
function! GotoFileWithLineNum()
" filename under the cursor let file_name = expand('<cfile>') if !strlen(file_name) echo 'NO FILE UNDER CURSOR' return endif
" look for a line number separated by a :
if search('\%#\f*:\zs[0-9]\+') " change the 'iskeyword' option temporarily to pick up just numbers let temp = &iskeyword set iskeyword=48-57 let line_number = expand('<cword>') exe 'set iskeyword=' . temp endif
" edit the file
exe 'e '.file_name
" if there is a line number, go to it
if exists('line_number') exe line_number endifendfunction
map gf :call GotoFileWithLineNum()<CR>
map gsf :sp<CR>:call GotoFileWithLineNum()<CR>