tern.vimでvimでjavascriptの補完など(vim advent calendar2012, 155日目)

これはvim advent calendar2012の155日目の記事です。

ternについて

tern for vimについて

ternのinstallと使用方法

install

下記の方法でとりあえずwarning無しでinstallできる。 ternはnodejsを用いるのでまずnodejsをinstallする必要がある。

npm install -g typescript
git clone git://github.com/marijnh/tern
cd tern
npm install

確認したのはMac, homebrewの環境でありternは/usr/local/bin/ternに installされていた。 homebrewはinstall時に/usr/local下のpermissionを変更するため上記で installできた、またtern commandにPATHが通っていたが他環境では異なる可能性がある

使用方法

command lineで tern と入力することでtern(server)がstartする

問題無くternがstartしていれば

Listening on port 58355

のように表示される。port番号はその都度変わる。 ある程度通信が無いと下記のようにternは終了する。

Was idle for 5 minutes. Shutting down.

ternをvimで使えるようにする

neobundleなり、pathogenなりで前述のternのためのvim scriptをinstallする。 vimpython supportが有効になっている必要がある。 あとは適当なjs fileを作成後 C-x, C-o と入力することで下記のように補 完が行われる。 bracketsとは異なり、補完だけでなくsyntaxとparameterの情報もpreviewに表 示される。

  • emacsでのtern supportもほぼvimと同様の模様
  • sublimetextは未確認
  • bracketsでは上述のようなternのinstall作業, serverのstartを行う必要は無く、補完が可能だが付加情報をeditor内に表示する機能はまだ備えていないようだった

f:id:kozo2:20130503234157p:plain

このような補完の他

  • cursor下の何かの定義へのjump(:TernDef)
  • cursor下の何かの(MDN)document表示(:TernDoc)
  • cursor下の何かの型情報表示(:TernType)
  • cursor下のvariableもしくpropertyの参照個所の表示(:TernRefs)
  • refactoring(rename)(:TernRename)

といった機能がある。

おわりに

この記事のほとんどは id:kiwanami さんの関西Emacsでの発表のぱくりです http://kiwanami.net/temp/2013-0427-kansai-emacs.html

tern便利

関西Emacsに行ってきた(MELPAの話をしてきた件)

関西Emacsでpackage.elやMELPA、またMELPAに無いpackageを登録してもらうにはといったことについて話してきました。

https://docs.google.com/presentation/d/1L8bdlfRtU6JflE7Znz4ExGRUGQgdqQxPPD8BAH5LsFU/edit?usp=sharing

