zshでmercurialのactive branchesを補完する

この記事は、Mercurial Advent Calendar 2011 - [PARTAKE]の3日目の記事です.

みなさんいかがおすごしですか.
ゲームの中でもチーフに冷たくされてしょんぼりしているyuitowestです.
f:id:yuitowest:20111203183719j:image

Mercurialを使っているとbranchをガンガン作ってガンガン切り替えます.
毎回 hg branches等でbranch名を確認して切り替えるのは面倒です.

そこでzshの補完機能を使って hg update のあとにactive branchを補完してくれるようにします.
まずはzshの補完関数を置くディレクトリを作ります.

$ > mkdir -p $HOME/.zsh/functions

pathを通します.
.zshrcに以下を記述します.

fpath=($HOME/.zsh/functions $fpath) 

zsh補完関数を設置します.

touch $HOME/.zsh/functions/_hg
vi $HOME/.zsh/functions/_hg

補完関数はこちら
Zsh completion script for mercurial — Gist
/path/to/zsh/4.3.11/functions/_hgを少々修正したものです.

--- a/_hg
+++ b/_hg
@@ -173,6 +173,17 @@
   (( $#tags )) && _describe -t tags 'tags' tags
 }
 
+_hg_branches() {
+  typeset -a branches
+  local branch rev
+
+  _hg_cmd branches -a |awk '{print $1}' 2> /dev/null | while read branch
+  do
+    branches+=(${branch/ #    [0-9]#:*})
+  done
+  (( $#branches )) && _describe -t branches 'branches' branches
+}
+
 # likely merge candidates
 _hg_mergerevs() {
   typeset -a heads
@@ -759,7 +770,7 @@
   _arguments -s -w : $_hg_global_opts \
   '(--clean -C)'{-C,--clean}'[overwrite locally modified files]' \
   '(--rev -r)'{-r+,--rev}'[revision]:revision:_hg_tags' \
-  ':revision:_hg_tags'
+  ':revision:_hg_branches'
 }

これでactive branch名が補完されます.
f:id:yuitowest:20111203191330p:image

やりましたね.

Omakeの自動継続ビルドしようとしたらvimでハマった

vim

sphinx専用エディタとかないかなーってつぶやいたらOmakeを薦められた。
世の中便利なものがあるんだねーほえーとか思いながらOmakeをビルドして
自動makeいざ尋常にって勝負したら動いてくれないわけ。

いろいろやってもだめで悩んだ挙句ファイル汚くしたんで一旦戻そうと思って
svn revert * ってやったら動いたわけですよ。意味がわからんし。

そこでいろいろ試してみることに。
まずemacs使ってやった
なんだと。。。動くだと。。。
emacsにできてvimに(ry

次にvim -u NONE hoge.rst してみる。
vimをデフォルトの状態で起動したわけです。
なんだと。。。動くだと。。。

で、犯人は/Users/yuito/.vimrc or /Users/yuito/.vim/* に決定

で、ここからが本題です。

vimのhelpから引用

options - vimdoc-ja

'backupcopy' 'bkc' 文字列 (UnixでのViの既定値: "yes" 、それ以外: "auto")
グローバル
{Vi にはない}
ファイルの書き込みをしてバックアップが作られるとき、その方法をこのオプ
ションで指定する。このオプションはコンマで区切られた単語のリストである。

主な値は次の通り:
"yes" 先にファイルのコピーを作ってバックアップにして、更新した内容は
元のファイルに上書きする
"no" 先に元のファイルをリネームしてバックアップにして、更新した内容
は新しいファイルに書き出す
"auto" どちらか適切な方を選ぶ

次の値を上のどれか1つと組み合わせることができる:
"breaksymlink"は書き込み時に常にシンボリックリンクを切る。
"breakhardlink"は書き込み時に常にハードリンクを切る。

backupとwritebackupの関係

editing - vimdoc-ja

'backup' 'writebackup' 動作
off off バックアップは作られない
off on カレントファイルをバックアップし、後で消去する (既定)
on off 古いバックアップを消去し、カレントファイルをバックアッ
プする
on on 古いバックアップを消去し、カレントファイルをバックアッ
プする

簡単にいうとbackupを作成するときは元ファイルが更新されときと
元ファイルをバックアップにして新しいファイルに更新が書き出されるときがある。

しかし、こいつに関係しそうなオプションが沢山あってわけわかめなので
3つのオプションの組み合わせでどんな挙動をするのかの検証をしてみた。

基本的にはbackupはとらないので

set nobackup

は設定しておきます

  • その1
set writebackup
set backupcopy=auto
 *** omake error:
   File OMakefile: line 18, characters 1-36
   rule failed to build target: source/index.rst

対象ファイルがなくなったって言われる

  • その2
set writebackup
set backupcopy=yes

問題なし

  • その3
set writebackup
set backupcopy=no

問題なし

  • その4
set nowritebackup
set backupcopy=auto or yes or no

:quitのタイミングでbuildが走る


とりあえずbackupcopy=autoはやめましょうということで。

sphinxのPDF出力ではまった

sphinxのPDF出力ではまったのでメモ。

環境

  • Mac OS X 10.6
  • python2.6(標準でつんでるやつ)
  • Sphinx1.0.8
  • texlive2011

作業メモ

Sphinxのrootディレクトリでmake latexを実行した。

yuito@yuito.local> make latex

Markup is unsupported in LaTeX:
syntax:: column or row spanning cells are not yet implemented.
make: *** [latex] Error 1

AAで書いた表が悪さしていたみたいで、探しだして撲滅した。

+---------------------+
|aaa                  |
+========+============+
|bbb     |ccc         |
+        +------------+
|        |dd          |
+--------+------------+

こんなやつです。list-tableを使って書くよう徹底しようと思った。

latexディレクトリに移動してmake all-pdfを実行した。

yuito@yuito.local> cd build/latex
yuito@yuito.local> make all-pdf
for f in *.pdf *.png *.gif *.jpg *.jpeg; do ebb $f; done
        .
        .
        .
# 下記のように止まった場合はr[Enter]と入力すればいい
! Undefined control sequence.
l.204 ...n}{0.5em}{\py@TitleColor}{\py@NormalColor

?
        .
        .
        .
Output written on hogehoge.dvi (183 pages, 916844 bytes).
Transcript written on hogehoge.log.
make: *** [all-pdf-ja] Error 1 

とりあえずdviできたのでpdf作ってみた。

yuito@yuito.local> dvipdfmx hogehoge.dvi

結果画像とかおかしな位置にあったり、表が崩れていたりして綺麗に出力されていない。

日本語のときはplatexでしょJK

ごめんなさいごめんさない。

で、以下が成功例。
追記: make all-pdfを使っていたのでmake all-pdf-jaを使うようにした。
make latexで作成が完了したあとlatexディレクトリにあるsphinx.styを修正。

diff --git a/sphinx.sty b/sphinx.sty
--- a/sphinx.sty
+++ b/sphinx.sty
@@ -47,7 +47,7 @@
 
 % For graphicx, check if we are compiling under latex or pdflatex.
 \ifx\pdftexversion\undefined
-  \usepackage{graphicx}
+  \usepackage[dvipdfm]{graphicx}
 \else
   \usepackage[pdftex]{graphicx}
 \fi
yuito@yuito.local> make all-pdf-ja

yuito@yuito.local> dvipdfmx hogehoge.dvi

うまくいきました。

vimでpep8を実行

最近python書く機会が多くなったので、自動でやってほしいよねと。
探したらこれが見つかった
https://github.com/nvie/vim-pep8
感謝しながらダウンロードしてきて.vimに展開
vundleの人は

" .vimrc
Bundle 'git://github.com/nvie/vim-pep8.git'
" :BundleInstall 実行

保存したときに実行するように設定

autocmd FileType python call s:python_settings()
function! s:python_settings()
  autocmd BufWritePost <buffer> call Pep8()
endfunction

ftplugin/python.vimに書いてもいい

f:id:yuitowest:20111110135305p:image

quickfixに結果が出力されます

mercurialのstyleを使用してlog出力をカスタマイズする

mercurialのdefaultのlog出力はあまりみやすくない.
styleオプションを使って出力形式を変えてみる.

mercurialのstyle

mercurialは標準でdefault changelog compactの3種類のstyleを積んでいる.

$ hg log --style default
changeset:   1:1fc5a09d576e
branch:      test
tag:         tip
user:        yuito 
date:        Fri Jun 10 11:05:15 2011 +0900
summary:     edit sample.txt

changeset:   0:4bfc25d77dab
user:        yuito 
date:        Fri Jun 10 11:04:23 2011 +0900
summary:     add files


$ hg log --style changelog
2011-06-10  yuito  

        * sample.txt:
        edit sample.txt
        [1fc5a09d576e] [tip] <test>

        * sample.txt, sample2.txt:
        add files
        [4bfc25d77dab]


$ hg log --style compact
1[tip]   1fc5a09d576e   2011-06-10 11:05 +0900   yuito
  edit sample.txt

0   4bfc25d77dab   2011-06-10 11:04 +0900   yuito
  add files

styleの自作

どれもあまりしっくりこないので、自分なりに作ってみた.

出力の形式は3種類書ける

  • changeset
  • changeset_quiet
  • changeset_verbose

changeset_quiet は --quietオプションを付けた場合のテンプレート
changeset_verboseは --verboseオプションを付けた場合のテンプレート

# こんな感じ
changeset = '{rev}{branches} ({date|age} by {author|person}){bookmarks}{tags}{desc|firstline|strip}\n'

波括弧("{" と "}")で囲まれたところがテンプレートキーワードになる.
テンプレートキーワードについてはChapter 11. Customizing the output of Mercurialを参考にしました.

テンプレートキーワードはカスタマイズできる.
たとえばタグの出力を変える場合は

start_tags = ' '
tag = '{tag}, '
last_tag = '{tag}'
end_tags = ' '

とすることができる.
start_でキーワードの先頭を指定できる
end_でキーワードの末尾を指定できる
last_でキーワードの項目が複数あった場合の最後のキーの出力を指定できる
start_などの後ろはテンプレートキーの複数形を指定する.

changeset = '{rev}{branches} ({date|age} by {author|person}){bookmarks}{tags}\n  {desc|firstline|strip}\n'

start_branches = ' '
branch = '{branch}'

start_tags = ' '
tag = '{tag}, '
last_tag = '{tag}'

上のをmap-cmdline.logとして保存して

$ hg log --style /path/to/map-cmdline.log
1 test (6 hours ago by yuito) tip
  edit sample.txt
0 (6 hours ago by yuito)
  add files

かなりスタイリッシュになった.

色とかつけたら最終的にこうなった.

changeset = '\033[0;33m{rev}\033[0m{branches} \033[1;30m({date|age} by {author|person}){bookmarks}\033[0m{tags}\033[0m\n {desc|firstline|strip}\n'

changeset_quiet = '\033[0;33m{rev}\033[0m \033[1;30m{author|person}\033[0m {desc|firstline|strip}\n'

changeset_verbose = 'changeset: \033[0;33m{rev}\033[0m:\033[0;33m{node|short}\033[0m{branches}{bookmarks}{tags}\nauthor:    {author}\ndate:      {date|rfc822date} ({date|age})\nsummary:   {desc|firstline|strip}\n\n{file_mods}{file_adds}{file_dels}\n\n'


start_file_adds = ''
file_add = '\033[0;32mA {file_add}\033[0m\n'
end_file_adds = ''

start_file_dels = ''
file_del = '\033[0;31mR {file_del}\033[0m\n'
end_file_dels = ''

start_file_mods = ''
file_mod = '\033[0;36mM {file_mod}\033[0m\n'
end_file_mods = ''

start_branches = ' '
branch = '\033[0;35m{branch}\033[0m'

start_bookmarks = ' '
bookmark = '\033[0;32m[{bookmark}]\033[0m '
last_bookmark = '\033[0;32m[{bookmark}]\033[0m'

start_tags = ' '
tag = '\033[0;33m{tag}\033[0m, '
last_tag = '\033[0;33m{tag}\033[0m'

f:id:yuitowest:20110610181316p:image

neocomplcacheをインストールしてみた

vim

作者の方がneocomplcache.vimはそれなりに複雑なプラギンだしインストールしても
たいへんだよってなことを言っていた。
けどすごい便利なので使えないのももったいない気がする。
とりあえずインストールまでを説明してみようと思った。

インストール

http://github.com/Shougo/neocomplcache/downloads
から最新をダウンロードする。(現状最新はver.5.1)

zip or tarを解凍するとこんな感じの構成になっている。
f:id:yuitowest:20100907213247p:image
それぞれのフォルダが何なのか知りたい人はここ http://vim-users.jp/2009/06/hack34/

autoload doc indent plugin presen syntaxというフォルダがあると思います。
このフォルダをvimのフォルダにコピーします。
ただし、presenはいりません。

OSX, linux系をお使いの方は~/.vimに移動します。
windowsをお使いの方は vimのインストールフォルダ/runtime/に移動します。
[OSX]
f:id:yuitowest:20100907214529p:image
[windows]
f:id:yuitowest:20100907214716p:image

移動したらダウンロードしてきたneocomplcacheの中身をコピーします。
f:id:yuitowest:20100907215226p:image

これでインストール完了です。

neocomplcacheを動かしてみましょう

本来は:helpとか:helptagsとか使うのですが、わからない人もいると思うので直接いっちゃいます。
先ほどneocomplcacheをインストールしたフォルダ(.vim とか runtime とか)に移動します。
docというフォルダがあると思うのでさらにその中に移動します。
neocomplcache.txtというファイルがあるので開きます。
620行目あたりになんとサンプルの設定が書いてあるではないですか!
f:id:yuitowest:20100907220016p:image
サンプルをコピーします。
vimrcファイルに貼り付けます。
貼り付け時に勝手にインデントとかうぜぇ〜〜〜ってひとは:set pasteしてください。
f:id:yuitowest:20100907220459p:image
保存していったんvimを終了します。
vimを機動します。
なんとneocomplcacheが動きます。
f:id:yuitowest:20100907220500p:image
ご丁寧にmapまで書いていただいております。
tabで補完できるぜ!いぇいw

各設定が何をやってるかわからないとか、こんな設定ないの?とか思った方は
先ほどのdocフォルダにあるneocomplcache.jaxファイルを開いてみましょう。
詳しい説明が日本語で書かれています。まず読んでみましょう。

たのしい補完ライフを送ってください!