git push での容量制限エラー

発端

とある大きな内容を git push しようとすると 見慣れないエラーで失敗しました。

error: RPC failed; result=22, HTTP code = 411
fatal: The remote end hung up unexpectedly
fatal: recursion detected in die handler

解決策1

411 なので送信量の指定がきちんとされていない?と思いつつ、 調べてみると gitlab のフロントにいる nginx が受けつけられる サイズの最大量を超えてしまっていたよう。

これを解決するために nginx の gitlab 用設定に

client_max_body_size 100M;

を一時的に追加しました。

解決策2

しかしそれでも同じエラーが発生していたのでさらに調べたところ、 git が送信するファイル量が多すぎるとこのエラーが発生しするとのこと。 解決策は、送信するファイルのバッファ総量を変更することだそう。 この総量の設定値はローカルリポジトリ毎にもっているので

git config --global  http.postBuffer 524288000

として変更しました。 いくつかのリポジトリで発生したため global を付けて設定しています。

こんな設定値があるのかーと思ったので備忘録として書いておきます。

参考にしたページ

eshell 便利

eshell でリモートサーバに入って作業をしていると

/

からディレクトリを辿りたくなることがあります。 深い作業ディレクトリから /etc 下のファイルを見に行きたい時などです。

ここで

cd /

としてしまうと、リモートの / ではなくて 当然、自マシンの / へ移動してしまいます。

かといって相対パスで ../../../ なんてやるのも面倒なので リモートサーバの / まで移動する eshell 用コマンド "cd/"を 適当 に作っておきました。

;; リモートホスト / へ移動
(defun eshell/cd\/ ()
  (interactive)
  (let* ( (host-name (concat
                     (car (split-string (eshell/pwd) ":/"))
                     ":/")))
    (eshell/cd host-name)
    ))

// ( を2つ続けると、はてなの markdown で注釈になるのか。。

ちなみに eshell で helm を使うととても便利です。

helm-eshell-history を使うと eshell のコマンド履歴を helm で絞り込み → 入力できます。

コマンドを一部入力した状態で実行すると、 入力した部分に一致する候補が絞り込まれた状態で helm が起動するので便利です。 eshell 標準の eshell-previous-matching-input-from-input と同じような機能ですが、 helm で絞り込みが効くのでより便利だと思います。

helm-esh-pcomplete を使うと pcomplete の補完を helm で選択して入力することができます。 pcomplete をそのまま使うよりもはるかに便利だと思います。 pcomplete を使っているので、リモートサーバの上でも補完が可能です。

ちなみに helm-esh-pcomplete で補完を行うと相対パス絶対パスに変換されて入力されます。 これにより、 eshell の cd を使った移動履歴を helm-eshell-history で絞り込む際に 履歴が全て絶対パスで記録されているため カレントディレクトリを意識せずに cd の履歴を再利用することができます。

"cd " と入力して helm-eshell-history を実行することで、 eshell は autojump 無しで移動したことのあるディレクトリに どんどん移動することができます!!

よく使うので eshell-mode-hook で

