QFixHowmでPelicanのブログ記事を書く

スポンサード リンク

QFixHowmで記事を書いて,PelicanでWebに公開する。 このフローを簡単に実現したい。

ちなみにOctpressとの連携ならWeb上に例があるが,Pelicanと連携した記事はない。 reStructuredTextなPelicanとMarkdownなQFixHowmの相性が悪いからだろうか。

目的:QFixHowmで g,c するPelicanのdraftとして新しいページを作成する

QFixHowmで g,C としてファイル名を指定してメモを作成するときは,最初から清書としてHTML変換したい。 一方で, g,c で日付でファイル名を自動作成する場合は,下書きとしてHTML化しないようにする。

まず, pelicanconf.py に以下の記述をし,パス名にdraftを含むファイルを make html などで無視させる。

IGNORE_FILES = ['.#*', '*draft*']

QFixHowmの下書きファイルを保存するディレクトリを作成する。

$ mkdir $HOME/pelican/content/draft-howm

.vimrc$HOME/pelican/content/draft-howm をhowmのメモの保存先として設定する。 ポイントは draft-howm/howm_filename オプションの一部としてに記述すること。 これにより,QFixHowmのgrep検索で howm_dir 以下にある清書と下書きの両方を 検索対象にしてくれる。 それと同時に, g,c のキー入力でPelicanの下書きファイルとしてQFixHowmのメモを保存できる。

" ベースディレクトリ
let howm_dir = $HOME.'/pelican/content/'
" g,cで開くメモ
let howm_filename = 'draft-howm/%Y-%m/%Y-%m-%d-%H%M%S.rst'
" g,Cで開くファイル名の初期値
let qfixmemo_misc_file = '%Y-%m/'
" g,<Space>で開く日記
let qfixmemo_diary = 'draft-howm/%Y-%m/%Y-%m-%d-DailyReport.rst'
" TODOと予定
let QFixHowm_ScheduleSearchDir = howm_dir.'/draft-howm/schedule'
" メニューファイルディレクトリ
let QFixHowm_MenuDir = howm_dir."/draft-howm/"

目的:新規エントリのテンプレートを作成する

1つの方法はQFixHowmのテンプレートを以下のように .vimrc で指定すること。 これではslug,category,tagsの入力が面倒なので,何らかの形で支援したい。

let QFixHowm_Template = [
  \"",
  \"###########################################",
  \"",
  \":date: %Y-%m-%d %H:%M:%S" ,
  \":modified: %Y-%m-%d %H:%M:%S" ,
  \":category:",
  \":tags:",
  \":slug:",
  \":authors: M\. Tsuyuki",
  \"",
  \".. PELICAN_END_SUMMARY",
  \"",
  \]

そう考えると,結局は以前書いた記事: Pelicanの記事をVimで楽々編集する | 電脳手帳 と同じようにシェルスクリプトを呼び出すしかない。 このシェルスクリプト中で タグやカテゴリをGrepしてSortしてUniqすれば, 現在使用中のカテゴリやタグの一覧が作れる。 入力支援といってもこれぐらいで十分だろう。

目的:QFixHowmをreStructuredTextのタイトル行に対応させる

QFixHowmはMarkdownが前提となっている。 Markdownの見出しは1行だが,reSTの見出しは2行である。

# Markdown

reStrucutruedText
#######################

reSTの見出しをQFixGrepで扱えるようにしたいが, 外部シェルスクリプトに任せる泥臭いやり方しか思いつかなかった。 とりあえずは期待通りに動いているが何となく気持ち悪い。

まず,ファイル保存時に勝手にタイトル行を追加されても迷惑なだけなので OFFにする。

let qfixmemo_alt_title_regxp = '.'

次に正規表現で # が文頭から文末まで続く行をタイトル行として指定する。

" タイトル行検索の正規表現
let QFixMRU_Title = {}
let QFixMRU_Title['rst'] = '^##*$'
let QFixMRU_Title['rst_regxp'] = '^##*$'

このままでは, g,g で検索した結果がすべて ############### となる無意味な表示になってしまう。そこで ############### の1つ 上の行をGrep形式の検索結果として整形し,標準出力で返す 外部シェルスクリプト mygrepprg.sh をGrepコマンドとして登録する。

" QFixHowmでrst対応させるためのgrep
let mygrepprg = $HOME.'/.vim/mygrepprg.sh'

mygrepprg.sh の中身は以下の通り。 読めば分かる通り,正規表現 ^##*$ を使った検索時のみ,1行前の検索結果 を整形して返すようにしている。これを設定しておけば, 今のところは特に問題なくreSTのタイトル行に対応できている。

#!/bin/bash
# custom grep command for  qfixgrep and qfixhowm

if grep  -F '^##*$' $8 > /dev/null 2>&1 ; then
    grep -B1 -Z $@  | sed  -e '/\#.*$/d' -e 's/\x0\([0-9]\)-/:\1:/'
else
    grep  $@
fi

VimからPelicanのMakefileを呼び出すコマンドを作成

