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 这款神级代码编辑器,那么本文应该会对您有所帮助,感谢您的阅读!