要说Linux下比较好用的文本编辑器,我推荐vim(当然很多人都用emacs,可我没用过),用vim也有一年左右,有些心得体会想与诸位分享。在我的学习过程中,借鉴了不少优秀的博客,其中有csdn大神namecyf的博客http://blog.csdn.net/namecyf/article/details/7787479和博客园风歌的blog的http://www.cnblogs.com/junnyfeng/p/3633697.html这两篇文章。

1 Vim的安装与基本介绍

•安装

Archlinux下安装Vim直接用pacman即可,其他Linux系统也类似,建议把gvim也安装上。

•配置文件

系统安装vim时应该会有一个vimrc文件,修改里面的代码可以对所有用户的Vim进行配置,我们一般只是对当前用户的vim进行配置,故我们可以在$HOME下创建一个.vimrc的隐藏文件,这个就是vim的配置文件。

•查看vim是否支持python

1.在vim界面执行:version,如果python前有+号,就是支持,减号就是不支持。如果不支持,则需要以编译安装方式重新安装vim。如下:

2.首先把系统的vim全部删除,包括vim,gvim,vim-runtime,vim-common,vim-gui-common,vim-tiny

3.然后下载源码包

4.进入目录进行配置编译属性,如下

cd ./vim74/src

./configure --with-features=huge --enable-pythoninterp --enable-python3interp --enable-luainterp --enable-multibyte --enable-sniff --enable-fontset

5.编译

make && make install

•安装vundle插件

git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle

以后只需要在.vimrc中添加插件,然后咋爱vim界面运行:BundleInstall就可以安装相应插件。

  •使用help命令

在vim执行:help <subject>就可以查看subject的相关解释,可以获得你想象得到的帮助:

(1)查找关于某个字母的命令 :help x   查找关于x的命令

(2)得到所以命令的索引:help index

(3)带有控制键的命令 :help CTRL-A 注意大写

(4)带有模式的命令:help i-CTRL-A 在虚拟模式下 v-CTRL-A 在冒号模式 c-CTRL-A

(5)带有命令行参数 :help -t

(6)关于某个选项的如:help 'number'

(7) 特殊按键用尖括号:help i-<Up>

(8)可以用错误ID号来寻求帮助 :help E37

(9)关于引发自动命令的事件“Eventname”的帮助:help Eventname

(10)关于编译时特性“+subject”的帮助:help +subject

(11)关于函数的subject()的帮助:help subject()

(12)到帮助文件digraphs.txt文件的开头:help digraphos.txt

(13)查找一个以“pattern”开始的帮助标记:help pattern<Tab>

(14)下一个匹配项:cn

(15)前一个匹配项:cN或:cprev

(16)第一个/最后一个匹配项:cfirst/clast

(17)打开/关闭快速修改窗口:copen/cclose

2 Vim配置

这部分主要将一些比较实用的插件以及它在.vimrc里如何配置。

2.1 在程序中跳来跳去:Ctags的使用

tags文件是由ctags程序产生的一个索引文件, ctags程序其是叫"Exuberant Ctags", 是Unix上面ctags程序的替代品, 并且比它功能强大, 是大多数Linux发行版上默认的ctags程序. 那么tags文件是做什么用的呢? 如果你在读程序时看了一个函数调用, 或者一个变量, 或者一个宏等等, 你想知道它们的定义在哪儿, 怎么办呢? 用grep? 那会搜出很多不相干的地方. 现在流行用是的<C-]>, 谁用谁知道呀, 当光标在某个函数或变量上时, 按下"Ctrl+]", 光标会自动跳转到其定义处,再按"Ctrl+T"就会跳回原来位置,够厉害吧!

下面我们就来安装吧!

•首先现在这个网站上下载ctags的压缩文件(类似ctags-x.x.tar.gz的文件):http://ctags.sourceforge.net

•然后就是解压安装了:

#tar -xzvf ctags-x.x.tar.gz --x自行替换

#cd ctags-x.x

#make && make install

这样Ctags就安装好了,执行#ctags -R就可以递归地生成当前目录下的tags文件了。现在进行一些配置:

在.vimrc中加入以下内容:

set tags=./tags,./../tags,./*/tags --这样的设置可以生成当前目录,上级目录以及当前目录的所有子目录的tags文件

然后绑定快捷键F7就可以,在vim界面下也可以生成tags文件

map <F7> <Esc>:!ctags -R <CR><CR>

ctags的一些使用说明:

•:tags 列出所有tag

•:tag 跳至tag序列的最后

•在多个匹配的tag之间移动

:tfirst

:tlast

:[count] tprevious

:[count] tnext

:tselect tagname

•:ptag function 新建窗口,显示function的参数定义

•:pclose 关闭该窗口

•gd 在当前函数中查找变量定义,gD在文件中查找定义

2.2 显示变量名和函数列表:TagBar

tagbar是一个taglist的替代品,比taglist更适合c++使用,函数能够按类区分,支持按类折叠显示等,显示结果清晰简洁。

安装TagBar只需要在.vimrc中添加:

Plugin 'majutsushi/tagbar'

然后在vim界面中输入:BundleInstall即可,可用vundle进行管理。

我在自己的vim里绑定了一个快捷键"tb",可以打开TagBar:

map tb <Esc>:Tagbar <CR>

:help tagbar可查阅详细用法。

右边的则是tagbar

2.3 树形目录插件:NERDTree

无意中看到朋友使用的vim竟然能在左边显示树形目录,感觉很方便,这样子文件夹有什么文件一目了然。打听后是一个叫做NERDTree的插件,这个插件在vundle居然也有,于是可以这样安装:

Plugin 'scrooloose/nerdtree'

同样的在vim界面中:BundleInstall进行安装

我的设置是F8打开:

map <F8> <Esc>:NERDTree <CR>

:help nerdtree可查阅详细用法

左边的为nerdtree

2.4 好看的状态栏:vim-powerline

PowerLine是一个增强的Vim状态栏插件。当Vim处于NORMAL、INSERT、BLOCK等状态时,状态栏会呈现不同的颜色,同时状态栏还会显示当前编辑文件的格式(uft-8等)、文件类型(java、xml等)和光标位置等。同样的vundle里也有

Plugin 'Lokaltog/vim-powerline'

然后安装同上,无需设置,重启即可看到效果。

以上图片的下面部分则是powerline的效果图:

2.5 好看的背景:molokai

我用的背景和文字分别是:molokai和Source Code Pro

当然了,需要安装对应的字体和下载主题文件,主题文件需要移至$HOME/.vim/colors/目录下,字体文件移至/usr/share/fonts/目录下(建议将.ttf文件移至TTF目录下,.otf文件移至OTF目录下),然后更新系统的字体缓存:#fc-cache -fv即可。

配置字体和背景还需要:

colorscheme molokai

set guifont=Source\ Code\ Pro\ 12 #12是字体大小

字体以及主题文件的下载地址我都会在下面给出,接下来介绍jeaye/color_coded插件:

这个插件可以高亮c/c++程序的struct,class等等结构。不过要在.vimrc中配置:

hi link StructDecl Type

hi link UnionDecl Type

hi link ClassDecl Type

hi link EnumDecl Type

2.6 超级强大的自动补全插件:YouCompleteMe

安装这个插件要求vim支持python2.6以上,如果支持,则用Vundle安装:

Plugin 'Valloric/YouCompleteMe'

之后的安装同上,安装完成后会有一个错误显示:

Done! With errors; press l to view log
ycm_client_support.[so|pyd|dll] and ycm_core.[so|pyd|dll] not detected; you need
to compile YCM before using it. Read the docs!

这是正常的,因为ycm需要手工编译出库文件,到 .vim/bundle/YouCompleteMe下跑

#./install.sh --clang-completer     --参数是为了支持c/c++ 的补全,系统需要安装clang

YouCompleteMe 的补全配置文件在$HOME/.vim/bundle/YouCompleteMe/cpp/ycm/.ycm_extra_conf.py(我的在$HOME/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py),这是个隐藏文件。通过修改它可以进行自己想要的补全功能。

我的.ycm_extra_conf.py文件配置如下:

  1 # This file is NOT licensed under the GPLv3, which is the license for the rest
  2 # of YouCompleteMe.
  3 #
  4 # Here's the license text for this file:
  5 #
  6 # This is free and unencumbered software released into the public domain.
  7 #
  8 # Anyone is free to copy, modify, publish, use, compile, sell, or
  9 # distribute this software, either in source code form or as a compiled
 10 # binary, for any purpose, commercial or non-commercial, and by any
 11 # means.
 12 #
 13 # In jurisdictions that recognize copyright laws, the author or authors
 14 # of this software dedicate any and all copyright interest in the
 15 # software to the public domain. We make this dedication for the benefit
 16 # of the public at large and to the detriment of our heirs and
 17 # successors. We intend this dedication to be an overt act of
 18 # relinquishment in perpetuity of all present and future rights to this
 19 # software under copyright law.
 20 #
 21 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 22 # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 23 # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 24 # IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
 25 # OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 26 # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 27 # OTHER DEALINGS IN THE SOFTWARE.
 28 #
 29 # For more information, please refer to <http://unlicense.org/>
 30
 31 import os
 32 import ycm_core
 33
 34 # These are the compilation flags that will be used in case there's no
 35 # compilation database set (by default, one is not set).
 36 # CHANGE THIS LIST OF FLAGS. YES, THIS IS THE DROID YOU HAVE BEEN LOOKING FOR.
 37 flags = [
 38 '-Wall',
 39 '-Wextra',
 40 '-Werror',
 41 '-Wc++98-compat',
 42 '-Wno-long-long',
 43 '-Wno-variadic-macros',
 44 '-fexceptions',
 45 '-DNDEBUG',
 46 # You 100% do NOT need -DUSE_CLANG_COMPLETER in your flags; only the YCM
 47 # source code needs it.
 48 '-DUSE_CLANG_COMPLETER',
 49 # THIS IS IMPORTANT! Without a "-std=<something>" flag, clang won't know which
 50 # language to use when compiling headers. So it will guess. Badly. So C++
 51 # headers will be compiled as C headers. You don't want that so ALWAYS specify
 52 # a "-std=<something>".
 53 # For a C project, you would set this to something like 'c99' instead of
 54 # 'c++11'.
 55 '-std=c++11',
 56 # ...and the same thing goes for the magic -x option which specifies the
 57 # language that the files to be compiled are written in. This is mostly
 58 # relevant for c++ headers.
 59 # For a C project, you would set this to 'c' instead of 'c++'.
 60 '-x',
 61 'c++',
 62 '-isystem',
 63 '../BoostParts',
 64 '-isystem',
 65 # This path will only work on OS X, but extra paths that don't exist are not
 66 # harmful
 67 '-isystem',
 68 '../llvm/include',
 69 '-isystem',
 70 '../llvm/tools/clang/include',
 71 '-I',
 72 '.',
 73 '-I',
 74 './ClangCompleter',
 75 '-isystem',
 76 './tests/gmock/gtest',
 77 '-isystem',
 78 './tests/gmock/gtest/include',
 79 '-isystem',
 80 './tests/gmock',
 81 '-isystem',
 82 './tests/gmock/include',
 83 '-isystem',
 84 '/usr/bin/',
 85 '-isystem',
 86 '/usr/lib64/gcc/x86_64-pc-linux-gnu/6.1.1',
 87 '-isystem',
 88 '/usr/include/c++/6.1.1',
 89 '-isystem',
 90 '/usr/include/c++/6.1.1/x86_64-pc-linux-gnu',
 91 '-isystem',
 92 '/usr/include/c++/6.1.1/backward',
 93 '-isystem',
 94 '/usr/local/include',
 95 '-isystem',
 96 '/usr/lib/clang/3.8.0/include',
 97 '-isystem',
 98 '/usr/include',
 99 ]
100
101
102 # Set this to the absolute path to the folder (NOT the file!) containing the
103 # compile_commands.json file to use that instead of 'flags'. See here for
104 # more details: http://clang.llvm.org/docs/JSONCompilationDatabase.html
105 #
106 # You can get CMake to generate this file for you by adding:
107 #   set( CMAKE_EXPORT_COMPILE_COMMANDS 1 )
108 # to your CMakeLists.txt file.
109 #
110 # Most projects will NOT need to set this to anything; you can just change the
111 # 'flags' list of compilation flags. Notice that YCM itself uses that approach.
112 compilation_database_folder = ''
113
114 if os.path.exists( compilation_database_folder ):
115   database = ycm_core.CompilationDatabase( compilation_database_folder )
116 else:
117   database = None
118
119 SOURCE_EXTENSIONS = [ '.cpp', '.cxx', '.cc', '.c', '.m', '.mm' ]
120
121 def DirectoryOfThisScript():
122   return os.path.dirname( os.path.abspath( __file__ ) )
123
124
125 def MakeRelativePathsInFlagsAbsolute( flags, working_directory ):
126   if not working_directory:
127     return list( flags )
128   new_flags = []
129   make_next_absolute = False
130   path_flags = [ '-isystem', '-I', '-iquote', '--sysroot=' ]
131   for flag in flags:
132     new_flag = flag
133
134     if make_next_absolute:
135       make_next_absolute = False
136       if not flag.startswith( '/' ):
137         new_flag = os.path.join( working_directory, flag )
138
139     for path_flag in path_flags:
140       if flag == path_flag:
141         make_next_absolute = True
142         break
143
144       if flag.startswith( path_flag ):
145         path = flag[ len( path_flag ): ]
146         new_flag = path_flag + os.path.join( working_directory, path )
147         break
148
149     if new_flag:
150       new_flags.append( new_flag )
151   return new_flags
152
153
154 def IsHeaderFile( filename ):
155   extension = os.path.splitext( filename )[ 1 ]
156   return extension in [ '.h', '.hxx', '.hpp', '.hh' ]
157
158
159 def GetCompilationInfoForFile( filename ):
160   # The compilation_commands.json file generated by CMake does not have entries
161   # for header files. So we do our best by asking the db for flags for a
162   # corresponding source file, if any. If one exists, the flags for that file
163   # should be good enough.
164   if IsHeaderFile( filename ):
165     basename = os.path.splitext( filename )[ 0 ]
166     for extension in SOURCE_EXTENSIONS:
167       replacement_file = basename + extension
168       if os.path.exists( replacement_file ):
169         compilation_info = database.GetCompilationInfoForFile(
170           replacement_file )
171         if compilation_info.compiler_flags_:
172           return compilation_info
173     return None
174   return database.GetCompilationInfoForFile( filename )
175
176
177 def FlagsForFile( filename, **kwargs ):
178   if database:
179     # Bear in mind that compilation_info.compiler_flags_ does NOT return a
180     # python list, but a "list-like" StringVec object
181     compilation_info = GetCompilationInfoForFile( filename )
182     if not compilation_info:
183       return None
184
185     final_flags = MakeRelativePathsInFlagsAbsolute(
186       compilation_info.compiler_flags_,
187       compilation_info.compiler_working_dir_ )
188
189     # NOTE: This is just for YouCompleteMe; it's highly likely that your project
190     # does NOT need to remove the stdlib flag. DO NOT USE THIS IN YOUR
191     # ycm_extra_conf IF YOU'RE NOT 100% SURE YOU NEED IT.
192    # try:
193    #   final_flags.remove( '-stdlib=libc++' )
194    # except ValueError:
195    #   pass
196   else:
197     relative_to = DirectoryOfThisScript()
198     final_flags = MakeRelativePathsInFlagsAbsolute( flags, relative_to )
199
200   return {
201     'flags': final_flags,
202     'do_cache': True
203   }

View Code

flags里面的这几条请依据自己的gcc和clang的版本来填写(gcc --version和clang --version):

'/usr/lib64/gcc/x86_64-pc-linux-gnu/6.1.1',
'/usr/include/c++/6.1.1',
'/usr/include/c++/6.1.1/x86_64-pc-linux-gnu',
'/usr/include/c++/6.1.1/backward',
'/usr/lib/clang/3.8.0/include'

接着就是在.vimrc文件里进行配置了:

""""""""""""" ycm配置
nnoremap <leader>gt :YcmCompleter GetType<CR>
nnoremap <leader>gp :YcmCompleter GetParent<CR>
nnoremap <leader>gg :YcmCompleter GoToDefinitionElseDeclaration<CR>
let g:ycm_global_ycm_extra_conf = '~/.ycm_extra_conf.py'
let g:ycm_confirm_extra_conf=0 "不再询问是否加载.ycm_extra_conf.py文件
let g:ycm_complete_in_comments = 1  "注释也用补全
let g:ycm_autoclose_preview_window_after_completion = 1
let g:ycm_add_preview_to_completeopt = 0

gt可以获得该变量类型,gp可以跳转到它的父类的声明处,gg跳转到定义处。详细教程参考https://github.com/Valloric/YouCompleteMe/#options。

2.7 c/c++快捷编译运行

这个功能主要使用自动命令autocmd,使得vim自动识别文件,然后F5进行编译,F6运行程序,另外还有整行注释功能(按./注释,按..取消注释):

""""""""""""""""""""""""""""""""""""""""C语言的编译运行"""""""""""""""""""""""""""""""""""""""""
" <F5>编译C/py语言,<F6>运行
augroup ccompileautocmd Filetype c map <F5> <Esc>:w<CR>:!gcc % -std=c99 -g -o %< -lm <CR>autocmd Filetype cpp map <F5> <Esc>:w<CR>:!g++ % -std=c++11 -g -o %< -lm <CR>autocmd Filetype python map <F5> <Esc>:w<CR>:!python % <CR>
augroup ENDaugroup crunautocmd Filetype c map <F6> <Esc>:! ./%< <CR>autocmd Filetype cpp map <F6> <Esc>:! ./%< <CR>
augroup END" 整行注释
augroup commentautocmd Filetype c noremap <buffer> <localleader>/ I//<Esc>autocmd Filetype cpp noremap <buffer> <localleader>/ I//<Esc>autocmd Filetype h noremap <buffer> <localleader>/ I//<Esc>
augroup ENDaugroup nocommentautocmd Filetype c noremap <buffer> <localleader>. ^xxautocmd Filetype cpp noremap <buffer> <localleader>. ^xxautocmd Filetype h noremap <buffer> <localleader>. ^xx
augroup END

2.8 相关下载

•.vimrc文件:click here

•Source Code Pro字体:click here

•主题(这里有百来个,自己挑选):click here

3 .vimrc代码

以下是我的.vimrc文件内容:

  1 "Y_VIMRC
  2 "author cqm
  3 "email chester@hit.edu.cn
  4 "Time: Wed Feb  3 16:40:07 CST 2016
  5 "settings are as followed:
  6
  7 "---------------------------------START-------------------------------------------------
  8
  9
 10 """""""""""""""""""""""""""""""""""""""基本设置""""""""""""""""""""""""""""""""""""""""
 11 " 设定默认解码
 12 set fenc=utf-8
 13 set fencs=utf-8,usc-bom,euc-jp,gb18030,gbk,gb2312,cp936
 14
 15 " 支持256色,使得vim配色支持终端
 16 set t_Co=256
 17
 18 " C缩进
 19 set smartindent
 20 set cindent
 21
 22 " 设置背景和字体
 23 colorscheme molokai
 24 set guifont=Source\ Code\ Pro\ 12
 25
 26 " 不要使用vi的键盘模式,而是vim自己的
 27 set nocompatible
 28
 29 " history文件中需要记录的行数
 30 set history=1000
 31
 32 " 在处理未保存或只读文件的时候,弹出确认
 33 set confirm
 34
 35 " 与windows共享剪贴板
 36 set clipboard+=unnamed
 37
 38 " 侦测文件类型
 39 filetype off
 40
 41 " 为特定文件类型载入相关缩进文件
 42 filetype indent on
 43
 44 " 带有如下符号的单词不要被换行分割
 45 set iskeyword+=_,$,@,%,#,-
 46
 47 " 语法高亮
 48 syntax enable
 49 syntax on
 50
 51 "隐藏GUI的工具栏
 52 set guioptions=P
 53
 54 " 不要备份文件
 55 set nobackup
 56
 57 " 不要生成swap文件
 58 setlocal noswapfile
 59
 60 " 字符间插入的像素行数目
 61 set linespace=0
 62
 63 " 在状态行上显示光标所在位置的行号和列号
 64 set ruler
 65
 66 " 命令行(在状态行下)的高度,默认为1,这里是2
 67 set cmdheight=2
 68
 69 " 使回格键(backspace)正常处理indent, eol, start等
 70 set backspace=indent,eol,start
 71
 72 " 允许backspace和光标键跨越行边界
 73 set whichwrap+=<,>,b,s,[,]
 74
 75 " 不让vim发出讨厌的滴滴声
 76 set noerrorbells
 77
 78 " 高亮显示匹配的括号
 79 set showmatch
 80
 81 " 匹配括号高亮的时间(单位是十分之一秒)
 82 set matchtime=5
 83
 84 " 在搜索的时候忽略大小写
 85 set ignorecase
 86
 87 " 不要高亮被搜索的句子(phrases)
 88 set nohlsearch
 89
 90 " 在搜索时,输入的词句的逐字符高亮(类似firefox的搜索)
 91 set incsearch
 92
 93 " 光标移动到buffer的顶部和底部时保持3行距离,窗口滚动最小距离
 94 set scrolloff=3
 95
 96 " 2为总显示最后一个窗口的状态行
 97 " 设为1则窗口数多于一个的时候显示最后一个窗口的状态行;
 98 " 0不显示最后一个窗口的状态行
 99 set laststatus=2
100
101 " 继承前一行的缩进方式,特别适用于多行注释
102 ""set autoindent
103
104 " 显示行号
105 set number
106
107 " 制表符为4
108 set tabstop=4
109
110 " 统一缩进为4
111 set softtabstop=4
112 set shiftwidth=4
113
114 " 不要用空格代替制表符
115 set noexpandtab
116
117 " 不要换行
118 " set nowrap
119 " set sidescroll=10
120
121 " 在行和段开始处使用制表符
122 set smarttab
123
124 " Ctrl+A全选,Ctrl+C复制,Ctrl+V粘贴
125 map <C-A> ggvG$
126 imap <C-A> <Esc>ggvG$
127 vmap <C-C> "+y<Esc>
128 map <C-V> "+p
129 imap <C-V> <Esc>"+pa
130
131 " 括号等的自动匹配
132 inoremap ( ()<Esc>i
133 inoremap [ []<Esc>i
134 inoremap { {}<Esc>i
135 inoremap ' ''<Esc>i
136 inoremap " ""<Esc>i
137
138 " 设置<leader>和<localleader>
139 let mapleader = ","
140 let maplocalleader = "."
141
142 " 可以折叠
143 set foldenable
144 set foldmethod=manual
145
146 " 自动更新.vimrc
147 map <leader>vo <Esc>:vsp ~/.vimrc<CR>
148
149
150 """"""""""""""""""""""""""""""""""""""""Vundle管理插件""""""""""""""""""""""""""""""""""""""""
151 set rtp+=~/.vim/bundle/vundle/
152 call vundle#rc()
153 Plugin 'gmarik/vundle'
154 Plugin 'tpope/vim-fugitive'
155 Plugin 'Lokaltog/vim-easymotion'
156 Plugin 'tpope/vim-rails.git'
157 Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
158 Plugin 'L9'
159 Plugin 'FuzzyFinder'
160 Plugin 'git://git.wincent.com/command-t.git'
161 Plugin 'Valloric/YouCompleteMe'
162 Plugin 'Valloric/ListToggle'
163 Plugin 'scrooloose/syntastic'
164 Plugin 'davidhalter/jedi'
165 Plugin 'majutsushi/tagbar'
166 Plugin 'scrooloose/nerdtree'
167 Plugin 'Lokaltog/vim-powerline'
168 Plugin 'jeaye/color_coded'
169 Plugin 'octol/vim-cpp-enhanced-highlight'
170
171 call vundle#end()
172 filetype plugin indent on     " required
173
174 """"""""""""""""""""""""""""""""""""""""C语言的编译运行"""""""""""""""""""""""""""""""""""""""""
175 " <F5>编译C/py语言,<F6>运行
176 augroup ccompile
177     autocmd Filetype c map <F5> <Esc>:w<CR>:!gcc % -std=c99 -g -o %< -lm <CR>
178     autocmd Filetype cpp map <F5> <Esc>:w<CR>:!g++ % -std=c++11 -g -o %< -lm <CR>
179     autocmd Filetype python map <F5> <Esc>:w<CR>:!python % <CR>
180 augroup END
181
182 augroup crun
183     autocmd Filetype c map <F6> <Esc>:! ./%< <CR>
184     autocmd Filetype cpp map <F6> <Esc>:! ./%< <CR>
185 augroup END
186
187 " 整行注释
188 augroup comment
189     autocmd Filetype c noremap <buffer> <localleader>/ I//<Esc>
190     autocmd Filetype cpp noremap <buffer> <localleader>/ I//<Esc>
191     autocmd Filetype h noremap <buffer> <localleader>/ I//<Esc>
192 augroup END
193
194 augroup nocomment
195     autocmd Filetype c noremap <buffer> <localleader>. ^xx
196     autocmd Filetype cpp noremap <buffer> <localleader>. ^xx
197     autocmd Filetype h noremap <buffer> <localleader>. ^xx
198 augroup END
199
200
201 " 大括号补全
202 autocmd Filetype c,cpp,h inoremap {<CR> {<CR>}<Esc>O
203
204
205
206 """"""""""""""""""""""""""""""""""""""""""各插件的配置""""""""""""""""""""""""""""""""""""""""""
207 """"""""""""" Ctags配置
208 set tags=./tags,./../tags,./*/tags
209 map <F7> <Esc>:!ctags -R <CR><CR>
210
211 """"""""""""" ycm配置
212 nnoremap <leader>gt :YcmCompleter GetType<CR>
213 nnoremap <leader>gp :YcmCompleter GetParent<CR>
214 nnoremap <leader>gg :YcmCompleter GoToDefinitionElseDeclaration<CR>
215 let g:ycm_global_ycm_extra_conf = '~/.ycm_extra_conf.py'
216 let g:ycm_confirm_extra_conf=0 "不再询问是否加载.ycm_extra_conf.py文件
217 let g:ycm_complete_in_comments = 1  "注释也用补全
218 let g:ycm_autoclose_preview_window_after_completion = 1
219 let g:ycm_add_preview_to_completeopt = 0
220
221 """"""""""""" TagBar设置
222 map tb <Esc>:Tagbar <CR>
223
224 """"""""""""" NerdTree设置
225 map <F8> <Esc>:NERDTree <CR>
226
227 """"""""""""" color_coded设置
228 hi link StructDecl Type
229 hi link UnionDecl Type
230 hi link ClassDecl Type
231 hi link EnumDecl Type
232
233 "----------------------------------------------END--------------------------------------------"

