2012/01/04


まず中平さんの vim-paint をインストール。
ynkdir/vim-paint - GitHub
https://github.com/ynkdir/vim-paint
このままだと日本語出せないのでパッチを当てる。 diff --git a/autoload/paint/bdf.vim b/autoload/paint/bdf.vim
index 8485995..e8323b8 100644
--- a/autoload/paint/bdf.vim
+++ b/autoload/paint/bdf.vim
@@ -139,6 +139,98 @@ let s:font.hexbits = [
       \ [1, 1, 1, 1],
       \ ]
 
+let s:utf8len = [
+\ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+\ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+\ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+\ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+\ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+\ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+\ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+\ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,0,0,
+\]
+
+function! s:dec2bin(v)
+  let v = a:v
+  if v == 0 | return 0 | endif
+  let ret = ""
+  while v > 0
+    let i = v % 2
+    let ret = i . ret
+    let v = v / 2
+  endwhile
+  return ret
+endfunction
+
+function! s:bin2dec(v)
+  let v = a:v
+  if len(v) == 0 | return 0 | endif
+  let i = 1
+  let ret = ""
+  for n in reverse(split(v, '\zs'))
+    if n == 1
+      let ret = ret + i
+    endif
+    let i = i * 2
+  endfor
+  return ret
+endfunction
+
+function! s:bitshift(a,b)
+  let a = s:dec2bin(a:a)
+  let a = repeat('0', 32-len(a)) . a
+  if a:b < 0
+    let a = (repeat('0', -a:b) . a[: a:b-1])[-32:]
+  elseif a:b > 0
+    let a = (a . repeat('0', a:b))[-32:]
+  endif
+  return s:bin2dec(a)
+endfunction
+
+function! s:bitand(a,b)
+  let a = s:dec2bin(a:a)
+  let b = s:dec2bin(a:b)
+  return s:bin2dec(tr((a + b), '21', '10'))
+endfunction
+
+function! s:byte2code(byte)
+  let p = a:byte
+  let n0 = char2nr(p[0])
+  if n0 < 0x80
+    return n0
+  endif
+  let l = s:utf8len[n0]
+  let n1 = char2nr(p[1])
+  if l > 1 && s:bitand(n1, 0xc0) == 0x80
+    if l == 2
+      return s:bitshift(s:bitand(n0, 0x1f), 6) + s:bitand(n1, 0x3f)
+    endif
+    let n2 = char2nr(p[2])
+    if s:bitand(n2, 0xc0) == 0x80
+      if l == 3
+        return s:bitshift(s:bitand(n0, 0x0f), 12) + s:bitshift(s:bitand(n1, 0x3f), 6) + s:bitand(n2, 0x3f)
+      endif
+      let n3 = char2nr(p[3])
+      if s:bitand(n3, 0xc0) == 0x80
+        if l == 4
+          return s:bitshift(s:bitand(n0, 0x07), 18) + s:bitshift(s:bitand(n1, 0x3f), 12) + s:bitshift(s:bitand(n2, 0x3f), 6) + s:bitand(n3, 0x3f)
+        endif
+        let n4 = char2nr(p[4])
+        if s:bitand(n4, 0xc0) == 0x80
+          if (l == 5)
+            return s:bitshift(s:bitand(n0, 0x03), 24) + s:bitshift(s:bitand(n1, 0x3f), 18) + s:bitshift(s:bitand(n2, 0x3f), 12) + s:bitshift(s:bitand(n3 & 0x3f), 6) + s:bitand(n4, 0x3f)
+          endif
+          let n5 = char2nr(p[5])
+          if s:bitand(n5, 0xc0) == 0x80 && l == 6
+            return s:bitshift(s:bitand(n0, 0x01), 30) + s:bitshift(s:bitand(n1, 0x3f), 24) + s:bitshift(s:bitand(n2, 0x3f), 18) + s:bitshift(s:bitand(n3, 0x3f), 12) + s:bitshift(s:bitand(n4, 0x3f), 6) + s:bitand(n5, 0x3f)
+          endif
+        endif
+      endif
+    endif
+  endif
+  return n0
+endfunction
+
 "
 " |hello, world
 " +------------