ここまで来たら,VimからPelicanブログのデプロイまでしてしまいたい。 PelicanのMakefileをVimから呼び出すのが一番楽かな。 単なるエイリアスになるけど。

ちなみに,以下の記事でMakefileを使って自動的にgithub pagesにデプロイする方法を書いた。

ブログをgithub pagesに移行した | 電脳手帳

.vimrcまとめ

最後に今のところの .vimrc を載せておく。

"---------------------------------------------------------------------
" QFixHowm
"---------------------------------------------------------------------
" キーマップリーダー
let QFixHowm_Key = 'g'
" howm_dirはファイルを保存したいディレクトリを設定
let howm_dir= $HOME.'/git_projects/pelican-blog/tech_content'
let pelican_dir= $HOME.'/git_projects/pelican-blog'
let howm_filename = 'draft-howm/%Y-%m/%Y-%m-%d-%H%M%S.rst'
let qfixmemo_diary = 'draft-howm/%Y-%m/%Y-%m-%d-DailyReport.rst'
let qfixmemo_misc_file = '%Y-%m/'
let howm_fileencoding = 'utf-8'
let howm_fileformat = 'unix'
let QFixHowm_FileType = 'rst'
"予定・TODOの検索場所指定
let QFixHowm_ScheduleSearchDir = howm_dir.'/draft-howm/schedule'
"予定・TODOでのプレビュー表示ON/OFF
let QFixHowm_SchedulePreview = 1
"予定やTODOに現在日付行や現在時刻行、境界行を表示する
let QFixHowm_ShowTodayLine = 1 "0にすると一部の予定が表示されなくなる?

" タイトル行検索の正規表現
let QFixMRU_Title = {}
let QFixMRU_Title['rst'] = '^##*$'
let QFixMRU_Title['rst_regxp'] = '^##*$'

" 擬似タイトル行とみなす正規表現(Vim)
" ファイルの一行目が特定の文字列で始まっていたらタイトル行やタイムスタンプの付
" 加を行いたくない場合に使用する
let qfixmemo_alt_title_regxp = '.'

" 表示するファイルリストの指定
let QFixHowm_FileList = '**/*'

"新規エントリのテンプレート
let QFixHowm_Template = []
" let QFixHowm_Template = [
"   \"",
"   \"###########################################",
"   \"",
"   \":date: %Y-%m-%d %H:%M:%S" ,
"   \":modified: %Y-%m-%d %H:%M:%S" ,
"   \":category:",
"   \":tags:",
"   \":slug:",
"   \":authors: M\. Tsuyuki",
"   \"",
"   \".. PELICAN_END_SUMMARY",
"   \"",
"   \]

" テンプレートに挿入されるタグ

" 時間関係
" 更新時間管理モード
let QFixHowm_RecentMode = 0
" タイムスタンプ付加
let qfixmemo_use_addtime = -1
" タイムスタンプアップデート
let QFixHowm_SaveTime = -1
let qfixmemo_use_updatetime = -1
"QFixGrepの検索時にカーソル位置の単語を拾う/拾わない
let MyGrep_DefaultSearchWord = 0
"QFixHowmの検索時にカーソル位置の単語を拾う/拾わない
let QFixHowm_DefaultSearchWord = 0

" メニューファイルディレクトリ
let QFixHowm_MenuDir = howm_dir."/draft-howm/"
" メニューファイル
let QFixHowm_Menufile = 'Menu-00-00-000000.howm'
"カレンダー表示の分割指定(vertical topleft, vertical botright,  rightbelow, leftabove)
let QFixHowm_CalendarWinCmd = 'rightbelow'
"---------------------------------------------------------------------
" QFixGrep
"---------------------------------------------------------------------
" QFixHowmでrst対応させるためのgrep
let mygrepprg = $HOME.'/.vim/mygrepprg.sh'
" 外部grep(shell)のエンコーディング(Unix)
let MyGrep_ShellEncoding = 'utf-8'
" QuickFixウィンドウでもプレビューや絞り込みを有効化
let QFixWin_EnableMode = 1
" QFixHowm/QFixGrepの結果表示にロケーションリストを使用する/しない
let QFix_UseLocationList = 0
" QuickFixウィンドウから開いた後ウィンドウを閉じる
let QFix_CloseOnJump = 1

" ------------ Pelican ---------------------------------------------
" スケルトンを作成
autocmd BufNewFile $HOME/git_projects/pelican-blog/*_content/*.md silent! exe "0r! sh $HOME/git_projects/pelican-blog/mkskel.sh  %"
autocmd BufNewFile $HOME/git_projects/pelican-blog/*_content/*.rst silent! exe "0r! sh $HOME/git_projects/pelican-blog/mkskel.sh  %"
" 保存時に更新日時を書き換え
autocmd BufWrite $HOME/git_projects/pelican-blog/*_content/*.md exe "%s/^Modified:.*/Modified: ".strftime("%F %T")."/ | normal ``zz"
autocmd BufWrite $HOME/git_projects/pelican-blog/*_content/*.rst exe "%s/^:modified:.*/:modified: ".strftime("%F %T")."/ | normal ``zz"

Comments !

social