2024年vim的使用
编程笔记
•
2024-11-04 17:55
•
阅读 3
1. 我的vim配置 1 "====================================================== 2 " 我的vimrc 配置 3 "====================================================== 4 set helplang=cn 5 set tags=tags 6 cs add ./cscope.out /home/sundh/temp 7 8 9 set nocompatible " 关闭 vi 兼容模式 10 syntax on " 自动语法高亮 11 colorscheme molokai " 设定配色方案 12 set number " 显示行号 13 set cursorline " 突出显示当前行 14 set ruler " 打开状态栏标尺 15 set shiftwidth=4 " 设定 << 和 >> 命令移动时的宽度为 4 16 set softtabstop=4 " 使得按退格键时可以一次删掉 4 个空格 17 set tabstop=4 " 设定 tab 长度为 4 18 set nobackup " 覆盖文件时不备份 19 set autochdir " 自动切换当前目录为当前文件所在的目录 20 filetype plugin indent on " 开启插件 21 set backupcopy=yes " 设置备份时的行为为覆盖 22 set ignorecase smartcase " 搜索时忽略大小写,但在有一个或以上大写字母时仍保持对大小写敏感 23 set nowrapscan " 禁止在搜索到文件两端时重新搜索 24 set incsearch " 输入搜索内容时就显示搜索结果 25 set hlsearch " 搜索时高亮显示被找到的文本 26 set noerrorbells " 关闭错误信息响铃 27 set novisualbell " 关闭使用可视响铃代替呼叫 28 set t_vb= " 置空错误铃声的终端代码 29 " set showmatch " 插入括号时,短暂地跳转到匹配的对应括号 30 " set matchtime=2 " 短暂跳转到匹配括号的时间 31 set magic " 设置魔术 32 set hidden " 允许在有未保存的修改时切换缓冲区,此时的修改由 vim 负责保存 33 set guioptions-=T " 隐藏工具栏 34 set guioptions-=m " 隐藏菜单栏 35 set smartindent " 开启新行时使用智能自动缩进 36 set backspace=indent,eol,start 37 " 不设定在插入状态无法用退格键和 Delete 键删除回车符 38 set cmdheight=1 " 设定命令行的行数为 1 39 set laststatus=2 " 显示状态栏 (默认值为 1, 无法显示状态栏) 40 set statusline=\ %<%F[%1*%M%*%n%R%H]%=\ %y\ %0(%{&fileformat}\ %{&encoding}\ %c:%l/%L%)\ "设置在状态栏显示的信息 41 set foldenable " 开始折叠 42 set foldmethod=syntax " 设置语法折叠 43 set foldcolumn=0 " 设置折叠区域的宽度 44 setlocal foldlevel=1 " 设置折叠层数为 45 " set foldclose=all " 设置为自动关闭折叠 46 nnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<CR> " 用空格键来开关折叠 47 set history=100 "设置在命令行显示多少历史记录 48 "set mouse=a 49 set iskeyword+=_,$,@,%,#,- 50 set so=7 " set 7 lines to the cursors( when moving vertical...) 光标距文本框下端有7行的距离 51 52 53 "设置leader伟, 54 let mapleader="," 55 let g:mapleader="," 56 57 "配置多语言系统 58 if has("multi_byte") 59 " UTF-8 编码 60 set encoding=utf-8 61 set termencoding=utf-8 62 set formatoptions+=mM 63 set fencs=utf-8,gbk 64 65 if v:lang =~? '^\(zh\)\|\(ja\)\|\(ko\)' 66 set ambiwidth=double 67 endif 68 69 if has("win32") 70 source $VIMRUNTIME/delmenu.vim 71 source $VIMRUNTIME/menu.vim 72 languag messages zh_CN.utf-8 73 endif 74 else 75 echoerr "Sorry,this version of (g)vim was not compiled with +multi_byte" 76 endif 77 78 79 80 " Buffers操作快捷方式!(多文件切换) 81 nnoremap <C-RETURN> :bnext<CR> 82 nnoremap <C-S-RETURN> :bprevious<CR> 83 84 " " Tab操作快捷方式! 85 nnoremap <C-TAB> :tabnext<CR> 86 nnoremap <C-S-TAB> :tabprev<CR> 87 "关于tab的快捷键 88 " map tn :tabnext<cr> 89 " map tp :tabprevious<cr> 90 " map td :tabnew .<cr> 91 " map te :tabedit 92 " map tc :tabclose<cr> 93 94 set completeopt=longest,menu 95 96 97 ""----------------------------------------------------------------- 98 " plugin - taglist.vim 99 " "----------------------------------------------------------------- 100 let Tlist_Show_One_File = 1 101 let Tlist_Use_Right_Window = 1 102 let Tlist_Exit_OnlyWindow=1 103 let Tlist_Auto_Open=1 104 let Tlist_File_Fold_Auto_Close=1 " 自动折叠当前非编辑文件的方法列表 105 let Tlist_Auto_Update = 1 106 let Tlist_Hightlight_Tag_On_BufEnter = 1 107 let Tlist_Enable_Fold_Column = 0 108 let Tlist_Process_File_Always = 1 109 let Tlist_Display_Prototype = 0 110 let Tlist_Compact_Format = 1 111 " silent 的作用是在命令行输入栏中不显示对应的命令,即Tlist 112 nmap <silent> tl :Tlist<cr> 113 114 ""----------------------------------------------------------------- 115 " plugin - winmanager.vim 116 " "----------------------------------------------------------------- 117 let g:winManagerWindowLayout='FileExplorer|Taglist' 118 nmap wm :WMToggle<cr> 119 120 121 ""----------------------------------------------------------------- 122 " plugin - cscope.vim 123 " "----------------------------------------------------------------- 124 set cscopequickfix=s-,c-,d-,i-,t-,e- "设定是否使用 quickfix 窗口来显示 cscope 结果 125 nmap <C-\>s :cs find s <C-R>=expand("<cword>")<CR><CR> 126 nmap <C-\>g :cs find g <C-R>=expand("<cword>")<CR><CR> 127 nmap <C-\>c :cs find c <C-R>=expand("<cword>")<CR><CR> 128 nmap <C-\>t :cs find t <C-R>=expand("<cword>")<CR><CR> 129 nmap <C-\>e :cs find e <C-R>=expand("<cword>")<CR><CR> 130 nmap <C-\>f :cs find f <C-R>=expand("<cfile>")<CR><CR> 131 nmap <C-\>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR> 132 nmap <C-\>d :cs find d <C-R>=expand("<cword>")<CR><CR> 133 nmap <F4> :cw<cr> 134 135 136 ""----------------------------------------------------------------- 137 " plugin - minibufexpl.vim 138 " "----------------------------------------------------------------- 139 "minibufexpl 插件的一般设置 140 let g:miniBufExplMapCTabSwitchBufs = 1 "<C-Tab> <C-S-Tab> 切换buffer 141 let g:miniBufExplMapWindowNavVim = 1 "<C-h,j,k,l> 切换上下左右的窗口 142 let g:miniBufExplMapWindowNavArrows = 1 "<c-箭头键> 切换到上下左右窗口 143 let g:miniBufExplModSelTarget=1 144 "let g:miniBufExplorerMoreThanOne=0 145 146 147 148 ""----------------------------------------------------------------- 149 " plugin - a.vim c/h文件间相互切换 150 " "----------------------------------------------------------------- 151 " :A 在新Buffer 中切换到c\h 文件 152 " :AS 横向分割窗口并打开c\h 文件 153 " :AV 纵向分割窗口并打开c\h 文件 154 " :AT 新建一个标签页并打开c\h 文件 155 156 157 ""----------------------------------------------------------------- 158 " plugin - grep.vim 在工程中查找字符串 159 " "----------------------------------------------------------------- 160 " 在要查找字符串上面按F3就可以查找了。 161 nnoremap <silent> <F3> :Grep<CR> 2.vim快捷键 常用命令: To undo previousactions, type: u (lowercase u) To undo all thechanges on a line, type: U (capital U) To undo the undo's,type: CTRL-R y 复制(copy) p 粘贴(paste) Ctrl-g 在下面命令栏显示文件名,行号, G 光标移动到最底端 gg 光标移动到最前面 行号+G 跳转到你指定的行 /+字符串 或者 ?+字符串 搜索字符串 % 在 (,[,{ 上按下 % 可以跳转到 },],) :s/old/new <enter> 某行old匹配的第一个字符串替换 :s/old/new/g <enter> 某行所有字符串替换 :%s/old/new/g <enter> 某个文件所有字符串替换 :!+非vim的命令 Vim编辑器中可以用这样的方式执行非vim的命令。 例如:!ls, :!dir等。 :make这个命令是vim可以识别的。 Ctrl+w两次 可以实现窗口间的跳转 CTRL-O 和 CTRL-I 来回跳转 Ctrl+] 当光标在某个函数或变量上时, 按下" Ctrl+]", 光标会自动跳转到其定义处 Ctrl-T 正好与ctrl+] 相反 % 跳转到配对的括号去 [[ 跳转到代码块的开头去(但要求代码块中'{'必须单独占一行) gD 跳转到局部变量的定义处 '' 跳转到光标上次停靠的地方, 是两个', 而不是一个" mx 设置书签,x 只能是a-z 的26 个字母 `x 跳转到书签处("`"是1 左边的键) > 增加缩进,"x>"表示增加以下x 行的缩进 < 减少缩进,"x<"表示减少以下x 行的缩进 浏览TagList窗口时,如果还不想让源码跳转, 但是想看看tag 在源码中完整的表达, 可以将光标移到你想要看的tag 上,如图中上边黄色的方框, 然后按下空格键, 在下面的命令栏会显示该tag 在源码中完整的写法, 而不会跳转到源码处。 vim项目创建添加命令: $cd /home/wooin/vim71 $ctags -R l $cscope -Rbq l :csadd /home/wooin/vim71/cscope.out /home/wooin/vim71 <cr>表示回车符 通过vim打开项目文件后,按tl可以显示taglist。 Ctrl-w,hj k l 向"左,下,上,右"切换窗口. cscope的主要功能是通过同的子命令"find"来实现的 (ctrl + shift + -)g/s/d/c/t "cscopefind"的用法: csfind c|d|e|f|g|i|s|t name 0或 s 查找本 C 符号(可以跳过注释) 1或 g 查找本定义 2或 d 查找本函数调用的函数 3或 c 查找调用本函数的函数 4或 t 查找本字符串 6或 e 查找本 egrep 模式 7或 f 查找本文件 8或 i 查找包含本文件的文件 's' symbol: find all references to the token under cursor 'g' global: find global definition(s) of the token undercursor 'c' calls: find allcalls to the function name under cursor 't' text: find allinstances of the text under cursor 'e' egrep: egrepsearch for the word under cursor 'f' file: open thefilename under cursor 'i' includes: find files that include the filename undercursor 'd' called: find functions that function under cursorcalls :cw打开QuickFix窗口 (或者是F4) :ccl 关闭QucikFix 窗口 F3 可以用正则表达式的查找,功能比vim自带的grep功能强大。 Vim 程序在 /usr/share 文件夹下。 删除多列: 进入vi命令模式,将光标定位在第1行第1列位置,按ctrl+v键进入visiual block模式,将光标移动到第10行第10列,按x键删除。 缩进缩出 按v进入visual状态,选择多行,用shift+>或shift+< 缩进或缩出。或者不 进入visual,在当前行用shift+>> 或者 shift+<< 在命令状态下对当前行用==(连按=两次),或对多行用n==(n是自然数)表示自动 缩进从当前行起的下面n行。你可以试试把代码缩进任意打乱再用n==排版,相当于一 般IDE里的codeformat。 使用gg=G可对整篇代码进行排版。 ctrl+s可以暂停终端运行, ctrl+q后恢复继续运行。 Ctrl+d 相当于exit命令,退出当前会话。 Ctrl+c 中止当前正在执行的程序。 Ctrl+z 将当前运行的程序放到后台运行。与运行时加 &类似。 折叠命令: zm 关闭折叠 zM 关闭所有 zr 打开 zR 打开所有 3. vim技巧 http://linux.chinaunix.net/techdoc/desktop/2009/07/06/1122020.shtml 1.全字匹配:\< 匹配单词词首 \> 匹配单词词尾 例如: 查询 four 字符串 输入: /\<four\> -------------------------------------------------------------------------------- 2.将注释替换成一个空行 :%s/\/\*\_.\{-}\*\///g -------------------------------------------------------------------------------- 每行输入到70个字符就自动换行 在VIM配置文件 _vimrc 中添加 set textwidth = 70 对于已有文本,在normal mode输入 :set textwidth=70 gqG 对全文本自动进行70字符后换行处理。 r -------------------------------------------------------------------------------- 在vim中输入/ 或者 : 后, CTR+R CTR+W 可以直接复制当前光标下的单词到命令行 -------------------------------------------------------------------------------- 如果粘贴一个代码,前面多出了// 注释符。 可以这样解决: 先在vim中输入 :set paste, 然后把代码粘贴过来, 之后再 :set nopaste -------------------------------------------------------------------------------- 窗口大小调整 纵向调整 :ctrl+w + 纵向扩大(行数增加) :ctrl+w - 纵向缩小 (行数减少) :res(ize) num 例如::res 5,显示行数调整为5行 :res(ize)+num 把当前窗口高度增加num行 :res(ize)-num 把当前窗口高度减少num行 横向调整 :vertical res(ize) num 指定当前窗口为num列 :vertical res(ize)+num 把当前窗口增加num列 :vertical res(ize)-num 把当前窗口减少num列 -------------------------------------------------------------------------------- *(#) 当光标停留在某个单词上时, 输入这条命令表示查找与该单词匹配的 下(上)一个单词. 同样, 再输入 n 查找下一个匹配处, 输入 N 反方 向查找. g*(g#) 此命令与上条命令相似, 只不过它不完全匹配光标所在处的单词, 而 是匹配包含该单词的所有字符串. gd 本命令查找与光标所在单词相匹配的单词, 并将光标停留在文档的非 注释段中第一次出现这个单词的地方. -------------------------------------------------------------------------------- c-f (即 ctrl 键与 f 键一同按下) 本命令即 page down. c-b (即 ctrl 键与 b 键一同按下, 后同) 本命令即 page up. '' (两个') 此命令相当有用, 它移动光标到上一个标记处, 比如用 gd, * 等查 找到某个单词后, 再输入此命令则回到上次停留的位置. '. 此命令相当好使, 它移动光标到上一次的修改行. `. 此命令相当强大, 它移动光标到上一次的修改点. -------------------------------------------------------------------------------- :12,23s/^/#/ 将从12行到23行的行首加入 # 字符 :%s= *$== 将所有行尾多余的空格删除 :g/^\s*$/d 将所有不包含字符(空格也不包含)的空行删除. -------------------------------------------------------------------------------- vim 鼠标右键无法复制 配置文件中的set mouse=a启动了所有模式, vim接管了鼠标的控制。 鼠标事件有两种处理方式,程序处理和 X 处理。 如果 X 负责处理,则是左键选择,中间粘贴。 要让 vim 中由 X 负责处理,有两个方法: 1. 按住 shift 键,然后选择,此时由 X 处理该选择,copy 选项就 enable 了。如果放掉shift键,则由 vim 处理该选择。 2. 在 .vimrc 中设置 set mouse= (就是说清空),此时vim永远不再干涉鼠标选择,永远把处理权交给 X,这个时候鼠标就处于无模式编辑状态, 当然也能用鼠标来切换vim里面的tab窗口了,vim中的编辑光标也不会跟随鼠标了。 -------------------------------------------------------------------------------- 4.spf-vim 运行 1.执行命令: sudo curl https://j.mp/spf13-vim3 -L > spf13-vim.sh && sh spf13-vim.sh 或者从https://github.com/spf13/spf13-vim下载spf13-vim-3文件夹, 直接点击运行 ./bootstrap.sh。 ( spf13-vim.sh 和 bootstrap.sh里面的内容是一样的。 2. 修改spf13-vim.sh 文件,REPO_URI='https://github.com/spf13/spf13-vim.git' 改为 REPO_URI='git://github.com/spf13/spf13-vim.git' VUNDLE_URI="https://github.com/gmarik/vundle.git" 改为 VUNDLE_URI="git://github.com/gmarik/vundle.git" 2. sh spf13-vim.sh 运行脚本, 开始下载插件,会出现插件下载不动,程序卡死的情况。 3.点击ctrl+C, 点击回车键,退出VI。 4.需要单独执行 vim +BundleUpdate 就可以继续下载插件了。它会读取$HOME/.vimrc.bundles 文件,并下载相应的插件 (可以重复多执行步骤3和4) 建议: 删除~/.vimrc中的spell on,这玩意注释掉都没用,用起来很狗血 在~/.vimrc.local中加入color molokai 搜索tree,找到C-e,改成C-t, 否则与原来快捷键冲突 BTW, gg=G 可以自动整理代码格式 5. spf13默认配置少了一个buffer管理器,当需要打开历史文件时很麻烦,这里推荐TabBar(也可以使用minibufferexplorer??) 另外,gnome的终端颜色个数也需要配置下,插件csapprox-terminal只支持88/256两种颜色. CSApprox skipped; terminal only has 8 colors, not 88/256 Try checking :help csapprox-terminal for workarounds Undotree <leader>u NERDTree <c-e> 开启/关闭 <leader>e或者<leader>nt 开启,并显示当前文件所在目录树 ctrlp <c-p> 显示匹配找过的文件或者已经打开的文件或者最近使用过的文件 NERDCommenter <leader>c<space> 在正常模式下后者visual模式下给代码前加 // , 注释代码 neocomplcache 自动显示剩余字符串。 按 tab 进行切换, 点击<c-k>显示可能的snippet。 Fugitive 这个命令只有在目录设置了git,才有用。 版本控制 Tabularize 代码格式排列 <leader>a= / <leader>a: / <leader>a:: / <leader>a, Tagbar 在右侧显示tag <leader>tt EasyMotion <leader><leader>w 把第一个word字母标记成"abcdefghijklmnopqrstuvwxyz"