DEVELOPING FOR VIM-PANDOC *vim-pandoc-devel* HOW TO CREATE A NEW MODULE *vim-pandoc-new-module* This is a guide to developing modules for |vim-pandoc|. It is aimed at anyone who wants to customize vim-pandoc further (or contribute some feature), and it doesn't presuppose much knowledge on the reader's part. |vim-pandoc|'s modules are viml files located in the `autoload/pandoc` directory, which are called by the pandoc filetype plugin depending on the value of |g:pandoc#modules#enabled| and |g:pandoc#modules#disabled|. *pandoc#MODULE#Init()* Every module must export a function called |pandoc#MODULE#Init()|, which should handle the module initial configuration (setting up defaults), and any functionality definition. MODULE here stands for the module filename. For example, for the module defined in `autoload/toc.vim`, this function is called `pandoc#toc#Init()`. Let's suppose we want to create a new module for fancy stuff. We should create a file called `autoload/fancy.vim`. This file should contain something like this: > function! pandoc#fancy#Init() endfunction < Now, we want it to export a command, `:PandocFancy`. This command simply calls this function (defined in the same file): > function! pandoc#fancy#Fancy() echom "this is so fancy!" endfunction < We should modify Init() so it reads: > function! pandoc#fancy#Init() command! -buffer PandocFancy call pandoc#fancy#Fancy() endfunction < Note the `command!` command passes the `-buffer` arg. This means this command will only be available in the current buffer. If a vim-pandoc module exports a command, it SHOULD be buffer-local. See |:command-buffer| This is probably not fancy enough! We want to be able to change the message `PandocFancy` outputs through a setting. We will provide a default message, and a configuration variable so we can override it. First, we define the default message modifying the Init() function: > function! pandoc#fancy#Init() if !exists("g:pandoc#fancy#message") let g:pandoc#fancy#message = "this is so fancy!" endif command! -buffer PandocFancy call pandoc#fancy#Fancy() endfunction < Note the configuration variable name follows the g:pandoc#MODULE#VARIABLE schema. We must change the Fancy() function so it picks up the configuration: > function! pandoc#fancy#Fancy() echom g:pandoc#fancy#message endfunction < Now the behavior of the Fancy function changes depending on the value of `g:pandoc#fancy#message`. We can also support buffer-local configuration variables that override the global configuration variable: > function! pandoc#fancy#Fancy() if exists("b:pandoc_fancy_message") echom b:pandoc_fancy_message else echom g:pandoc#fancy#message endif endfunction < Note the buffer-scoped variable uses underscores instead of hashes (b: variables' names can't contain them). If we wanted to add a keyboard mapping to call the :PandocFancy command more easily, we should add something like: > noremap ff :PandocFancy < to the Init() function. Note the mapping is buffer-local. Note the mapping uses . This is recommended so the mapping doesn't interfere with others. Note If you need to change a vim setting, use |:setlocal|. Changing the global values of vim settings (or vim settings which are global only) is not recommended. If you must, save the original value and restore it after using it. vim:tw=78:ts=8:noet:ft=help:fdm=marker