@@ -146,7 +238,8 @@ let s:font.hexbits = [
 " origin
 function s:font.draw_text(canvas, text, org, color)
   let [ox, oy] = a:org
-  for c in map(split(a:text, '\zs'), 'char2nr(v:val)')
+  for c in map(split(a:text, '\zs'), 's:byte2code(iconv(v:val, &encoding, "utf-8"))')
+    call garbagecollect()
     if !has_key(self.glyphs, c)
       let c = self.default_char
     endif
ビットシフト関数は結構適当。最新のvimならbitwize関数が入ってるはずなので、そっちを使った方が良い。さらにunifontからbdfフォントを貰ってくる。
GNU Unifont Glyphs

This page contains the latest release of the GNU Unifont, with glyphs for every printable code point...

http://unifoundry.com/unifont.html
そしてコード scriptencoding utf-8
let canvas = paint#canvas#new(10050)
let font = paint#bdf#loadfile(globpath(&rtp, 'font/unifont/unifont-5.1.20080820.bdf'))
let text = "あけまして"
call canvas.draw_text(text, [1020], font, [000])
let text = "おめでとう"
call canvas.draw_text(text, [1040], font, [000])

call canvas.save('kakizome.bmp')
出来上がり
vim-de-kakizome
ちなみに画像ファイル出力までに5分くらいかかります。
Posted at by




僕がサクラエディタからVimに乗り換えるまで - ITは芸術だ

僕がサクラエディタからVimに乗り換えるまで エディタ はじめに 恐怖のエディタ、Vim。 僕はこの間までずっとサクラエディタを愛用していましたが、最近 Vim を使うようになりました。 ええ、Vim...

http://d.hatena.ne.jp/JunichiIto/20120101/1325420213
Vimテクニックバイブルの著者略歴でも書いたけど、僕は「生涯Vimを使う」と決めた。僕のブログを読んでくれている人なら、だいたいの人は僕がVimを使っているのは知ってると思うけど、今日は「なぜ僕がVimを選んでいるのか」を書こうと思う。
こんな僕だけど、Vim以外が使えない訳じゃない。PCにVim以外のテキストエディタが入ってない訳でもない。Emacsも一応は使える。もちろんEmacsもxyzzyもsakuraエディタも秀丸もTeraPadもK2Editorも、他ありとあらゆるテキストエディタもインストールしてあって常時起動出来る様にしてある。
それらを完全にマスターしている訳じゃないけど、個々の特徴は知ってるつもり。なぜインストールしているのかというと、Vimを一生使い続ける為にVimに足りない物を探す為。

なぜVimを使っていると玄人っぽく見えるのか

Vimを取り上げられてよく言われるのが、「なぜEclipseやVisual Studioの様なIDEを使わないのか」。これは都度出てくる話題で、その度に盛り上がる。
そして毎回僕はこう言ってる。
Vim等のテキストエディタは言うなれば板前が使う包丁。そしてIDEはフードプロセッサ。
野菜をみじん切りにしたり、一定の薄さでスライスするのにはIDEはとても便利だし、それを使う価値は十分にある。逆にVim使いが玄人っぽく見えるのはそのせいで、包丁で大根の桂剥きをする様は誰が見ても玄人であって、IDEは初心者にとっての敷居が低い。野菜を入れてスイッチ入れればそれ相応の物が出来上がる。「じゃぁIDE使えよ」そう思われる方も多いと思う。しかしIDEでは少し凝った細工や調整が効かない事が多い。いつもは3mmでスライスしていた人参を今日のお客さんだけは2.7mmでスライスしたい。時には波状にスライスしたい。そして花の模様にカットしたい。そんな事もあると思う。IDEでも出来なくないかもしれないけど、その度に違う操作感のプラグインに慣れるのは苦痛にもなりえるし、そこで思考を停止してしまうとせっかく浮かんだアイデアが飛んでいってしまう。できればそこはアイデアの事だけを考えながら操作したいというのがプログラマにとっての本音であろう。
この2.7mmでスライス出切る様になる事がVim使いへの道だろうし、挫折の多い所だろうと思う。「もういいよ3mmで」そう思ってしまうかもしれない。

「板前の包丁めんどくせぇな」そう思われるかも知れないが、それは職人がフードプロセッサだけで料理を作らない理由と同じであろう。

なぜVimを使っていると変態っぽく見えるのか

Vimは言わば包丁だ。フードプロセッサなら使い終わったら水で流して乾かせば良い。しかし包丁は時にはメンテナンスも必要で、定期的に研がなければならなかったり、錆びない様に気を使わなければならなかったりもする。職人はいつも包丁を持ち歩いている。
路上でフードプロセッサを持ち歩いていたらどうだろう。それ程不自然ではないと思う。何かの搬入にも見えるかもしれない。
しかし包丁を持ち歩いていたらどうだろう。弁解しなければ捕まってしまうかもしれない。変人どころか危ない人に見えるかもしれない。事ある毎に大根の桂剥きをする様は、時には自慢に見えるかもしれないし、無駄な作業に見えるかもしれない。

だからと言って、Vimを使える人が玄人であって、一般的なテキストエディタやIDEを使う人が素人と言ってる訳ではない。おそらくいろんな所で書かれているVimの記事にもそういった事は書かれていないと思うし、もしそう書いてあったとしてもアクセス数を稼ぐ為に誇張した表現だと受け取って欲しい。

Vimを知らない人からすればVimは明らかに変だし、無駄な行動が多いように見えるし、面倒臭そうだし、加齢臭がしそうだし、モテなさそうだし、オタクっぽいだろう。IDE使ってる方が「○○先輩教えて下さい><」って可能性は高いだろう。間違っても「えー!ネオコン?なにそれ!? 知りたい知りたーい♪」なんて娘は出てこない。繰り返して言っておく。
そんな娘は現れない
でも僕はVimを使い続けるだろう。

なぜなら、僕が作った料理を見て「ここの料理は他のお店と違うわ。」と思ってもらえる事に最大の喜びを感じるからだ。
Posted at by



2011/12/22


# vim Vimを起動して <?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
 <Worksheet ss:Name="Sheet1">
 </Worksheet>
</Workbook>
XMLを書いて <?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
 <Worksheet ss:Name="Sheet1">
  タカッ
  トラッ
  バッタッ
 </Worksheet>
</Workbook>
データを足して <?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
 <Worksheet ss:Name="Sheet1">
  タカッ
  トラッ
  バッタッ
 </Worksheet>
</Workbook>
Visual選択してzencoding-vimでラップする。("CTRL-Y" and ",") Tag: Table>Row>Cell*>Data[ss:Type=String] <?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
 <Worksheet ss:Name="Sheet1">
  <Table>
    <Row>
        <Cell>
            <Data ss:Type="String">タカッ</Data>
        </Cell>
        <Cell>
            <Data ss:Type="String">トラッ</Data>
        </Cell>
        <Cell>
            <Data ss:Type="String">バッタッ</Data>
        </Cell>
    </Row>
  </Table>
 </Worksheet>
</Workbook>
後は :w Book1.xls 出来上がり。
Excel
Posted at by