打造一个基础的VIMer需要配备的环境,开不开ctags, cscope(需求不大的时候也可以忽略), nerdtree,tmux。下面整理一下我的配置过程,以备不时之需。
ctags相关
首先肯定是下载安装了。这点不用多讲,根据自己的操作系统或者平台,使用相应的包管理工具或者源码编译安装都可以。
下载完之后,在想要使用ctags帮助查找的文件夹(一般是项目的根目录)下输入如下命令:
ctasg -R
- 1
命令执行完毕后就会在这个路径下生成一个tags文件,然后就可以通过下面两个最实用的命令来进行代码的跳转了, 具体的操作步骤如下:
1. 将光标定位到要进行跳转的位置,然后按下: Ctrl+] 这样就能跳转到变量(方法或者函数)被定义的地方了。2. 跳回到原来位置的命令为: Ctrl+t(回到第一个标签)3. 按照刚才操作的路径顺序返回到最开始的地方。
- 1
- 2
- 3
2.3有点重复。平时操作的话,ctrl+o更为常用。毕竟谁也记不住高频跳转的路径不是。
如果代码库中增加了新文件,这个时候ctags有可能因为更新不及时导致找不到对应的tag标签,这个时候可以使用下面的命令更新下tags。
ctags -R
- 1
接下来看看如何在VIM中查找目标内容。
:ts name
- 1
如果有匹配项的话,它会列出一个可选列表,下标从数字1开始计数,输入序号回车即可跳转到选择的位置。而出现这个可选列表的同时,突然不想跳转了,就可以直接输入数字0,退出这个选择界面。
:tags
- 1
列出之前已经查找过的tag信息,它会以列表的形式进行罗列。有些时候我们会想查看一个函数的实现部分,又不想离开当前的上下文环境,这个时候可以使用下面的这个命令。
:stag tagname(tagname一般是要查看的函数名或者方法名)
- 1
这时,VIM会进行分屏显示,一边是函数的实现部分,另一边是函数的跳转部分。查看完毕使用Shift ZZ或者输入:q退出即可。
关于tag的自动补全,ctags做的其实还算可以。有时候我们要查找的串的长度很长,一个个的输入还很有可能出现错误,那么这时就可以借助ctags的自动补全功能了。
:tag xxx_按下tab键,然后找到自己想输入的那个,回车即可。
- 1
由于在代码的根目录生成一份tags文件,所以只能在tags所在的目录下进行各种关于ctags的命令的使用,但是我们很有可能在根目录下的某一级目录下进行查找操作,这个时候就需要对VIM进行一下设置,要不然ctags也没什么大作用。具体方式:
在~/.vimrc文件内添加下面的内容:
set tags = tags;/
- 1
当有多个项目要使用ctags的时候,可以分别生成各自的tags文件,然后这样引入到vim的配置中来。
set tags=/home/wwwroot/myproject/a.tagsset tags+= /home/wwwroot/otherproject/b.tags
- 1
- 2
cscope相关
第一步依旧是常规套路,下载以及安装等等。cscope类似于ctags,也是一个基于本地规则匹配的查找工具。使用它之前需要先建立一个scope的数据库。
其实我们每一个查找操作,都要依赖这个数据库文件。cscope默认对C语言代码进行查找等操作。但是我们也可以对其指定编程语言,比如PHP,Python等等,使用下面的命令即可:
find . -name "*.php" -o -name "*.inc" -o -name "*.module" > cscope.files
- 1
来生成一个搜索命令的文件列表,这个列表中的每一项会包含文件的路径信息(属于相对路径)。
现在有了文件列表,就可以根据这个文件列表来建立cscope的数据库了,在含有刚才生成的cscope.files目录下,运行下面的命令:
cscope -b
- 1
这时会在同级目录下生成一个cscope.out的文件,这个文件就是cscope查找操作依赖的核心了。另外创建这个数据库的过程中,还有几个其他的可选命令,虽然不怎么常用,但还是来记录一下吧:
- R:表示把所有的子目录中的文件也建立索引。
- q: 生成cscope.in.out和cscope.po.out文件,加快cscope的查找时的索引速度。
k: 在生成索引文件时,不搜索/usr/local目录。(这一点我也不知道会有什么用,可能还是跟C语言头文件使用有一定的联系吧)
现在cscope的数据库已经建立好了,接下来就是告诉VIM,这个文件的位置,这样在使用VIM的时候就可以很好的配合cscope尽心操作。
配置很简单,只需要在~/.vimrc文件中添加这样一句话:
set cscope=target_cscope_out_path
- 1
或者在打开VIM的时候在命令模式下输入:
:cs add target_cscope_out_full_path
- 1
这样就算是配置完成了。
还有一点需要了解的是:如果想使用quickfix窗口来显示cscope的搜索结果,既可以在~/.vimrc中添加下面这条语句:
set cscopequickfix=s-,c-d-i-,t-,e-
- 1
下面将整个使用流程连贯起来操作一下:
vim ktvboxmp.php:cs add ./cscope.out:cs find g function-name:cs find c function-called-record:cw # 查看符合要求的可选的列表
- 1
- 2
- 3
- 4
- 5
最后关于cscope的一个不常用的命令为:
:cs reset
- 1
作用就是初始化,重置所有索引。
nerdtree 相关
nerdtree 是VIM的一个可以显示目录信息的插件,有了它就可以让VIM变像一个IDE, 但是安装它却耗费了我不少时间。原因就在于它支持的版本问题。
下载的话,https://github.com/scrooloose/nerdtree/archive/master.zip 对我来说,并不好用。不知道对别人会怎样。 正常的操作下:
wget https://github.com/scrooloose/nerdtree/archive/master.ziptar -zxvf master.zipcp nerdtree/plugin/nerdtree.vim ~/.vim/plugincp nerdtree/doc/README.md ~/.vim/doc/
- 1
- 2
- 3
- 4
- 5
- 6
- 7
按理说没什么错误的啊,结果出现了下面的错误信息:
Error detected while processing /Users/jcostanzo3/.vim/plugin/nerdtree/nerdtree_plugin/exec_menuitem.vim:line 22:E117: Unknown function: NERDTreeAddMenuItemError detected while processing /Users/jcostanzo3/.vim/plugin/nerdtree/nerdtree_plugin/fs_menu.vim:line 18:E117: Unknown function: NERDTreeAddMenuItemline 19:E117: Unknown function: NERDTreeAddMenuItemline 20:E117: Unknown function: NERDTreeAddMenuItemline 28:E121: Undefined variable: g:NERDTreePathE15: Invalid expression: g:NERDTreePath.CopyingSupported()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
没办法,只好换个思路。换个版本试试。https://vim.sourceforge.io/scripts/script.php?script_id=1658 这个链接中下载版本为4.2.0 的名为nerdtree.zip 文件,然后下载这个文件后解压,同样把plugin和doc文件夹下的内容放到~/.vim/文件夹下的对应位置。
这样就完成了安装过程。对于nerdtree插件最最实用的一个快捷键就是:
ctrl + ww
- 1
来切换左侧目录区和右侧文件编辑区。
退出左侧目录区或者右侧文件编辑区的命令为:
:q 或者 Shift+zz
- 1
差点忘了,在VIM中调出目录树的命令是在VIM的命令模式下输入:
:NERDTree
- 1
但是每次输入这么长的内容,也是不好玩,那么就绑定一下VIM的快捷键吧。在~/.vimrc 文件中添加这样一行语句:
nmap <F2> :NERDTree <CR>
- 1
这样在打开VIM后按下F2键就可以调出目录树了。这下看起来很方便了吧。
VIMRC
关于这个配置文件,需要了解的有很多,但是最基础的就是它的位置。
- ~/.vimrc 仅仅对当前用户有效
/etc/vim/.vimrc 对所有用户有效
我一般作为root用户登录到我的服务器,所以我只想让我的VIM对我自己友好的话,我只需要编辑/root/.vimrc文件即可。
下面贴出我的VIMRC的配置吧,有需要的可以拿去试试。
set nu!syntax onsyntax enableset clipboard+=unnamedset background=darkcolorscheme desertset magicset fo-=r"高亮显示tab,行尾结束符,空格信息"set list listchars=tab:>.,trail:.,extends:#,nbsp:~"highlight WhitespaceEOL ctermbg=green guibg=green"match WhitespaceEOL /\s+$/" 告诉vim在当前的目录下找不到tags文件的话,就到上层目录中去查找set tags=tags;/" 告诉VIM可以使用quickfix窗口显示cscope的查找列表set cscopequickfix=s-,c-,d-,i-,t-,e-if has("cscope") set csprg=/usr/local/bin/cscope set csto=1 set cst set nocsverb " add any database in current directory if filereadable("cscope.out") cs add cscope.out endif set csverbendif" 给cscope的关键命令添加快捷键支持nmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR>nmap <C-_>g :cs find g <C-R>=expand("<cword>")<CR><CR>nmap <C-_>c :cs find c <C-R>=expand("<cword>")<CR><CR>nmap <C-_>t :cs find t <C-R>=expand("<cword>")<CR><CR>nmap <C-_>e :cs find e <C-R>=expand("<cword>")<CR><CR>nmap <C-_>f :cs find f <C-R>=expand("<cfile>")<CR><CR>nmap <C-_>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>nmap <C-_>d :cs find d <C-R>=expand("<cword>")<CR><CR>" 添加nerdtree插件支持,让VIM显示一个目录树nmap <silent>n :NERDTreeToggle<CR><CR>set rulerset foldmethod=syntaxset cmdheight=2set cursorlineset tabstop=4set shiftwidth=4set softtabstop=4set noautoindentset nocindentset fo-=rset expandtabset wrapset wildmenuset showmatchset showcmdset ignorecaseset nobackupset noswapfileset nowritebackupset autowriteset autoreadset hlsearchset incsearchset ignorecaseset smartcaseset nowrapscanset nocompatibleset backspace=2set mouse=aset selection=exclusiveset selectmode=mouse,keyfiletype plugin indent onfiletype plugin onautocmd FileType php set omnifunc=phpcomplete#CompletePHP
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
Tmux相关
基本上来说,tmux已经成为了我日常工作的一部分了,很难想象没了它的话,工作效率会是多么低。之前写过一篇关于tmux的特别简单的文章,总体来说含金量不大。
学习tmux主要是对各种快捷键的熟练使用,不需要有多么好的记忆力,只要多敲多练,就够了,下面贴一下我的tmux 的配置。
# set -g mode-mouse on# 设置滚屏# set-window-option -g mode-mouse on# 如果喜欢给窗口自定义命名,那么需要关闭窗口的自动命名set-option -g allow-rename off# 如果对 vim 比较熟悉,可以将 copy mode 的快捷键换成 vi 模式# set-window-option -g mode-keys vi# 系统剪切板共享# set-option -g default-command "reattach-to-user-namespace -l zsh"# 用鼠标切换窗口、调节分屏大小# setw -g mouse-resize-pane on# set-window-option -g mouse-select-pane on# setw -g mode-mouse on# setw -g mouse-select-window on## 设置复制模式# setw -g mode-keys vi# bind ` copy-mode# unbind [# unbind p# bind p paste-buffer# bind -t vi-copy v begin-selection# bind -t vi-copy y copy-selection# bind -t vi-copy Escape cancel# bind y run "tmux save-buffer - | reattach-to-user-namespace pbcopy"# 下面是自己的一些配置,可删可不删bind r source-file ~/.tmux.conf \; display "配置文件已成功加载完毕!"bind | split-window -hbind - split-window -v# set -g default-ternimal "screen-256color"set -g status-fg whiteset -g status-bg blacksetw -g window-status-fg magentasetw -g window-status-bg defaultsetw -g window-status-attr dimsetw -g window-status-current-fg whitesetw -g window-status-current-bg redsetw -g window-status-current-attr brightset -g pane-border-fg greenset -g pane-border-bg yellowset -g pane-active-border-fg whiteset -g pane-active-border-bg cyanset -g message-fg whiteset -g message-bg blackset -g message-attr brightset -g status-left-length 36set -g status-left "#[fg-White] Session: #S #[fg=cyan]#P"set -g status-interval 60set -g status-justify centresetw -g monitor-activity onset -g visual-activity on
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
总结
之前听过有人这么说过,Windows用的时间越久,人就变得越来越迟钝。用了Linux之后,很多东西都得自己一个字母一个字母的去敲,久而久之,既锻炼了记忆,有锻炼了手指。确实还是有很多好处的。
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow