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
# 上面是永久配置, 下面是临时配置, 可能升级之后就没有了:
sudo update-alternatives --config editor                  # 手动选择
sudo update-alternatives --set editor /usr/bin/vim.basic  # 自动选择

man update-alternatives     # 參考文件:
select-editor               # for crontab
View Code

  忘记使用 sudo 权限编辑文件后保存:

:w ! sudo tee %

2. ctags的使用

  基于 ctags 的搜索是正则匹配而不是语法, 临时使用. 使用 lsp 服务的才是最好的做法

  参考    配置 golang 参考

①. 从项目的根目录开始遍历生成 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进制的修改会生效。

  补充:

一、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 换行符
Vim和Hexdump

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 来避免转义。

 

posted @ 2019-07-22 12:06  AlexOne  阅读(631)  评论(0编辑  收藏  举报