magit の部分 stage が便利で便利で

この投稿はEmacs Advent Calendar 2012の14日目の記事です。 (Qiita で行われています)

"Emacs Advent Calendar 2012 - Qiita" - http://qiita.com/advent-calendar/2012/emacs

導入

みなさん、 git つかってますか?

git を使ってらっしゃる方はコマンドで操作している方が大半だと思います。 そこで Emacs をお使いのみなさんにお勧めするのが 今回のテーマの magit です。

magit って?

Emacs から git を操作するための elisp です。

magit/magit · GitHub - https://github.com/magit/magit

インストールには el-get を利用すると便利です。

M-x el-get-install
    → magit を入力してインストール

add や commit、 checkout に branch など、 基本的なコマンドはこのあたりをご覧ください。

普通の magit

そんな magit ですが今回特に紹介したいのは、 "部分 stage 機能" です!

ファイルを編集後の git 管理下のファイルが変更された状態で magit-status を実行すると、 magit による git 操作画面となります。

通常であれば Changes の中から add したいファイルにカーソルを合わせておいて s キーをタイプすることで Staged changes へとファイルが移ります。

単純な追加や変更であれば、このまま c をタイプしてコミットメッセージを入力してしまいましょう。

今回のポイント

リポジトリに管理下の hoge アプリ設定ファイルに新しい設定項目を追加したという状況を考えてみましょう。

# hoge設定ファイル
path=/hoge/piyo
newSetting=aaa

ここでは newSetting が新しい設定項目だと思ってください。

この時、もともとの設定項目 path が存在していますが、 これが動作確認に必要な項目で ローカル特有の設定値に変更していたとしたらどうでしょうか?

add 前にリポジトリの内容に戻しておかないと、 このローカル用設定のままコミットされてしまいます。

こんな時に使えるのが magit の部分 stage です。

使い方はいたって簡単です。 編集が完了した状態で magit-status を実行します。

magit での git 操作画面が開きますので、部分的に stage したいファイルにカーソルを合わせます。

この状態で M-s (alt+s, Cmd+s, Opt+s)をタイプします。 するとファイルリストの下部に Diff が表示されます。

この Diff 上でリージョン選択して s をタイプすると、 リージョン選択した領域のみが stage(git add)されるのです!

この例の場合だと、 変更として加えたいのは newSetting=aaa の部分ですので、この行を行頭から行末までリージョンとして s をタイプします。 するとどうでしょう。Staged changes として部分的に stage したファイル名があらわれます。

あとは通常通り c をタイプしてコミットに進むだけです。 もちろん他にファイルや部分を同時にコミットすることも可能です。

部分のみコミットするとこのようにちゃんと部分がコミットされています。

便利ですね!!

ちなみに同じ要領で、リージョン選択後に ステージの s ではなく v をタイプすることで部分的にリポジトリの状態に戻す(revert)することも出来ます!

おわりに

magit は Emacs からとっても便利に git を操作できる素晴しい道具です。 git をコマンド操作するよりも効率良く操作できると楽しいですね!!

最後に、 magit の Diff の色合いが気に入らない人用の情報です。 色は下記のように変更可能ですのでいろいろ試してみてください。

