Neovim plugins


Initially inspired by Vimwiki, I designed Mkdnflow to facilitate the fluent navigation and management of markdown-based document repositories (whether that be a notebook or journal, a personal wiki or knowledge base, or pages fed into a static website generator like Jekyll or Hugo). Its most broadly useful feature is following links to other markdown documents in the repository and backward and forward navigation through thus-opened files using <Backspace> and <Delete>, respectively. Link-following behavior depends on the kind of target the link points to: links to markdown files are opened in the same window in vim; links prefixed with file: are opened in the default application for the filetype (any OS); links to websites are opened in the default browser; links to anchors cause the cursor to jump to a matching heading or Pandoc-flavored bracketed span. Syntactic and semantic transformation functions can be configured to explicitly transform text into a markdown file’s source name or implicitly transform a markdown file’s link source when following it, affecting the interpretation of paths. A number of other convenience features are included: automatic directory creation, jumping between links with <Tab>, table creation and formatting, list support, section folding, and more. Written in Lua.


TEXmagic is a very simple Neovim plugin that enables LaTeX build engine selection via magic comments (e.g. %! TEX program = xelatex). It is designed with the TexLab LSP server’s build service in mind, which has to be specified globally in the init file (with the help of the Neovim team’s lspconfig plugin) and cannot be set on a by-project basis. The plugin identifies magic comments at the very top of a .tex document and passes the settings you configure for the given program name to the build service.


Extraction from relative clauses in English

  Dissertation   Notebooks   Languages manuscript

Relative clauses (RCs) are a prototypical example of a strong island, but certain languages have been shown to selectively tolerate RC subextraction (Mainland Scandinavian languages, certain Romance languages, Hebrew, and others). For subextraction to be licit in these languages, the DP that hosts the RC typically needs to be the pivot of a canonical or non-canonical existential, or otherwise non-presupposed.

It hasn’t been heavily researched whether these patterns extend to English as well, but some research suggests that it does (see, e.g., Chung & McCloskey 1983 and Kush et al. 2013). I am currently using experimental methods to investigate whether English also selectively tolerates RC subextraction. So far, I have found that English RCs are substantially more transparent to extraction in existentials, as well as in predicate nominals (as found by Sichel 2018 for Hebrew). I have written about these results here, and you can find my experiment notebooks here. I plan to investigate the online processing of RCs in these environments, and to address the question of whether these cases of improved RC subextraction should be generated by the grammar.

Internally headed relative clauses in Chamorro

  Master’s thesis

Chamorro has a typologically rare construction in which a noun phrase being modified by a relative clause surfaces within that relative clause, as shown below.

'The child [who sat in the chair] laughed.'

In my MA thesis, I argue that the head NP in Chamorro’s internally headed RCs (IHRCs) is merged within the RC as a DP headed by the null operator, after which the D0 moves to the specifier position of the relative clause CP, abstracting over the RC-internal head and stranding the nominal restrictor. The analysis explains the island sensitivity of the IHRC formation rule, the mandatory presence of the linker na directly before the head NP, certain interpretive effects, and their surface similarity to stranding patterns in other A-bar contexts in the language. This work was recently cited in Cinque’s (2020) book on the syntax of relative clauses.

Miscellaneous projects

  View source

I am currently working on a syllable parser that takes input in IPA characters and produces a syllabified output. Currently, the function follows essentially the same procedure that students are taught to follow in Phonology 1. It first identifies syllable nuclei (including diphthongs), then parses preceding consonants into the syllable of the following nucleus segment by segment (leaving segments unparsed if they don’t form a legal onset cluster), and finally parsing remaining unparsed segments into the coda of the syllable of the preceding nucleus.

The program also includes an integration with the Carnegie Mellon University Pronouncing Dictionary, which contains pronunciations for over 100,000 words. The script converts the ARPABET codes that come with the dictionary into IPA, which makes it possible to look for statistical patterns across English pronunciations and syllabifications.

  View source

The following tool (written in JavaScript, HTML, and CSS) takes word, gloss, and free translation data and converts it into HTML that will display as an interlinear gloss when pasted into your website HTML file.

Free translation: 


Preview will show here.


Paste the following into your stylesheet:


In an undergraduate project, I analyzed 106 of Joaquin F. Borja’s rhyme pairs from the collection of Chamorro literature Istreyas Marianas: Chamorro. Approximately 25% of the rhyme pairs there have strict rhyme (= identical from the vowel of the stressed syllable to the end of the word), and the remainder have what I called abstract rhyme, which seems to creatively utilize abstract associations between classes of segments established by the phonological processes in Chamorro grammar. The use of abstract rhyme results in a broad (yet orderly) range of licit rhyming pairs.