Vimテクニックバイブル

ここには特に書いてなかったのですがVim関連本の原稿を執筆しました。
複数著者による、初心者〜中級者向けの(主にプラグインで)環境改善がテーマのVim本です。
おかげさまで増刷決定しました :-D

Vimテクニックバイブル 〜作業効率をカイゼンする150の技
Vimテクニックバイブル 〜作業効率をカイゼンする150の技
Vimの操作等はすでに了解しているものとして、次のステップとして編集環境を快適にするための実践的なTipsが多数記載されています。
不特定多数向けの一般的なTipsではなく特化したTipsが多いため、全てのTipsが役に立つというタイプの本ではありませんが、その分より濃い内容となっています。
御用とお急ぎのない方はどうぞお手にとっていただければ。

vimで休日表示付きのカレンダーを使う

calendar.vimを使うとVim上にカレンダーを表示する事が可能です。
ただデフォルトでは休日表示がされていないため、個人的にはほとんど使っていませんでした。
諸事情から休日表示付きのカレンダーがVim上に欲しいと思って、calendar.vimのソースを見てみたのですが、よくわからないのでcalendar.vimに休日表示を追加するプラグインを作ってみました。
さすがにカレンダーで休日表示がないのも考えにくいのでどっかにあるんだと思いますが、QFixHowmの休日定義をそのまま流用できるように作ったのでそれはそれということで車輪の再発明です。

とりあえず休日の強調表示は今回作成したプラグイン単独で行うのでQFixHowmは特に必要としません。

  • 今日は2011年11月05日で、 11月3日と11月23日が休日のためハイライトされています。
  • その他赤く表示されているのが休日です。
  • +記号がついてハイライトされている日が日記が存在する日で、23日は日記も存在している休日なので#記号で表示されハイライトされています。

インストール

今回作成したhowm-calendar.vimは以下にあります。
runtimepathの通った場所へコピーしてください。
https://sites.google.com/site/fudist/files/howm-calendar.vim


calendar.vimに表示する休日を定義するファイルにはQFixHowmの休日定義ファイルを使用します。
休日定義ファイル
https://sites.google.com/site/fudist/Home/qfixhowm#downloads
日本語部分は表示されないのでutf-8,cp932のどちらでもかまいません。
好みの場所においたらパスを登録します。

" calendar.vimで使う休日定義ファイル(パス等は環境に合わせてください)
let calendar_holidayfile = '~/howm/Sche-Hd-0000-00-00-000000.utf8'


あとは :Calendar でカレンダーを表示すると休日が強調表示されているはずです。

QFixHowmとの連携

休日表示とは関係ないですが、以下を .vimrcへ追加して日付上でを押すとQFixHowmで日記を書くことができます。

let calendar_action = "QFixHowmCalendarDiary"
let calendar_sign   = "QFixHowmCalendarSign"

あとQFixHowmを使っているなら calendar_holidayfileは設定しなくてもQFixHowmの設定から自動で探します(たぶん)

休日を強調表示する

サインは次の表のように表示されます。

普通日
+ 日記が存在する
@ 休日
# 休日で日記が存在する

休日とその他の日は別にシンタックスハイライトで色分けして表示されているはずです。

休日定義のフォーマット

休日定義ファイルで使用可能な定義はQFixHowmの予定・TODOのサブセットです。
現在のところは次の3種類のみサポートされています。

[2010/01/11]@@@(2*Mon)0 成人の日
[2010/02/11]@@@0 建国記念の日
[2011/03/21]@0 春分の日

@@@ は年単位の繰り返しで、第3水曜を指定したい場合は(3*Wed)のように曜日指定オプションを使用します。
つまり@@@では年と日指定は意味がなく月指定と曜日指定から生成されます。
@ は一回限りの指定です。

休日サインのシンタックスハイライト

