dbridges / vim-markdown-runner

Easily execute markdown fenced code blocks in vim

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

vim-markdown-runner

Make your markdown interactive!

markdown-runner-screencap

Installation

Use your preferred package management tool, for vim-plug:

Plug 'dbridges/vim-markdown-runner'

Usage

Place your cursor inside a fenced code block and execute :MarkdownRunner. This will echo the results of executing the code block. :MarkdownRunnerInsert will insert the results in a new fenced code block directly below. If there is an existing code block below tagged with language markdown-runner it will be replaced with the new results.

You might consider mapping these for easy usage:

autocmd FileType markdown nnoremap <buffer> <Leader>r :MarkdownRunner<CR>
autocmd FileType markdown nnoremap <buffer> <Leader>R :MarkdownRunnerInsert<CR>

For full documentation:

:h markdown-runner

Code Type Customization

MarkdownRunner passes the code contained in the block to the specified language runner through stdin. By default the runner command is the same as the specified language, so

```python
print("Hello World")
```

will run with python.

If no source language is specified it will use $SHELL as the run command.

You can overwrite or specify new commands by updating the g:markdown_runners dictionary. Set the value for a language to a string or a Funcref in your .vimrc:

" Specify an alternate shell command for a certain language
let g:markdown_runners['python'] = 'python3'

" Specify your own Vim script function for further customization.
" The function should receive a list of strings, representing the contents of
" the code block, and return a single string with the results.
function! MyHtmlRunner(src)
  " ... your custom processing
  return "Results"
endfunction

let g:markdown_runners['html'] = function('MyHtmlRunner')

You can set buffer specific runners with b:markdown_runners

Builtin Runners

Go

The Go runner will attempt to handle a variety of code blocks by (i) adding a default package declaration if one does not already exist, (ii) wrapping the entire code block in a main function, if main is not already defined, and (iii) running goimports on the final result. This lets you easily run code blocks without adding extra boilerplate, like this one in net/http:

resp, err := http.Get("http://example.com/")
if err != nil {
	// handle error
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))

Javascript

js and javascript code blocks will be run with node.

Vimscript

Vimscript code blocks will be directly sourced.

Additional Settings

g:markdown_runner_populate_location_list Set to 1 to always populate the location list with the results.

About

Easily execute markdown fenced code blocks in vim


Languages

Language:Vim Script 100.0%