Vimscirptでプラグインを作ってみた
投稿:2014-10-03、更新:2014-10-12
こちらの本「Vim script テクニックバイブル ~Vim使いの魔法の杖」を読んで作りたくなりましたので。
しかも、ちまちまとプラグインを作っていると著者の方々が助けてくださいました(大歓喜) 2014.10.07 このページを添削していただきました♪プラグインのソースを一部修正しています。
しかも、ちまちまとプラグインを作っていると著者の方々が助けてくださいました(大歓喜) 2014.10.07 このページを添削していただきました♪プラグインのソースを一部修正しています。
ホームページの作成、修正が楽にできるような機能を盛り込みました。
これでもうVimを開くだけで、ホームページの追加や修正ができるようになってしまいました(わーい♪)。
こーゆーのハイカラな言葉で何て言いましたっけ?
ターンキーシステム(古!)…違った、ワンストップだ(←聞きかじった用語を使ってみたい)。
- メニューを表示して機能を選択(気分はMS-DOS)
- スクラッチから作成する場合、ファイル名の先頭2文字と拡張子を自動生成、定型ヘッダに作成日を埋め込み
- 自分独自のタグやよく使うタグ、開きタグや閉じタグを自動判定してユーザー補完
- 画像ファイルの最新10個のファイル名を埋め込んだimgタグをユーザー補完
- ファイルに書き出すとブラウザがファイルを開く
- コンパイル(ページ内容以外のヘッダやメニュー表示を統合)のバッチファイルを起動
- アップロードのバッチファイルを起動
pluginの所に置くppmod.vimです。表示の都合で文字化け、脱字あります。
" ppmodのhtmlファイル作成を省力化します。
" Version: 1.0
" Author: lemorin_jp <@lemorin_jp>
" License: VIM LICENSE
if exists('g:loaded_ppmod')
finish
endif
let g:loaded_ppmod = 1
let s:save_cpo = &cpo
set cpo&vim
:scriptencoding utf8
command! -bar Ppmod call ppmod#ppmod()
let &cpo = s:save_cpo
unlet s:save_cpo
autoloadに置くppmod.vimです。表示の都合で文字化け、脱字あります。
2014.10.12
imgタグのユーザー補完について手を抜かない処理に改善しました。
デジカメから画像ファイルをコピーするとコピー日時で統一されるため手抜きの処理では上手く動作しませんでした。
" ppmodのhtmlファイル作成を省力化します。
" Version: 1.0
" Author: lemorin_jp <@lemorin_jp>
" License: VIM LICENSE
let s:save_cpo = &cpo
set cpo&vim
scriptencoding utf8
cd C:\?????\pp
let s:words_mid = []
let s:words_mid += ['<a href=""></a>']
let s:words_mid += ['<br />']
let s:words_image = []
function! ppmod#CompletePpmod(findstart, base)
if a:findstart != 0
"入力済みを無視
return col('.')
else
"補完候補を準備
let words = []
" 日付(PpRemark用)
if 1 < line('.') && '<pre ppmod="PpRemark">' == getline(line('.') - 1)
let words += [strftime('%Y.%m.%d')]
endif
" 開きタグをチェック
let tag_open = ''
let line_num = line('.')
while 6 <= line_num
let linebuff = getline(line_num)
if 0 == stridx(linebuff, '</')
break
elseif stridx(linebuff, '<li>') < stridx(linebuff, '</li>')
elseif 0 <= stridx(linebuff, '<') && (-1 == stridx(linebuff, '/>') && -1 == stridx(linebuff, '</'))
let tag_open = linebuff
break
endif
let line_num -= 1
endwhile
if '' == tag_open
let words += ['<h2>']
let words += ['<pre ppmod="PpDownload">']
let words += ['<pre ppmod="PpNiconico">']
let words += ['<pre ppmod="PpRemark">']
let words += ['<pre ppmod="PpSourceCode">']
let words += ['<pre ppmod="PpGoogleMap">']
let words += ['<ol>']
let words += ['<ul>']
elseif '<h2>' == tag_open
let words += ['</h2>']
elseif 0 == stridx(tag_open, '<pre')
let words += ['</pre>']
elseif '<ol>' == tag_open
let words += ['<li>']
let words += ['</ol>']
elseif '<ul>' == tag_open
let words += ['<li>']
let words += ['</ul>']
elseif 0 <= stridx(tag_open, '<li>')
let words += ['</li>']
endif
if '' == tag_open && line('.') == line('$')
let words += ['</p>']
endif
let words += s:words_mid
let words += s:words_image
return words
endif
endfunction
"ホームページをコンパイル
function! Compile()
silent execute '!start "C:\?????\HTMLをコンパイル.bat'
endfunction
"imgタグに最新10個の画像ファイル名を埋めてユーザー補完に追加
function! FileTimeCompare(i1, i2)
if s:image2time[a:i1] < s:image2time[a:i2]
return -1
elseif s:image2time[a:i2] < s:image2time[a:i1]
return 1
endif
return 0
endfunction
function! Image()
let images = []
let s:image2time = {}
for image in glob('*.jpeg', 0, 1) + glob('*.jpg', 0, 1)
let s:image2time[image] = getftime(image)
let images += [image]
endfor
call sort(images, 'FileTimeCompare')
call reverse(images)
let s:words_image = []
let i = 0
for image in images
let s:words_image += ['<img src="' . image . '" alt="" class="単独" />']
let i += 1
if 10 <= i
break
endif
endfor
endfunction
"編集
function! Edit()
" カテゴリを選択
let category = browsedir('カテゴリを選択', getcwd())
if '' != category
execute 'cd! ' . category
else
return
endif
let s:html_file = browse(0, 'ページを選択', getcwd(), '*.html')
if '' != s:html_file
execute 'e! ' . s:html_file
else
return
endif
call Image()
endfunction
"新規作成
function! New()
" スクラッチでHTMLファイルを作成
" カテゴリを選択
let category = browsedir('カテゴリを選択', getcwd())
if '' != category
execute 'cd! ' . category
else
return
endif
" 既存で最後のファイル名の接頭語から次の接頭語を生成
let html = reverse(sort(glob('??_*.html', 0, 1)))
let prefix_last = strpart(html[0], 0, 2)
let digitalpha = '0123456789abcdefghijklmnopqrstuvwxyz'
let prefix_1_idx = stridx(digitalpha, strpart(prefix_last, 0, 1))
let prefix_2_idx = stridx(digitalpha, strpart(prefix_last, 1, 1))
" 接頭語の順番は、01~99、a0~a9、aa~az、b0~zz
if prefix_1_idx < 9 || prefix_2_idx < 9
" 2桁の数字
let prefix_new = printf('%02d', str2nr(prefix_last) + 1)
elseif prefix_last == '99'
" 99の後はa0
let prefix_new = 'a0'
else
" a1~zz
if prefix_2_idx < strchars(digitalpha) - 1
let prefix_2_idx += 1
else
let prefix_2_idx = 0
let prefix_1_idx += 1
endif
let prefix_new = strpart(digitalpha, prefix_1_idx, 1) . strpart(digitalpha, prefix_2_idx, 1)
endif
let newfile = prefix_new . '_' . input("作成するファイル名(接頭語と拡張子を除く)") . '.html'
" ヘッダーの定型フォーマットに日付を埋める
let today = strftime('%Y/%m/%d')
let header = []
let header += ['<!-- $VER: html code. 1.0, ' . today . ' () -->']
let header += ['<p>']
let header += ['<h1>']
let header += ["\t"]
let header += ['</h1>']
let header += ['<h2>']
let header += ["\t"]
let header += ['</h2>']
call append(0, header)
" カーソルをタイトル位置に移動
let posbuff = getpos('.')
let posbuff[1] = 4
let posbuff[2] = 2
call setpos('.', posbuff)
let s:isnew = 1
execute 'w ' . newfile
let s:isnew = 0
call Image()
endfunction
"ファイル書き出しと同時にブラウザで開く
function! ppmod#OpenHtml()
" 新規作成で書き出した場合は定型フォーマットだけなので開かない
if 0 == s:isnew
silent execute '!start "C:\Program Files (x86)\Mozilla Firefox\firefox.exe" ' . expand("%:p")
endif
endfunction
"ホームページをアップロード
function! Upload()
silent execute '!start "C:\?????\プロバイダと自宅サーバにアップロード.bat'
endfunction
" メニュー
function! ppmod#Menu()
let MenuSelected = inputlist(['PPMODメニュー', '1. ページを作成', '2. ページを編集', '3. コンパイル', '4. アップロード'])
if 1 == MenuSelected
call New()
elseif 2 == MenuSelected
call Edit()
elseif 3 == MenuSelected
call Compile()
elseif 4 == MenuSelected
call Upload()
endif
endfunction
" プラグイン使用開始
function! ppmod#ppmod()
set completefunc=ppmod#CompletePpmod
set fileencoding=utf8
set nobomb
command! -bar PpmodMenu call ppmod#Menu()
let s:isnew = 0
augroup ppmod#Preview
autocmd!
autocmd BufWritePost *.html call ppmod#OpenHtml()
augroup END
endfunction
let &cpo = s:save_cpo
unlet s:save_cpo
