tmuxのペイン切り替えをscreenみたくする(ターミナルマルチプレクサ Advent Calendar 2011 23日目)

ターミナルマルチプレクサ Advent Calendar 2011の23日目でございやす。
すいやせん、日またぎ遅刻しやした。

tmuxはscreenと比べると設定をあまりせずとも便利に使えるのがいいところですが、screenから乗り換えた際にどうしても不便に感じるのがactiveなwindowのpaneに別windowのpaneの情報をもってくることではないでしょうか。

僕は下記のscreenでできてたことをtmuxでしたかったけどやり方わからず不満だったんですね。

  1. windowをpane2個になるように分割してから
  2. 1.のpane2個のうち片側のpaneをC-n, or C-p で次or前のwindowのpaneと置き換える

この挙動が最初っからできることに関してはscreenの方が便利な気がするんですよね。

国語力が低いのでとりあえず下記を試してみてください。多分前述の挙動をtmuxで実現できてると思います。

bind-key C-n swap-window -t:+ \; swap-pane -s:-
bind-key C-p swap-window -t:- \; swap-pane -s:+

とにかくscreenのwindow切り替えに慣れている方は試してもらえれば、と思います。
アデュー

Shougoさんは痛くなんかない! ~VimFilerのどこがいいかも語る~ (Vim Advent Calendar 13日目)

Vim Advent Calendar の13日目です。

最初はVimFilerのいいところをEmacsのdiredと比較し書くだけにしようと思っていたのですが、その前に痛いニュースのネタまとめに出たらしい「Vimと過ごすイチャラブクリスマス ~そして伝説へ~」が実は痛くない、というか深いということを解説しようと思います。
失礼ながら僕も今回見直すまでちゃんと深く読めていませんでした。もしタイトルから侮ってそこまで読んでいない方がいたらその方達にも深く考えてほしい。
なぜ痛くないかを具体的な言葉に翻訳して解説するという野暮なことをします。
(原文でも文が進むにつれてイチャラブというような感じから真面目かつ具体的に説明されるようになっているので解説とか必要ないかもしれないんですが)
最初メインにしようとしてた「VimFilerのいいところ解説」はオマケになってしまいました。

Shougoさんは痛くなんかない!

もう12月となりクリスマスが近付いてきましたが、Vimmerの皆さんはいかがお過ごしでしょうか。
クリスマスの予定はもう決まりましたか。まだ決まっていない?
ならば、今年の冬はVimと一緒のクリスマスというのはどうでしょうか。
クリスマスは普段はできないVimとの愛を深める良い機会です。
幸い、Vimとのデートにはお金がかかりません。PCからVimを起動するだけでよいのです。
ノートPCさえあれば、どこでもVimとイチャイチャし放題です。
筆者オススメのデートコースは以下の通りです。 (Vimと過ごすイチャラブクリスマス そして伝説へ イントロより)

この界隈の人は常にVimEmacsを起動しています。起動してないほうがおかしい。
そして時間がある休日(クリスマス)に愛を深める(設定を見直す)傾向があります。
仕事中にもやってはいると思うのですが、仕事中に大っぴらに時間を取りまくるのはこの界隈の人でもさすがに憚られるものがあると思います。
「イチャイチャ」を翻訳すると「設定or拡張を書く」ということになります。
ちなみにこの設定、拡張を書き快適な作業環境を得ることは快感であり、Emacs or Vimから離れたくないという症状になります。
故にイチャイチャという言葉は的確です。

長い間Vimを使用していると、不要になった設定が貯まってくることでしょう。
大晦日にやっても良いのですが、大晦日はVimとの新居(PC)の掃除で忙しいはず。
この機会に、Vimの設定を見直しましょう。汚ない設定では、Vimから嫌われてしまいますよ。
デート前には身だしなみを整えるのも大事ですよね。
おそらく、皆さんのVimの設定には、他の人からのコピペが多数含まれているはず。
それは良くないですね。コピペは「だめゼッタイ!」です。
訳が分かる設定だけを導入しましょう。
分からないコマンドや分からない設定については、まず:helpを参照しましょう。
Vimの知識を増やすチャンスです。
ちなみに:helpを参照するときは、一覧を表示できるunite-helpを用いるのがオススメです。(Vimと過ごすイチャラブクリスマス そして伝説へ デートコース1より)