calendar.vimを併用している場合、カーソルキーの左右等でデフォルト以外の月のカレンダーを表示させるとシンタックスハイライトがデフォルトに戻ってしまい、「休日」と「日記の存在する日」とが色で区別できなくなることがあります。
これはcalendar.vimシンタックスハイライトを毎回リセットしてしまうためですが、気になる場合はcalendar.vimシンタックス作成が終わった後に独自のシンタックス設定を行なってやれば良いということになります。
具体的には calendar.vim Ver.2.5なら1166行目の function Calendar()の最後に CalendarPost()を追加すると良いかと思います。

function! Calendar(...)
...()

  if search("\*","w") > 0
    silent execute "normal! gg/\*\<cr>"
  endif
  call CalendarPost()  " 独自の色分けのためここに追加する
  return ''
endfunction

lispのdefadviceみたいのが欲しいところです。

howm-calendar.vimの休日強調表示が気に入らない場合は次を設定して無効化してください。

" calendar.vimのハイライト表示変更
let calendar_howm_syntax = 0

[vim][tips] VimとIBusの vi協調モード

IBusには vi協調モードがありますがVimを使っていたら、どうもバグ臭い挙動があって気になるので対処してみました。
具体的には次のような挙動です。

  1. 挿入モードへ
  2. IMオン
  3. なにも入力しないでノーマルモード
  4. IMはオンのまま

何か入力するとちゃんとノーマルモードでIMがオフになるのでバグじゃないかなと思います。
IBusでimactivatekeyを設定すると入力できなくなったりもするので、自分が何か間違えているのだろうかとも思いますが面倒なのでPythonスクリプトで回避することにしました。
Pythonを利用する事によりバグ回避だけでなく Vim(非GUI)でも vi協調モードが動作するようになります。


UbuntuPythonがデフォルトでインストールされていて、VimPythonインターフェイスが有効なのでIBusPythonで制御します。

au InsertLeave * call PyIBusDisable()

" PythonでIMのオフ
function! PyIBusDisable()
python << EOF
import ibus
bus = ibus.Bus()
ic = ibus.InputContext(bus, bus.current_input_contxt())
ic.disable()
EOF
endfunction


Pythonインターフェイスが使えないVimでは同じ内容を外部ファイルibus-disable.pyにして実行します。

au InsertLeave * call PyIBusDisable()

" 外部のPythonスクリプトでIMのオフ
function! PyIBusDisable()
  let res = system('python ~/path/to/ibus-disable.py &')
endfunction

ibus-disable.pyは適当なディレクトリにコピーしてsystem呼び出し部分のpathは変更して下さい。
最後の & は非同期にするためですがなくても問題ないかもしれません。。


当然IMオンも個別制御できるので、ついでにVim用の「日本語入力固定モード」もIBusできちんとした動作を行えるように修正しました。


IBusのvi協調モードは切ることが出来ないのでバグがあったり、自分で制御したい時はちょっと面倒だなとか思ったり思わなかったり。

[Linux][tips] iBusでIMのOn/Offを個別制御

最近UbuntuクリーンインストールしたらIMのデフォルトがIBusになっていました。
IBusではIMのOn/Offを個別設定できないようなので「変換」キーと「無変換」キーでIMをON/OFFみたいなことができません。
とりあえずUbuntuにはデフォルトでPythonがインストールされているので、Pythonで制御してキーボードショートカットに割り付けることにしました。


PythonIBusのIMトグル

import ibus
bus = ibus.Bus()
ic  = ibus.InputContext(bus, bus.current_input_contxt())
if ic.is_enabled():
  ic.disable()
else:
  ic.enable()


このスクリプトibus-toggle.pyなど適当なファイルにして

$ python ibus-toggle.py

みたいに実行するとIMがトグルされるはずです


