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のそれなりに入ってるやつ入れたい。。。


Popular Posts

Blogger templates

Blogger news