これは正確には「Vimから嫌われる」というより、「Vimとそれほど一緒にいたくなくなってしまう」かと思います。
コピペがよくないというのも同感です。
Vimの優秀なhelpシステムを用い、理解することを怠るとVimとイチャイチャする(積極的に設定or拡張を書く)レベルには至りません。

同様に、不要になったプラグインも見直しましょう。
プラグインの管理には、pathogen.vimやvundle.vim, neobundle.vimといった
プラグイン管理プラグインを使用すると楽です。
この機会に導入しておくと良いでしょう。
筆者のオススメは、neobundle.vimを使用することです。
vundle.vimがもつほとんどの機能に加え、unite.vimと連携してプラグインをインストールしたり削除できます。
「neobundle.vimのおかげで彼女(Vim)との仲が深まりました!」など嬉しい報告が続々届いています(妄想)。(Vimと過ごすイチャラブクリスマス そして伝説へ デートコース2より)

プラグイン管理プラグインは確かに仲が深まる効果をもたらします。
というかもう使わないということが考えられなくなりました。
再起動とかシェルに離れる時間は常人からすれば僅かですが、Vimユーザにとってその断絶は非常に大きく、ノリが失われてしまうので使うべきです。

Vimとラブラブになるためには、できるだけVimと過ごす時間を取らなければいけません。
仕事でだけVimと過ごすというのは勿体無いです。
我々は仕事でも趣味でもVimと一緒に過ごすことができる幸運に恵まれているのですから。
いつでもVimと過ごすために、vimfilerやvimshellをインストールしましょう。
Explorerやzsh, screenといった軟弱なツールは窓からポイしてください。
さらに、unite.vimやneocomplcacheをインストールすることで、より濃密なVimとの時間を堪能することができます。

これらのプラグインはVim pluginで拡張することができ、Vim scriptで設定を行います。
Vimを愛する人達には無くてはならないものです。
Vimに慣れていない人には使いこなすのは難しいですが、
Vimへの愛があれば、それくらいの障害は乗り越えられることでしょう。
えっ、Vim scriptが分からない? それはなんてこと。

Vim scriptはVimとのコミュニケーションを図るために無くてはならないスキルです。
英語なんて学んでいる暇があったらVim scriptを勉強するべき。
だいたいなぜVim scriptプログラマの求人やVim scriptを書くだけのお仕事はないんだ。
私はC言語ではなくVim scriptで全てのコードが書きたい。
Vim scriptを書いていると心が落ちつく。Vim script最高!
おっと、イカンイカン。つい本音が出てしまいました。 (Vimと過ごすイチャラブクリスマス そして伝説へ デートコース3より)

仕事(プログラム書き)、趣味(ファイル[テキストファイル以外も]整理、探索)ということになるでしょうか。
先ほども出た小さな時間の断絶(ファイラやシェルに移るの)もノリに大きな影響を与えるのでVimFilerやvimshellを使うべきです。
これら(ファイラ改善やshellの組み込み)はみんなVimでもやりたいと思っていたことでありながらShougoさんのような挑戦者はほとんどいなかった分野でしょう。讃えられる、応援されるべきです。その心意気もしこの表現から汲み取れてなかった人いたらそこまで感じてあげてほしい。

クリスマスこそ、Vim scriptを勉強してVimと一緒にプラグインを作成しましょう。
愛するVimとの共同作業です。
最初から難しい課題に取り組むのは大変なので、最初はプラグインの改造をしたり、
ftpluginやちょっとしたプラグインを作成すると良いでしょう。
.vimrcに書いた設定を汎用的にしてプラグイン化するのも良い方法です。
例えばthincaさんはそういう方法でプラグイン化するのをよくやっているようです。
最近では、unite.vimのsourceを作成するのが流行しているため、それをやってみるという手があります。
ちなみに、neocomplcacheを使うと簡単にVim scriptを書くことができます。
neocomplcacheはVim scriptを書くプログラマのために最適化されているからです。
他の言語にも対応していますが、それはオマケです。 (Vimと過ごすイチャラブクリスマス そして伝説へ デートコース4より)

