reStructuredText のヘッダを書く

http://blog.tuxcoder.com/2008/12/vim-restructure-text-macros.html を参考に、日本語タイトルに対応する。
vimスクリプトが全く判らないので、Pythonに頼った。
キーマップとか、もっと賢い方法があると思う。

python <<EOF
_e_a_width_map = dict(F=2, H=1, W=2, Na=1, A=2, N=1)

def _count_width(s):
    import unicodedata
    return sum(_e_a_width_map.get(unicodedata.east_asian_width(c), 0) for c in s)

def rst_heading(n=0):
    import vim
    u = vim.current.line.decode(vim.eval('&encoding'))
    line_width = _count_width(vim.current.line.decode('cp932'))
    heading_line = ('#*=-^"'[n]) * line_width
    lineno = vim.current.window.cursor[0]
    vim.current.buffer[lineno:lineno] = [heading_line]
    if n < 2:
        vim.current.buffer[lineno-1:lineno-1] = [heading_line]
EOF

" Restructured Text
" #########################
" Ctrl-u 1:    underline Parts w/ #'s
noremap  <C-u>1 :py rst_heading(0)<CR>
inoremap <C-u>1 <esc>:py rst_heading(0)<CR>
" Ctrl-u 2:    underline Chapters w/ *'s
noremap  <C-u>2 :py rst_heading(1)<CR>
inoremap <C-u>2 <esc>:py rst_heading(1)<CR>
" Ctrl-u 3:    underline Section Level 1 w/ ='s
noremap  <C-u>3 :py rst_heading(2)<CR>
inoremap <C-u>3 <esc>:py rst_heading(2)<CR>
" Ctrl-u 4:    underline Section Level 2 w/ -'s
noremap  <C-u>4 :py rst_heading(3)<CR>
inoremap <C-u>4 <esc>:py rst_heading(3)<CR>
" Ctrl-u 5:    underline Section Level 3 w/ ^'s
noremap  <C-u>5 :py rst_heading(4)<CR>
inoremap <C-u>5 <esc>:py rst_heading(4)<CR>
" Ctrl-u 5:    underline Section Level 4 w/ "'s
noremap  <C-u>6 :py rst_heading(5)<CR>
inoremap <C-u>6 <esc>:py rst_heading(5)<CR>

追記

C-u にマップすると上にスクロールするのが邪魔されることに後で気づいた。
良いキーマップを見つけるまで保留。

このブログに乗せているコードは引用を除き CC0 1.0 で提供します。