vim 配置
1. vim配置文件
VimTip VimCdoc Vimcdoc Vim7.4 ccls
~/.vimrc使用双引号进行注释,~/.viminfo文件会对一些配置项进行记录。
# 这个配置成vim,终端里面 git 或者 ctrl+xe 的打开编辑器默认就是vim了
echo 'update-alternatives --set editor /usr/bin/vim.basic' | sudo tee -a /etc/profile
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 上面是永久配置, 下面是临时配置, 可能升级之后就没有了: sudo update-alternatives --config editor # 手动选择 sudo update-alternatives --set editor /usr/bin/vim.basic # 自动选择 man update-alternatives # 參考文件: select-editor # for crontab
忘记使用 sudo 权限编辑文件后保存:
:w ! sudo tee %
2. ctags的使用
基于 ctags 的搜索是正则匹配而不是语法, 临时使用. 使用 lsp 服务的才是最好的做法
①. 从项目的根目录开始遍历生成 tags 文件:ctags -R ②. 在 ~/.vimrc 文件添加: se tag=tags; "自动查找父目录的tags文件, 注意分号不能少 se nocst "直接跳转到定义处, 不设置则先显示搜索列表 se acd "自动切换工作目录
Mac上xcode的ctags的使用:
ctags *
find `pwd` -type f -exec ctags -adtwf tags {} \;
ctags 太费劲了,用qmake查看代码:qmake -project 生成 pro 文件即可。
3. 实用快捷键
*/# 搜索上一个/下一个 n/N 跳转到上一个/下一个搜索 ctrl + ] 跳转到定义处(依赖ctags文件) ctrl + t 跳回调用处(依赖ctags文件) [ + ctrl + i 跳转到声明处 ctrl + i/o 光标前进/回退 g + f 打开文件/路径 g + d 跳到定义处/首次出现的地方 ctrl +g 显示文件总行数 ctrl + p/n 插入上个/下个匹配 ctrl + w 删除光标前的一个单词 ctrl + u 删除当前行所有 ctrl + d/t 行首插入、删除一个缩进 y + i + " 拷贝"xxx"内的内容,i为内,a为包含 y + i + t 光标放到 html tag名字上,将把标签的value复制到剪切板 y + f + t 复制当前行上光标到第一个t之间的所有内容%s/^/xxx 每行的行首都添加xxx %s/$/xxx 每行的行尾都添加xxx ctrl + a/x 数字增/减 g + a 显示10进制、16进制、8进制 g + U/u + w 单词大/小写转换 '0 跳到上次退出的地方 shift + v + U/u 整行转换为大/小写 u 撤销操作 ctrl + r 重做(windows系统是ctrl + y重做,不用搞反了)
关于行尾模式:
① 置于行首 ② 按 shift+ v
③ 向上/下选中你要操作的行 ④ 按 a 或 end + i 或 end + a 或 → 键移动到想要标定的位置 ⑤ 输入内容 ⑥ esc + esc
以上按右方向键(因为文本是左对齐的, 所以第一行的末尾要预留足够的位置),输入的内容在标定位置整齐排成一列。
按 end + a, 输入分号或者 xxx 内容顺序追加到内容末尾。两种行尾模式效果见下图:
列编辑模式
ctrl+v shift+i Esc Esc # 通常用于多行注释
插入模式:
i 在光标所在位置插入字符
I 在光标所在行的行首插入字符
o 在光标所在行的下一行新行插入字符
O 在光标所在行的上以行新行插入
s 删除光标所在字符并插入字符
S 删除光标所在行并插入字符
a 光标所在字符的下一个字符插入
A 光标所在行的行尾插入字符
4. 命令行模式与 git difftool 的使用
查看帮助 : help set 查看寄存器 : reg 查看标签 : marks 执行命令 : !sh compile.sh 查看配色方案 : hi
vim的正则: 参考
删除全为空的一行:g#^\s*$#d。\s同样可以用\t代替,同时为了更通用,可以使用posix标准的表达式代替都是ok的,也可以用集合的形式表示。
g就是%s,d就是删除。所以可以用规则的方法代替:%s#^\s*$##g
注意sed命令的&的使用技巧。
git 如何配合 vimdiff 使用:
git config --global diff.tool vimdiff git config --global difftool.prompt false git config --global alias.d difftool
然后使用 git d 或 git d HEAD HEAD^ 打开对比代码,修改后用 :wq 保存继续比较下一个文件,:wqa 退出全部窗口,ctrl + w 切换窗口进行编辑。注意修改只对工作区的生效。
5. 文件查看
十六进制查看:vim -b filename打开文件然后:%!xxd
二进制查看:%!xxd -r
只有16进制的修改会生效。
补充:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
一、vim下显示16进制数据 :%!xxd -g 1 表示每1个字节为1组 :%!xxd -g 2 表示每2个字节为1组(默认) :%!xxd -g 4 表示每4个字节为1组 :%!xxd -r 将vim恢复成原来的显示 man xxd可以获得xxd的帮助文件 二、hexdump显示16进制数据 hexdump可以以16进制形式显示文件内容,比如一个内容为01234567890的文件 记住一个用法即可(-C): hexdump a -C 00000000 30 31 32 33 34 35 36 37 38 39 30 0a |01234567890. | 0000000c 红色部分是对应的16进制 和 ascii码 \r --> 0x0d 回车符 \n --> 0x0a 换行符
6. 主题设置
se t_Co=256 " 背景配色方案 hi Normal guifg=#c0c0c0 guibg=#000040 ctermfg=7 ctermbg=black " 行号的显示配色
" hi LineNr ctermfg=214 ctermbg=238
hi LineNr ctermfg=222 ctermbg=238
7. 基本设置
syn on se fdm=indent "代码自动折叠方法 se tag=tags; "ctags 文件 se nu "设置行号 se cul "水平光标 se cuc "垂直光标 se sm "高亮显示括号匹配 se acd "自动切换工作目录 se ts=4 "设置tab的长度为四个空格的长度,编码依然是tab se et "expand tab,将tab从编码上替换为空格键,不影响 < 或 > 缩进的长度 se sts=4 "够tab的长度补tab,不够tab的长度补空格 se sw=4 "shiftwidth 设置 < 或 > 一次缩进为4个空格 se ai "自动缩进 se si "智能缩进 se hls "高亮显示搜索结果 se ic "忽略大小写 se is se aw se nocst se clipboard=unnamed se wildmode=list:longest se mouse=a se mousemode=popup se selectmode=mouse,key
"about fileencodings: se fencs=utf-8,gbk,utf-16,big5 se helplang=cn se encoding=cp936 se fileencoding=cp936
8. 设置头文件模板
autocmd BufNewFile *.c,*.cc,*.cpp exec ":call SetTemplate()" func SetTemplate() call setline(1,"/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ") call append(line("."), "\* Author: Alex") call append(line(".")+1, "\* mail: abnk@qq.com") call append(line(".")+2, "\* File Type: ".&ff." Name: ".expand("%")) call append(line(".")+3, "\* Created Time: ".strftime("%Y-%m-%d %H:%M %S")) " %c call append(line(".")+4, "*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */") if (&filetype == 'cpp' || &filetype == 'cc') call append(line(".")+5, "#include\<iostream\>") call append(line(".")+6, "using namespace std;") endif if &filetype == 'c' call append(line(".")+5, "#include\<stdio.h\>") call append(line(".")+6, "#include\<stdlib.h\>") endif call append(line(".")+7, "int main(int argc,char *argv[],char *env[])") call append(line(".")+8, "{") call append(line(".")+9, " ") call append(line(".")+10, " return 0;") call append(line(".")+11,"}") autocmd BufNewFile * normal G endfunc
9. 设置状态栏
"显示行号,列号 "se stl+=%1*\ %l%* "hi User1 cterm=bold ctermfg=130 ctermbg=0 "显示文件浏览百分比 se stl+=%2*\ %P\ %* hi User2 cterm=bold ctermfg=9 ctermbg=121 "显示文件名 se stl+=%3*\ %f\ %* hi User3 cterm=none ctermfg=red ctermbg=256 se stl+=%< se stl+=%5*\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ %* hi User5 cterm=none ctermfg=0 ctermbg=0 se stl+=%= "显示文件编码类型 se stl+=%6*\ %{\"\".(&fenc==\"\"?&enc:&fenc).((exists(\"+bomb\")\ &&\ &bomb)?\",B\":\"\").\"\"}\ %* hi User6 cterm=bold ctermfg=172 ctermbg=256 "显示系统时间 se stl+=%9*%{strftime(\"%m.%d\")}%* hi User9 cterm=bold ctermfg=6 ctermbg=242 "gray se stl+=%5*\ %* se stl+=%7*\ %{strftime(\"%H:%M\")}\ %* hi User7 cterm=bold ctermfg=1 ctermbg=34 se ls=2
10. 颜色对照表
11. 补充技巧
在.vimrc中添加上这一行:
iab xtime <c-r>=strftime("Alex %Y-%m-%d %H:%M:%S")<cr>
然后输入xtime即可插入作者、时间。xtime可以换成其它的。
实际上,这就是缩写:https://blog.csdn.net/lalor/article/details/7288553
搜索与修改技巧:https://www.cnblogs.com/ifantastic/p/3826433.html
12. 空格和Tab的替换
① 查看文本中所有的tab和空格
se list
② 将tab替换为4个空格
:set ts=4
:set expandtab
:%retab! "加!是用于处理非空白字符之后的TAB,即所有的TAB,若不加!,则只处理行首的TAB
13. 我的简洁配置
去除无用的空格:参考
关于 filetype 的问题
se nu se si se sw=4 "按==或>>后缩进为4 se st=4 se sts=4 se et "ts和et联用就是替换tab键。 se tag=tags; se nocst se acd se hls "高亮搜索 syn on se backspace=2 "针对删除键失效的配置
se mouse-=a
" 打开到上次退出的地方。快捷键'0代替,或者 ctrl + o 回退光标 if has("autocmd") autocmd BufReadPost * \ if line("'\"") > 0 && line("'\"") <= line("$") | \ exe "normal g`\"" | \ endif endif
" 自动去除无用的空格
function! <SID>StripTrailingWhitespaces() let l = line(".") let c = col(".") %s/\s\+$//e call cursor(l, c) endfun
autocmd BufWritePre * :call <SID>StripTrailingWhitespaces() " autocmd BufWritePre *.h,*.c,*.cc,*.cpp,*.java :call <SID>StripTrailingWhitespaces()
filetype plugin indent on " 解决 template 不生效的问题 autocmd BufNewFile *.c,*.cc,*.cpp exec ":call SetTemplate()" func SetTemplate() call setline(1,"/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ") call append(line("."), "\* Author: Alex") call append(line(".")+1, "\* mail: abnk@qq.com") call append(line(".")+2, "\* File Type: ".&ff." Name: ".expand("%")) call append(line(".")+3, "\* Created Time: ".strftime("%Y-%m-%d %H:%M %S")) " %c call append(line(".")+4, "*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */") if (&filetype == 'cpp' || &filetype == 'cc') call append(line(".")+5, "#include\<iostream\>") call append(line(".")+6, "using namespace std;") endif if &filetype == 'c' call append(line(".")+5, "#include\<stdio.h\>") call append(line(".")+6, "#include\<stdlib.h\>") endif call append(line(".")+7, "int main(int argc,char *argv[],char *env[])") call append(line(".")+8, "{") call append(line(".")+9, " ") call append(line(".")+10, " return 0;") call append(line(".")+11,"}") autocmd BufNewFile * normal G endfunc
14. MacOS 安装 ctags
使用代理:参考
brew install ctags -exuberant
15. 一种获取函数签名的方法
ctags --languages=c -R * egrep -o "\^[^$]+)" tags egrep -o "\^[^$]+);" tags #单纯获取声明
以上,没有搜到头文件的函数声明,还是比较靠谱的。如此,便可以辅助快速将一个较大的项目转换成cpp的项目了。
其它:
nm ' [TW] ' ./obj | grep func_name
readelf -Ws a.out | grep FUNC
16. 替换操作
# 以下命令将文中所有的字符串old替换成new: :1,$s/old/new/g
# 通常我们会在命令中使用%指代整个文件做为替换范围: :%s/old/new/g
# 以下命令指定只在第5至第15行间进行替换: :5,15s/old/new/g
# 以下命令指定只在当前行至文件结尾间进行替换: :.,$s/old/new/g
# 以下命令指定只在后续9行内进行替换: :.,.+8s/old/new/g
# 你还可以将特定字符做为替换范围。比如,将SQL语句从FROM至分号部分中的所有等号(=)替换为不等号(<>): :/FROM/,/;/s/=/<>/g
# 在可视化模式下,首先选择替换范围, 然后输入:进入命令模式,就可以利用s命令在选中的范围内进行文本替换。 注意:s/old/new/g 可以使用 s#old#new#g 来避免转义。