header

2014年12月31日水曜日

vi.el、Emacsやめるってよ

Emacs newsの24をみてたら、vi.el, vpi.elがObsoleteになるみたい(なった?)ようです。以下のS式をEmacs上で評価するとみれます。

(view-emacs-news 24)

一応コメントを抜き出すと、

* Changes in Specialized Modes and Packages in Emacs 24.5
** Obsolete packages
...
*** vi.el, vip.el (try M-x viper instead)



ということで変わりにviper-modeを使えということらしいです。まぁ使ってる人がいるのか謎のvi modeですが、まだ(require 'vi)で注意はでますがまだ使うことはできました。

なんでこんなこと書いてるかというと、来年は心を入れかえて(Emacsで)vi(っぽい)操作を少しずつ覚えようと思い調べたからです。この記事のメインはEmacsよりのevilの設定なんですが、この Evil: EmacsをVimのごとく使う - 導入編 をみるといろいろ歴史があるんですねー。

さて僕自身はvi(vim)の操作は移動方法と終了方法がわかるくらいで、ギリギリvisudoで設定編集できるくらいなんですがちょっと観光するくらいの気持ちでevil.el挑戦してみました。あまり急にviっぽい操作を入れるとなかなかストレスフルなので、かなりEmacsよりの設定になっています。

Evilの設定

一般的な設定

(require 'evil)

(setq evil-default-cursor 'box ; 'hbar box
evil-normal-state-cursor '("#Ff00ff")
evil-insert-state-cursor '("#4169e1" (bar . 2))
evil-emacs-state-cursor '("#00ced1" (bar . 2))
evil-cross-lines t
;; Do not move eol when normal state
evil-move-cursor-back t)

;; window移動するときcursorを更新
(advice-add 'other-window :after 'evil-refresh-cursor)

Emacsよりのevilにする設定:キーバインドまとめて無効化するのにmykie.el というキーバインド拡張を利用しています。(作者によるステマ)

(require 'cl-lib)
(require 'mykie)
;; Override Evil's keybinds
;; (自分が使わない)一部のEvilキーバインドを無効化する
(cl-dolist (map `(,evil-normal-state-map
,evil-motion-state-map))
;; 以下の設定で指定したキーが無効化され、global-mapのキーが利用され
;; るようになる
(mykie:set-keys map
"C-e" "C-o" "C-r" "C-s" "C-t" "C-w" "C-z" "C-^" "C-="
"M-n" "M-p"))

(setq
;; デフォルトのevilの状態をemacsに(それevil使う意味ry)
evil-default-state 'emacs
;; term-mode or eshell-mode didn't work well in my environment.
;; For more info, see `evil-emacs-state-modes', `evil-insert-state-modes' or
;; `evil-motion-state-modes'.
evil-insert-state-modes nil)

;; insertモードはemacsモードです
(advice-add 'evil-insert-state :override 'evil-emacs-state)

自分の設定を解説すると、最初のdolistの部分はnormalモードとmotionモードの一部のキーでglobal-mapのキーが使いたいので無効化しています。evil-insert-state-modesについては、デフォルトではterm-modeやeshell-modeが入っていましたがこのままだと自分が設定した各モード用のキーバインドが反映されなかったのでnilとして default のstateをemacsとして使っています。

あと最後のevil-insert-stateの設定については、あまりこういうことはしたくないのですがorg-modeでtabキーでorg-tableを広げられなかったり上述のterm-modeやeshellの問題があり、各モードごと設定するのはめんどうかなと思い、このように設定しました。(何かよい解決策あれば教えてください)

InsertモードからNormalモードへの切替え

ESC と C-[ はちょっと押しづらいと感じていて、muhenkanキーに割り当てています。これもmykie.elを利用していて、2回押したらmagitを起動するようにしてます。

(mykie:set-keys global-map
"<muhenkan>"
:default
(if (bound-and-true-p evil-mode)
(call-interactively 'evil-normal-state)
nil)
:repeat magit-status

"C-e"
;; C-u2回押したあと、C-eでevil-modeになる
;; mykieがこんな設定もできるよという例なので、:C-uとregion&C-uはいりません。
:default end-of-line
:C-u eww
:C-u*2 evil-mode
:region&C-u align)

おわり

こんな感じでevil.el使い始めました。ほんとはvi.elが一度も登場しないもやもやとした構成も考えましたがさすがにあれかなぁと思って最初にちょっと書きました。

桐島、部活やめるってよ (本編BD+特典DVD 2枚組) [Blu-ray]
バップ (2013-02-15)
売り上げランキング: 6,195

2014年12月29日月曜日

EmacsでGoogle日本語入力のSKKサーバーを利用するようにした

以前は Ruby製のGoogle日本語入力サーバー を使っていたが、OSを変えたついでに調べたら Golang製のGoogle日本語入力のSKKサーバー があったのでこちらを使うようにした。(どちらもlocalのマシンでサーバー起動して、Google日本語入力APIとやり取りする)

SKKについてあまりわかっていないので、自分のやり方が正しいかよくわからないがとりあえず利用できるようになったので記事にしておく。(自分は辞書含めて全てutf-8で設定しているので、以降の設定もそれようとなっているので適当に読み替えてください)

まずはインストール

Golang製なので


go get github.com/akiym/go-skkserv


これでインストールできる。

作者さんの書いてる例をコピペ&ビルド

コピペしたけど、文字エンコーディングの部分は"utf8"にした。その後、go buildでビルドした。

Emacsの設定

ほんとは設定値をsetqしたら後はskk-server-openでいけそうな気がするけど、(よくわからず)できなかったので、自分は以下のように設定した。

(require 'skk-server)

(setq skk-server-host "0.0.0.0"
skk-server-prog "pass/to/go-serv" ; ビルドしたgo-skkservへのパス
skk-server-portnum 55100)

(defun my/boot-skk-server ()
"Start SKK server."
(unless (skk-server-live-p)
(async-shell-command skk-server-prog (get-buffer-create "*goskk*"))
(setq skkserv-process (skk-open-server-1))
(when (skk-server-live-p)
(set-process-coding-system skkserv-process 'utf-8 'utf-8))))

(defun my/skk-close-server ()
(interactive)
(when (skk-server-live-p)
(skk-disconnect-server)
(kill-process (get-buffer-process "*goskk*"))
(message "Server disconnected")))

(add-hook 'kill-emacs-hook 'my/skk-close-server)

最初文字コードを特に設定せずに利用した場合、文字化けしたので`skk-process-coding-system'の部分を追加したら動くようになった。設定変数でこのあたりなんとかできるのかもしれないけれど、自分が調べたかぎりではeuc-jpに強制的にかわるようだった。(詳しいかたいたらコメントいただければうれしいです。)

上のコードを利用するにはmy/boot-skk-serverをSKKでキーインプットする前に呼び出せばいい。

おわり

ハードコアなSKKユーザーの方には軟弱者と罵られそうですが、SKKを使いつつGoogle日本語入力で補助してもらうのは、なかなか快適です。便利なGoogle日本語入力SKKサーバー(のコード)を公開してくださっているかたたちに感謝です。

Raspberry Piでリモートデスクトップ環境を作った

現在Raspberry PiはHDMI経由でテレビにつなっがっているので、こちらのほうが大画面でみやすいのでRaspberry PiからノートPCのほうにリモートで接続して使用できないかと思い試した。(自分は)あんまりやることではないので、メモとして残す。

結論からいうと、できることはできるけどあんまり快適ではなかったのでたぶん継続しては使わないと思う。

やりかた

リモートデスクトップで調べると、xrdp, remix, x11vnc, tightvncserverとかあるらしい。このページ をみてx11vncを試してみた。

接続されるPC:

sudo apt-get install x11vnc
# マシンのパスワードを保存
x11vnc -storepasswd
# パスワード付きでサーバー起動
x11vnc -usepw -forever

実行すると、メッセージで最後の方に"ホスト名:0"みたいのがでた。

接続するPC(自分の場合Raspbery Pi)

# 確かこんな名前のパッケージだった
sudo apt-get install vncviewer
# sshで接続
ssh 接続されるPC
# 別タブを開いた後,その別タブで(上で出たホスト名を入れる)
vncviewer ホスト名:0

sshで接続する前は、エラーが出て接続できなかった。

書きわすれたがPiはstartxしてから確認した。ログインターミナルの状態では確認していない。

使い勝手

リモートPC側でキーバインドの変更をしているが、Raspberry Piではしていないので(あたりまえだけど)設定したキーバインドが使えなくて違和感を覚えた。あと自分の環境ではそんなにさくさく使えなかった。ただこのあたりPiの性能なのか自分のとこのネットワークが遅いのかよくわからなかった。

おわり

快適じゃないけど、Raspberry Piでリモートで自分のPCをいじるのはちょっと快感だった。Raspberry Piおもしろい。

2014年12月27日土曜日

Raspberry Piの設定をした

クリスマスプレゼントにRaspberry Piをもらったので(ありがとう母!)さっそく設定した。ブログ記事としては、他の人もよくかかれているしとりたてて新しい情報はないので知っている人はあまり見る価値はないです。自分用のメモの意味合いがつよいです。

もらったもの

Raspberry Pi Starter Kitをもらった。なので、

  • Raspberry Pi B+
  • HDMIケーブル
  • 電源ケーブル(micro usb)
  • micro SD card(Noobs入り)

が入っていた。※NoobsはPi用のOSインストーラーです

OS Install

  • Raspberry PiをテレビにHDMIでつなぐ
  • Raspberry Piにmicro SD cardを入れる
  • 電源ケーブルを入れる

電源ケーブルを入れた段階でRaspberry Piが起動するので、後は(Noobs)なのでOSを選択してインストールする。

自分は初Raspberry Piだったので、とりあえずRaspbianにした。

インストール中にユーザー名とパスワードとホスト名を決めたきがする。defaultのユーザー名はpi,パスワードはraspberryだった。デフォルトのパスワードのままだとアレなので変えた。

あと説明の途中で、raspi-configで設定変えれるよって書いてあったのでメモしておく。

Install後にしたこと

若干インストール中のことも入っている気もするが、まぁメモなのでいっか。

update-alternativeコマンドでちょっとデフォルト設定をいじった。エディターnanoからviにした。

sudo update-alternative --all



アップデート&アップグレード

sudo apt-get update
sudo apt-get upgrade



Wifi接続の設定をした。startxコマンドの後,GUIからwifiの設定ぽいっアイコンをクリックした

startx


あとは普通にIDとパスワードを設定した。

固定IPの設定たぶん、Emacsからtrampで接続するので固定IPの設定をした。How to set static address in Raspberry Pi上のリンクを参考に設定した。(リンクはeth0で設定しているが自分がやりたいのは無線なのでwlan0で設定した。)

SSH接続がカクつくSSH接続がカクつくような感じがしたので、ググったRaspberry Pi + Wi-Fi アダプタが異常に遅い問題を解決とりあえず設定したら少し早くなった気がする。(たぶん)

おわり

設定したのこれくらい。(ほんとはEmacsのtrampの設定もしたけど別の記事にする)スターターキットだからOSもすぐインストールできて導入はすごい簡単だった。

Raspberry Pi Model B+ (Plus)
Raspberry Pi Model B+ (Plus)
posted with amazlet at 14.12.29
raspberrypi.org
売り上げランキング: 724

2014年12月22日月曜日

Emacsのcl-lib.elとlexcal-binding: tのエラー回避

最近mykie.elというEmacsのキーバインド拡張をcl-lib対応した。その時に遭遇した問題をメモとして残しておく。(この記事は2014/12/20に書いたので、そのうち修正さる挙動がかわるかもしれません)


cl-libって?

まずcl-libが何だという人向けに説明すると、cl-libはEmacsでもcommon-lisp系の関数を使えるようにする拡張です。loopとかloopとかloopとか(それくらいしかしらない)

たしかEmacs24くらいから正式に導入されたと思いますが、それ以前のEmacserは



(eval-when-compile (require 'cl))

としてclライブラリを使っていました。eval-when-compileの説明をみるとどうやら、コンパイル時評価するようにしていたようです。

詳しい経緯は知らないですが、最近は上記のcl-libを使うほうが主流のようです。


lexcal-baidingって

emacs-lispの変数はダイナミックスコープですが、ファイルの先頭にlexical-binding: tとして追加しておくとそのファイルをレキシカルスコープとして扱ってくれます。



;; some thing ......  -*- lexical-binding: t -*-

問題

んで、mykie.el ですが上の古いclを使って書いてました。去年僕が書いた時はcl-libを使おうとするとwarningが出て直し方がよくわからなかったので、古い方のclでいいやって思ってそのままでしたが、最近このmykie.elパッケージをいじるのにcl-libにしてたらまだワーニングがでたのでいいかげん調べてみました。

最初の問題としては以下のようなcl-loop関数でunused lexical variable my_listと出るようになりました。



;;; this is sample -*- lexical-binding: t -*-
(require 'cl-lib)
(cl-loop with my_list
for str in '(1 2 3)
collect str into my_list
finally return my_list)

上の関数をmacroexpand関数で展開してみると以下のようになりました。



(cl--block-wrapper
(catch (quote --cl-block-nil--)
(let* ((my_list nil)
(--cl-var-- (quote (1 2 3)))
(str nil)
(my_list nil))
(while (consp --cl-var--)
(setq str (car --cl-var--))
(setq my_list (nconc my_list (list str)))
(setq --cl-var-- (cdr --cl-var--)))
my_list)))

なぜかletフォームの中にmy_list nilが2個あるのがわかると思います。というわけで、実際マクロ展開すると使われていない変数として存在するのがわかりました。

じゃあどう書けばいいかっていうと、単純にwith my_listで宣言している部分を消してしまえばいいだけでした。

他のunused variableが出た時のtipsとして、_を変数名につけるとwarningがでなくなるかもしれません。



  •   ;;; this is sample -*- lexical-binding: t -*-
    (require 'cl-lib)
    (cl-loop for (first second) in '((1 . 2) (3 . 4))
    collect first)

    ;; こっちはエラーでない
    (cl-loop for (first _second) in '((1 . 2) (3 . 4))
    collect first)

ただemacs-lispコンパイラーに好き嫌いがあるみたいで、上で紹介したwith文の場合は_ではwarning抑制できませんでした。

あとこれは、あまりおすすめできませんが、with-no-warningsという関数でくくればその中はワーニングが抑制できます。ただ上のwith文は(以下略)

なので、最初は_をちょろっと追加してダメなら、他を試すといった感じでしょうか

あとこんなスーパーおっちょこちょいは僕だけかもしれませんが、古いcl-libが読み込まれているとエラーが出るというケースもあるみたいです。いいかたがあやふやなのはもう古いのは消してしまって確認するのがめんどうという理由ですが、確か古いcl-lib消したらちょっとワーニング変わった気がします。たぶん

でどうやって確認するかですが、M-x list-load-path-shadowsで確認できました。
(僕がみつけたのは、なんかwarningにそれっぽいのがでてたからですが)

こんなかんじの出力でした。



/home/yuta/local/vcs/github.com/yuutayamada/emacs.d/elisp/el-get/cl-lib/cl-lib hides /home/yuta/local/vcs/git.savannah.gnu.org/emacs/lisp/emacs-lisp/cl-lib

おまけ

pcaseでも以下のようにするとunusedワーニングがでました。



(let ((name "おれだよおれおれ"))
(pcase name
(`"foo" "fooだよ")
(`"bar" "barだよ")
(`"piyo" "piyoだよ")
(name (concat name "だよ"))))

一番下のデフォルトで結果を返すところをtにすれば普通にうごきます。


おわり

というわけで、僕がはまったところのネタがつきました。cl-libではまったとき参考になれば幸いです。


USBからUbuntu14.10minimalをインストールした

わけあってUbuntu12.04 LTSからUbuntu14.10(utopic)にした。
環境構築のメモなどを(自分ように)書いておく。



§yuta@Penguin§Git:☁:master§2014/12/18 18:01§~§
λ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.10
Release: 14.10
Codename: utopic

先に結論を書くとあまりおすすめできない。たぶんなんらかのトラブルが起こるかもしれないし、rescueモードで入り直すたびにいくつかのインストール処理をやり直すことになりなかなかストレスフルな感じだった。(僕の場合インストール用のUSBがちょうど120MBくらいのしか手元になくしょうがなくやってみた。)

まぁよかったなぁと思ったのは、自分が要らないと思った設定などが入ってないことか。普通のUbuntuだとcomplzだかなんだか色々はいるけど、すがすがしいくらいなんにもないとこから始まる。僕の場合、LXDEを入れたあとawesomeを使うようにしたら、トータルで12GBくらいしかつかってなかった。(他にEmacs,vimとかもいれた。)


Ubuntuのイメージの入手

Ubuntu lxde minimal とかで検索して、適当にisoイメージを入手した。(リンク貼ろうと思ったけどたぶん時期によってリンクかわりそうだし、今さがしたらみつからなかった。)

ネットワークインストール版でだいたい30〜40MBでくらいだった。


unetbootin

iso imageをUSBにうつす



sudo apt-get install unetbootin
unetbootin

画面下部のUSBの項で適当にiso imageをインストールする


バックアップを取る

パスワードとか、いろいろ
僕は辞書とかPDFの本とかをDropboxやGoogleDriveに写した。


OS入れ替え

unetbootinでos iamgeを入れたUSBをパソコンにさし、再起動、起動中ESCとかF2とかおしてBIOSモードに入る。入ったら、起動するディスクにそのUSBを指定する。BIOSの状態を保存してBIOSの設定画面からでる。そしたら、install用の画面になるはず。


USBからUbuntuのインストール

指示に従ってなんか情報をいれてく、たぶんそんなに詰まる人はいないと思う。(インストールに失敗しなければ。。。)

ただ、自分の場合はgrubのインストールができなかったのでいろいろ、トラブってしまった。最終的にはrescueモードで入りなおしてごちゃごちゃやった。

その時にやったのは、マニュアルインストールにしてLXDEとawesomeを入れた。
他にも入れたけど関係あるか謎。。。

あとは、インストール後に何故か、userが存在しない状態でloginできなかったので、
rescueモードで入り直し、ユーザーと権限の追加を行った。



adduser username
visudo
# rootと同じ感じに設定する
# username ALL(....)

これrescueモードで他の人のPCに入れるんだろうか??謎。。

このあと再起動して、ログインパスワードを入れるところでウィンドウマネージャをawesomeに変えてログインした。prefixキーとリターンでターミナルを起動できる。

ここまでくれば、自分はホームディレクトリをgit管理してるのであとは余裕。
微妙にコマンドが違うかもしれないけど、だいたいこんな感じだった:



apt-get install -y git-core autoconf libtool make paco aptitude tmux zsh vim
git init
git commit --allow-empty -m "init"
git remote add origin https://hoge@bitbucket.org/hoge/home.git
# もしかしたらstash必要かも
# git stash
git pull rebase origin

あと最近はaptの高速版(ダウンロードを並列化してる?)があるらしいので、
先にダウンロードしたほうがいいと思う。



sudo apt-get install python-software-properties software-properties-common && \
sudo add-apt-repository ppa:saiarcot895/myppa && \
sudo apt-get update && sudo apt-get install apt-fast

git管理のリポジトリとか

ghqというgolang製のツールが気に入っていてこの機会に、ghqでほぼ統一してしまおうと思い設定を変えた。

/HOME/local/vcs以下にインストールするのに.gitconfigの設定を変えた。一番上の設定がghqで保存される場所になるらしい。



[ghq]
root = ~/local/vcs
....

XDG_CONFIG_HOME

XDG_CONFIG_HOMEって前々から見かけてたけど、めんどくさくて全然設定してなかった。

http://mobile.btclush.com/m/linux/comments/2k3nnn/using_gnu_stow_to_manage_your_dotfiles/
http://d.hatena.ne.jp/kakurasan/20120803/p1
http://lxl.io/xdg-config-home
http://emacs.1067599.n5.nabble.com/bug-583-Use-XDG-basedir-spec-for-configuration-files-td16662.html

リンクの情報を参考に、いくつかのdotファイルをXDG_CONFIG_HOME送りにできたけど、.sshはだめだったり、fehってawesome用の背景管理ソフトがmanだとXDG_CONFIG_HOMEにあれば読みに行くって書いてあるけど読んでくれなかったりしてまだドットファイルを駆逐できてない状態。そのうちEmacsのXDG_CONFIG_HOME化とかまとめてブログに書きたい。


ファイルマネージャ

いつも忘れて名前が出てこないから書いておく。nautilus



apt-get install nautilus

コマンドラインからだとかんな感じで呼び出せる



nautilus --no-desktop --browser

awesomeを使ってるとUSBマウント勝手にしてくれないときあって、いつもnautilus起動してアクセスしてた。


キーバインド

Capslockに耐えられないので



sudo apt-get install -y setxkbmap numlockx
setxkbmap -option ctrl:nocaps

でCapslocさんには死んでもらった。

あとはいつも入れてる窓使いの憂鬱のLinux版のmayuをインストールした。
http://symfoware.blog68.fc2.com/blog-entry-1397.html
このあたりを参考にした。


例のごとく音がでなくて困った。
色々やったが、最後はpavucontrolで確認したら出力がミュートになってただけだった。

他にも、alsa,pulseaudio関係をre-installしたりしたが関係あったのか…


terminal

デフォルトのターミナルでもよかったが、lilytermにしてみた。XDG_CONFIG_HOMEに勝手に設定保存してくれるので移行するのであればおすすめ。


awesomeの設定とか

xcompmgrで透過設定が有効化された。
この方の設定をほぼパクって使っている。
http://tony.github.io/awesome-config/

変更したら設定の確認。やらなくて死んだことがある。



awesome -k

conky

conkyも初めて入れてみた。
このテーマにした: http://harshit1990.deviantart.com/art/Infinity-306921086

なかなかかっこいい。

ぐぐったら、redditにも板が http://www.reddit.com/r/Conkyporn/
でもスレッド名が、、、ポーンて

Awesome WMで背景透過(70%くらい)するといい感じになった。


日本語入力

EmacsのSKKで頑張ろうかなって思ったけどやっぱだめだった。IMEはMozcを使うようにした。キーマップテーブルと、ひらがなとかのテーブルをインポートした。

メモ: 自分のコマンド履歴を見る以下を実行していたけど、順番が定かでない。。。



ibus-daemon -d -x &
ibus-setup
/usr/lib/mozc/mozc_tool --mode=config_dialog

ibusで設定すると英語圏用の入力メソッドと日本語用の入力メソッドの切り替えができた。だけど、Mozcのなかでもダイレクトインプットがあって結構混乱した。

さらに、ひらがなモードの時に、アルファベット入力モードへのトグル切り替えがあったり、普通の人はどうしていんだろ。。。わからん。

とりあえずM-oで英語圏用の入力メソッドと日本語用の入力メソッドの切り替えをするようにした。他はあとで設定する。


locale

このブログをEmacsで書いてorgモードでエキスポートしているのだが、文字化けでうまく送れなかった。どうやら日本語のlocaleが入っていないらしく(まぁもろにen_USってえらんだからなぁ)以下のサイトを見て入れなおした。
https://www.compnet.jp/archives/2571



sudo locale-gen ja_JP.UTF-8
locale -a # 確認

余談だがgoogleclの設定もちょっと追加した。(自分用)
~/.config/googlecl/configの中



[GENERAL]
...
default_encoding = utf-8
...

感想

rescueモードでトラブってるときが一番焦ったけど、awesomeさえ起動してしまえば、自分でもなんとかなった。でも次回は普通にLXDEのそれなりに入ってるやつ入れたい。。。


2014年11月29日土曜日

Emacs24.4をインストールした

Emacs24.4をインストール(ソースからビルド)した。理由は24.4からサポートされるeww.elを試すためでした。(ewwはEmacsから使えるテキストブラウザーです)ubuntu12.04でインストールして特に問題はなかったが、configureオプションを自分が忘れそうなので、自分用のメモも兼ねて記事にしておく。

参考にしたページ

上のページ通りにやってだいたい行けたが、2つ問題がありひとつは、

./configureする時、以下のパッケージが足りなかったのでaptでインストールした。

sudo apt-get install libxaw7-dev libgif-dev libxpm-dev

もう一つの問題は、というか当たり前ことかもしれないけど、git checkoutでbranchを移動しないと、最新のEmacsになってしまうことだった。(最初気づかなくて、emacs-versionをみたら25.xx.xとなっていてありのまま起こったことを話すポルナレフ状態だった。)

あと、これが未来の自分へ伝えたいことだが、./configureする時オプションで"–with-x-toolkit=lucid"を指定してEmacs起動時のうざいメッセージを消すことができた。(メッセージみればやることはわかるけど、インストールしなおすのがめんどくていつもそのままだった)

./configure --with-x-toolkit=lucid

あっ、あとこれはまぁemacsclientを使わない人には関係ないことだけど、参考ページのやり方でやった場合emacsclientはemacsのクローンしたリポジトリのlib-src以下に入っているのでそちらにもパスを通したほうがいいと思います。(24.3の時のemacsclientでも動きましたが)


ewwの設定とか

半年前くらいに開発版を試したときは、googleの検索結果画面が背景がgrayで自分のフォント色とあわず、また、背景の変更方法もよくわからず投げ出してしまいました。今回標準で使えるということで、eww関係の変数をざらっとみてみましたが残念ながら変更方法がわかりませんでした。
ただ、強制的に変える方法はわかったので一応紹介します。(いい方法ご存知のかたいたら教えてください…)
以下のアドバイス関数を定義すれば、背景を固定できました。
(blackとなっている部分を好きな色に変えてください)

※2014/11/29更新

shr-colorパッケージで元の背景から少し明るくなるように設定されていました。
(僕の場合は背景黒だったので、明るくなってgrayに見えた?)
僕は黒背景が使いたかったので以下の設定で元の背景色に戻しました。

(setq shr-color-visible-luminance-min 100)

ewwの検索エンジンについて

デフォルトだとduckduckgoですが、googleに変更しました。
それと、httpsだとテキストブラウザーなのに結構遅くて(自分の中で)使用にたえない感じだったので、httpに設定しました。(どうせ大したもの検索しないし、ewwでwebサービスにログインしないし)
-> 僕がコンパイルするときにlibgnutlsをインストールしてなかったからっぽいです。インストール後、再度コンパイルしたら早くなりました。

(setq eww-search-prefix "https://www.google.com/search?q=")

ewwのコマンド

リンクの移動関数がよくわからなかったが、shrの関数で移動できた。

ewweww起動 or ewwで検索
eww-next-url次ページに移動
eww-back-url前ページに移動
shr-next-link次リンクに移動
shr-previous-link前リンクに移動

2014年11月6日木曜日

Emacs Mew.elでメールを日本語で検索する

Emacs Mew.elでメールを日本語でも検索できるようにした。公式だとmgというもの利用するように書いてあったが探せなかったので、他の外部プログラム(jvgrep)を利用するようにした。

ネット上で探しても、(自分は)mgの昔の記事ばかりだったので一応記事にしておく。


jvgrepのインストール

Golang製のソフトウェアなので、golangが使える必要があります。
もしもう既に使えるようなら、

go get github.com/mattn/jvgrep

でインストールできると思います。


Emacsの設定

既にmewが使えているのであれば、下の設定を追加すればjvgrepで検索できると思います。一応ハマったところを書いておくと、-rオプションを指定しないとmew側でなんにも検知してくれないところですね。。。
あっ、あと最後の-Gオプションは正規表現のオプションなのでjvgrepのhelpをみて適当に変えてください。

(setq mew-prog-grep "jvgrep"
mew-prog-grep-opts
'("-l" "-r" "--enc" "\"iso-2022-jp,utf-8,ascii,euc-jp,sjis\"" "-G"))

人によっては必要ないかもしれませんが、僕の場合はmew-cs-encode-argに日本語を渡すところで文字化けするするようになりjvgrepへ日本語を渡せませんでした。それと下の設定は24.4から使えるようになったアドバイス関数を利用しているので、それ以下のバージョンだと旧アドバイスを使う必要があります。(mew-summary-selection-by-pick-with-grep1関数をみてください)

;; mew-cs-encode-arg関数を上書き
(advice-add 'mew-cs-encode-arg :override (lambda (arg) arg))

mewでsummary-modeで検索するには"/"キーです。カラのままエンターを押すと直接コマンドをいじれます。


2014年9月2日火曜日

RustのインストールとEmacs用の設定

Rust に興味があって、インストールした。この記事はそのときにした設定とか迷ったところのメモ

普通に試すだけなら、tar形式でダウンロードするか、rustbyexample ってサイト(tour of Go風)で試すのが一番お手軽っぽい。。。


Rustのインストール

自分は最初はtar形式で試したあとコード補完とかしたいかったのでgit cloneした(自分はghqを使っているのでghq getした)

git clone https://github.com/rust-lang/rust.git

Ubuntu12.04を利用しているので、ビルドするのにgccのバージョンが違かったのでppaからgcc/g++の4.7をインストールした(必要なバージョンは変わるので随時rustのページを確認したほうがいい)
参考: http://mortenvp.com/installing-a-newer-gccg-on-ubuntu-12-04-lts/

コンパイラがupdate alternativesでうまくかえれなかったのでCC, CXXでコンパイラを指定した。あと、clangのオプションをgcc/g++がうまくうけとってくれなかったので、COVERED_SWITCH_DEFAULT変数を書きかえた。

COVERED_SWITCH_DEFAULT=`$CXX -Werror -fsyntax-only -xc /dev/null 2>/dev/null`; CC=gcc-4.7; CXX=g++-4.7; ./configure
make && make install

これでrustcとrustdocコマンドが使えるようになる(はず)。


Emacsの設定

エラーチェックにとくに設定なしでflycheckがつかえた。
Rust用のauto-completeに racer というパッケージがあったので利用した。(この記事を書いていて力つきたのでインストールはリンク先をみてください)
ソースコードのタグジャンプにGNU globalを利用した。


GNU globalの設定

Rust用の設定をするのが結構手間だったので、項をわける。
GNU globalはデフォルトでは、Rustに対応してないのでexuberant-ctagsをパーサーにしてctagsにRust用の設定を追加する方法を利用した。

なので最初にexuberant-ctagsをインストールする
注意点として、自分はctags, etagsをコマンドが存在しているときは、exuberant-ctagsコマンドがうまくインストールされていないようだったのでsudo rm /usr/bin/etags sudo rm /usr/bin/ctagsをしたあとにexuberant-ctagsをインストールした。

# インストールするときはexuberant-ctags、コマンドはctags-exuberant
sudo apt-get install exuberant-ctags

Rust用の設定を ~/.ctags に貼りつける(rustのsrc/etc/にctags.rustという名前で入っている)

--langdef=Rust
--langmap=Rust:.rs
--regex-Rust=/^[ \t]*(#\[[^\]]\][ \t]*)*(pub[ \t]+)?(extern[ \t]+)?("[^"]+"[ \t]+)?(unsafe[ \t]+)?fn[ \t]+([a-zA-Z0-9_]+)/\6/f,functions,function definitions/
--regex-Rust=/^[ \t]*(pub[ \t]+)?type[ \t]+([a-zA-Z0-9_]+)/\2/T,types,type definitions/
--regex-Rust=/^[ \t]*(pub[ \t]+)?enum[ \t]+([a-zA-Z0-9_]+)/\2/g,enum,enumeration names/
--regex-Rust=/^[ \t]*(pub[ \t]+)?struct[ \t]+([a-zA-Z0-9_]+)/\2/s,structure names/
--regex-Rust=/^[ \t]*(pub[ \t]+)?mod[ \t]+([a-zA-Z0-9_]+)/\2/m,modules,module names/
--regex-Rust=/^[ \t]*(pub[ \t]+)?static[ \t]+([a-zA-Z0-9_]+)/\2/c,consts,static constants/
--regex-Rust=/^[ \t]*(pub[ \t]+)?trait[ \t]+([a-zA-Z0-9_]+)/\2/t,traits,traits/
--regex-Rust=/^[ \t]*(pub[ \t]+)?impl([ \t\n]*<[^>]*>)?[ \t]+(([a-zA-Z0-9_:]+)[ \t]*(<[^>]*>)?[ \t]+(for)[ \t]+)?([a-zA-Z0-9_]+)/\4 \6 \7/i,impls,trait implementations/
--regex-Rust=/^[ \t]*macro_rules![ \t]+([a-zA-Z0-9_]+)/\1/d,macros,macro definitions/

この時点でctags-exuberantを試すにはrustのsrcディレクトリ以下で以下のようにする。(あとから思いだしながらかいてるので、あってないかも。。。)

# cd path/to/rust-lang/src/
ctags-exuberant -e -f TAGS.emacs --language-force=Rust -R ./

たぶん、TAGS.emacsというのができてるのでなかをみればrustの関数の情報が入っていれば成功

GNU global はapt-getではなくリンク先のdownloadからtarを解凍したものを利用した。
GNU globalのplugin-factory/PLUGIN_HOWTOに書いてあるが、configureオプションにちょっと追加した。ctagsにはemacsのものもあるけど–with-exuberant-ctagsにはctags-exuberantを指定した。

./configure --with-exuberant-ctags=/usr/bin/ctags-exuberant
make
sudo make install

GNU globalのルートディレクトリにgtags.confがあるのでこれをコピペして.globalrcとして$HOMEにはりつけた。
その貼りつけた.globalrcのexuberant-ctagsの設定の中にRust用のlangmap, gtags_parserを追加した。(下のRustに関係ある行だけ追加した)

exuberant-ctags|plugin-example|setting to use Exuberant Ctags plug-in parser:\
...
:langmap=Ruby\:.rb.ruby:\
:langmap=Rust\:.rs:\
:langmap=Scheme\:.SCM.SM.sch.scheme.scm.sm:\
...
:gtags_parser=Ruby\:/usr/local/lib/gtags/exuberant-ctags.la:\
:gtags_parser=Rust\:/usr/local/lib/gtags/exuberant-ctags.la:\
:gtags_parser=Scheme\:/usr/local/lib/gtags/exuberant-ctags.la:\
...

Rustのソースコードがcppとrust自体のコードが混在していて、gtagsコマンドを実行した場合、混ざったものがでてきてしまったので.globalrcにRust用のラベルを作った。ほかにいい方法があればおしえてください。。。

default:\
:tc=native:
native:\
:tc=gtags:tc=htags:
user:\
:tc=user-custom:tc=htags:
ctags:\
:tc=exuberant-ctags:tc=htags:
rust:\
:tc=common:\
:langmap=Rust\:.rs:\
:gtags_parser=Rust\:/usr/local/lib/gtags/exuberant-ctags.la:

bashrcとかzshrcに以下を貼りつける。GTAGSCONFは設定ファイルの場所、GTAGSLABELはデフォルトのパーサーの設定なのでGNU globalのgtags.confを貼り付けていればctagsを設定しておけばctags-exuberantに対応する言語にも対応できるようになる。
GTAGSLIBPATHは:区切りでディレクトリを指定でき、globalで検索するソースを追加できる。Rustにしかglobalを使わないのであればしたの設定でいいかもしれないけど、Emacsからmajor-modeごとに変更したほうがよさそう。環境変数の説明のため(自分のメモとしても)に書いたので、これは別に設定しなくても大丈夫です。

export GTAGSCONF=$HOME/.globalrc
export GTAGSLABEL=ctags
export GTAGSLIBPATH="$HOME/.ghq/github.com/rust-lang/rust/src"

これで通常のRustのソースコードはそのソースのルートディレクトリで

gtags

でそのままタグファイルがつくれるはず。。ただ上でちょこっと書いたとおりRustのソースはcppとrustのコードが混ざってるので、rust用のラベルを指定してタグを作った

cd path/to/rust/src/
gtags --gtagslabel rust

EmacsからGNU globalを使う

自分が調べた感じだと、Emacsでglobalを使うなら以下のがよさげだった。

ggtags.el
helm-gtags.el

Githubのページの機能をみるとggtags.elはglobalで作ったタグから、eldocに表示できる機能があるらしい。試してみたがRustは表示できなかった。(他の言語は試してない)時間がたったら違う言語でまた試してみたい。

helm-gtags.elはglobalの結果をhelmでいい感じに表示してくれる。

まだあんまり試してないけど、下のようにしたらrust-modeの時helm-gtags-dwimで
Rustのソースコードも見れるようなった。

(require 'cl-lib)
(defadvice helm-gtags-dwim
(around update-libpath activate)
(setenv "GTAGSLIBPATH"
(cl-case major-mode
(rust-mode (file-truename
;; rustのソースコードへのパスを指定する
"~/.ghq/github.com/rust-lang/rust/src"))
(t nil)))
ad-do-it)

Rustを試してみた

普通にquickrunで実行できた。(quickrunすごい!)

type Rune = u8;
fn main () {
for c in range('a' as Rune, 'z' as Rune + 1) {
print!("{}", c as char);
}
}
// => abcdefghijklmnopqrstuvwxyz

まだRustそんな理解してないけど、基本的なところは書きやすそう。


おわり

なんか読みかえすと、GNU globalの導入記事っぽくなってる。。。


2014年8月21日木曜日

helm-ghqとhelm-for-filesを組み合わせたらすごい便利になった

もともとhelm-ghqでも便利なんだけど、helm-ghqとhelm-for-filesを組み合わせたらすごい便利になった。以下はその設定とか


その前にhelm-for-filesとは

helm用のファイルを探すのに特化したhelmの関数で、デフォルトで表示されるhelm-for-filesでの候補はbufferのリストとrecentf、file-cache、現在のディレクトリのbufferのリストとhelm-source-bookmarksとhelm-source-locateというもの(最後の2つはよくわからないし、重複しそうなので自分は使っていない)
まぁhelm-miniの重いバージョンみたいな認識


helm-ghqとは

簡単にいうとghqのリストをhelmで開く拡張。ディレクトリを開いたあとさらにそのディレクトリのなかを探してくれる。

作者さんのブログ http://masutaka.net/chalow/2014-06-22-1.html
GitHub : https://github.com/masutaka/emacs-helm-ghq


注意

もしかしたらhelm-for-files用のソース変数を追加するpull requestを送ったので今回紹介する設定をする前にhelm-ghqをアップデートしたほうがいいかもしれない。


設定

みてて思ったがブログに書くほどのことでもないかもしれない。。。(まぁいいか)

下のハイライトの無効化はお好みで。たぶん候補がめちゃめちゃ多いなら無効化しとくのが無難。

(require 'helm-files)

;; 重くなるのでhelm-for-filesだけハイライトを無効化する
(defadvice helm-for-files
(around helm-for-files-no-highlight activate)
"No highlight when using helm-for-files."
(let ((helm-mp-highlight-delay nil))
ad-do-it))

(require 'helm-ghq)
;; helm-for-filesのソースにhelm-ghqのソースを追加
(add-to-list 'helm-for-files-preferred-list 'helm-source-ghq)

上のadd-to-listの行は下のようにも設定できる(というか自分の設定)

(defconst helm-for-files-preferred-list
'(helm-source-buffers-list
helm-source-recentf
helm-source-file-cache
helm-source-ghq
helm-source-files-in-current-dir
;; comment out this is too heavy for me.
;; helm-source-bookmarks
;; helm-source-locate
))

これもお好み設定だけど、file-cache-add-directory-listの引数にディレクトリのリストを渡すとそのディレクトリのファイルがhelm-for-filesの候補に追加される。
じつをいうとこれがhelm-for-filesの候補で一番気に入っている。
ghqはバージョン管理しているディレクトリ単位だけど、こっちは関係ない。
自分のようにホームディレクトリをバージョン管理していて特定のディレクトリのファイルだけ候補にいれたい場合便利かもしれない。

(require 'filecache)
(file-cache-add-directory-list '("~/" "~/.emacs.d/"))
(setq file-cache-filter-regexps
(append file-cache-filter-regexps
;; 無視したいファイルの正規表現を指定もできる
'("\\.cache$")))

2014年8月9日土曜日

AndroidのAVDの高速化を試してみた

昔AndroidのAVDを試してけどめちゃくちゃ遅くて使う気がしなかったけど、高速化する方法があるらしいので、なんとなくやってみた。途中で(自分のなかで)はまりポイントがあったので、記事として書いておく。

自分の環境:

ubuntu12.04LTS
64bit環境
SSD

(関係ないけどawesome window managerも使ってる)

参考サイト:
http://my-clip-devdiary.blogspot.com/2013/01/android64bit-ubuntu-12041lts.html
http://saku-java.be-ourselves.jp/2014/05/18/intel-x86-android-emulator-setting/

どうやら、intel x86設定にするのとSnapshotを使うといいらしい。

昔設定したので、SDKやandroidコマンドは普通に使えた。

以下のコマンドでSDKはアップデートできた。-uをつけるとno-uiになるらしい。
(sdkだけ)

android update adb
android update sdk

適当にavdを作る

android avd

上のコマンドでavdマネージャを開いたあとCreateボタン、そのあとCPU/ABI設定でintel x86を選択し。(そのまえにandroid update sdkで対象のintel x86をインストールする)必要なavdを作る。

avdのイメージができたので起動してみた。

-[10598]% emulator-x86 -avd nexus4intel
emulator: ERROR: Could not load OpenGLES emulation library: libOpenglRender.so: cannot open shared object file: No such file or directory
emulator: WARNING: Could not initialize OpenglES emulation, using software renderer.
emulator: emulator window was out of view and was recentered

http://qt-project.org/forums/viewthread/29747

libOpenglRender.soが読めないらしいので、ググったところLD_LIBRARY_PATHにパスを追加するほうがいいということで、

locate libOpenglRender.so

で調べたら、sdk/tools/libディレクトリに入っていた。

とりあえず、パスを通してもういっかい挑戦してみたら、

-[10602]% emulator-x86 -avd nexus4intel -port 5554
Failed to load libGL.so
error libGL.so: cannot open shared object file: No such file or directory
Failed to load libGL.so
error libGL.so: cannot open shared object file: No such file or directory
emulator: emulator window was out of view and was recentered

のようなエラーがでた。

libGL.soがどうせ足りないんだろって思って調べた
(もしかしたら、apt-get install ia32-libsが必要かも?)

-[10659](1)% locate libGL.so
/usr/lib/i386-linux-gnu/mesa/libGL.so.1
/usr/lib/i386-linux-gnu/mesa/libGL.so.1.2.0
/usr/lib/x86_64-linux-gnu/libGL.so
/usr/lib/x86_64-linux-gnu/mesa/libGL.so
/usr/lib/x86_64-linux-gnu/mesa/libGL.so.1
/usr/lib/x86_64-linux-gnu/mesa/libGL.so.1.2.0

x86_64版のlibGL.soのほうでパスを通しても、

Failed to load libGL.so
error libGL.so: wrong ELF class: ELFCLASS64
Failed to load libGL.so
error libGL.so: wrong ELF class: ELFCLASS64

というエラーがでるので、/usr/lib/i386-linux-gnu/mesa/libGL.so.1.2.0の
symbolic link libGL.soをつくってパスを通すようにしたら
エラーはでなくなった。

最終的にはemulatorの起動は下のようなshell scriptにした

#!/bin/sh
SNAPSHOTNAME="default"
PORT=5554
LIBGL="/usr/lib/i386-linux-gnu/mesa/"
export LD_LIBRARY_PATH=$ANDROID_SDK_HOME/tools/lib/:$LIBGL:$LD_LIBRARY_PATH
echo "accessing the avd: telnet localhost ${PORT}"
# I couldn't save snapshot if I use just "emulator"(I chose intel86)
emulator-x86 -avd nexus4 -port $PORT -snapshot $SNAPSHOTNAME &
# or without snapshot
# emulator-x86 -avd nexus4 -port $PORT &

環境変数に32bit版のをまぜるのは、よくないのでemulator使うときだけまぜる
ようにした。
-avdの名前やport番号は適当にかえてください。(port番号については
emulator -help-portをいちどみたほうがいいかも)

libGL.soのディレクトリもシンボリックリンクを作ったところへかえてくださ
い。

他にはまったところとして、最初はemulatorの起動コマンドをemulatorにして
いましたが、この場合snapshotがうまく保存されませんでした。
理由はよくわかりませんが、emulator-x86を利用するとtelnetからsnapshotの
保存が可能でした。

telnet localhost port-number
# after connected to android
avd snapshot save snapshot-name

ただsnapshotといっても
saveした画面がでるのが7秒後くらい、操作うけつけるのが1分10秒後くらいで、
ん?って感じ。
試しにsnapshotなしで起動した場合でみたら、26秒くらいで操作できるようになった。

参考サイトの動画みると20秒くらいで操作できるようになってたから、普通に起動する分には成功してるっぽい。ただsnapshotは謎、どなたか見識のあるかたコメントいただければ。。。


2014年6月4日水曜日

Golangの{}ブラケットをEmacs上で非表示にするmasawをリリースしました

Golang結構みためが気にいってて特に不満はなかったんだけど、
ふとGolangの関数とかの{}をEmacsのバッファ上で非表示にしたらどうなるかな?
って思って実装してみた。

下のはスクリーンショット

見た目ちょっとpythonっぽくなる?


インストール

go getコマンドで簡単にインストールできる

go get github.com/yuutayamada/masaw

Emacsの設定、.emacsとかの設定するところに以下のコードを保存する
GOPATHやgofmtやgo-modeとかがないとうごかないとおもう。

(unless (require 'masaw nil t)
(load (concat (getenv "GOPATH")
"/src/github.com/yuutayamada/masaw/misc/emacs/masaw")))
(add-hook 'masaw-after-gofmt-before-save-hook 'masaw)

使い勝手とか感想

まだ作ったばっかで、どうやったら便利かと模索中ですごい便利かっていうと
そうでもない。。。
上の設定ではgofmtがかかったあとに{}を消すようにしている。
たぶんgofmtとセットでうごかす想定しかしてないので、他の方法では
うまくうごかないかもしれない。

だめなところとして、消すのにちょっと時間がかかる
自分の環境で1.5~3.0秒くらい…
(timerで処理を分割すれば解決可能だと思うけど)
あと、まだ閉じ}で一緒に改行を消せてないので少し空間があいてしまう。
ただこれは、あいた方がみやすいとかそうでないとか色々ありそうなので
いまは手をつけない。識者の方の意見募集中です。

今回の機能を実現するのにEmacsでcompose-regionっていう関数を利用した。
リージョンの文字を違う文字にできる。
なんかGolang以外の他の言語でも色々できそうな気がする。。。
(javascriptの{}消したらおもしろそう)

まぁこんなところ、よかったら使ってみてダメなところがあったら
直してpull-request下さい。


名前の由来

隠すにかかわる名前を考えたけど、ネットで探してもほとんど先にとられてた
のであきらめて家にあった人形からとった。アメリカのホピっていう部族が売っ
てる人形から


自分用のメモ

go/astパッケージの以下のBlockStmtっていう構造体がブラケットにかかわる
らしい
あと以下の構造体がBlockStmtへの要素をもっていたので、場合分けなどの
処理が必要な場合は、調べる必要があるかもしれない。

*ast.TypeSwitchStmt, *ast.SwitchStmt, *ast.SelectStmt,
*ast.RangeStmt, *ast.IfStmt, *ast.FuncLit, *ast.FuncDecl,
*ast.ForStmt,
*ast.TypeSwitchStmt, *ast.SwitchStmt, *ast.SelectStmt,
*ast.RangeStmt

参考にしたサイト
http://golang.org/src/pkg/go/ast/ast.go
http://golang.org/src/pkg/go/ast/example_test.go
http://golang.org/pkg/go/ast/


2014年2月22日土曜日

EmacsでJavaの設定

Clojureを勉強しようとおもって、まずはJavaからとおもいEmacsでJavaの設定
をととのえた。でもJavaについてはまだよくわかっていないので変なことをし
ているかもしれない。


できるようになったこと


  • emacs-eclim を利用しauto-completeのコード補完
  • popupでeclimのエラーを表示
  • quickrunでコードの実行

eclim?

説明が前後してしまったけどeclim自体はeclipseをvimから使うプロジェクト
です。これのおかげでeclipse並のコード補完が実現できてるらしい。
(eclipseは10秒くらい起動してすぐ閉じてしまったのでほとんど知らない…)

なぜ僕がemacsから使えるかというと、emacsからもeclim使えるようにする
emacs-eclimという拡張を利用しました。(これより以下のeclimという用語は
emacs-eclimを指しています)
eclipse自体の機能を把握してないのでアレですが、projectの作成やリファク
タリングなどeclimから実行できるようです。


環境構築方法

多分日本語では、あまり情報がなさそうなので自分がやったことなどを書いて
おきます。
英語ですが、このサイト が一番参考になりました。(Installationの項が詳し
く書いてあります)


eclipseのダウンロード

僕はubuntu 12.04を利用していますが、apt-getからのインストールでは
うまくeclimをビルドできなかったので、参考サイトのように
ここの download linkからダウンロードしました。
参考(OSを確認してインストールしてください):

INSTALL_DIR=/opt/local
mkdir -p $INSTALL_DIR
cd $INSTALL_DIR
curl -o eclipse.tar.gz http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/juno/SR1/eclipse-java-juno-SR1-linux-gtk-x86_64.tar.gz
tar xvzf ./eclipse.tar.gz

eclim

続いてeclimのインストール(上の続きから)

git clone git://github.com/ervandew/eclim.git
cd eclim
ant clean deploy -Declipse.home=$INSTALL_DIR/eclipse

これでeclipseのあるディレクトリにeclimdが置かれるようになります。


emacs-eclim

これはEmacsに慣れてる人なら特にインストールの説明は必要ないとおもうの
ですが、、、
M-x list-package で確認したらemacs-eclimとあったので、MELPAから手軽に
インストールできると思います。
僕はel-getからインストールしました。


Emacsの設定

僕はinit_というprefixをつけて設定をわけています。
使えそうなところだけ抜きだす使いかたでもいいと思います。

init_java.el:

(defun my/java-init ()
(cond
((and
(not (string-match "^\\*Org Src .*\\*" (buffer-name)))
(string-match "/src/.*\\.java$" buffer-file-truename)
(my/boot-eclim)
(eclim--project-name))
(eclim-mode)
(ac-emacs-eclim-config))
(t
(require 'init_flymake-java)
(flymake-mode t))))

(add-hook 'java-mode-hook 'my/java-init)

project管理しているディレクトリの場合は、eclimdを起動する設定
そうでなければ、flymakeで利用するだけ
(もっとましなチェック方法がありそう。。。)

init_eclim.el:

(with-no-warnings (require 'eclim))
;; ECLIPSE_HOMEはeclipseのあるディレクトリを設定してください
(setq eclim-eclipse-dirs `(,(getenv "ECLIPSE_HOME"))
eclim-executable (eclim-executable-find))

(defconst eclimd-executable (format "%s/eclimd" (getenv "ECLIPSE_HOME")))
(require 'eclimd)

(defun my/boot-eclim ()
(let* ((boot-p (zerop (shell-command "pgrep eclimd")))
(answer (and (not boot-p) (y-or-n-p "Use eclim? "))))
(when answer
(call-interactively 'start-eclimd))
answer))

;; auto-completeにeclimの補完を表示
(require 'ac-emacs-eclim-source)
;; C-M-iを無効化
(define-key eclim-mode-map (kbd "C-M-i") nil)

(defadvice eclim-problems-highlight
(around avoid-this activate)
(when (eq 'java-mode major-mode)
ad-do-it))

eclim用の設定、eclimを利用するとeclipseの起動の重さがそのまま反映され
るデメリットもあるので起動するか尋ねるようにした。

init_flymake-java.el:

(require 'flymake)

(defun flymake-simple-generic-init (cmd &optional opts)
"Syntax check function for without Makefile.
CMD means command and OPTS means options."
(let* ((create-tempfile
(lambda ()
(let* ((temp-file
(flymake-init-create-temp-buffer-copy
(case major-mode
(java-mode 'flymake-create-temp-with-folder-structure)
(t 'flymake-create-temp-inplace))))
(local-file (file-relative-name
temp-file
(file-name-directory buffer-file-name))))
(if (file-exists-p local-file)
(expand-file-name local-file)))))
(file+opts (push (funcall create-tempfile) opts)))
`(,cmd ,file+opts)))

(defun flymake-simple-make-or-generic-init (command &optional options)
"Do syntax check function.
If makefile is exists, then do `flymake-simple-make-init'.
Otherwise, do `flymake-simple-generic-init' function with COMMAND and OPTIONS."
(if (or (file-exists-p "Makefile") (file-exists-p "makefile"))
(flymake-simple-make-init)
(flymake-simple-generic-init command options)))

(add-hook 'java-mode-hook
(lambda ()
;; TODO: add flymake-simple-ant-java-init?
(defun flymake-simple-make-java-init ()
(flymake-simple-make-or-generic-init "javac" '("-Xlint")))))

eclimを利用しない場合はflymakeでエラーチェックするようにしている。
冗長な書き方をしているのは、c/c++でflymakeを利用する時用。
(今の時代はflycheckがありますが、もったいなくてなんか消せない…)

init_quickrun.el:

(require 'quickrun)
;; override Java
(quickrun-add-command
"java"
'((:compile-only . "javac -source 1.6 -target 1.6 -Werror %o %s")
(:exec . ("javac -source 1.6 -target 1.6 %o %s" "%c %N %a")))
:override t)

設定しなくてもquickrunでJavaのコード実行できる人は必要ない設定です。
javacとjavaのバージョンがちがくて実行ができない場合、上の1.6と書いてあ
る部分を変えて設定してみてください。


eclimのエラーチェックをpopupで

emacs-eclim標準でエラーチェックをやってくれるのですが、
表示方法が別バッファ表示のようなので、僕はあんまりすきな感じでなかったので
flycheck-tip というflycheckのエラーをpopup.elのツールチップで表示する
拡張にねじこみました。
MELPAからインストールできます。

僕は mykie.el というEmacsのキーバインドを登録するのを便利にする拡張を利
用しているので設定はこんな感じになっています(mykie.elのステマ):

(require 'mykie)
(require 'error-tip)

(setq mykie:prefix-arg-conditions
(append mykie:prefix-arg-conditions
'((:C-u&error . (error-tip-error-p)))))

(mykie:set-keys nil
"C-l"
:default (recenter-top-bottom)
:C-u&error (mykie:do-while
"n" (error-tip-cycle-dwim)
"p" (error-tip-cycle-dwim-reverse)))

上のコードの意味は、C-u C-lを押したときにエラーが出ていれば
そのエラーをpopup.elのツールチップで表示します。
他のエラーをみたければ 'n' または 'p' キーを押すことで、
移動後エラーを表示します。それ以外のキーを押すと通常の入力モードに戻り
ます。
エラーが出てなければ、通常どおりrecenter-top-bottomを行います。

ちなみにerror-tip-cycle-dwim関数は、flycheck-modeならflycheck-tip,
eclim-modeならeclim用のエラー表示、flymakeを利用してたらflymakeのエラー
表示をする便利関数です。(いずれもpopupでエラー表示します)


eclimのメリット、デメリット

コード補完とエラーチェックは便利だと思うけど、eclimdを起動するのは
eclipseを起動するのと同じくらい時間がかかるので好みがわかれる気がしま
す。
僕はrevert-bufferをbuffer移動するときに実行していたんですが、
eclimを使うようにするとなんか重くなる感じがするんですよね。。。
git-gutter+の情報の更新のためだったので、git-gutter+-refleshで
なんとかなりましたが、、、
普段revert-bufferを頻繁に利用している人は注意が必要かもしれません。


注意事項


  1. 自分の設定をサルベージして書いたものなので、もしかしたらそのままでは動
    かない可能性もあります。。。
  2. auto-completeは有名なパッケージなので設定は書きませんでした。
  3. flycheck-tip/error-tipはflycheckとeclimの同時起動は想定していません
    のでどちらかはoffにしてください。

その他メモ

今回は入れてないけど、drip, flycheck-java, java-lookup
とかもあるらしい。(flycheck-javaはeclimがあればいらないと思うけど)
そういえば、malabar-modeとかどうなんだろう。。。


おわり

ほかにも便利な設定などあればコメントいただけるとうれしいです:)


2014年2月8日土曜日

mykie.el v0.2.1リリースし(て)ました。

mykie-v0.2.1リリースしました。というかしてましたというか、野放しというか。。。
英語のREADME.mdのほうはなおしてたのですが、日本語の情報はとくになにも
してなかったので紹介記事を書きたいとおもいます。


mykie.elとは

カーソルのポイントやflycheckのエラーの状態などに応じて
呼び出す関数を柔軟に変えることができるEmacs用の拡張です。
またユーザーの独自の条件も簡単に追加できます。


0.1.x系から変わったところ


  • キーを登録するときのクオートがいらなくなりました
  • 括弧つきの記法ができるようになりました
  • :C-u! :fileキーワードがつかえるようになりました
  • lazy order -> fuzzy orderになまえがかわりました
  • デフォルトでfuzzy orderを利用するようになりました
  • デフォルトキーワードとして"t"を利用できるようになりました。
  • multiple-cursors.elからmykieを利用できない問題があったのですが、
    mykie.elをロード前のキーバインドを利用するようにしました
  • helm-show-mykie-keywordsでmykieで利用できるキーワードがみれるように
    なりました
  • キーワードを追加するときの方法がかわりました

キーを登録するときのクオートがいらなくなりました。

以下は例ですが、mykie:set-keysでwith-self-keyを利用する場合も
クオートがいらなくなっているので注意してください。

;; 旧バージョン
(mykie:global-set-key "C-j" :default '(message "クオート書いちゃダメ絶対"))
;; 新バージョン
(mykie:global-set-key "C-j" :default (message "hello"))
(mykie:set-keys with-self-key ; <- これもクオートいらなくなりました
"a" :C-u (message "pushed a after pushed C-u"))

括弧つきの記法ができるようになりました。

prognを指定したくないときに便利かもしれません。

(mykie:global-set-key "C-j"
(:default (message "default")
(message "default2行目"))
(:C-u (message "default")))

追加されたキーワード:C-u! And :file


  • :C-u!は:C-uとおなじですが、関数を呼び出す前にcurrent-prefix-arg変数を
    nilに設定します。移動系関数でcurrent-prefix-argの数値によって挙動を変える
    関数の場合設定すると便利かもしれません。
  • :fileは`ffap-file-at-point'関数を呼び出します。
    結果はmykie:current-file変数に保存されます。

lazy orderからfuzzy orderに名前がかわりました

適当に名前考えてあとからちょっと違うなと思って変えました。
どういう機能かというと、以下のような設定で

(mykie:global-set-key "C-j"
:default (message "default")
:C-u&url (message "ポイントがURLだったらよばれる")
:C-u&eolp (message "ポイントがend of lineだったらよばれる")
:C-u (message "default"))

:C-u&urlと:C-u&eolpが同時に条件をみたしていた場合、上にあるキーワードを
優先して実行する機能です。(ユーザーが設定するまでどちらを優先するかわ
からないのでfuzzyとしました)
旧バージョンでは、C-u*2がしたの方に設定されていると呼ばれないなどのめ
んどくさい仕様だったのですが、現在は:C-u&somethingより:C-u*2や:M-3など
のcurrent-prefix-argの数字を意図的に変えたものを優先するようにしている
のでとくに意識しなくても意図したものがよばれないなどの不具合は出ないの
ではと思います。


デフォルトでfuzzy orderを利用するようになりました

上記のとおりそこそこ便利に設定できる機能だと思うので、デフォルトでこの
機能がオンとなるようにしました。
もし無効化したい場合はmykie:use-fuzzy-order変数にnilを設定してください。


:defaultキーワードとして"t"を利用できるようになりました。

case or cond文のようにすべての条件にマッチしなかった場合は、
:defaultのかわりにtを設定できるようにしました。

(mykie:global-set-key "C-j"
t (message "default"))

multiple-cursors.elからmykieを利用できない問題について

これは解決したわけではないのですが、mykieをロードする前のキーバインド
を利用するようにしました。(pull-requestはウェルカムです)


helm-show-mykie-keywordsでmykieで利用できるキーワードがみれるようになりました

helmがロードできる状態であれば利用できます。


キーワードを追加するときの方法がかわりました。

もしmykieの過去のバージョンを使っている場合は、そのままでは利用できません。
すいません。ただ新しい設定方法のほうがEmacsっぽいので気に入っていただ
けるのではと思います。。。
以下はいくつかの条件(キーワード)を追加する例ですが追加するのがひとつの
場合はpush関数を利用してもいいと思います。

(setq mykie:normal-conditions
(append mykie:normal-conditions
'((:org-src . (or (org-in-src-block-p)
(org-src-edit-buffer-p)
(string-match "^\\*Org Src .*\\*" (buffer-name))))
(:org-mobile . (org-mobile-dir-p))
(:org-header . (and (eq 'org-mode major-mode)
(org-on-heading-p)))
("^:skk-\\(on\\|active\\)$" . (mykie:get-skk-state)))))

例の一番下の:skk…の部分だけ異質ですが、このmykie:get-skk-stateという
関数は条件をみたしていた場合、:skk-onか:skk-activeというキーワードをか
えします。
条件をチェックして複数のキーワードを返す可能性がある場合に利用してください。
(mykie.elの中ではmajor-mode変数にあわせてキーワードを作ったりしています)

追加できる条件変数には

  • mykie:region-conditions
  • mykie:prefix-arg-conditions*
  • mykie:prefix-arg-conditions
  • mykie:normal-conditions

があります。region-conditionsに新たに追加する場合は、use-region-pなど
のリージョンがアクティブかどうかを確認する条件を含める必要はありません。
同様にprefix-arg-conditionsの方もcurrent-prefix-argがnilでないことを確
認する条件を追加する必要はありません。
(上の変数に応じてチェックする条件が決まっています)

余談ですが、上記の変数のリストを含むmykie:group-conidtions変数が新たに
追加されたのですが、このなかの変数の順番で条件を評価します。
なのでこの変数のなかの順番を変更することでC-u*2などの優先度を変更できます。


インストール、その他の機能(過去記事のほぼコピー)


インストール

MELPA に登録したのでM-x package-install RET mykieでインストールできる
と思います。もし MELPA をpackage-archivesに登録してなければ以下を
スクラッチバッファなどで評価してから試してください。

(add-to-list 'package-archives
'("melpa" . "http://melpa.milkbox.net/packages/"))
(package-initialize)

el-getをつかっているなら以下のコードを評価して、M-x el-get-install RET
mykie でインストールできると思います。

(push '(:name mykie-el
:type git
:url "https://github.com/yuutayamada/mykie-el.git"
:load-path ("./lisp"))
el-get-sources)

使い方

インストールができたら、init.el などで設定します。
下は簡単な設定例

(require 'mykie) ; <- これはmykie.elを読み込む必須の設定
;; major-modeのキーをglobal-mapのmykieの同じキーで上書きするかどうか
;; の設定。上書きしますが元のメジャーモードキーは:default用の関数に
;; 登録されるのでそのまま使用できます。
;; defaultではnilとなっています。
(setq mykie:use-major-mode-key-override t)
;; 上のメジャーモードの上書き設定の変更や条件の変更をおこなった場合は
;; ↓これを呼び出してください。
(mykie:initialize)
;; mykie:set-keysの第一引数にnilを指定するとグローバルマップに登録され
;; ます。emacs-lisp-mode-mapと指定して特定のメジャーモードを指定することも
;; できます。
(mykie:set-keys nil
"C-a"
:default (beginning-of-line)
:C-u mark-whole-buffer
"C-e"
:default (end-of-line)
:C-u (message "Hello")
;; ... You can add more keybinds
)

上の例はC-a, C-eキーにC-uを押した時の設定を追加します。

関数の指定方法についてですが、上の例のようにリスト形式で渡す方法のほかに
query-replace-regexpのようにシンボルで渡すこともできます。
この場合そのシンボルがインタラクティブだった場合、call-interactively
関数からそのシンボルを呼び出します。(コマンドとして実行する)


指定できるキーワード引数

以下は現在の指定できるキーワード引数です。
最新の情報は GitHubのmykieのページ に書くつもりなので、そのうち情報が古
くなるかもしれません。
helmが利用できればhelm-show-mykie-keywords関数がつかえるので現在利用で
きるキーワードをみることができます。

KEYWORDDESCRIPTION
:defaultデフォルトで呼ばれる
:C-uC-uをそのキーを押す前に押すと呼ばれる
:C-u!C-uと同じだけど、current-prefix-argをnilにする
:C-u*NC-uをN回押したとき呼ばれる
:M-Nメタ(alt)キー + [0-9] の数字を押した時に呼ばれる
:regionリージョン選択中に呼ばれる
:region&C-u:regionと:C-u条件をみたすとよばれる
:repeat同じコマンドを同じポイントで行うと呼ばれる
:bolpbeginning of line で呼ばれる
:eolpend of line で呼ばれる
:bobpbeginning of buffer でよばれる
:eobpend of buffer で呼ばれる
:C-u&bolp:C-uと:bolpの条件をみたすとよばれる
:C-u&eolp:C-uと:eolpの条件をみたすとよばれる
:C-u&bobp:C-uと:bobpの条件をみたすとよばれる
:C-u&eobp:C-uと:eobpの条件をみたすとよばれる
:email現在のポイントが e-mail だと呼ばれる
:C-u&email:C-uと:emailの条件をみたすとよばれる
:url現在のポイントが URL だと呼ばれる
:C-u&url:C-uと:urlの条件をみたすとよばれる
:MAJOR-MODEemacs-lisp-mode などの 現在の major-modeに マッチ
:C-u&MAJOR-MODE:C-uと:MAJOR-MODEの条件をみたすとよばれる
:region&MAJOR-MODE:regionと:MAJOR-MODEの条件をみたすとよばれる
:progプログラミングモードに関連したバッファだと呼ばれる
:C-u&prog:C-uと:progの条件をみたすとよばれる
:region&prog:regionと:progの条件をみたすとよばれる
:errflymakeかflycheckのエラーがあるときよばれる
:C-u&err:C-uと:errの条件をみたすとよばれる
:region&err:regionと:errの条件をみたすとよばれる
:minibuffミニバッファでよばれる
:readonlyread only だとよばれる
:commentコメントか文字列だとよばれる

以下は関数の指定ではなく、違う効果を持ったキーワード引数

KEYWORDvalueDESCRIPTION
 (example)<30>
:cloneKEY as stringClone mykie's functions to other KEY. this function is convenient if you use Emacs either situation terminal and GUI. Because terminal Emacs can't use partial keybind such as C-;, this keyword can clone same functions to another key without :default function. For example: :clone ";" (<- if you want to clone origin key to ";")
 "a" 
:deactivate-regionsymboldeactivate selecting region after mykie executed command. You can specify this t, 'region, 'region&C-u.
 t 
:region-handle-flagsymbolDo copying or killing before command executing. This function is convenience if you want to use kill-ring's variable. But there is mykie:region-str variable that always store region's strings.
 'copy or 'kill 

:cloneはself-insert-commandに:default以外のコマンドを引き継ぐ設定です。
どういう時に便利かというと、ターミナルではC-;は使えないので";"キーで
リージョンに指定した関数を使いたいというときに便利です。
ユーザー側からすると同じキーバインドが使えてると錯覚できます。
(:defaultの設定は使えないですが)

(mykie:set-keys nil
"C-;"
:default 'newline-and-indent
:region 'comment-dwim
:clone ";")

その他の例

mykie.el のページにキーワードを使った例がありますのでそちらを参考にして
ください


メジャーモードのキーの上書き

最近のmykie.elに実装された機能ですので不具合があるかもしれません。

(setq mykie:use-major-mode-key-override t)
(mykie:initialize)

のようにしないと設定されないので、つかいたくなければ上記の設定をしない
でください。

mykie:use-major-mode-key-overrideには 'both, 'global, 'self or t が設
定できます。'bothはself-insert-commandとglobal-mapのC-jなどのprefix付
きのコマンド両方、'globalは C-j などのprefix付きのglobal-mapのコマンド、
'self と t は self-insert-command(a-z0-9など) を意味します。

目的: major-modeのキーバインドにmykieのglobal-mapのキーを埋め込もうというの
が目的です。

;; You can specify 'both or 'global 'self or t to
;; mykie:use-major-mode-key-override.
;; 'both means use overriding major-mode keys both case.
;; 'global means use overriding major-mode keys by global-map's keys
;; without self-insert-command keys.
;; 'self means use overriding major-mode keys by self-insert-command keys.
;; if you set nil, then don't overriding major-mode key.
;; `mykie:use-major-mode-key-override' is nil by default.
(setq mykie:use-major-mode-key-override 'both)
(mykie:initialize)
(mykie:set-keys nil ; <- nil means registering global-map
"C-w" :default 'tetris :C-u (message "C-u+C-w"))

;; self-insert-commandはこの方法で登録する
(mykie:set-keys with-self-key
"1" :region sort-lines
"2" :region align
"3" :region query-replace
"c" :C-u (message "C-u+c"))

この機能を使うとき、self-insert-commandとそれ以外を意識する必要があります。
a-zや0-9などがself-insert-commandです。
それ以外というのは、global-mapのC-jやC-wなどprefix付きのコマンドです。
上の例はどちらの場合でも上書きする例です。

-Magitなど一部のパッケージでは、自動で上書きしてくれません。
僕のコードがバグってました。最新のmykie.elではmagitでも上書きしてくれ
ます。ごめんなさい

もしそういう場合どうしても上書きしたい場合、以下のようにしてください。
シンボル名でモード名を指定してください。

個別のモードごとに上書きの設定をしたい場合:

;; specify major-mode name as symbol.
(mykie:attach-mykie-func-to 'emacs-lisp-mode)

逆に MagitのようにC-uを押すと動作を変えるので上書きしてほしくない場合
以下のようにできます。

(setq mykie:major-mode-ignore-list '(magit-status-mode))

特定のキーだけに指定したい場合以下の指定方法もあります。

;; You can use below configuration. This way can specify specific keybind
;; only. you enjoy playing tetris.
(mykie:set-keys nil ; <- nil means registering global-map
"C-t"
:default tetris
:C-u (message "C-u+C-t")
:ignore-major-modes (emacs-lisp-mode)
:ignore-major-modes (diff-minor-mode))

おわり

region系の関数を開いてるキーにいれるだけでもまぁまぁ便利なのでよかった
らつかってください。


Popular Posts

Blogger templates

Blogger news