MAC下使用终端里的VIM
2020年4月2日,MACOS10.15.4。
学习vim推荐这个慕课的免费教程https://www.imooc.com/learn/1129
第一步:在终端下载安装brew
- 在终端复制粘贴此自动脚本 :
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
- 本人选的中科大下载源
3.想用brew安装某软件则brew install XXX
卸载为brew uninstall XXX
第二步:利用brew安装最新的gcc,gdb
安装gcc
安装最新的gcc这一步可以跳过。
gcc用来编译你的.cpp文件,在终端输入brew install gcc
即可安装最新的gcc。
注意 mac自带的gcc实际上是clang,当你想编译如a.cpp文件时,输入g++ -Wall -g -o a a.cpp
时调用的其实是clang,在安装完最新的gcc后终端输g++-9 -Wall -g -o a a.cpp
(我现在安装的gcc是9.3版,故输g++ -9),同理对.c文件用gcc-9 -Wall -g -o a a.c
。g++是包含在gcc中的,终端输gcc用来编译.c,输g++用来编译.cpp。
-w的意思是关闭编译时的警告,也就是编译后不显示任何warning,因为有时在编译之后编译器会显示一些例如数据转换之类的警告,这些警告是我们平时可以忽略的。
-Wall意思是编译后显示所有警告,养成好习惯编译一定要加上它。
-W类似-Wall,会显示警告,但是只显示编译器认为会出现错误的警告。
-g 可执行程序包含调试信息,不加的话之后调试时会出问题
-o 指定输出文件名,如g++-9 -Wall -g -o a a.cpp
,生成的可执行文件名就是a。
-c 只编译不链接,使用命令如gcc -c a.c -o a
,这样得到的是.o文件,而不是可执行程序,此时输./a运行它就会报cannot execute binary file: Exec format error
错误!此时应改用gcc a.c -o a
就可以了。
若不安装gcc,mac下也可直接输gcc和g++,不过实际调用clang和clang++。
安装gdb
1.安装
gdb用来调试debug,在终端输入brew install gdb
即可安装最新的gdb。 目前本人装的是9.1版。
具体安装过程见https://blog.csdn.net/github_33873969/article/details/78511733?utm_source=blogxgwz0
2.BUG
安装最新的gdb这一步也可以跳过,gdb的bug不少,经常在debug时输入东西的时候卡死,按Ctrl/Command + I显示已停止
而且想用gdb调试必须在终端输sudo gdb a
(a为文件名),每次还要输密码,想不输密码的话,打开命令窗口输入命令sudo visudo
,并将注释 %admin ALL=(ALL) ALL
,改为 %admin ALL=(ALL) NOPASSWD: NOPASSWD: ALL
3.STL容器支持
使用gdb调试程序会发现它对stl容器的支持很差(调试时输p v[1][1]
可以看到单个元素的值,不能直接p v
看所有的元素),这一点可以详见https://sourceware.org/gdb/wiki/STLSupport进行改善。可是我用该网站第一种方法还是不行,由https://blog.csdn.net/wj1066/article/details/83690177?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task可能是gdb没有支持python,需要重新安装编译gdb并使用如下参数./configure --with-python
,只能用第二种方法,就是在进入调试后输入source XXX
(XXX为脚本路径名),之后就能用pvector v(具体用法 source XXX
后输help pvector
,help pmap
等查看)等打印。用第二种方法还要注意之前编译时一定要用g++-9,gcc-9
而不能g++,clang,gcc
,否则出现There is no member or method named _M_impl.
报错(第二种方法对二维vector数组的支持还是不行)。
4.还不如直接用lldb
mac下可直接调用xcode的lldb,终端输lldb XXX
(XXX为文件路径)。lldb有一个很大的优势就是对stl容器的支持非常不错还不用加sudo
,调试过程中输入p v(假设你的vector数组名为v),就可以直接将值显示出来,甚至对二维vector数组也支持的很好。
第三步:安装最新的vim及vim配置
安装vim
终端输brew install vim
,输vim -v
可查看当前版本,我目前是8.2.450
修改.vimrc及安装插件
详见https://www.jianshu.com/p/9fa9bedc259a(不用这篇文章中使用vundle安装插件部分的方法,但它推荐的几个插件都不错,其中nerdtree不能定位软连接的当前文件)
为了让autopairs也能自动配对<>,加上下列代码
let g:AutoPairs = {'(':')', '[':']', '{':'}',"'":"'",'"':'"', "`":"`", '```':'```', '"""':'"" "', "'''":"'''",'<':'>'}
关于vundle下安装youcompleteme的建议参考https://www.jianshu.com/p/f2b0fa840973
vundle 命令
安装插件
:BundleInstall
更新插件
:BundleUpdate
清除不需要的插件
:BundleClean
列出当前的插件
:BundleList
搜索插件
:BundleSearch
注意
插件配置不要在 call vundle#end() 之前,不然插件无法生效
如果配置错误,需要重新配置后,在vim中运行 :PluginInstall
安装 YouCompleteMe
使用 Vundle 安装 YouCompleteMe
在.vimrc中添加如下内容(终端输vim ~/.vimrc
即可进入),位置在call
vundle#begin(
)和call vundle#end()
之间
Bundle 'Valloric/YouCompleteMe'
在vim中运行命令
:BundleInstall
推荐用以上修改.vimrc的方法安装插件
用vundle安装插件时,在.vimrc先用vim进随便一个文件,然后输:PluginInstall
,会出现上图最后一行的processing XXXXX,这就是在下载安装你的插件,可能需要等一段时间。但注意youcompleteme这个补全插件较大,建议挂代理,否则可能会下载不了,下载完后还要编译。
youcompleteme
使用代理后,我用了大概一个小时才下载完YCM,下载完后提示The ycmd server SHUT DOWN (restart with :YcmRestartServer),见https://blog.csdn.net/weixin_30617797/article/details/94850372。
解决后需在终端根目录安装CMake进行编译brew install CMake
。之后选择安装你需要的语义支持的版本
带 C-family languages 语义支持的版本
cd ~/.vim/bundle/YouCompleteMe
./install.sh --clang-completer
不带 C-family languages 语义支持的版本
cd ~/.vim/bundle/YouCompleteMe
./install.sh
带 C# 语义支持的版本
cd ~/.vim/bundle/YouCompleteMe
./install.sh --omnisharp-completer
带 Go 语言语义支持的版本
cd ~/.vim/bundle/YouCompleteMe
./install.sh --gocode-completer
之后在.vimrc中添加配置
"下面两行代码在网站上搜的用来解决NoExtraConfDetected: No .ycm_extra_conf.py file detected报错
let g:ycm_global_ycm_extra_conf = '~/.vim/.ycm_extra_conf.py'
" 不显示开启vim时检查ycm_extra_conf文件的信息
let g:ycm_confirm_extra_conf=0
" 自动补全配置
set completeopt=longest,menu "让Vim的补全菜单行为与一般IDE一致(参考VimTip1228)
autocmd InsertLeave * if pumvisible() == 0|pclose|endif "离开插入模式后自动关闭预览窗口
inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<CR>" "回车即选中当前项
"上下左右键的行为 会显示其他信息
inoremap <expr> <Down> pumvisible() ? "\<C-n>" :