Some people may wonder why would anyone want to do this? Well, there are at least two benefits.

One, I can write posts offline with my favorite editor, whenever I feel like it. Then post them from within vim once I got an Internet connection.

Two, I get to use niceties of vim such as spellchecker, autocompletion and syntax highlighting for html code. I found this solution on Peter Wilkinson's Blog. I did a few minor changes to make his script to work with the latest version of python.

A step further, I combined it with his another post, now I can even use the regular vim syntax to read/post blog entry just like a regular file, e.g. :e blog/4 to edit blog entry number 4, :w to post the edited version. Very cool. See the following .vimrc code for details:

" post blog entry to my Drupal site
" Use :e blog/nodeID_which_is_digits to open an existing entry for editting;
"     For example :e blog/12
" Use :e blog/anything_other_than_digits to open a new entry for editing
"     For example :e blog/blah
" Use :w to post it.
" Use :w blog/anything to post a file as a new blog entry

python << EOF

strUserName = 'your_username'
strPassword = 'your_password'
strDrupal = ''

import vim
import xmlrpclib
import re

def PostBlog():

  # If first line contains a blog entry ID then edit existing post,
  # otherwise write a new one.
  nFirstLine = 0
  strID = vim.current.buffer[0]
  if not re.match( '^\d+$', strID):
    strID = ''
    nFirstLine = 1

strTitle = vim.current.buffer[nFirstLine]
  strText = "\n".join( vim.current.buffer[nFirstLine+1:])

oDrupal = xmlrpclib.ServerProxy( strDrupal + '/xmlrpc.php')

oPost = { 'title': strTitle, 'description': strText}

if strID == '':
    strID = oDrupal.metaWeblog.newPost( 'blog', strUserName, strPassword, oPost, True)
    bSuccess = oDrupal.metaWeblog.editPost( strID, strUserName, strPassword, oPost, True)

print "Posted entry %s" % strID

  # Don't intend to write posts to disk so unmodify the buffer and
  # allow easy quit from VIM.
  vim.command( 'set nomodified')

def ReadBlog( strID ):

  # So html plugin is automatically enabled for editing the post
  # with auto-completion and syntax highlighting
  vim.command('setfiletype html')

if not strID.isdigit():
    print "New blog entry"

oDrupal = xmlrpclib.ServerProxy( strDrupal + '/xmlrpc.php')

oBlog = oDrupal.metaWeblog.getPost( strID, strUserName, strPassword )

vim.current.buffer[:] = []
  vim.current.buffer[0] = strID
  vim.current.buffer.append( oBlog['title'])
  vim.current.buffer.append( '')
  for strLine in oBlog['description'].split('\n'):
    vim.current.buffer.append( strLine)


:au BufWriteCmd blog/* py PostBlog() 
:au BufReadCmd blog/* py ReadBlog(vim.eval("expand('<afile>:t')"))

syntax on


comments powered by Disqus