vim-sonic-pi
July 29, 2022 ยท View on GitHub
The Sonic Pi (Neo)Vim plugin requires the following:
- An installation of Sonic Pi (currently tested against 3.3.1)
- A tool to interface with Sonic Pi - the default is sonic-pi-tool
- Note: I am developing a new tool for v4 due to the major architecture changes - sonic-pi-tool does not (yet) work with Sonic Pi v4
Either Neovim or Vim 8.1+ is required for log, built-in server, and recording support but older versions of Vim should gracefully fallback to basic functionality.
Features
The plugin enables itself when Sonic Pi is running and the Ruby filetype is initiated (let g:sonic_pi_enabled = 0 to disable), and provides the following features:
<leader>r- Send the current buffer or selection to Sonic Pi and show log (let g:sonic_pi_autolog_enabled = 0to disable automatic log popout)<leader>c- Close log output (let g:sonic_pi_autolog_enabled = 0to disable automatic log popout)<leader>S- Send stop message to Sonic Pi- Contextual autocompletion of Sonic Pi terms with omnicomplete (
<C-x><C-o>by default). That is, if you havesynth :zawain the line, omnicomplete will provide parameter names for:zawa, and more! - Extension of Ruby syntax to include Sonic Pi terms
- Starting and stopping Sonic Pi server via
:SonicPiStartServerand:SonicPiStopServer - Recording a Sonic Pi session via
:SonicPiStartRecording <filename>and:SonicPiStopRecording
Commands
SonicPiEval- Send current buffer or selection to Sonic PiSonicPiStop- Send Sonic Pi the stop signalSonicPiShowLog- Pop out the Sonic Pi server log on the right side of the tab page (requires either Neovim or Vim 8 withterminalfeature)SonicPiCloseLog- Close the Sonic Pi server log on the current tab pageSonicPiCloseAll- Close all Sonic Pi server log windowsSonicPiStartServer- Start Sonic Pi server using sonic-pi-tool (requires Neovim or Vim 8 withjobfeature)SonicPiStopServer- Stop Sonic Pi server when managed from (Neo)VimSonicPiCheckServer- Check if Sonic Pi server is runningSonicPiStartRecording <filename>- Start a recording to<filename>(this will be automatically stopped and saved when stopped or when (Neo)Vim is closed) (requires Neovim or Vim 8 withjobandchannelfeatures)SonicPiStopRecording- Stop the current recording and save it to the previously specified filename
Installation
Prerequisites: Sonic Pi and sonic-pi-tool or similar.
- vim-plug
Plug 'lilyinstarlight/vim-sonic-pi'
- Neovim packages
git clone https://github.com/lilyinstarlight/vim-sonic-pi.git ~/.local/share/nvim/site/pack/plugins/start/vim-sonic-pi
- Vim 8 packages
git clone https://github.com/lilyinstarlight/vim-sonic-pi.git ~/.vim/pack/plugins/start/vim-sonic-pi
- Pathogen
git clone https://github.com/lilyinstarlight/vim-sonic-pi.git ~/.vim/bundle/vim-sonic-pi
- Vundle
Plugin 'lilyinstarlight/vim-sonic-pi'
Whenever Sonic Pi is running and you haven't disabled the g:sonic_pi_enabled flag in your configs, the plugin will activate. The plugin will additionally activate after the server has been started within (Neo)Vim. Otherwise, it's a normal Ruby session!
Configuration
g:sonic_pi_command- Command to use for Sonic Pi interfacing (default: 'sonic-pi-tool')g:sonic_pi_check- Subcommand to use for checking whether Sonic Pi is running (default: 'check')g:sonic_pi_run- Subcommand to use for starting a standalone server (default: 'start-server')g:sonic_pi_run_args- Arguments to supply to the run subcommand (default: '[]')g:sonic_pi_eval- Subcommand to use for sending stdin to Sonic Pi (default: 'eval-stdin')g:sonic_pi_stop- Subcommand to use to give Sonic Pi the stop command (default: 'stop')g:sonic_pi_logs- Subcommand to use for following log output (default: 'logs')g:sonic_pi_record- Subcommand to use for starting a recording (must acceptfilenameas the only parameter) (default: 'record')g:sonic_pi_enabled- Whether vim-sonic-pi is enabled (default: 1)g:sonic_pi_autolog_enabled- Whether automatic log popouts are enabled (default: 1)g:sonic_pi_keymaps_enabled- Whether default keybindings are enabled (default: 1)g:sonic_pi_log_width- Width for the log popout (default: 70)
As an example, to use sonic-pi-cli the following .vimrc or init.vim settings would work:
let g:sonic_pi_command = 'sonic_pi'
let g:sonic_pi_check = 'version'
let g:sonic_pi_eval = ''
let g:sonic_pi_stop = 'stop'
" Disabled due to lack of support
let g:sonic_pi_run = ''
let g:sonic_pi_logs = ''
let g:sonic_pi_record = ''
Sonic Pi Interfacing Tools
- sonic-pi-tool (version by @emlyn) - Written in Python and supports all of the functionality of vim-sonic-pi. This is the preferred tool since it works best with recent Sonic Pi versions and has a few extra handy features that may be incorporated into vim-sonic-pi in the future.
- sonic-pi-tool (version by @lpil) - Written in Rust and supports all of the functionality of vim-sonic-pi.
- sonic-pi-cli - Written in Ruby but does not support showing the log, starting a standalone server from (Neo)Vim, or initiating recordings.
To-Do
- Disable autolog if something is already listening on the logs port (e.g. the GUI is up)
- Add more contexts beyond the synths/fx/samples
Thanks
Many thanks to @dermusikman for the sonicpi.vim plugin on which this is based and also to @samaaron and the whole Sonic Pi community for such an awesome platform!