Vim plugin for compiling, uploading, and debugging arduino sketches. It uses arduino-cli when available (recommended), and falls back to using the Arduino IDE's commandline interface (new in 1.5.x).
vim-arduino works with all the usual plugin managers
Packer (Neovim only)
require('packer').startup(function() use {'stevearc/vim-arduino'} end)
Paq (Neovim only)
require"paq" { {'stevearc/vim-arduino'}; }
vim-plug
Plug 'stevearc/vim-arduino'
dein
calldein#add('stevearc/vim-arduino')
Pathogen
git clone --depth=1 https://github.com/stevearc/vim-arduino.git ~/.vim/bundle/
Neovim native package
git clone --depth=1 https://github.com/stevearc/vim-arduino.git \ "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/pack/vim-arduino/start/vim-arduino
Vim8 native package
git clone --depth=1 https://github.com/stevearc/vim-arduino.git \ "$HOME"/.vim/pack/vim-arduino/start/vim-arduino
Linux and Mac are tested and functioning. I have not tested on Windows, but have heard that it works via WSL. See this issue for discussion.
It is recommended to use arduino-cli
, installation instructions here: https://arduino.github.io/arduino-cli/latest/installation/
However it is also possible to use the arduino IDE directly. Download Arduino IDE (version 1.5 or newer). Linux users make sure the arduino
command is in your PATH.
Command | arg | description |
---|---|---|
ArduinoAttach | [port] | Automatically attach to your board (see arduino-cli board attach -h ) |
ArduinoChooseBoard | [board] | Select the type of board. With no arg, will present a choice dialog. |
ArduinoChooseProgrammer | [programmer] | Select the programmer. With no arg, will present a choice dialog. |
ArduinoChoosePort | [port] | Select the serial port. With no arg, will present a choice dialog. |
ArduinoVerify | Build the sketch. | |
ArduinoUpload | Build and upload the sketch. | |
ArduinoSerial | Connect to the board for debugging over a serial port. | |
ArduinoUploadAndSerial | Build, upload, and connect for debugging. | |
ArduinoInfo | Display internal information. Useful for debugging issues with vim-arduino. |
To make easy use of these, you may want to bind them to a key combination. You can put them in ftplugin/arduino.vim
:
" Change these as desirednnoremap<buffer><leader>aa<cmd>ArduinoAttach<CR>nnoremap<buffer><leader>av<cmd>ArduinoVerify<CR>nnoremap<buffer><leader>au<cmd>ArduinoUpload<CR>nnoremap<buffer><leader>aus<cmd>ArduinoUploadAndSerial<CR>nnoremap<buffer><leader>as<cmd>ArduinoSerial<CR>nnoremap<buffer><leader>ab<cmd>ArduinoChooseBoard<CR>nnoremap<buffer><leader>ap<cmd>ArduinoChooseProgrammer<CR>
By default you should not need to set any options for vim-arduino to work (especially if you're using arduino-cli
, which tends to behave better). If you want to see what's available for customization, there is detailed information in the vim docs.
The built-in mechanism for choosing items (e.g. :ArduinoChooseBoard
) uses inputlist()
and is not very pretty or ergonomic. If you would like to improve the UI, there are two approaches:
- Neovim: override
vim.ui.select
(e.g. by using a plugin like dressing.nvim) - Vim8: install ctrlp or fzf. They will automatically be detected and used
If you want to run the arduino commands in a separate tmux or screen pane, use vim-slime. By setting let g:arduino_use_slime = 1
vim-arduino will send the commands via slime#send()
instead of running them inside a vim terminal.
You may want to display the arduino state in your status line. There are four pieces of data you may find interesting:
- g:arduino_board - the currently selected board
- g:arduino_programmer - the currently selected programmer
- g:arduino_serial_baud - the baud rate that will be used for Serial commands
- arduino#GetPort() - returns the port that will be used for communication
An example with vanilla vim or nvim, added to ftplugin/arduino.vim
:
" my_file.ino [arduino:avr:uno] [arduino:usbtinyisp] (/dev/ttyACM0:9600)function!ArduinoStatusLine() let port =arduino#GetPort() letline='[' . g:arduino_board . '] [' . g:arduino_programmer . ']'if!empty(port) letline=line . ' (' . port . ':' . g:arduino_serial_baud . ')'endifreturnlineendfunctionaugroupArduinoStatusLineautocmd!*<buffer>autocmdBufWinEnter<buffer>setlocalstl=%f\ %h%w%m%r\ %{ArduinoStatusLine()}\ %=\ %(%l,%c%V\ %=\ %P%) augroupEND
To do the same thing with vim-airline:
autocmdBufNewFile,BufRead*.inoletg:airline_section_x='%{MyStatusLine()}'
For lualine (Neovim only) I use the following function:
localfunctionarduino_status() ifvim.bo.filetype~="arduino" thenreturn""endlocalport=vim.fn["arduino#GetPort"]() localline=string.format("[%s]", vim.g.arduino_board) ifvim.g.arduino_programmer~="" thenline=line..string.format(" [%s]", vim.g.arduino_programmer) endifport~=0thenline=line..string.format(" (%s:%s)", port, vim.g.arduino_serial_baud) endreturnlineend
Everything is under the MIT License except for the wonderful syntax file, which was created by Johannes Hoff and copied from vim.org and is under the Vim License.