(define-key eshell-mode-map (kbd "M-p") 'helm-eshell-history)
(define-key eshell-mode-map [(tab)] 'helm-esh-pcomplete)

と割り当てて使っています。

auto-complete での eshell 補完も設定しているので 簡単な移動は auto-complete で、 リモートなどへの遠い移動や履歴からの補完は helm でと使い分けています。

eshell 便利です。

// とは言うものの、素直に zsh 使った方が良いことが多いですが……

Ensime が標準の auto-complete 設定を無視するのを防ぐ

Scala 用の Ensime には auto-complete(AC) が同梱されています。

デフォルトだと Ensime 同梱の AC が有効になっています。 そのため自分で AC をインストールしていても、 ensime-mode が有効になると同梱の AC によって 自分でインストールした AC の設定が全て無視されてしまいます。

これでは他の scala-mode のバッファからの補完などが効かず少し鬱陶しいため、 下記の設定の + の部分を加えてください。

(require 'ensime)

+ ;; ensime 同梱の auto-complete を使おうとするのを止める
+ (setq ensime-ac-override-settings nil)

(add-hook 'scala-mode-hook 'ensime-scala-mode-hook)

上書き設定するかどうかが設定可能なので、 上書きしない "nil" をセットするだけです。

Emacs で同名のバッファがあった時の uniquify の設定

Emacs で同名のバッファがあった時には uniquify を使うと パスの一部をバッファ名に付与して表示してくれるので見分けが付くようになります。

例えば、

  • aaa/bbb/test
  • 111/bbb/test

というパスでファイルがあったとします。

これは通常

  • test<1>
  • test<2>

と表示されますが、 uniquify を使って

(setq uniquify-buffer-name-style 'forward)

とやると

f:id:nishikawasasaki:20130203024040p:plain

といった感じです。

区別のためのディレクトリ表示を test<111>のように <> 囲みで表示するのは

(setq uniquify-buffer-name-style 'post-forward-angle-brackets)

と設定してやります。

と、この設定は良くみるのですが、 この状態だと間の bbb が省略されてしまいます。

"..." のような省略記号があるとまだ分かりやすいのですが パス表示の中間部が無かったことのように表示されてしまうため、 個人的には分かりにくいのです。。

これを解決するには

(setq uniquify-strip-common-suffix nil)

としてやります。

これでパス風表示の場合は

f:id:nishikawasasaki:20130203024846p:plain

<> 囲みの場合は

f:id:nishikawasasaki:20130203024153p:plain

と全て表示されてわかりやすく、そして helm/anything で絞り込みの対象になります。

深いディレクトリになった時おそろしいことになりそうだけれど、 とりあえずはこっちの方が好み!

Facebook で Keysnail の jk を無効にする

facebook がキーボードの j/k で移動出来るようになって Keysnail とぶつかってしまう。。

仕方ないのでKeysnail側で site-local-keymap を使って

local["^https?://www.facebook.com/"] = [
    // navigation
    ['k', null],
    ['j', null]
];

しといた。。

追記

そんなことしないでも、KeySanil プラグインの KKK を使って Facebook の用意したキー操作全部無効化してしまえば良いことに気がつきました。

plugins.options["kkk.sites"] = ["^https://([0-9a-zA-Z]+\\.)?github\\.com/",
                                "^https://([0-9a-zA-Z]+\\.)?facebook\\.com/",
                                "^https://([0-9a-zA-Z]+\\.)?google\\.co\\.jp/",
                                "^http://([0-9a-zA-Z]+\\.)?tumblr\\.com/"];

ついでにいろいろ追加しています。 これですっきりです。

multiple-cursors.el を使おう

年の瀬ですね。 来年、良い年になると良いですね。

さてちょっと話題となった multiple-cursors.el の紹介です。 github のドキュメントや動画できちんと使い方が説明されていますので そちらもご覧ください、というか是非元ドキュメントにあたってください。

magnars/multiple-cursors.el · GitHub
    https://github.com/magnars/multiple-cursors.el
    git://github.com/magnars/multiple-cursors.el.git

動画はこちら

Emacs Rocks! - http://emacsrocks.com/e13.html

multiple-cursors.el ってなに?

その名の通り、カーソルキーを複数作成することが出来ます。 この説明だけでは何が嬉しいのか分かりにくいですが嬉しいことです。

まずこんなテキストがあったとします。

f:id:nishikawasasaki:20121231090431p:plain

"cd" という文字列を一気に修正したくなった場合に、 "cd" をリージョンに入れます。

f:id:nishikawasasaki:20121231090839p:plain

ここで multiple-cursors.el の mc/mark-all-like-this を実行します。

f:id:nishikawasasaki:20121231090943p:plain

リージョンと一致する要素、ここでは全ての "cd" がリージョンに入り、 "cd" の後ろにカーソルが追加されました。

リージョン選択されている状態ですので、 このまま文字を入力すると全てのリージョンに入力が行われて 一気に編集することが出来ます。 "cd" を "hogehoge" に編集するとこんな感じです。

f:id:nishikawasasaki:20121231091309p:plain

ここまでであれば magnars 氏が別に用意されている mark-multiple.el でも可能です。 しかし multiple-cursors.el はここからが本領発揮です。 マルチカーソルというくらいですので C-a して行頭に移動してそれぞれの行に文字列を追加したり……

f:id:nishikawasasaki:20121231091505p:plain

そのまま C-e して行末に追加することも可能です。

f:id:nishikawasasaki:20121231091603p:plain

もちろん、行頭行末でなくても C-f や C-b で全てのカーソルを1文字ずつ移動することも可能ですし、 C-n や C-p も出来てしまいます。

用意されているコマンド

multiple-cursors.el には、どのようにカーソルを追加するかが 異なるコマンドが定義されています。 その内よく使いそうなものをピックアップしてみます。

mc/mark-next-like-this と mc/mark-previous-like-this

リージョン状態で実行すると、リージョンと同じ内容の位置にカーソルを追加します。 next の方で現在行より下の候補を、previous で上の候補です。

リージョンが存在しない場合は、現在のカーソル位置の丁度上下に新たなカーソルを追加します。 文字列の置き換えをしないのであれば、リージョン選択せずにカーソルを増やして一括編集が可能です。

行頭と文頭のインデントのスペースを一括で取り除く場合に 矩形選択して削除という方法が考えられますが、 行頭にカーソルを置いて mc/mark-next-like-this で下の行に次々カーソルを追加すれば あとは C-d で全ての行のインデントを1つずつ消していけますね。

こんな風に設定しています。

;; リージョンと一致する箇所で現在行より下にあるもの1つを追加
(global-set-key (kbd "C->") 'mc/mark-next-like-this)
;; リージョンと一致する箇所で現在行より上にあるもの1つを追加
(global-set-key (kbd "C-<") 'mc/mark-previous-like-this)

mc/mark-more-like-this-extended

上の項目の拡張版です。 矢印キー↑↓を使ってリージョンと同じ内容へのカーソル追加が行えます。

← で要素を1つ飛ばしでカーソルを追加出来ます。 ところどころ編集したく無い要素がある場合に便利ですね。

もし間違えて要素を追加してしまった場合は → キーで直前の追加をキャンセルして戻ることが出来ます。 何度も可能です。

mc/mark-all-like-this

上記の例で紹介済みですがリージョンに一致する項目全てにカーソルを追加します。 リファクタリングで変数名を変えたり……なんて場合に便利です。

mc/mark-sgml-tag-pair

HTML などで、対応するタグにカーソルを追加します。 開始タグで mc/mark-sgml-tag-pair すれば閉じタグに、 閉じタグで mc/mark-sgml-tag-pair すれば 開始タグにカーソルが追加されますので 対応するタグを一緒に編集することが出来ます。

mc/mark-all-like-this-dwim

DWIM、良い感じにカーソルを追加してくれます。 通常時は mc/mark-all-like-this のように動作し、 タグ上で使うと mc/mark-sgml-tag-pair のように動作するスマートな子です。

その他

multiple-cursors.el でカーソルを追加中はモードラインに何箇所追加したかが "mc:n" (n は整数)で表示されています。

また、表示している領域外にある要素の追加を確認したい場合 C-v と M-v で通常の画面送りではなく、要素をひとつずつ確認することが出来ます。

ちなみに リージョン選択が便利になる er/expand-region との併用が作者からオススメされています。

おわりに

どうでしょうか。 使いこなす方に頭を使いそうな気がする elisp ですが 状況によっては大変便利だと思います。

それでは良いお年を、また来年!!

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 が逆なので入れ替えました。


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