感じたことを思いつくままに列挙

  • MELPAはみんな使っていると思っていたがそうでもない。参加者の半数ほど。
  • 半数は特にpackage managementを自分でやっていたり、package.elの限界を知った上でel-getを使ったりしている模様
  • 開発者が必ずしもpackage作成を自分でやりたいと思っているわけではない。
  • 20名超の参加者の内、MELPA recipe作成者は3人ほど
  • 開発者は依存するものは自分の環境に入れているので依存を細かく確認するモチベーションが起こりにくいのかもしれない。
  • 万人がpackage.elのinteractiveなpackage management bufferを使いたいと思っているわけではない。init.elに(package-install 'git-gutter)のような文を列挙し一挙にinstallしたいuserもいる。
  • すでにinstallしているpackageを(package-install '...)するとerrorが出てしまうのでflag(名前は失念しました)を用いてpackage-installするかどうか判断させるinit.elを書く必要がある

とはいうものの

「最大多数の最大幸福」という点ではMELPAとpackage.elかなという気がします。

参加者のみなさんに感謝します。

evilがあるのでemacsつこてください

vim advent calendarの110日目を大幅に遅刻し申し訳ありません。
さらに申し訳ないことにvimではなくemacsの話です。

evilというemacs lisp packageを皆さんご存知でしょうか。
evilはvip.elから連なるvi(m)の操作性をエミュレートするelispの最新進化型です。
vip, viper, vimpulse ときてevilです。
名前がかっこいいですね。

evilの何がいいのか

emacsがmodal(vimのhjkl移動ができたりする)になります。
またevilはvi(m)の操作性をエミュレートしつつもemacsの機能とうまく共存 できるようになっています。
これを

  • 両方おいしいとこどりですばらしいと思うか
  • 中途半端と思うか

は別れるところでしょう。
ですがとりあえず

どちらにも一度試してみてもらいたいです。

modalなemacs

evilはvimの機能のエミュレートをその主目的としているわけではなく emacsが持つ本来の機能との親和性に重きを置いているようです。
下記は私の設定の一部です。

(evil-mode 1) 
(define-key evil-normal-state-map " " 'dired-jump)
(define-key evil-normal-state-map ";" 'evil-ex)
(define-key evil-normal-state-map "\C-n" 'helm-mini)
(define-key evil-insert-state-map "\C-h" 'delete-backward-char)
(define-key evil-insert-state-map "\C-j" 'tcode-activate-input-method)
(define-key evil-insert-state-map "\C-l" 'evil-normal-state)
(define-key evil-insert-state-map "\C-k" 'tcode-inactivate-input-method-recenter)
  • define-key evil-normal-state-map は vim での nnoremap に
  • define-key evil-insert-state-map は vim での inoremap に
  • 最後がemacsのコマンドに

対応していると考えてください。
normal-stateのようにmodeでなくstateという語を使っているのは emacsには元々メジャーモード、マイナーモードという概念があり、この用途で既に用いられているためかと思います。
normal, insert, motion, visual, operatorといったstateに加え

(evil-ex-define-cmd "on[ly]" 'delete-other-windows)

のようにvimのexコマンド的にemacsのコマンドを呼ぶことも可能です。

私は vim-likeなmodalなemacs + emacsのコマンドの組み合わせ を非常に便利と思っています。

emacsのコマンドはemacs lisp名前空間がフラットなため、必ず名前の先頭にプレフィックスが付いています。
このため、vimと異なり用いたい(emacsの)コマンドを適当なキーワードですぐに見つけることができます。
機能が見つけられれば前述のようにそれを適当なmode(state)に割り当てます。 modalになることでキーバインドにマップできるコマンド数が増えるだけでなく、キー押下の負担も軽減されます。

「mode(state)概念の導入と、emacsの機能(コマンド)の共存」
これをevilでぜひ味わってみてください。

ipython notebookを特攻の拓する

install

sudo easy_install pip
pip install ipython --user
pip install tornado --user
pip install pyzmq --install-option="--zmq=bundled" --user
ipython notebook

使う

browserで http://localhost:8888 を開く

おわりに

see you next 放送 bye bye

Vimのkeymap feature (果てはVimでのT-codeを支援するtcvime.vimとその最近追加された便利機能について) - Vim Advent Calendar 2012 24日目

Vim Advent Calendar 2012 の 24 日目の記事です。

keymap という feature について

Vimにはkeymapというfeatureがありこれを有効にしてcompileされていると
例えば

:set keymap=dvorak

とすることでinsert mode時にdvorak配列で入力できるようになります。
(keymapを定義している.vim files は **/share/vim/vim73/keymap/ 下あたりにあります。)

他に標準添付されているkeymapで日本人が使えそうなkeymapとなるとkana.vimがあります。

:set keymap=kana

とすると insert mode では **/share/vim/vim73/keymap/kana.vim で定義されているようにかな入力ができます。

素のkeymapに戻したい場合

:set keymap=

とします。

「ひらがな、カタカナのみのJapanese communicationでOKさ!」ってんならこれだけでIMいらずで助かるのですがおそらくそれは無理でしょう。漢字を入力する方式が必要になってきます。

keymap の機能を活用し漢字を入力する

日本語を扱う上で便利な設定やスクリプトが追加されているKaoriyaさん版のVimでは
シフトJIS文字を挿入するkeymapが追加されています。
https://github.com/splhack/macvim/tree/master/plugins/kaoriya/keymap
この中には

  • tcode_cp932.vim
  • tutcode_cp932.vim

といった漢直入力用keymap filesがあります。
ここではこの2つのkeymap filesの内のT-codeの方(tcode_cp932.vim)を使ってみます。
これらを導入した環境ではこれまで同様

:set keymap=tcode_cp932

とすることでinsert mode時にT-codeのkeymapが有効になり、T-codeをすべて記憶していれば大体の漢字は変換無しで入力することが可能になります。

ただここでujihisaさんのように「よし俺は根性でT-codeをすべて覚えるぞ」というのはおすすめしません。
T-code使いのすべてがT-codeを覚えているわけではなく、まずT-code入力支援の仕組みを活用しています。

そこでtcvime.vimですよ

ここでtcvime.vimの登場です。
https://github.com/kanchoku/tcvime
tcvimeの導入により、「漢字変換機能」と「変換を用いた漢字のT-codeを表示してくれる」機能が使えるようになります。
これらの機能を使い、頻繁に用いる漢字を少しずつ覚えていくことがおすすめです。(ひらがなは覚える必要があります。)

tcvime.vimの導入方法、ひらがなの覚え方などは https://gist.github.com/4076375 をご参照ください。

最近追加された便利機能

tc2同様の後置型交ぜ書き変換、さらにはVimの補完ポップアップメニューで変換候補の表示、moreさらには変換で確定した文字列のヘルプ表の自動表示

例えば「ゆづか姫」と打ちたいとする

f:id:kozo2:20121224064654p:plain

「ひめ」だけ変換したいので、ここで「28」とうつ(いまのpointから2文字前の文字が変換対象となる、さっきのgistの設定なら)

f:id:kozo2:20121224064812p:plain

Vimの補完ポップアップメニューで変換候補が選択できる。「姫」で確定すると...

f:id:kozo2:20121224065115p:plain

tcvimeのhelp用bufferに「姫」の部首合成変換のための文字の組み合わせ「女+臣」が自動で表示される。 ちなみに

  • 姫はT-code標準の2strokeではsupportされていない文字。
  • 臣もT-code標準の2strokeではsupportされていない文字なので姫は普通に交ぜ書き変換した方がよい。
  • というかT-coderも部首合成変換はほとんど使ってないと思われる

複数文字のhelp表表示機能、visual modeからのhelp表表示機能

例えば「西田」という漢字を交ぜ書き変換し、help表bufferを消した後でまた見たくなったとする。

f:id:kozo2:20121224072537p:plain

visual modeで「西田」を選択後、(tcvimeのdefaultでは)C-k ?を入力

f:id:kozo2:20121224072646p:plain

おわりに

時代はT-code

たった1行のコード(というか2つのcommand)でひたすらアイドル水着画像をあつめる - Vimperator Advent Calendar 2012 17日目

たった10行のコードでひたすらアイドル水着画像をあつめる の「画像の一覧を取得する」節までをvimpでやるとなると、

:open http://matome.naver.jp/odai/2135350364969742801
:echo [img.src for (img of content.document.wrappedJSObject.images)]

になります。
せっかくbrowserにいるので「ブラウザに表示する」節以降までやりきるべきかとは思いますが持病のEDがひどくそこまでやりきれませんでした。
とんずらー!

謝辞

PythonのList comprehensionみたいな書き方は@teramakoさんにVimperator - Lingrで教えてもらいました。あざす。

Ubuntu preciseでの10GbEとinfinibandのiperf結果 - Debian/Ubuntu JP Advent Calendar 2012 8日目(2巡目)

Debian/Ubuntu JP Advent Calendar 2012 8日目担当、日本目光会のkozo2です。 昨日は岩松さん @iwamatsuapt-forktracer を使ってパッケージをチェックする でした。 今日は、Ubuntu precise以降での10GbEとinfinibandの導入方法とその速度のiperf結果をお伝えします。

10GbEの導入方法とiperf結果

10GbEのcardを挿せば、特にdriverとかそれ用の設定は必要無く普通に認識されてるかと思います。

lspci |grep Gigabit
それらしきEthernet controller

ls -l /sys/class/net/eth-/device/driver
lrwxrwxrwx 1 root root 0 Nov 16 18:04 /sys/class/net/eth-/device/driver -> ../../../../bus/pci/drivers/ixgbe

下記は3つのクライアントからiperfした結果です。 高性能なクライアントほど速度が出てるようでした。

iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[  4] local ---.---.---.--- port 5001 connected with ---.---.---.--- port -----
[ ID] Interval       Transfer     Bandwidth
[  4]  0.0-10.0 sec  3.69 GBytes  3.16 Gbits/sec
[  5] local ---.---.---.--- port 5001 connected with ---.---.---.--- port -----
[  5]  0.0-10.0 sec  6.99 GBytes  6.03 Gbits/sec
[  4] local ---.---.---.--- port 5001 connected with ---.---.---.--- port -----
[  4]  0.0-10.0 sec  4.20 GBytes  3.60 Gbits/sec

infinibandの導入方法とiperf結果

これもipoibを使う分には、precise以降のkernelであればinfinibandのcardを挿し下記の commandを実行するだけでib interfaceの設定ができるようになります。

sudo apt-get install opensm
modprobe mlx4_ib
modprobe ib_umad
modprobe ib_uverbs
modprobe ib_ipoib

lspci |grep InfiniBand
03:00.0 InfiniBand: Mellanox Technologies MT26428 [ConnectX VPI PCIe 2.0 5GT/s - IB QDR / 10GigE] (rev b0)

ls -l /sys/class/net/ib0/device/driver
lrwxrwxrwx 1 root root 0 Dec  8 04:42 /sys/class/net/ib0/device/driver -> ../../../../bus/pci/drivers/mlx4_core

こっちでも3つのクライアントからiperfしてみました。ただしこっちのクライ アントはすべて同スペックです。単純には比べられないのですが10GbEのクラ イアントより性能は劣ると思います。

iperf -s 
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[  4] local ---.---.---.--- port 5001 connected with ---.---.---.--- port -----
[ ID] Interval       Transfer     Bandwidth
[  4]  0.0-10.0 sec  3.38 GBytes  2.90 Gbits/sec
[  5] local ---.---.---.--- port 5001 connected with ---.---.---.--- port -----
[  5]  0.0-10.0 sec  3.40 GBytes  2.92 Gbits/sec
[  4] local ---.---.---.--- port 5001 connected with ---.---.---.--- port -----
[  4]  0.0-10.0 sec  3.40 GBytes  2.92 Gbits/sec

おわりに

これだけ見る限りでは10Gの方が速いみたいですが、どうなんですかね