読者です 読者をやめる 読者になる 読者になる

やろーじだい

ブログです

私とEmacs

 

Aizu Advent Carender 2013

 

Aizu Advent Carender 2013

私とEmacs

 

挨拶と注意書き

これは AizuAdventCalendar2013 の16日目の記事です。

皆さんはじめまして、某津大学2年のやほー @yahoo778と言います。 学内の人も含めて殆どの人が誰だお前という感じかと思いますが、以後よろしくお願いします。

どうする?なにする?

今回私はEmacsについて書きます。

Emacsとの馴れ初めは、津大生の殆どの人と同じように、この大学に来てどうぞと渡されたのが出会いでした。

Emacs実践入門

初めはツイッターで教えていただいたこの本で勉強しました。Emacs使い始めたいけれども何をすればいいのって人におすすめです。

記事の内容は、私はこんな使い方をしています、といった感じの月並みな紹介文です。 elispはネットなどから拾ってきたものが殆どです。 画像など使えばよかったのですが文字だけです。分かりづらかったらすいません、質問して下さい。 また、古い情報や誤った情報を書いている可能性があります。間違いがあれば罵声とともに指摘お願いします。

私のメイン環境はMacOSX10.8, GnuEmacs 24.3.1 です。Linuxなどの人も大体同じだと思います。Windowsはわかりません。

張り切って長文になってしまいました。実際にEmacsを動かしならお付き合い下さい。

便利な機能

ここでは特に設定などが不要な、知ればすぐに使える便利っぽいことを紹介します。 ここではEmacs使ったこと無いような人でもわかるようにできるだけ簡単に説明したつもりです。 津で課題の時だけEmacsを利用するという人にも有用なことを紹介したつもりなので、試してみて下さい。

導入

キー入力は、

RET 
SPC

上からリターンキー、スペースキー、

C-x

Controlを押しながらx、

M-x

Meta (津の初期設定ではSPCの左横のはずです。それ以外は普通はalt)を押しながらx, またはESCを押してからx(同時押しでは無いことに注意して下さい)。

M-x hoge [RET]

M-xを押した後すべてのキーから手を離して、hoge と入力しRETを押します。 M-xを入力するとEmacsの下の狭いところ(ミニバッファ)に

M-x

と表示されて、カーソルが勝手に移動すると思います。 そのまま

M-x hoge

と入力しRETとするとその文字列に対応する機能が動作する仕組みです。 (実際にM-x hogeとしても普通はhogeに何も割り振られていないので何もおきません)

またここでは誰にでも直感的に分かる言葉を使うようにしたつもりです(バッファ -> ファイルなど)

チュートリアル [M-x help-with-tutorial]

emacsキーバインドはたくさんあり、大抵の事はホームポジション付近のキー入力でのみできるようになっています。 このチュートリアルではカーソルの移動など基本的な動作を学ぶことができます。 Emacsを使う人は一度は通してやってみましょう。

英語はちょっとという人は

M-x help-with-tutorial-spec-language [RET]

とするとミニバッファに

Language:

と表示されるので

Language: japanese [RET]

と入力すると日本語でもチュートリアルが行えます。 一度にすべて覚えることは不可能だと思うので、度々やってみるとよいかもしれません。

マウスを使わない移動を覚えると、多分幸せになれると思います。 (不幸になる人もいるかもしれません。)

検索 [C-s]

現在のカーソルの位置から下に向かって文字列検索します。上方向は [C-r] です。 検索することはもちろん、カーソルの移動にも使ったりします。

[C-s]と入力すると例によってミニバッファに

I-search: 

と表示されるのでそこに検索したい文字列を入力すると、 ファイル内で見つけた直近のその文字列のところにカーソルが移動します。 [C-s]を入力すると次へ、入力すると次へ…となります。 [C-g]を押すと検索前の位置に戻り、[RET]など押せばその場所にカーソルがとどまります。

置換 [M-%]