具体的に真面目なことを書かれています。
neocomplcacheVim scriptを書くプログラマのために最適化されている」のを最も身近に体感できるのは自動補完時に出てくるポップアップ中の説明文ではないかと思います。こういった普通の人にとってはあまり大きな意味を感じられないかもしれないことがVim愛する人達にとってはいかに大きな意味を持つかということは文面からはわからないかと思います。これ以外にもShougoさんの魂のこもった最適化がneocomplcacheにはあるはずです。

Vimとの仲がかなり深まったと思ったあなた、しかしそのうち関係がマンネリ化してしまうからもしれません。
それを防ぐために、Vimコミュニティに参加してみましょう。
いわゆる、町内会や保護者会みたいなものだと思ってください。
周囲にVimmerがいなくて寂しい思いをしているそこのアナタ、ぜひとも参加するべきです。
他人がどのようにVimと良好な関係を続けているかを観察することで、あなたのVimにとても良い影響を与えるはずです。
vim-users.jpやvim-jpでは、あなたの参加をいつでもお待ちしています。
もちろん、Vimに貢献したいというメンバーも随時募集中です。
私はvim-users.jpに育てられてVim scriptを書くようになったので、もっと仲間が増えるといいなと思っています。(Vimと過ごすイチャラブクリスマス そして伝説へ デートコース5より)

だんだん真面目度が上がってきますが、孤独な戦いは厳しくコミュニティの力は偉大です。
そして日本のVimコミュニティには非常に強力なメンバーがいます。

Vimとのデートを楽しんだ後は、Vimへの愛を囁きながら眠りに付きましょう。
心配しなくても、Vimはいつもあなたと一緒に居ます。Vimとは心でも繋っているのです。
大事なことは、クリスマス終了後もVimとの愛を深めていくことです。
クリスマスは切っ掛けにすぎません。
これを実践して、皆さんがよりVimを愛するようになれば幸いです。
もちろん、Vimと一緒に新年を向かえるのも非常に良い心掛けではないかと思います。(Vimと過ごすイチャラブクリスマス そして伝説へ デートコース6より)

僕も結構寝る前に限らず自然とよくVimとかEmacsの設定を考えたりします。
人の思考はわからないのですが似たような人多いのかもしれない。

えっ、この記事は単に自分のプラグインの宣伝をしているだけじゃないかって?
私は純粋にVimとの過ごし方を解説しているだけだというのに、何て失礼な!(Vimと過ごすイチャラブクリスマス そして伝説へ 結びより)

実際Shougoさんのneocomplcache, unite, vimfiler, neobundleといったプラグインVimを使う上でと必須になった現在、純粋にVimとの過ごし方を解説したらShougoさんのプラグインになるというのは自然です。

繰り返しになりますが、タイトルから侮らずにちゃんと読んでみて考えてもらうとかなりいいこと仰っていることがわかります。
では次にLingrで発言してからやるやる詐欺になっていた「Emacsのdiredと比較したdiredのいいところ」を述べようと思います。

Emacsのdiredと比較したVimFilerのいいところ」

2画面ファイラである

2画面ファイラの方がよいのは移動先のパスを入力する必要がないからです。
VimFilerのファイルツリーの移動はhjklでできるのでファイル操作先の表示は非常に迅速に行えます。
また日本語パスも移動だけで設定できるので非常に便利です。

C-jの移動ヒストリが便利

Emacsでもanythingがあればヒストリ表示できるのですがファイラはファイラのヒストリと分かれている方が便利という気がします。
Emacsでもdiredにいるときはanythingのヒストリでdiredのバッファを上に出すとかあるのかな。

vimfiler_switch_to_drive, vimfiler_switch_to_home_directory, vimfiler_switch_to_root_directory が便利

これは「あふ」にインスパイアされた機能かと思われますが非常に便利です。diredにはありません。

以上でーす。

PyPyとスパコンとバイオインフォマティクス (PyPy advent calender 12日目)