View Code

4 vim使用技巧

4.1 基本操作技巧

•插入模式下h,j,k,l分别表示左,下,上,右

•J表示合并两行,使用时在前一行按大写J

•o表示在下一行开始新的一行,O表示在上一行开始新的一行

•u可以撤销上一次的任意修改,再按u则继续撤销上上次的修改,而ctrl+r可以对此次撤销操作进行撤销

•i表示在光标字符前插入,a表示在光标字符后插入,I将光标置于第一个非空白字符前并插入,A在行尾插入

•w指想后移进一个单词,且光标置于首字母处,b相反,移前一个单词,光标也是首字母处;其次,3w则执行3次w命令。e同w,只是光标置于单词末尾,ge同b一样,只是光标置于单词末尾;大写W以空白为边界区分单词分隔,而小写w以,/等为分隔

•^或者是0可以将光标移至行首,$移至行末,2$则是下一行行末,以此类推

•fx为向右查找x,5fx为向右查找第五个x,F为向左查找;tx与fx类似,只是光标停在x前一个字符处,T则向左查找,用;可重复命令或者是,反方向重复

•%用于匹配括号,中括号,大括号,双引号等

•33G将光标置于第33行,gg跳至文章第一行,G跳至文章最后一行

•ctrl+g显示当前光标所在位置

