vim也是platformio的IDE
知道platformio很久了,但是一直没时间玩耍,最近有时间了,又研究了一番,platformio也为vim用户提供了一些可用的姿势,本篇文章就分享一下vim与pio的配合好戏!
初始化工程
这里以Arduino uno
为例,可以使用以下命令初始化工程,哦,对了,之前先切换到工程目录:
pio init --ide vim -b <ID>
其中,<ID>
代表板子的ID,可以通过命令pio boards
列出所有的板子ID,选择自己使用的,所以可以执行以下命令初始化:
pio init --ide vim -b uno
此时会发现生成了一下文件:
.
├── .clang_complete
├── .gcc-flags.json
├── .gitignore
├── .pioenvs
│ ├── do-not-modify-files-here.url
│ └── structure.hash
├── .travis.yml
├── lib
│ └── readme.txt
├── platformio.ini
└── src
3 directories, 8 files
其中.clang_complete
用于代码补全,后面会告诉你如何利用这个文件。
为了方便编译和上传等,可以创建文件Makefile
,内容如下:
all:
platformio -f -c vim run
upload:
platformio -f -c vim run --target upload
clean:
platformio -f -c vim run --target clean
program:
platformio -f -c vim run --target program
uploadfs:
platformio -f -c vim run --target uploadfs
update:
platformio -f -c vim update
那么以后在工程目录下,执行make all
就可以编译了,如此简单!
添加源代码
在目录src
下新建文件main.cpp
,内容可以添加如下:
#include <Arduino.h>
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("What?");
delay(500);
Serial.println("Hello, world!");
delay(1000);
}
编译工程
为了方便在vim下编辑代码时可以编译工程,这里可以添加快捷键,在~/.vimrc
中添加如下内容:
nnoremap <C-b> :make<CR>
这样可以按快捷键ctrl+b
编译工程了。
代码补全
有两种方法,一个是使用YouCompleteMe,一个是使用插件completor,这两种方式任选其一即可,这里强烈建议使用后者 completor.vim,因为配置方便,安装轻量。
completor.vim
如果您使用的vim版本是8.0+,那么可以看一下 vim插件管理工具pack 了解一款新的vim插件管理工具,当然也可以使用其他的管理工具,这里说一下使用 pack 安装,非常简单:
$ pack install maralla/completor.vim
确保已经安装 clang,自行搜索安装方法。
查看clang
安装目录:
➜ which clang
/usr/bin/clang
最后一步,配置插件所需要的 clang
路径即可,可以在 .vimrc
中添加配置:
let g:completor_clang_binary = '/usr/bin/clang'
map <leader>jj <Plug>CompletorCppJumpToPlaceholder
imap <leader>jj <Plug>CompletorCppJumpToPlaceholder
⚠️: clang 的目录配置是您电脑中clang的安装目录,可能与这里不同。
或者使用 pack 的配置方法:
➜ pack config maralla/completor
此时会跳出vim来编辑配置,添加上面三行的配置内容保存退出即可。三行配置中后两行用来配置跳转占位符快捷键。
打开源码 src/main.cpp
,输入函数前几个字母就会有提示,选择相应函数, completor 在形参位置以占位符填充,按下配置中的快捷键就会在占位符间跳转,方便填写实参。
YouCOmpleteMe
为VIM安装YCM插件,自行研究安装即可,传送门在这里。假设已经成功安装YCM
,其中相应.vimrc
中的配置如下:
" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" alternatively, pass a path where Vundle should install plugins
"call vundle#begin('~/some/path/here')
" let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'
Bundle 'Valloric/YouCompleteMe'
Bundle 'rdnetto/YCM-Generator'
" The following are examples of different formats supported.
" Keep Plugin commands between vundle#begin/end.
" All of your Plugins must be added before the following line
call vundle#end() " required
" for ycm
let g:ycm_error_symbol = '>>'
let g:ycm_warning_symbol = '>*'
nnoremap <leader>gl :YcmCompleter GoToDeclaration<CR>
nnoremap <leader>gf :YcmCompleter GoToDefinition<CR>
nnoremap <leader>gg :YcmCompleter GoToDefinitionElseDeclaration<CR>
"让YouCompleteMe同时利用原来的ctags
let g:ycm_collect_identifiers_from_tags_files = 1
nmap <F4> :YcmDiags<CR>
" let g:loaded_youcompleteme = 1
插件需要文件.ycm_extra_conf.py
,可以根据Anthony Ford提供的配置文件PlatformIO/YouCompleteMe Integration修改我们工程需要的这个配置文件。先将这个文件下载到工程目录下,然后进行修改即可。
需要修改的地方有几处:
- libDirs中对应的几个库目录,也就是31、36、40这三行,对应自己使用的framwork目录就可以,不同MCU平台可能有不同,自行添加即可;
- 修改flags,
.ycm_extra_conf.py
中61~65这五行内容替换成正确的,这里需要参考上面提到的.clang_complete
文件,文件中最后几行给出了flags;
再次启动vim编辑/src/main.cpp
,提示使用我们创建的.ycm_extra_conf.py
,OK即可,然后就可以享受语义分析的代码补全了。
写在最后
如果你也玩 Arduino
,使用 platformio进行开发,同时喜欢使用 vim 这款神级代码编辑器,那么本文应该会对您有所帮助,感谢您的阅读!