以前Octopressを試してみる で、Octopress記事作
成スクリプトを掲示したが、これを変更してみた。
変更点は
サブディレクトリの指定
YAML Front Matterに published:の追加
YAML Front Matterのcategories:、keywords:に初期値追加
続きを読む(<!-- more -->
)の追加
変更点の説明
サブディレクトリの指定
octopress_dir/source/_post
にサブディレクトリを作ってもちゃんと記事を認識してくれるみたい。
月毎にディレクトリ作っておいた方が管理が楽そうなので、それに対応させるように
g:octopress_article_subdir
変数を追加。
let g:octopress_article_subdir = '%Y-%m'
のように指定。文字列には strftime()で使用できる書式指定コードを指定可能。
Kaoriya版なら、VC2010なのでVisual Studio 2010のstrftime() を参照。
gccでコンパイルされてるならManpage of strftime になるのかな?
サブフォルダが存在しない場合は自動的に作られる(vimのmkdir()が存在すれば)。また’%Y/%m’のように複数階
層になっても動くはず。
:published の追加
下書き機能ってないのかな?とOctopress Document-Blogging Basics を見てるとYAML Front Matterにpublished: false
と指定すれば良い
ことが分かった。
その時わざわざ追加するのもうざいので、記事の先頭部分にpublished:
を追加するようにしてみた(初期値はtrue)
categories:、keywords:に初期値追加
いつも「書式どうだったっけ?」と思うので、categories:
とkeywords:
にダミー初期値を出力するようにし
てみた。
鬱陶しいならソースを修正しといてください
続きを読む<!-- more -->
の追加
記事中に<!-- more -->
があると「続きを読む」リンクが表示される。
毎回打つのも面倒なので、末尾に追加するようにしてみた。
なお表記はデフォルトでは「Read on →」となるが、これを変更したい場合_config.yml
の
excerpt_link: "Read on →" # "Continue reading" link text at the bottom of excerpted articles
を変更すればよい。
ソースコード
$VIMRUNTIME/autoload/myvimrc.vim
に以下を追加
"Octopress 新記事作成
"
"使用するグローバル変数
" g:octopress_rootdir octopressルートディレクトリ
" g:octopress_article_ext 記事の拡張子
" g:octopress_article_subdir 記事のサブフォルダ。strftime()のパラメータ(%Y等)
" 使用可能
"
" 2012/01/06 新規作成
" 2012/01/11 category,keywordに初期値を入れた
" publishedフィールド追加
" g:octopress_article_subdir追加
"
func! myvimrc#new_article(title)
let l:atitle = a:title
if ( l:atitle == "" )
let l:atitle = input("input title:")
endif
let l:time = localtime()
let l:hantitle = l:atitle
"Kaoriya 全角→半角関数があるなら使う
if ( exists( "*ToHankaku" ) )
let l:hantitle = ToHankaku(l:atitle)
endif
" match_characterはKaoriyaのhz_ja.vimより。意味はよく分からん。
let l:match_character = '\%([ウカキクケコサシスセソタチツテトハヒフヘホ]゙\|[ハヒフヘホ]゚\|.\)'
let l:asctitle = ""
let l:ii = 0
let l:len = strlen(l:hantitle)
" titleのファイル名に使える英数字&記号だけ抜き出す。
while ( l:ii < l:len )
let l:char = matchstr(l:hantitle, l:match_character, l:ii)
"2バイト文字は省く
if ( l:char =~ '^\f$' && char2nr(l:char) < 256 )
let l:asctitle .= l:char
endif
let l:ii += strlen(l:char)
endwhile
if ( l:asctitle == "" )
let l:asctitle = "article"
endif
let article_dir = get(g:, 'octopress_rootdir', '~/octopress') . '/source/_posts/'
let sub_dir = strftime(get(g:, 'octopress_article_subdir', ''), l:time)
if ( sub_dir != '' )
if ( finddir( article_dir . sub_dir ) == '' )
if ( exists( "*mkdir" ) )
let article_dir .= l:sub_dir
call mkdir( article_dir, "p" )
else
"作れない場合は_postsに置いとく
echohl ErrorMsg | echomsg 'mkdirをサポートしてません _postに置いておきます' | echohl None
endif
else
let article_dir .= l:sub_dir
endif
let last_char = article_dir[strlen(article_dir)-1]
if ( last_char != '/' && last_char != '\' )
let article_dir .= '/'
endif
endif
let article_ext = get(g:, 'octopress_article_ext', 'markdown')
let l:fbase = strftime("%Y-%m-%d-", l:time) . l:asctitle
let l:fname = article_dir . l:fbase . '.' . article_ext
let l:is_create = 1
if ( findfile(l:fname) != "" )
let l:ec = tolower(input("'".l:fbase.'.'.article_ext."' is exist create/overwrite/edit [c/w/e]?:"))
if ( l:ec == "w" )
call delete(l:fname)
elseif (l:ec == "c" )
let l:ii = 0
while ( 1 )
let l:ii += 1
let l:fname = article_dir . l:fbase.'_'.l:ii.'.' . article_ext
if ( findfile(l:fname) == "" )
break
endif
endwhile
elseif (l:ec == "e" )
let l:is_create = 0
else
return
endif
endif
if ( l:is_create )
let l:utf8title = ""
if ( has('iconv') )
let l:utf8title = iconv(l:atitle, &enc, "utf-8")
else
let l:utf8title = l:atitle
endif
let l:wlines = ['---', 'layout: post']
let l:wlines += ['title: "' . l:utf8title . '"']
let l:wlines += ['date: '. strftime("%Y-%m-%d %H:%M", l:time)]
let l:wlines += ['comments: true', 'published: true', 'categories: [cat1, cat2]']
let l:wlines += ['description: ', 'keywords: key1, key2', '---', '',"<!-- more -->"]
call writefile( l:wlines, l:fname )
endif
if ( l:asctitle == l:atitle )
"タイトルに日本語が含まれない場合、明示的にutf-8にしてみる
"タイトルにファイル名に使えない文字が含まれてる場合ここを通らないけど
augroup au_oct_new
au BufEnter * setl fenc=utf-8
augroup END
endif
execute "edit" . " ++enc=UTF-8 " . l:fname | "normal G"
if ( l:asctitle == l:atitle )
augroup au_oct_new
autocmd!
augroup END
endif
endfunc
$MYVIMRC
に以下を追加
_vimrc 1
2
3
4
5
command! - nargs= ? OctNewPost call myvimrc#new_article(< q - args>)
"設定サンプル
let g:octopress_article_ext = "krd"
let g:octopress_rootdir = expand( '$OCTOPRESS_DIR' )
let g:octopress_article_subdir = '%Y-%m'
そのうちプラグインにするかも。
実行と出力サンプル
今日の日付が2012/01/12で上記設定サンプルが有効な場合にvim上で
:OctNewPost Octopressを試してみる
などとして実行すると$OCTOPRESS_DIR/source/_post/2012-01/2012-01-12-Octopress.krd
ができる
2012-01-12-Octopress.krd 1
2
3
4
5
6
7
8
9
10
11
12
---
layout : post
title : "Octopressを試してみる"
date : 2012-01-12 09:08
comments : true
published : true
categories : [ cat1 , cat2 ]
description :
keywords : key1, key2
---
<!-- more -->