•/string用来搜索字符串,n向下搜索,2n为第二个,N向前搜索;?string同/string,n向前搜索,N向下搜索;*可以向下查找当前光标所在单词,#为向前搜索;/和?的正则表达式的运用规则主要有:.匹配任何单个字符,$匹配行尾字符串,^匹配行首字符串

•ma将当前光标的位置标记为a,`a则是跳转到a标记,'a为跳转到a标记所在行的行首,:marks可以查看所有标记--在列表中,标志名为'为进行此次跳转之前的起跳点,"为上次编辑该文件时光标的最后位置,[为最后一次修改的起始位置,]为最后一次修改的结束位置

•dw删除包含光标所在位置的第一个单词,包括后面的空白字符;d2w删除第二个单词;de,同dw,不过不包括空白字符;d$则删除当前光标到末尾的所有字符;cw为删除该单词后进入插入模式;dd删除整行,cc删除后进入插入模式;D=d$,s=cl(删除光标下字符并且进入插入模式),S=cc

•r更换单个字符,5r将光标下字符开始数第5个更换,.重复修改命令,R进入replace模式,V进入visual模式,ctrl+v矩形框图式的visual模式;visual模式下,as可直接选中一个句子

•y可对选中的内容进行复制,Y复制整行内容,yw复制一个单词包括其后的空白字符,ye则不包括,yy复制整行;p为粘贴,若是单个字符(包括x删除的字符),p将粘贴到当前光标的后一个位置,若是一行(包括dd后的内容),则粘贴至下一行

•cas删除一个句子并且进入插入模式,cis类似,只是不包括后面的空格

•~改变当前光标下字符的大小写

•gu改成小写,如guj将下一行的所有字符改成小写,gU改成大写,g~大小写反写

•g ctl+g 显示字数

•zf创建折行,zo打开,zc关闭,zR/zr打开所有这行,zM/zm关闭所有折行,如zfap折叠一个段落,zd删除当前行折叠,zD删除所有折叠

4.2 vim脚本初试

将命令台的命令写入.vimrc文件中,便能永久生效,如下

•set nohlsearch 取消搜索高亮效果

•set incsearch 边打字边搜索

•set nowrapscan 到了行尾或者行首便停止搜索,不必反复绕

•命令台下:scriptname 搜索启动文件路径

•命令台下:options 打开选项,回车可跳转对应主题,对选项进行更改后回车即可成功设置,:set 选项名& 用于恢复默认值

•set nowrap 长行不折到下一行

•set whichwrap=b,s,<,> 退格或者左方向键到行首时,再按一次到上一行行尾;空格或者右方向键到行尾时,再按一次到下一行行首;set whichwrap = b,s,<,>,[,] 保证在插入模式下也可行

•set list 将制表符显示出来,隐藏起来为nolist,默认情况下制表符表示为^I,行末尾为$,行末尾空白字符为空格,但是可以通过set listchars=tab:^I.trail:-(空白字符)来修改

•查看一个word可包含的字符set iskeyword,会显示iskeyword=@(所有字母),48-57(ASCII中0~9),_,192-255(拉丁字母),若想加入-,则set iskeyword+=-来实现,同理减去某个字符用-=

4.3 编辑多个文件

•:edit foo.txt 关闭当前窗口,编辑foo.txt文件

•#vim 1.txt 2.txt 3.txt 窗口只会显示第一个文件,剩下的文件可以通过:next来查看

•:args 查看列表中有哪些文件,其中正在编辑的文件用[]括起

•:previous 前一个文件,:last 最后一个文件,:first 第一个文件,:3next 向后数第三个

•:args a.txt b.txt c.txt 重新编排顺序,且打开第一个文件

•ctrl+^可以在两个文件中切换(当前和下一个)

•当回到某个文件时,`.可以回到最后修改处,`"回到最后光标停留处

•ma为局部标记,只对该文件有用;mA为全局标记,对全部文件有用

•"将文本保存至寄存器中,名字为26个小写英文字母例如--------"fyas复制句子到f寄存器中,ctrl+vjjww"by复制文本到b寄存器中,粘贴可用"fp,删除时也可以将内容复制,如"wdaw

•:saveas change.txt 另存为

4.4 分割窗口

•:split 将分成上下两个屏幕,光标定位于上面的窗口

•ctrl+w+w 切换窗口

•:only 除当前窗口,其他窗口都关闭

•:3split a.txt 高度为3打开a.txt

•ctrl+w+- 减小高度,ctrl+w++ 增加高度,3ctrl+w++ 增加3行高度

•:vsplit 分成左右,光标定位于左

•ctrl+w+h,j,k,l可切换窗口

•:wall 保存全部窗口,:qall 退出所有窗口

•#vim -o a.txt b.txt c.txt 为每个文件水平分配一个窗口,O则垂直分配

•#vimdiff main.c main.c~ 查看所作的修改,:diffupdate可以重新比较2个文件,dp和do可以使该行消除不同

•tabedit a.txt 建立一个页签,gt可以在不同页签中切换

•read b.txt 将b.txt中内容添加到光标下一行的开始位置

•:.,$write! b.txt 将当前行到尾行的内容写入b.txt中

4.5 大幅操作

•qb 记录命令,将接下来的动作记录到b寄存器中,直到再按下q结束记录,@b可以重复执行b中命令

•qB 向b中追加命令,同样"By也是追加操作

•:[range] s/from/to/[flags] 替换命令,例如:%s/Professor/Teacher/g 表示对所有行Professor替换成Techer,其中%表示所有行,g表示一行中的所有符合条件的匹配,若无g则只是每行第一个被替换,from中字符串可以用正则表达式,对于range,可以表示如下:

1,5     1到5行

75      第75行

.,$      当前行到尾行

%       全文

•可用别的字符代替分隔符

•:[range]global/{pattern}/{command} 全局命令,如:g+//+s/foobar/barfoo/g 意为将c文件中//注释中的foobar改成barfoo,其中+为分割符

•!{motion}{program} 其中motion为指定内容,program为外部命令,如!5Gsort将光标所在行到第5行的文本进行sort操作;!!为过滤当前行,如!!date则将时间信息代替当前行内容

•:0read !date -u将utc格式时间插入文件开头

•:read !date 插入时间

•.,$!sort 当前行到尾行sort

•:source filename 执行脚本,:souece %为执行当前脚本

•:grep java *.c 在所有c程序中找到java的行,并且跳到第一个符合的行,:cnext下一个,:cprev上一个,:clist列表

•:write !wc 显示行数,单词数,字数

•保存一个会话 :mksession! vimbook.vim下次运行#vim -S vimbook.vim即可

4.6 文件处理

•:set path += /a/b/c 添加path

•gf查找光标下关键字的定义,在path下查找

•:find stdio.h 在path中查找,sfind则会建立新窗口

•缓冲区分成三种:active(出现在窗口),hidden(隐藏,不在窗口),inactive(已经编辑完)

•:hide edit a.txt 将当前文件隐藏,但是未保存,然后转而编辑a.txt

•:buffers 显示缓存区列表,前面有编号,后面是一系列符号,其中%表示当前缓冲区,+表示有改动的,=表示只读,l为被载入并且显示在窗口,h为被载入但是不显示在窗口

•:buffer [编号] 可跳至相应的缓冲区,bnext下一个缓冲区,bprevious上一个缓冲区,还有bfirst,blast;bdelete则是删除,后面接编号

•使vim自动识别mac,windows,unix系统文件,只需:set fileformats=unix,dos,mac,可以+=和-=;:set fileformat?可以查看文件格式

•:edit ++ff=unix a.txt 强制指定a.txt为unix文件,:w使其保存为unix文件

•#vim -x a.txt 为文件加密

•:set key=    解密(因为密码为空格)

•:X 加密

•#vim -b data 打开一个二进制文件

•:set display=uhex 以十六进制显示不可打印字符

•:cd进入一个目录,会使所有窗口改变

•:pwd显示当前目录

•:lcd会改变当前窗口,但是不影响别的窗口

4.7 定义新命令

•脚本语言中,空格为<Space>,回车为<CR>,空命令为<Nop>,|字符为<Bar>

•:command列出自定义命令,:command -nargs=[char] my_command_name command定义一个新命令,其中char可为:0,1,*,?,+分别表示0个参数,1个参数,任意参数,0或1个参数,1个或多个参数

•例如:command -nargs=+ Say :echo "<args>" 则命令模式下Say Hello则会打印,需要注意的是,<args>不支持用户参数中存在双引号,不过<q-args>可以

•在命令中还可以用-range指定范围,可以用delcommand删除单个命令,comclear删除所有命令

•:autocmd {event} {file_pattern} {command}表示在event触发时执行command,其中event可以为BufReadPost(开始编辑一个已载入的文件),BufNewFile(开始编辑一个未载入的文件),FileReadPre(开始读文件),FileWritePre(保存文件前),当然也可以是FileType指定文件类型,例如:autocmd FileType c command,对c文件进行执行命令;file_pattern为文件名模式,可以用*匹配任何字符,?匹配单个字符,[abc]匹配a,b,c

•augroup group_name {一系列autocmd命令} augroup END 为一个组定义多个自动命令

•被自动命令执行的都是ex命令,如果要在normal模式下定义命令,则需要在{command}前面加入normal

4.8 vim脚本进阶

•变量赋值let {variable} = {expression}

•while循环: while {condition}

          {statements}

end while

•变量名由ASCII,,数字,下划线组成,不能以数字开头

•s:name 脚本文件作用域,此时s:name这个变量只在当前脚本文件中有效,其他的脚本文件中如果也定义了同名的s:name也没关系,因为这两者彼此独立。这一点与C中的static关键字类似;b:name 缓冲区作用域,b:name只在指定的缓冲区中有效;w:name只在指定的窗口中有效;g:name 全局作用域,函数外定义的变量的默认值;v:name vim预定义的变量,注意预定义变量不同于vim的选项(option)变量;l:name 函数内部的局部变量,函数内部定义的变量的默认值

•字符串变量若本身包含双引号,则需要在引号前用\

•字符串序列中的特殊字符\t   <Tab>

            \h   <NL>段行符

\r    <CR>

\e    <Esc>

\b     <BS>

•表达式中可包含以下语素:$NAME环境变量名,&namevim中选项名,@rvim中寄存器名

•if {condition}

{statements}

elseif {condition}

{statements}

endif

•excute只可执行ex命令,加上normal后可执行normal模式命令

•函数定义function {name}

{body}

endfunction

4.9 vim剪贴板

•:reg查看vim中所有剪贴板内容,其中""为当前剪贴板(用y复制后的内容),"0-9是历史剪贴板,"+为系统剪贴板,"*为当前选择区,为选择的内容

•鼠标中键为当前选择区内容

•被替换或者被删除的内容会进入当前剪贴板

转载于:https://www.cnblogs.com/vachester/p/5659648.html

Vim配置及使用技巧相关推荐

  1. vim配置即.vimrc文件的配置及vim操作技巧

    目录 1.1 vim配置(.vimrc配置) 1.2 vim操作技巧 1.VIM文本替换命令 2. 在VIM中进行文本替换 3.vim官方教程 1.1 vim配置(.vimrc配置) 1.下载vim( ...

  2. 最全最好用的vim配置(即.vimrc文件的配置),附加vim操作技巧

    请注意:此教程是在他人基础上修改的,部分内容需要自己调整.--这也是学习使用vim的必经之路. 目录 1.1 vim配置(.vimrc配置) 1.2 vim操作技巧 1.VIM文本替换命令 2. 在V ...

  3. 用GVIM/VIM写Verilog——VIM配置分享

    使用VIM或GVIM最基本的配置,不包含任何插件相关的设置,VIM用于写verilog,非常欢迎大家在评论区分享讨论. 本文不进行插件的配置,不进行基本使用方式与使用技巧的说明,仅作为基本配置的分享交 ...

  4. Linux 各类设置、配置、使用技巧参考,Linux使用集锦

    Linux 各类设置.配置.使用技巧参考,Linux使用集锦 ========== 参考格式 (新增记录时,复制粘贴在下)============= [日期]: <标题> 参考链接ref1 ...

  5. 【 Vim 配置详解 】强大的vim配置文件,让编程更随意

    Vim 配置详解 首 先安装完整版本的VIM  如果是在Linux下,可以安装VIM-Enhance使其扩展为完整版本的 VIM,如果在Windows下,直接安装它的Binary就行了. 当然自己编译 ...

  6. 超级强大的 vim 配置(vimplus)

    From : http://www.cnblogs.com/highway-9/p/5984285.html From : http://www.cnblogs.com/ma6174/archive/ ...

  7. Vim配置Golang开发环境

    Vim配置Golang开发环境 文章目录 Vim配置Golang开发环境 准备: 开始: 参考资料 准备: Download Ubuntu Desktop | Download | UbuntuUbu ...

  8. 超级强大的vim配置(vimplus)

    From : http://www.cnblogs.com/highway-9/p/5984285.html From : http://www.cnblogs.com/ma6174/archive/ ...

  9. VIM配置攻略(最强干货加强版)

    自己最近也在折腾这个VIM的配置,在网上也看了很多教程等,说真的看的一头雾水.主要是对于一个初学者来说对Vundle等根本没有什么了解,也不知道怎么用,并且由于本人的Linux系统是CentOs6.5 ...

最新文章

  1. 线性布局上的一个小错误
  2. 微信小程序实现图书管理系统
  3. python函数名第一类方法、f-string格式化、迭代器及递归函数
  4. php向数据库添加数据失败,无法从PHP中的表单向数据库添加数据
  5. linux diff diffstat组合使用示例
  6. WWW 2020 | 信息检索中的对话式问题建议
  7. Qt程序打包发布方法(使用官方提供的windeployqt工具)
  8. 杨元庆:乐Pad更适合中国消费者
  9. 【BZOJ3036】绿豆蛙的归宿 拓补排序+概率
  10. poj 3352Road Construction(无向双连通分量的分解)
  11. Hive分析函数--row_number 的用法
  12. python接口自动化(二十七)--html 测试报告——上(详解)
  13. Linux命令学习手册-mount命令
  14. 页面浏览pdf或图片iframe
  15. 西门子200SMART(六)数据块
  16. 安装mysql提示oxc000007b_重装win7系统黑屏提示oxc000007b怎么办
  17. 电机qudong电路
  18. 《四世同堂》金句摘抄(十)
  19. Blackhat 2017Defcon 25学习笔记
  20. 11、Microsoft Visual Studio 2022 Installer Projects踩坑一

热门文章

  1. apicloud加java,【APICloud】App开发中加入系统分享功能案例源码分享
  2. Linux中Web项目部署以及基本指令
  3. 【学习笔记】builtin函数
  4. 修改 messagebox 按钮文字
  5. css a标签去除下划线
  6. CentOS 8 安装视频网站与流媒体直播Nginx-http-flv-module模块
  7. ubuntu修改时区
  8. 春季三月各行业活动营销指南
  9. Linux学习:文件和用户管理——文件管理命令
  10. 梯度回归模型预测PPI