PyPy Advent Calendar 12日目です。
タイトル通りのことを徒然なるままに書きます。
スパコンアーキテクチャ無知のど素人です。
バイオインフォマティクスをやってるつもりです。
PyPyがどういうものかはこれまでのPyPy Advent Calendar筆者の方々の記事をお読みください。

PyPyとスパコン

この節で何が言いたいのというと

PyPy(みたいの)をスパコンで使えるといいですね。そういう意味でもPyPy面白そうですね。

ってことです。

京が有名になりましたが、実質京がサポートしている言語はCとFortranと言っていいのではないでしょうか。
アーキテクチャとかPython自体のサポートとかはとりあえずすっ飛ばして、なぜPyPy(Python)みたいのが使えるといいなと思うかというと

toolchainで楽したい

ということに尽きます。

Pythonで書いて楽できるようになること、コードの複雑さを軽減すること

は非常に意味のある(デスマの人を助ける?)ことのように思いますし、あのデータのメモリ上の配置の仕方も意外とスパコンに合ったりしないのかなーなどと妄想しています。
というわけでPyPyのような仕組みがスパコンでも活用されると面白いかもしれませんね。
もう誰か考えてるんですかね。
さらっとググった感じだとNCARってとこがそういうことしようとしているんですかねって感じでした。

PyPyとバイオインフォマティクス

さあではスパコン環境でツールチェーンを実演してみせましょう。

なんてことできるわけないので、結局しょぼいMacMiniで「既存ライブラリのスピード勝負じゃいオラ!」って意味あるのかな的なことしかできませんでした。

使ったのはBioPythonです。
Bitbucketのwikiの「PyPyのメジャーなPythonライブラリのcompatibility」のページでBioPythonはバツマークついてますが、これはnumpy使ってるとこが使えないからこうなってるだけでそれ以外の部分は自分が試した限りでは全部使えました。
ちなみに自分は普通にBioPython使ってた時でもnumpy使ってるの使ったことないです。

  • numpyがだめなんでinstall時にはpypy setup.py buildをすっとばしてpypy setup.py installってやれば使えます。
  • reportlabは使えるぽい(後述しますが力尽きて確認してません)
  • MySQLdbは重要性低いと判断し無視

で最初のスピード差が確認できたBioPython tutorial中の例(Uniprotのデータのパースかな)で許してください。

from Bio import SeqIO
uniprot = SeqIO.index("uniprot_sprot.dat", "swiss")
handle = open("selected.dat", "w")
for acc in ["P33487", "P19801", "P13689", "Q8JZQ5", "Q9TRC7"]:
  handle.write(uniprot.get_raw(acc))
handle.close()
macmini:bin kozo2$ time python uniprottime.py 

real	1m42.344s
user	1m21.054s
sys	0m5.537s
macmini:bin kozo2$ time ./pypy uniprottime-pypy.py 

real	0m53.986s
user	0m36.852s
sys	0m4.819s

とりあえずしょぼしょぼのこれだけかよ的最後ですけど今後もPyPy使ってみようと思います。(uniprottime-pypy.pyってのも処理内容は同じです)
reportlab使ってるGenomeDiagram部分もPyPyでできるかどうか試してまた書きます(多分いけると思う)。
あとnetworkxも試してみたんですがtutorial的な例は全部PyPyでいけました。
numpypyはまだまだこれからっぽいですね。
とりあえずはスピード速くなったわーいだけです。
fastqのパースとかはこのスピード差がうれしかったりするんですかね。
もっと最初の節みたいなとこもやってけるといいな的な感じです。

さようなら。

謝辞

id:moriyoshi にファミレスで教えてもらってPyPyに興味持ちました。PyPyおもろそげですね。あざす。
最初の節の内容 id:moriyoshi の言説パクってます。

tmuxのjoin-paneからpaneの指定方法を学ぶ (ターミナルマルチプレクサ Advent Calendar 2日目)

ターミナルマルチプレクサ Advent Calendarの2日目です。
1日目は id:tmatsuu さんの ターミナルマルチプレクサ Advent Calendar始めました&インストールでした。