;; 色変更
(set-face-foreground 'magit-diff-add "#b9ca4a") ; 追加した部分を緑に
(set-face-foreground 'magit-diff-del "#d54e53")  ; 削除した 部分を赤に
(set-face-background 'magit-item-highlight "#000000") ; 選択項目ハイライトがうっとうしいので背景色と同化

それではそれでは〜

Emacs on Windows な環境で el-get する

この投稿はEmacs Advent Calendar 2012の14日目の記事です。 (Qiita で行われています)

"Emacs Advent Calendar 2012 - Qiita" - http://qiita.com/advent-calendar/2012/emacs

導入

Emacselisp 管理に el-get はいまやかかせないものになっています。

が、しかし git に依存しているため、 windows では工夫してやる必要がありました。 msysgit(msys) は大きな助けになります。

"Git for Windows" - http://msysgit.github.com/

msys の環境設定を引き継いだまま Emacs を起動するには msys のプロンプト上から

runemacs

を実行するだけですので簡単です。

したがってこれで終わり……とはいかないのが windows の悩ましいところですね。

問題

この状態で M-! で git が使えるにも関わらず、 el-get を使おうとするとエラーが発生してしまい el-get 自体の clone とインストールに失敗してしまいます。

この問題は msys に含まれる bin/install-info.exe が影響しています。 その顛末はこれを書いている今もここでやりとりがされています。

"install-info strangeness... · Issue #861 · dimitri/el-get" - https://github.com/dimitri/el-get/issues/861

問題としては、cygwin や msys が windows ネイティブの install-info.exe と 混ざって呼び出してしまうことのようですが、 てっとり早く回避方法を試しましょう。

回避方法

その1

msys の install-info.exe をリネームして使わないようにします。 強引ですが手間もかからず簡単です。 ただし今のところリネームによる問題は発生していませんが、 もしかすると Emacs 以外で問題が発生するかもしれません。

その2

el-get を手動で clone します。 el-get のインストールスクリプトは単純に el-get 管理下のディレクトリに まず el-get 自身を clone します。 ですのでこれを手で行なってしまいます。 msys のプロンプトで ~/.emacs.d/el-get などの環境に合わせた el-get の管理ディレクトリに移動して 手動で clone しましょう。

その2の方法で入れた el-get を el-get が誤作動で吹き飛ばした経験があるので、 現在は1の方法で運用しています。

おまけ

yasnippet は github 上で el-get でのインストールが紹介されています。

"capitaomorte/yasnippet · GitHub" - https://github.com/capitaomorte/yasnippet

しかし windows 環境では使用不可能なパスの形式で 一部の snippets が登録されています。 これらの snippets は git submodule で管理されているのですが、 公式で紹介されている el-get からのインストール方法を試すと git submodule も実行されてしまいます。 git submodule が実行されたタイミングで OS がエラーを出すために、 el-get が動作を停止した上 GUI では削除不可能なファイルが出来てしまいます。

この問題を回避するためには el-get に追加されたオプションを有効にしてインストールを行います。

通常、

      (:name yasnippet
             :website "https://github.com/capitaomorte/yasnippet.git"
             :description "YASnippet is a template system for Emacs."
             :type github
             :pkgname "capitaomorte/yasnippet"
             :features "yasnippet"
             :compile "yasnippet.el"

のように記述する部分に :submodule nil を追加し、

      (:name yasnippet
             :website "https://github.com/capitaomorte/yasnippet.git"
             :description "YASnippet is a template system for Emacs."
             :type github
             :pkgname "capitaomorte/yasnippet"
             :features "yasnippet"
             :compile "yasnippet.el"
             :submodule nil

というように変更します。 これで git submodule は実行されないため問題が回避出来ます。 (当然本来であればインストールされる snippets がインストールされません。) あくまで回避策、ですね。

終わりに

windows 環境は地雷がいっぱいなので、 VM に Linux を入れてそこで Emacs を使うのが一番楽だなと感じる今日このごろです。

Win でも Mac でも Linux でも SandS したい!!

タイトルのような人向けです。
SandS したいくらいなので SKK を使ってる想定です。


ちなみにこれを読もうと思ったくらいのあなたには
不必要な説明かもしれませんが、
SandS というのは当然「砂粒」ではなく

スペースキーと他のキーを同時押しすると、スペースキーがシフトとして動作する。
スペースだけ打鍵するとスペースとして動作する。

というものです。
SKK を使うととにかくシフトを打鍵するのであると嬉しい機能です。

Win 編

Win でも SKK 使いたいとは相当のアレですね。
最近は日本語入力に

SKK日本語入力FEP - http://goo.gl/Dnd32

利用しています。
大変しっかり動きますし、何おり更新履歴が楽しいです!!

この skkfep に SandS 機能がありますので、
日本語入力中に SandS 出来れば良い人はこれだけで OK でしょう。


ブラウザ拡張を vimperator や Keysnail などで弄り過ぎている変態さんは
日本語入力中以外にも SandS が欲しくなると聞きます。
あくまで聞いた話です。伝聞です。
そんなあなたは AutoHotKey を使うと簡単です。
AutoHotKey の詳細には触れませんが、
掻い摘んで言うとキーに好きな挙動を割り当てるものです。
これでスペースキーの挙動を SandS にしてやれば良いのです。
設定方法はググると出てきますのでそちらをご覧ください。

AutoHotKey SandS - Google 検索 - http://goo.gl/XCesm

これで Win でばっちり SandS ライフが送れますね!! やった!!!

Mac 編

会社では支給の PC が Win だ、
嫌いだけど仕方ない、社命とあれば地獄まで、というあなたは
御自宅では Mac をお使いのことでしょう。
そんなに Mac を使いたいなら早く情シスを説得した方が精神を保てるでしょう。


これで終わりではあんまりです。
ということで Mac で SandS をしたい場合の方法ですが、
一番簡単です。


KeyRemap4MacBook という素晴しいものがあります。

KeyRemap4MacBook - OS X用のソフトウェア - http://goo.gl/JuSIf

こちらで Mac のキーボードを好きに出来ます。
あらかじめ SandS 用に "Space to Shift_L" という設定がありますので
有効にするだけで完了です。
スペースを押しっぱなしにした時に、スペースをたくさん入力して欲しい人は
[KeyRepeat] の方を選択してください。


ちなみに追加で PCKeyboardHack をインストールして
caps lock に control や return を割り当てるともっと幸せを感じられるかもしれません。
そういえば左シフトキーも要らないので好きなキーに割り当てられますが、
帰って来られない世界に行ってしまう恐れがあります。
用法用量を守ってお使いください。


これで Mac でばっちり SandS ライフが送れますね!! やった!!!

Linux

こんなことしたい輩はだいたい gentoo を使っています(独自調べ)。
gentoo な人は大変親切な方が準備してくださっているので
こちらを利用します。

At home modifier - Home - Open wiki - Gitorious - http://goo.gl/xTwtj

ebuild も付いていますので emerge すれば OK です。
gentoo 以外にも Arch や Ubuntu でも使えるようですが、
使っていないので試したことがありません。


これで Linux でばっちり SandS ライフが送れますね!! やった!!!

終わりに


どうでしょうか、どんな環境でも SandS ライフを送れるようになったでしょうか?
御自宅で会社で VM でと様々な環境で戦うあなたに必要なマルチ環境 SandS 導入でした。


キーボードは標準で使わないと設定されていない標準環境で辛くなるので、
出来るだけ標準のまま使うべきという説もあるようです。
それでもオレオレカスタマイズで戦う、そんな人の助けになれば幸いです。


それでは……
これでどこでもばっちり SandS ライフが送れますね!! やった!!!

TypeMatrix 2030 USB を買ってみた

タイトルの通りです!


こんな感じ。
止せばいいのに無刻印。
f:id:nishikawasasaki:20120920221529j:image


写真右端の縦に2列、キーボードの真ん中に Return や Delete が並ぶという怪しさ……。
でも右手でマウス操作しながらキーボードで操作する時に
いちいち右手をマウスから外してキーボードを触ることに無駄を感じていたので、
真ん中に Return があるのは便利だと思っています。


当然、英字キーボードですので日本語のオンオフキーはそのままではありません。
でも SKK を普段使っていますので問題ないかな?


気になったのは左 Ctrl の小ささと位置。(左下隅からひとつ上)
Shift の下なのはまだ良いとしても、小さい、とても小さい。。


ということで左 Shift と左 Ctrl を入れ替えました。
すると今度は左 Shift が小さいので押しにくい。。
SKK では致命的。


結局、Space を SandS にして Shift 代わりに使うことにしました。
これで快適!


ついでに Mac だと左 Command と 左 Option が逆なので入れ替えました。


どんどん普通の環境から離れていってるなぁ……

cabal update が timeout するので

xmonad と xmobar を入れ直したかったのでふと cabal update してみたら、
何度やっても timeout ……。
ping は飛ばないけれど nslookup で名前引きはできる。


調べてみると IPv4 ならどうとか IPv6 だとどうとか書いてあるブログもあるのだけれど、
cabal のためにどうこう出来ないので代替策を探しました。


"[Haskell-beginners] Hackage down?"- http://goo.gl/BXCGY


これが丁度探してた、 cabal が見にいく URL を変更する方法だったので
下記のように試してみました。

-- remote-repo: hackage.haskell.org:http://hackage.haskell.org/packages/archive
remote-repo: hackage.haskell.org:http://hdiff.luite.com/packages/archive

問題なくミラーから取得できました。


解決してみれば単純なことだけれど、
他に書いてる人もいないようですのでメモメモ。

helm で eshell が便利

helm の readme にもありますが
eshell の補完で helm を使うと便利です。
anything にもあったかもしれません。


普段のコマンドとパスの補完は auto-complete でして、
こったコマンドの履歴や一覧から補完候補を選びたい時は helm を使います。


auto-complete を使う部分

;; eshell での補完に auto-complete.el を使う
(require 'pcomplete)
(add-to-list 'ac-modes 'eshell-mode)
(ac-define-source pcomplete
  '((candidates . pcomplete-completions)))
(defun my-ac-eshell-mode ()
  (setq ac-sources
        '(ac-source-pcomplete
          ac-source-filename
          ac-source-files-in-current-dir
          ac-source-words-in-buffer
          ac-source-dictionary)))
(add-hook 'eshell-mode-hook
          (lambda ()
            (my-ac-eshell-mode)
            (define-key eshell-mode-map (kbd "C-i") 'auto-complete)
            (define-key eshell-mode-map [(tab)] 'auto-complete)))


helm を使う部分

;; helm で履歴から入力
(add-hook 'eshell-mode-hook
          #'(lambda ()
              (define-key eshell-mode-map
                (kbd "M-p")
                'helm-eshell-history)))
;; helm で補完
(add-hook 'eshell-mode-hook
          #'(lambda ()
              (define-key eshell-mode-map
                (kbd "M-n")
                'helm-esh-pcomplete)))


普段の補完は TAB を使って auto-complete 、
途中まで入力して一覧から補完したい時は M-n で helm-esh-pcomplete 、
途中まで入力した内容から履歴をたどりたい時は M-p で helm-eshell-history 。


M-n と M-p は適当感あるので別のキーに変更したい。


eshell の face (色) が気にいらない人はテーマで

;; eshell
(eshell-ls-executable ((t (:background ,"#色" :foreground ,"#色"))))
(eshell-prompt ((t (:background ,"#色" :foreground ,"#色"))))

のように変更すると良いのではないでしょうか。


キャプチャも撮ったけど
なぜかはてなブログにアップロード完了しないのではれませんでした。。

ダイアリーをインポート!

はてなダイアリーからブログに記事をインポートできるようになっていたので、
いろいろ移してみました。
なんとなくこれで良いかも。

ついでに記事のフォントを web フォントにしてみたり。
若干重たいかな?


こちらを利用させていただいています。

M+ OUTLINE FONTS | WEB FONTS
http://mplus-fonts.sourceforge.jp/webfonts/#license

@import url(http://mplus-fonts.sourceforge.jp/webfonts/mplus_webfonts.css);

body
{
font-family: mplus-1p-regular;
}

play 2.0 ではまった話

ちょっといじってみる必要があったので、
play framework 2.0 をさわっていました。
beta の時にもさわっていたのですけど、
json まわりの変更が入る前のやつだったので 2.0 final に更新しました。


するとどうでしょう、アプリが動かなくなりました。。
最初の1回は Web ページを開けるのですが、
それ以降遷移もリロードもできなくなるのです。


play 本体を homebrew でいれていたのでやめてみたり、
ロードしていたプラグインをやめてみたり、
プロジェクトの設定を変えたり作りなおしたり・・・
色々やってるうちに jps と jstac して、なんだか途中で止まっていることを発見。
もしかして java ? ということで Mac の Java 設定を見てみると、
ちょっと前に入れた oracle 製「Java SE 7 Developer Preview」 が優先に・・・。
Apple 製の Java SE6 に変えて、再度 play すると

[UnsupportedClassVersionError: controllers/routes] 

などと出たためプロジェクトごと作りなおすとようやく動きました。


試しに最新の Oracle JDK7u4 Mac OS X Port Developer Preview Release にしてみても動きませんでした。
Oracle JDK7u4 Mac OS X Port Developer Preview Release — Java.net - http://goo.gl/lj6hj
少なくとも Mac では JDK6 で動かすのが安全なようですね。。

rst + Sphinx S6 で勉強会の資料

勉強会で Scala をさらりと、Actor と Akka Actor について話をしてきました。
資料を rst + Sphinx S6 で作成したので楽しかったです。

Scala/Akka Actor
http://nishikawasasaki.github.com/slides/20120317_scala-akka-actor/html/index.html


github pages を使ってみたかったので、
資料の公開ついでに試してみました。

http://nishikawasasaki.github.com/slides/

S6 もちゃんと動きますし良いですね!
Web フォントを使えば HTML でも思ったフォントで動かせて良いですね!

git のエディタを emacs や emacsclient にした状態の git rebase -i

git で歴史を修正したい時があると思います。

古いコミットを書き換える: 歴史修正主義者のための git rebase -i 入門 - 学習する機械、学習しない人間
http://goo.gl/p902q

こんなふうですね

git rebase -i HEAD~1

実行するとエディタでログの編集をはじめるわけですが、
vi / vim ならばそのままいつもどおり修正をすることになります。


ところが、

  • core.editor
  • GIT_EDITOR

などで git のコミットログ編集用エディタを
emacs や emacsclient にしている場合は少し様子が違います。
view-mode 、読み取り専用で開くのです。


f:id:nishikawasasaki:20120315003631p:image
pick を消して edit と書き直したくなるところですが、
pick の上にカーソルを持って行き、
"e" と入力すれば一瞬で edit に変わります。
f:id:nishikawasasaki:20120315003632p:image


キーはだいたい下のとおりです。

r  >>  reword
e  >>  edit
s  >>  squash  
k  >>  delete


望みどおりになれば C-x C-s して保存後にバッファを閉じれば完了です。


なんで読み取り専用で開くんだろうと少し考えてしまったのでメモ・・・。