Hatena::ブログ(Diary)

Pyro Memo RSSフィード

2008-02-15

[][] Pythonで1行メモVimスクリプト

先日に引き続きPythonVimに挑戦。

コマンドラインで書き込んだメモをファイルに蓄積していくVimプラグインを書いてみた。

画面に表示している内容とまったく関係ないふとした思いつきを書き込む。


:PyMemoAdd メモ

のような感じで使う。


pymemo.vim

if has('win32')
    let s:vim_encoding = "shift_jis"
else
    let s:vim_encoding = "utf-8"
endif

if !exists("g:pymemo_filepath")
    let g:pymemo_filepath = $HOME . "\\pymemo.txt"
endif

if !exists("g:pymemo_loaded_python_file")
    pyfile <sfile>:p:h/pymemo.py
    python memo = PyMemo()
    let g:pymemo_loaded_python_file=1
endif

command! -nargs=1 PyMemoAdd python memo.add_memo(<q-args>)

pymemo.py

# vim:set fileencoding=utf-8:

# メモ用Vimスクリプト
# 
# 指定されたファイルにどんどんメモを追加する

import vim
import sys
import codecs
import os
import re
import datetime

LINE_HEADER = "*"
UNI_FILE_HEADER = """vim:set filetype=rest:
= PyMemo
====================
"""
DATE_TEMPLATE = "[%Y-%m-%d %H:%M]"

class PyMemo():

    def __init__(self):
        self.vim_encoding = vim.eval("s:vim_encoding")
        self._memo_path = None

    def add_memo(self, text):
        self._append_to_file(text)
        print u"メモを追記しました".encode(self.vim_encoding)

    def _enc_command(self, command):
        vim.command(command.encode(self.vim_encoding))

    def _enc_eval(self, command):
        return vim.eval(command.encode(self.vim_encoding))

    def _append_to_file(self, line):
        day = datetime.datetime.now().strftime(DATE_TEMPLATE)
        if not os.path.exists(self._get_memo_path()):
            f = open(self._get_memo_path(), "w")
            f.write(UNI_FILE_HEADER)
            f.write("%s\n\n" % (day,))
        else:
            f = open(self._get_memo_path(), "a+")
        f.write("%s %s %s\n" % (LINE_HEADER, line, day))
        f.close()

    def _get_memo_path(self):
        if self._memo_path == None:
            self._memo_path = vim.eval("g:pymemo_filepath")
        return self._memo_path