今日はtmuxのjoin-paneというpaneに関するコマンドについて説明します。
これはバージョン1.2から加わったコマンドでとりあえず覚えといた方がよさげです。
これは

  • 「今いるpane」を「他のwindowのpane」にもって行ったり
  • 「他のwindowのpane」を「今いるpane」にもって来たり

するものです。今後「今いる」を「activeな」という言葉に置き換えます。

下記のコマンドを試せば便利さが実感できると思います。

:join-pane -t :動かしたい先のwindowの番号 (activeなpaneがwindowの番号のwindowに加わる)
:join-pane -s :もって来たいpaneがあるwindowの番号 (windowの番号のpaneがactiveなpaneに加わる)

オプションが他にもありますが、基本これだけ覚えておけば十分なことがほとんどです。


先程の2番目のコマンドで
「指定した番号のwindowに複数のpaneがある場合にはどのpaneが今いるwindowに加わるのか?」
なんですが、これはかつてそのwindowでactiveだったものが加わります。
そもそも「-sオプションの対象の windowの番号に複数のpaneがある場合ってあまりない」と思うんですが、
activeでなかったpaneも -s オプションの対象に指定できます。
それをやるには

:join-pane -s :持ってきたいpaneがあるwindowの番号.pane番号

となります。
.(dot)の後にpaneの番号を書きます(list-panesコマンドで見れます)
しかしここまで指定したいことがないのでまず

:join-pane -s :2

みたいなので十分です。
tオプションの場合も:window番号の後に.(dot)を付けて番号を書くとjoinさせる先のpaneまで指定できます。


さらに言うと:window番号の前にsession番号をつけると違うsessionからpaneを持ってくることもできるようです。(使っている人いるんでしょうか。)
つまりtmuxの概念には session - window - pane の順の階層性がありpaneの指定方法は

session番号:window番号.pane番号

となっていて「session番号とpane番号は省略することが多いけど、activeなものという指定が暗黙の内にされている」ということになります。
manだとCOMMANDS説の直後あたりに書いてます。

アディオス

Sun Grid Engineのジョブにおけるシェル

bash的に環境変数を設定する方法でジョブを投げるとエラーになってなんでやろ、と思ってると研究員の方が「なんかジョブ中ではcshになってるみたい」と教えてもらった。

SGEのsubmission script中では

#! /bin/bash

と書いていたのだがどうも

#$ -S /bin/bash

と書かないといけなかったぽい。

SGEはubuntuの10.10のパッケージで入れた。
さいなら。

Hg-Gitつかう

installation

sudo aptitude install mercurial git mercurial-git
vim ~/.hgrc

.hgrc

[extensions]
hgext.bookmarks =
hgext.git =

commands

mkdir gitrepos
mkdir hgrepos
cd gitrepos
git init --bare --shared repo_you_wanna_push_from_hg.git
cd ../hgrepos
hg clone http://localhost/hg/repo_you_wanna_push_from_hg
cd repo_you_wanna_push_from_hg
hg push ../../gitrepos/repo_you_wanna_push_from_hg.git

learned from id:moriyoshi

jkは上下移動だろjk (Emacs Advent Calendar jp: 2010)

Emacs Advent Calendar jp: 2010の23日目です。
昨日22日目はanything-gist, py-doc-popup, auto-complete-acr, ess-R-object-popupなどの作者@myuheさんでした。統合執筆環境 org-mode (Emacs Advent Calendar 22日目)

基本的なキーバインドも変えてみよう

このエントリでは移動用キーバインドやPrefixなど
「不便に感じてはいるけど、他への影響があるだろうから変更はしていない」
方が多いであろう、そんなキーバインドでも利便性を追求し変えてしまうことを提案します。

私は

  • C-nはいいとしてもC-pは指が疲れる
  • C-xが押し難い
  • C-uはめったに使わない

と思っていたのでこれらのキーバインドを全て変更しています。
使用感を合わせるためにanythingやauto-completeなど他の必須拡張機能での操作も併せて変更しています。
その設定をまとめたので、よければ試してみてください。

jkで上下移動

まず下記設定により、jkでカーソルを上下移動するように変更しています。