最初に指定した単語を、次に指定した単語に置き換えます。 例えば

 1:  #include <iostream>
 2:  using namespace std;
 3:  
 4:  int main()
 5:  {
 6:     int num = 0;
 7:  
 8:     ++num;
 9:     cout << num << endl;
10:  }

というコードの num をすべて number に変えたいという場合、カーソルをint mainの辺りに置いて、

[M-%] と入力すると、

Query replace:

と表示されると思うので、

Query replace: num [RET]
Query replace num with: number [RET]

とすると、numの色が変わり、一番近いnumにカーソルが移動するので、変更するなら[y]、しないなら[n]とすると次々移動していきます。 途中で終了は[C-g]です。

変更したいところにわざわざカーソルを移動する手間も省ける上、変更漏れも防げるので便利です。

コンパイル [M-x compile]

適当なプログラムのファイルを開き(ここでは test.c とします)、これを呼び出すと、

Compile command: make -k 

make -kを削除して(makeがあるならこのまま[RET])

Compile command: gcc test.c; ./a.out [RET]

としてあげると、emacs上のウィンドウが別れて、コンパイルと、その実行結果を表示してくれます。 (もちろんコンパイルと実行を分けておこなってもいいです、上の場合コンパイルでエラーが出るとそこで止まります。)

元の1つの画面に戻すには、一つにしたい画面がアクティブになっている(カーソルが点滅していることを)確認して、 (点滅していなかったらマウスでクリックするなりしてアクティブにしてから)、[C-x 1]とします。 (また[C-x o]でマウスを使わずに画面の移動ができます。覚えると便利です。)

わざわざターミナルに移動して、ファイルのある場所に移動してからコンパイルする必要がないので、慣れると多分便利です。 勘違いして別なファイルをコンパイルしていた、という経験がある人も居るでしょう。それもなくなると思います。

dired [C-x d] または [C-x C-f RET]

標準搭載ファイラーです。 emacs上でファイルの作成、削除、リネームなど出来ます。

これを起動すると、[p] で上、 [n] で下へ移動できるので、開きたいファイルやフォルダで[RET]すると開けます。 [^]で一つ上の階層へ、フォルダの作成は[+]、と様々なことを行えます。 もっと使いこなしたい人は ここ などに詳しく載っています。

キーバインド

私が設定してるキーバインドの話です。 ここからは先は設定ファイルをいじったりしている人向けだと思います。

[C-h], [M-h] を backword-delete-char, backword-kill-charに

[M-h]の範囲選択はたまに便利ですが、kill-charに比べれば必要性は薄いので変えて使ってます。 [C-h] は元々はhelpですが、[F1]にも割り当てられているので、そちらを使いましょう。

これにより、[C-h]で後ろ一文字, [C-d]で前一文字、[M-h]で後ろの単語、[M-d]で前の単語を削除と統一できます。 どのモードでもできるだけこれで統一して使えるようにしてます。 global-set-keyだけでは、他のモード(例えばI-search)でhelpが開いてしまうのでそれも変えます。