ここでハマったのがcurrent_input_contextではなくcurrent_input_contxtを使用するというところです。
これってtypoだろ! と思ったのですが、Changelogをみるともろにtypo修正という項目があるので互換性のためかなにかでこのままなのかもしれません。
それならそれでcurrent_input_contextもちゃんと定義しろよ、という気もしますが、自分がなにか勘違いしている可能性も高いですし、とりあえず動作したのでそこはそれ。
もしも動かなくなっていたらこの辺が怪しいということにして覚え書き。


ということでIMオンとIMオフも作成しました

PythonIBusのIMオン

import ibus
bus = ibus.Bus()
ic = ibus.InputContext(bus, bus.current_input_contxt())
ic.enable()

PythonIBusのIMオフ

import ibus
bus = ibus.Bus()
ic = ibus.InputContext(bus, bus.current_input_contxt())
ic.disable()

vimから Evernoteへ登録(Windows)

vimから Evernoteへ、現バッファの指定範囲/任意ファイルの内容を登録するスクリプトです。
ENScript.exe(evernoteに同梱)を使用しているので Windows専用になります。
内部エンコーディングやファイルエンコーディングは気にせず使用可能です。
vim2en_win.vim
基本的にコピペの手間を省くだけの物です。


使用方法

vimfiles/pluginなどのランタイムパスが通った場所へコピーして下さい。

指定範囲を Evernoteへ登録

無指定時は現バッファの全行が対象になります。

:BufToENwin

適当にキーマップするなどしてください。

nnoremap \e :BufToENwin<CR>
vnoremap \e :BufToENwin<CR>

登録タイトルは指定範囲の一行目から作成されます。

指定ファイルを Evernoteへ登録

無指定時は現バッファのファイルが対象になります。

:VimToENwin
:VimToENwin c:/path/to/file

ファイル名がそのまま登録タイトルになります

オプション

タグは v2e で登録されます。

let ENScript_tag = 'v2e'


複数タグは ENScript.exeの /t コマンドを追加します。

let ENScript_tag = 'v2e /t hoge /t fuga'

実行時のオプション指定が可能なのでそちらで設定しても良いかもしれません。

" ENScript.exeのオプション指定
let ENScript_opt = ''


その他、一時ファイルや ENScript.exeのパス指定

" ENScript.exeのパス
let ENScript = 'C:\Program Files\Evernote\Evernote\ENScript.exe'
" 転送ファイルの一時保存場所  
let ENscript_tempdir  = '~/evernote'
" 転送ファイル名  
let ENScript_filename  = '_evernote_.txt'

vimでファイルをHTML変換する

howm2html.vim は編集中のバッファやファイルをHTMLに変換してブラウザで開くプラグインです。


画像はサムネイル表示が行われ、一部のはてな記法はテーブルやリスト、引用などのHTMLタグに変換されて表示されます。


インストールや詳しい使い方は実際に変換されたHTMLにあります
howm2html.vimで変換された howm2htmlヘルプを表示


現在編集中のバッファやファイルをすぐにHTML変換して表示できるので、vimをblogシステムの一部のような感覚で扱うことが出来ます。
閲覧が主な目的の場合なら、画像なども一緒に表示されるので便利です。


howm2html.vim 自体は 単独で完全に動作するスクリプトで、 「QFixHowm」と併用するとより便利に扱えますが QFixHowmは必要としません。
QFixHowmの検索結果を連結表示してからHTML化すると動的生成な感じのHTMLファイルとして扱えますし、howmファイルを静的にHTML化しておくと、vimを使用しなくても閲覧可能な簡易プライベートblogとして利用できます。
howmで日記を付けているなら、日記だけ変換しておくのも良いかもしれません。

vimで現在編集中のバッファのファイル名を変更する

以下を .vimrcに追加します。

command! -nargs=+ -bang -complete=file Rename let pbnr=fnamemodify(bufname('%'), ':p')|exec 'f '.escape(<q-args>, ' ')|w<bang>|call delete(pbnr)

変更したいファイル名を指定して実行します。

:Rename newfilename

!を付けると強制保存して変更します。

:Rename! newfilename