Hatena::ブログ(Diary)

こくう このページをアンテナに追加 RSSフィード

2011-11-09

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

21:44 | vimで休日表示付きのカレンダーを使うを含むブックマーク vimで休日表示付きのカレンダーを使うのブックマークコメント

calendar.vimを使うとVim上にカレンダーを表示する事が可能です。

ただデフォルトでは休日表示がされていないため、個人的にはほとんど使っていませんでした。

諸事情から休日表示付きのカレンダーがVim上に欲しいと思って、calendar.vimのソースを見てみたのですが、よくわからないのでcalendar.vimに休日表示を追加するプラグインを作ってみました。

さすがにカレンダーで休日表示がないのも考えにくいのでどっかにあるんだと思いますが、QFixHowmの休日定義をそのまま流用できるように作ったのでそれはそれということで車輪の再発明です。

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

f:id:fuenor:20111105100146j:image:w360

  • 今日は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へ追加して日付上で<CR>を押すと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テクニックバイブル

21:44 |  Vimテクニックバイブルを含むブックマーク  Vimテクニックバイブルのブックマークコメント

ここには特に書いてなかったのですがVim関連本の原稿を執筆しました。

複数著者による、初心者〜中級者向けの(主にプラグインで)環境改善がテーマのVim本です。

おかげさまで増刷決定しました :-D

Vimテクニックバイブル 〜作業効率をカイゼンする150の技
Vimテクニックバイブル 〜作業効率をカイゼンする150の技

Vimの操作等はすでに了解しているものとして、次のステップとして編集環境を快適にするための実践的なTipsが多数記載されています。

不特定多数向けの一般的なTipsではなく特化したTipsが多いため、全てのTipsが役に立つというタイプの本ではありませんが、その分より濃い内容となっています。

御用とお急ぎのない方はどうぞお手にとっていただければ。

2011-07-05

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

20:48 |  [Linux][tips] iBusでIMのOn/Offを個別制御を含むブックマーク  [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][tips] VimとIBusの vi協調モード

20:48 |  [vim][tips] VimとIBusの vi協調モードを含むブックマーク  [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できちんとした動作を行えるように修正しました。


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

hito_asahito_asa 2011/09/02 15:18 参考になりました。
IME無効にするとこ、InsertEnterじゃなくてInsertLeaveですよね。

fuenorfuenor 2011/09/02 19:10 うわ、これはひどいミスですね。修正しました。
ありがとうございます。

2011-05-09

vimから Evernoteへ登録(Windows)

| 20:08 |  vimから Evernoteへ登録(Windows)を含むブックマーク  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'

2010-05-13

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

| 21:31 |  vimでファイルをHTML変換するを含むブックマーク  vimでファイルをHTML変換するのブックマークコメント

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


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


インストールや詳しい使い方は実際に変換されたHTMLにあります

howm2html.vimで変換された howm2htmlヘルプを表示


現在編集中のバッファやファイルをすぐにHTML変換して表示できるので、vimblogシステムの一部のような感覚で扱うことが出来ます。

閲覧が主な目的の場合なら、画像なども一緒に表示されるので便利です。


howm2html.vim 自体は 単独で完全に動作するスクリプトで、 「QFixHowm」と併用するとより便利に扱えますが QFixHowmは必要としません。

QFixHowmの検索結果を連結表示してからHTML化すると動的生成な感じのHTMLファイルとして扱えますし、howmファイルを静的にHTML化しておくと、vimを使用しなくても閲覧可能な簡易プライベートblogとして利用できます。

howmで日記を付けているなら、日記だけ変換しておくのも良いかもしれません。

2010-01-15

vimで内容が空のファイルを保存したら自動で削除する

| 19:27 | vimで内容が空のファイルを保存したら自動で削除するを含むブックマーク vimで内容が空のファイルを保存したら自動で削除するのブックマークコメント

vim/gvimで開いたファイルを削除したい時があります。

:Explore や shellコマンドでも良いのですが、単純にファイルの中身を全削除して保存したらファイル自体も削除するように設定しています。


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

augroup BUFWRITE_POSTDELETE
  au!
  autocmd BufWritePost * call BufWritePostDelete()
augroup END

function! BufWritePostDelete()
  if search('^.\+$', 'ncw') == 0
    call delete(expand('%:p'))
  endif
endfunction

ファイルの中身に関わらず削除してはいけないファイルがある場合は、特定の拡張子の場合(例えば txt)だけ中身のないファイルを削除するようにした方がよいかもしれません。

augroup BUFWRITE_POSTDELETE
  au!
  autocmd BufWritePost *.txt call BufWritePostDelete()
augroup END

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

| 19:27 | vimで現在編集中のバッファのファイル名を変更するを含むブックマーク 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

thincathinca 2010/01/16 00:32 余計なお世話かもしれませんが、こんな感じでもっとシンプルに書けます。
command! -nargs=1 -bang -bar -complete=file Rename saveas<bang> <args> | call delete(expand('#:p'))

fuenorfuenor 2010/01/16 09:11 一週間ぐらい特定の拡張子でBufWritePostを使って保存時に変換した別ファイル開く処理を行った時があって裏バッファ名に依存しないようにしていた名残です。普通は全く問題ないと思いますが、事が削除なので安全のためそのままにしています。