Skip to content

Instantly share code, notes, and snippets.

@inhies
Forked from ppanyukov/markdown.vim
Last active December 14, 2015 20:39
Show Gist options
  • Save inhies/5145663 to your computer and use it in GitHub Desktop.
Save inhies/5145663 to your computer and use it in GitHub Desktop.
A plugin for rendering markdown and loading it in your web browser for viewing. This has been modified a few times and this version is geared towards Ubuntu and the blackfriday markdown processor. To use, just open a markdown file in vim and press ,p (comma then p) and it will render it to an html file and load it in your default browser.
"
" While editing a Markdown document in Vim, preview it in the
" default browser.
"
" Author: Nate Silva
"
" To install: Place markdown.vim in ~/.vim/ftplugin or
" %USERPROFILE%\vimfiles\ftplugin.
"
" To use: While editing a Markdown file, press ',p' (comma p)
"
" Tested on Windows and Mac OS X. Should work on Linux if you set
" BROWSER_COMMAND properly.
"
" Requires the `blackfriday-tool` command to be on the system path.
" If you do not have the `markdown` command, install it from here:
"
" https://github.com/russross/blackfriday-tool
"
" inhies, 12MAR2013, tweaked to work with blackfriday-tool, a
" utility for testing blackfriday, a golang
" markdown parsing engine:
" https://github.com/russross/blackfriday
"
" MOD, PP June 2011, slight changes to make it work on Ubuntu,
" mainly BROWSER_COMMAND and some other little
" things, less important ones.
function!PreviewMarkdown()
" **************************************************************
" Configurable settings
let MARKDOWN_COMMAND = 'blackfriday-tool -page=true'
if has('win32')
" note important extra pair of double-quotes
let BROWSER_COMMAND = 'cmd.exe /c start ""'
else
let BROWSER_COMMAND = 'gnome-open'
endif
" End of configurable settings
" **************************************************************
silent update
let output_name = tempname() . '.html'
" Some Markdown implementations, especially the Python one,
" work best with UTF-8. If our buffer is not in UTF-8, convert
" it before running Markdown, then convert it back.
let original_encoding = &fileencoding
let original_bomb = &bomb
if original_encoding != 'utf-8' || original_bomb == 1
set nobomb
set fileencoding=utf-8
silent update
endif
" Write the HTML header. Do a CSS reset, followed by setting up
" some basic styles from YUI, so the output looks nice.
let file_header = ['<html>', '<head>',
\ '<meta http-equiv="Content-Type" content="text/html; charset=utf-8">',
\ '<title>Markdown Preview</title>',
\ '<link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/3.3.0/build/cssreset/reset-min.css">',
\ '<link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/3.3.0/build/cssbase/base-min.css">',
\ '<link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/3.3.0/build/cssfonts/fonts-min.css">',
\ '<style>body{padding:20px;}div#container{background-color:#F2F2F2;padding:0 20px;margin:0px;border:solid #D0D0D0 1px;}</style>',
\ '</head>', '<body>', '<div id="container">']
call writefile(file_header, output_name)
let md_command = '!' . MARKDOWN_COMMAND . ' "' . expand('%:p') . '" >> "' .
\ output_name . '"'
exec md_command
if has('win32')
let footer_name = tempname()
call writefile(['</div></body></html>'], footer_name)
silent exec '!type "' . footer_name . '" >> "' . output_name . '"'
exec delete(footer_name)
else
silent exec '!echo "</div></body></html>" >> "' .
\ output_name . '"'
endif
" If we changed the encoding, change it back.
if original_encoding != 'utf-8' || original_bomb == 1
if original_bomb == 1
set bomb
endif
silent exec 'set fileencoding=' . original_encoding
silent update
endif
exec '!' . BROWSER_COMMAND . ' "' . output_name . '"'
"exec input('Press ENTER to continue...')
"echo
exec delete(output_name)
endfunction
" Map this feature to the key sequence ',p' (comma lowercase-p)
map ,p :call PreviewMarkdown()<CR>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment