mac下用vim写c/c++踩的坑

MAC下使用终端里的VIM

2020年4月2日,MACOS10.15.4。
学习vim推荐这个慕课的免费教程https://www.imooc.com/learn/1129

第一步:在终端下载安装brew

  1. 在终端复制粘贴此自动脚本/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
  2. 本人选的中科大下载源
    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 pvectorhelp 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的方法安装插件
mac下用vim写c/c++踩的坑_第1张图片用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() ? "\" : "\" "回车即选中当前项
"上下左右键的行为 会显示其他信息
inoremap <expr> <Down> pumvisible(

你可能感兴趣的:(vim,macos)