(global-set-key "\C-j" 'next-line)
(global-set-key "\C-k" 'previous-line)

元の C-j の newline-and-indent, eval-print-last-sexp や C-k の kill-line は下記のように変更しています。

(global-set-key "\C-m" 'newline-and-indent)
(add-hook 'lisp-interaction-mode-hook
          (function
           (lambda ()
	     (local-set-key "\C-c\C-j" 'eval-print-last-sexp)
             )))
(global-set-key "\C-n" 'kill-line)

これでC-pの割り当てが余分になりました。
私はどのOSでもCtrl-Spaceを日本語入力のトグルにしているので、余計になったC-pにはset-mark-commandを割り当てています。

(global-set-key "\C-p" 'set-mark-command)

他の機能もjkで上下移動

次にanythingやauto-completeの操作感も合わせています。(anythingのC-j,kの元の割り当てをよく使っている場合、それらは他の適当なキーに割り当ててください。)

(define-key anything-map "\C-j" 'anything-next-line)
(define-key anything-map "\C-k" 'anything-previous-line)
(setq ac-use-menu-map t)
(define-key ac-menu-map "\C-j" 'ac-next)
(define-key ac-menu-map "\C-k" 'ac-previous)

私はdiredをよく使うのでdiredもjkで上下移動するようにしています。

(add-hook 'dired-mode-hook
          (function
           (lambda ()
             (local-set-key "j" 'dired-next-line)
             (local-set-key "k" 'dired-previous-line)
             )))

Prefixキーも変える

次にC-x, C-uといったPrefixキーも下記の設定で変えています。

(global-set-key "\C-u" ctl-x-map)
(global-set-key "\C-x" universal-argument-map)

これでxとuの役割がswapされます。
Prefixを変更したこの状態で本来のCtrl-xのPrefixに続く入力を設定したい場合

(define-key ctl-x-map "\C-u" 'dired-jump)

などとします。ここではC-u2連打でdired-jumpするように設定しています。
(dired-jumpは本来C-x C-jに割り当てられています。)

コマンド入力時は通常のEmacsキーバインドにする

これまでjkで上下移動することで楽になると主張してきたのはバッファ内を移動することが多い場合であり、コマンド入力インタフェース(例えばeshellなど)の場合はこの限りではありません。
そのためコマンド入力インタフェース時には通常のEmacsキーバインドになるよう、さらに設定を行います。
私はeshellは使っていないのですが、ESSでRを使うので下記のように設定しています。

(add-hook 'inferior-ess-mode-hook
          (function
           (lambda ()
	     (local-set-key "\C-p" 'comint-previous-input)
	     (local-set-key "\C-n" 'comint-next-input)
	     (local-set-key "\C-r" 'comint-history-isearch-backward-regexp)
	     (local-set-key "\C-k" 'kill-line)
	     (local-set-key "\C-j" 'ess-smart-underscore)
             )))

蛇足かもしれませんがESSのヘルプの上下移動はjkで行うようにしています。

(add-hook 'ess-help-mode-hook
	  (function
	   (lambda ()
	     (local-set-key "j" 'ess-skip-to-next-section)
	     (local-set-key "k" 'ess-skip-to-previous-section)
	     )))

最後に

いかがでしたか。カーソル移動キーバインドを変更することは他のEmacsキーバインドを用いるソフトとの統一感がなくなるために抵抗を感じる方もいらっしゃるかもしれません。(特にkill-lineとか...でも上移動よりは使用頻度は少ないかと)
しかし設定

(global-set-key (kbd "C-;") 'anything)

を加えたりして、ホームポジションから一切動かずともバッファや、カーソルの移動ができるのを体感すると、なかなか気に入って頂けるのではないかと思っています。(コンソール内のEmacsでは使えませんが)

もし興味を持たれた方は、Emacs Advent Calendar 17日目の深町英太郎さんによる「Emacsのトラノマキ」の「元VimmerによるEmacsの再設計」もご覧下さい。

明日24日目はT-code使いであり、「便利なツールEmacsらくらく入門」の著者でもあられます@_ki_nuさんです。

最後の蛇足

私はCtrlをSpaceキーの位置にremapしています。