Syntax highlighting for Pollen, a Racket language by Matthew Butterick for making books.
Supports:
- Highlighting
#lang pollen
and#lang pollen/mode <reader>
- Spell checking (when enabled separately): will only spell check the non-code regions
- Full highlighting of Racket and Pollen functions/keywords
- Nested Racket
◊(tag …)
and Pollen◊tag{…}
forms - Variables:
◊foo
or◊|foo|
- String literals:
◊"text"
(can be used for◊"◊"
) - Single-line
◊; …
and multiline◊;{ … }
comments
Overall I have kept this plugin very simple, with no fancy tricks and no treatment for special edge-cases. It supplies syntax highlighting only: no indentation or special macros.
As Pollen is a Racket language, this plugin depends quite a bit on vim-racket
for correct syntax highlighting. Install that first.
The most basic way to install this plugin is to save the syntax/pollen.vim
file into your ~/.vim/syntax
folder.
If you use pathogen.vim, do it this way:
cd ~/.vim/bundle
git clone https://github.com/otherjoel/vim-pollen.git
Or, if you prefer submodules:
cd ~/.vim
git submodule add https://github.com/otherjoel/vim-pollen.git bundle/vim-pollen
To turn on Pollen syntax highlighting manually, do :set filetype=pollen
.
To turn it on automatically for Pollen’s default file extensions, add these lines to your .vimrc
:
" Create an augroup if you don’t already have one
augroup configgroup
autocmd!
"Set Pollen syntax for files with these extensions:
au! BufRead,BufNewFile *.pm set filetype=pollen
au! BufRead,BufNewFile *.pp set filetype=pollen
au! BufRead,BufNewFile *.ptree set filetype=pollen
" Suggested editor settings:
autocmd FileType pollen setlocal wrap " Soft wrap (don't affect buffer)
autocmd FileType pollen setlocal linebreak " Wrap on word-breaks only
augroup END
For now, this plugin doesn’t come with any automatic file-typing; you need to know how to turn Pollen syntax on in a way that fits with your workflow. This is for a few reasons:
- Pollen doesn’t have its own set of file extensions, strictly speaking.
- Any Racket module can use
#lang pollen
or one of its variants. - Some of Pollen’s default file extensions (
.p
and.pm
) are also used by Python and Perl.
If you use Pollen Markdown files (.pmd
) it might be more appropriate to use Markdown highlighting for those.
(NB: What follows is hard-won knowledge about the solution to a potentially very strange problem)
If you use the vim-pencil
plugin and have it “turned on” for Pollen files, it will break parts of Pollen syntax highlighting because it changes the iskeyword
setting (the set of characters that Vim considers to be part of a keyword).
The same holds true for any other plugin that changes the iskeyword
value. If you suspect this is happening, you can run :verbose setlocal iskeyword?
and it will tell you the current value as well as the path/filename of the script that last changed it.
What I do, for now, is to leave pencil#init()
out of my auto-commands for Pollen files, and just enable it manually with :Pencil
after the file is open. Another remedy is to make sure that, after the call to pencil#init()
, iskeyword
gets reset to the value used for Racket code (i.e., this value as of the time I write this).
This plugin is opinionated about using the default command character ◊
. If you change the command character in your project, you’ll need to replace it everywhere in this plugin’s syntax/pollen.vim
file as well.
There’s also currently no support for ◊tag|{...}|
or ◊tag|<<<{...}>>>|
. These forms aren’t even covered in Pollen’s documentation, but Pollen can use them by virtue of its Scribble heritage.
Finally: in any form ◊func[…]{…}
, the symbol func
will always be highlighted in the same way, even when it is a Racket keyword/function (e.g. define
, string=?
, let
, etc). Pollen-provided functions are highlighted differently in this form, however. Here’s an example to illustrate:
The font used in the screenshots is IBM Plex Mono Light. The color scheme is One Dark.