(global-set-key (kbd "C-h") 'backward-delete-char)
(global-set-key (kbd "M-h") 'backward-kill-word)
(define-key isearch-mode-map (kbd "C-h") 'isearch-delete-char)

[C-x C-c] に何かよく使うもの

私はcompileを置いてます。初期では終了が割り当てられていますが、頻繁に終了するものでもないので勿体ないと思います。 終了は代わりにsave-buffers-kill-emacsをaliasして使ってます。(後述)

[C-t]でバッファ移動

頻繁に使うため[C-x o]では少し面倒なので。 デフォルトでは前二つの文字の入れ替えが入っていますが変更してます。

(defun other-window-or-split ()
   (interactive)
   (when (one-window-p) (split-window-horizontally))
   (other-window 1))
(global-set-key (kbd "C-t") 'other-window-or-split)

alias

aliasを利用しましょう。 例えば、

(defalias 'exit 'save-buffers-kill-emacs)

という感じで、

(defalias '(実行名) '(関数名))

で定義出来ます。

後は、

M-x (実行名)

で使えます。

Mac向け

 

導入

MacでのEmacsの使い始めに。 まずOSの設定で、初期状態では[C-SPC]にspotlightが入っているので別なところへ。ASCII配置ならcapslockはcontrolにします。 さらに他にも初期設定で沢山のショートカットが設定されていますが、これは使わないだろうというものはすべて切ります。 そしてFunctionキー(F1~F12)を使えるようにしておきます。(systemのキーボード設定で変えれます) またMacOSでは、殆どの場面でcontrolを使ったEmacsキーバインドでカーソルを動かせます。 [C-n,p,f,b]はもちろん、[C-a], [C-e], [C-k], [C-y], [C-h], [C-d], [C-m]あたりはEmacsと同じように使えますヤッタ。

(cond
 (
  (string-match "apple-darwin" system-configuration)
  (load "~/.emacs.d/init/cocoa.el"))
 (
  (string-match "linux" system-configuration)
  (load "~/.emacs.d/init/linux.el"))
 (
  (string-match "freebsd" system-configuration)
  (load "~/.emacs.d/init/freebsd.el"))
)

などとするとOSによって設定ファイルを分けられます。この例だとmacの設定はcocoa.elに記述することで、Macで開いた時のみ読み込まれるようになります。

commandキー

commandキーはMetaにしてます。 私がMacのショートカットキーの中で、commandを用いるよく使うショートカットは、 [command-SPACE](入力変換)と[command-TAB](アプリケーションの切り替え)位です。 したがってemacsでは[M-SPACE],[M-TAB]は使わないようにしてます。 (設定しても基本的にOS側(?)のキーバインドが優先されます。他のショートカットも同様) また、fnキーが付いてるキーボードは、hyperキーなどにすればemacs上でも利用できます。

;; command -> meta
(setq ns-command-modifier 'meta)
;; fn -> hyper
(setq ns-function-modifier 'hyper)

トラックパッド

初期状態ではemacsをトラックパッドで動かそうとすると動きすぎて使いづらいので、 以下の設定をすると良い感じになります。

;; Trackpad
(defun scroll-down-with-lines ()
    "" (interactive) (scroll-down 3))
(defun scroll-up-with-lines ()
        "" (interactive) (scroll-up 3))

(global-set-key [l-up] 'scroll-down-with-lines)
(global-set-key [wheel-down] 'scroll-up-with-lines)
(global-set-key [double-wheel-up] 'scroll-down-with-lines)
(global-set-key [double-wheel-down] 'scroll-up-with-lines)
(global-set-key [triple-wheel-up] 'scroll-down-with-lines)
(global-set-key [triple-wheel-down] 'scroll-up-with-lines)

拡張

大まかな紹介なので 、気になった場合は詳しくはwebで!

org-mode

ブログなどを書く人や、大学の課題で文章を作成するときなどおすすめです。 この記事はこのmodeを利用して書かれています。この為に調べたので、もっと早く使い始めればよかったと思いました。

拡張の欄に入れましたが、一応最初から入ってます(私の環境では最初から7.9.3が入ってました。[M-x org-version]で確認できます。) 今はもっと新しいバージョンが公開されています。 (最新版はこちら) [M-x org-mode]をするか、拡張子orgで自動的にorg-modeになります。

ちょっと古いですが、詳細な機能や使い方はこちらがおすすめです。

auto-complete

使い方とインストールはここ バッファや辞書ファイルから候補を出して補完してくれます。 これがあるだけでかなりタイプ数やタイプミスに差がでると思います。

これ標準でも便利なのですが、拡張が作られています。

  • ac-clang-async

    auto-completeのC/C++向けの拡張です。 文脈を解析して補完を行うオムニ補完をしてくれます。

  • ac-mozc

    関西Emacsで紹介されていたものです。ローマ字から日本語を補完してくれます。 ただMacではmozc.elが使えない(?)ため、私も使いたいけれども使えずにいます。 (もし使う方法があるという人は教えて下さいなんでもしますから!)

yasnippet

最新版のダウンロードと詳しい使い方は こちら

コードを保存し使いまわしたりするための機能を使えます。 前述のauto-completeとの連携で非常に便利です。 特にac-clang-asyncの関数の引数補完といい感じに連携してくれます。 yasnippetが無いとac-clang-asyncの引数補完は邪魔に感じると思いますが、これを入れると引数の説明を見ながら打てるので便利です。

helm-mode

インストールと使い方はこちら

anythingのフォークであり、統合インターフェースです。 本当に多機能で、これを使いはじめてから一気にEmacsが更に便利になりました。 私がよく使っているのは以下の5つです。

  • helm-mini(recentf + show buffer)

    ファイルの履歴とbuffer一覧 初期状態では20程度しか保存しないので、

    (setq recentf-max-saved-items 10000)
    

    として一度開いたファイルはほぼ全部保存するようにしています。

  • helm-etags-select

    etagsで作ったTAGSを用いて関数ジャンプできます。

  • helm-occur

    バッファ内で検索し、マッチした行を出力します。

  • helm-do-grep

    フォルダ内のすべてのファイルから文字列検索します。

  • helm-show-kill-ring

    kill bufferの表示と貼り付けができます。 これも最大数を増やしておきます。

    (setq kill-ring-max 100)  
    

wikiにある機能の他にも様々な拡張が作られています。 私はyasnippetの手助けをしてくれるhelm-c-yasnippet など愛用させて頂いてます。

機能が多いので、一番多用するhelm-mini以外でよく使うものは短めのailasで設定してます。 またhelmのkillringがあれば通常のM-yは必要ないと感じたので、M-yに割り当ててます。

(global-set-key (kbd "C-c h") 'helm-mini)
(global-set-key (kbd "M-y") 'helm-show-kill-ring)

(defalias 'hx 'helm-M-x)             
(defalias 'ho 'helm-occur)            
(defalias 'hg 'helm-do-grep)          
(defalias 'ht 'helm-etags-select)    

init-loader

設定ファイルを分割できます。最新版はこちら

最低でもelispの設定、キーバインドの設定、見た目の設定などに分けておくと、 elispの設定ミスで設定ファイルが読み込まれず、一時的にキーバインドが使えなくなったりなどの苦痛からおさらばできます。 また読み込みに失敗したファイルをログに表示してくれバグを発見しやすくなるので、設定が多くなってきた人にはおすすめです。

 

 

sequential-command

インストールはpackageなどでどうぞ。

同じキーを連続で入力したときの挙動を変えてくれます。 [C-a]や[C-e]は文頭文末に移動した後にもう一度入力しても何も起きません。 これを入れると、二度目の入力の時にそれぞれバッファの先頭と終端に移動してくれます。 もう一度入力すると元の位置に戻ります。[M-<]や[M->]は使用頻度の割に押しづらい感じがするのでこれを利用してます。

google-translate

最新版のgitはこちら emacs上で翻訳の実行と、その結果が返って来ます。翻訳作業から、助けて変数名まで。

これからの課題など

 

拡張の作成

何か作りたいものができれば挑戦したいです。いろいろ足りないですが。

Magit

使い方(まずgit)を覚えます。現状Dropboxで設定ファイルとか管理(???)してるので、そろそろやめたいです。

原因不明のバグ?

autocompleteが落ちたり、インデントが急死したり、とてもつらい。

終わりに

いかがでしたでしょうか。一つでもへーと思ってもらえたことがあればよかったです。 個人の問題としてEmacsいじるだけで他の進捗が皆無です。 AizuAdventCalendar最高!(絶叫)

何か文句などあればコメントかツイッターにお願いします。 ツイッターの方が反応は早いと思います。

次はabout_hiroppyさんです。よろしくお願いします。