Lisp読み書きできないけどEmacs使いたい

Emacsのhelmを使いこなしてみる

僕自身はずっとanything使っててhelmに移行したくねぇ〜と思ってたけどついにmelpaからanythingが削除されてしまって、しぶしぶhelmを使っていた。

helmの基本機能しか使ってこなかったので、ここらで気合い入れて使いこなしてみる。

残念ながら、Emacs界隈はhelmよりivyの流れできてるよね。22世紀でもhelmかと言われたら厳しそうな雰囲気がプンプンしてる。

helmとはなんぞやと言うと、一言で言えばEmacsの対話型の処理を拡張するものと言える。具体的にはファイル検索やバッファーリスト、キリングリスト、M-xによるコマンド実行など。これら機能をhelmはより使いやすくしてくれる。

最後にhelmに関するelispの設定置いてある。

インストール

僕はel-getつかちゃってるんで~/.emacs.d/init.elにこれだけで記述すればインストールできちゃうが 、melpaやleafの人はそれに合わせてインストールして。

;; helm
(el-get-bundle helm)
(require 'helm-config)

プレフィックスを設定

helmのショートカットコマンドを実行する時に接頭辞としてC-c hを宣言する。これで多くのhelmに関するキーバインドC-c hから始まるものになる。言うても、よく使う奴は別にキーバインド割り振るからどうかなとも思う。

;; helmのキーバインドプレフィックスをC-c hで始まるように変更
(global-set-key (kbd "C-c h") 'helm-command-prefix)

このプレフィックスで利用できるキーバインド一覧をみるには少々難しいがこのキーバインドを実行すれば閲覧できる。

C-c h C-h

f:id:nuy:20200909224836j:plain

helmの設定

helmは多くの変数を持っていて、用途に合わせて設定することでより使いやすい環境を作れる。

とにかく多いので、何をどう設定したらどうなるのか全く分からんが、いろんなサイトを訪問してそれなりに良さげな設定を揃えた。

(setq helm-split-window-inside-p            t  ; 画面分割しても同じバッファ内にhelmのバッファを表示
      helm-move-to-line-cycle-in-source     t  ; helmバッファ内で候補の最後に到達したら上に戻る
      helm-ff-search-library-in-sexp        t  ; よく分からんがライブラリの中も検索するみたいな
      helm-echo-input-in-header-line        t)  ; helmのバッファの上部にコンソールの内容を表示

helm-split-window-inside-p

デフォルトは画面を分割した状態でhelmのバッファを開くと、アクティブでないフレームに表示される。

f:id:nuy:20200909225031j:plain

アクティブにすると各フレーム内で表示される。

f:id:nuy:20200912121823j:plain

helm-move-to-line-cycle-in-source

デフォルトではhelmバッファ内でカーソルが候補をループせず下まで移動する。実際にC-nで移動してみると分かりやすいと思う。

アクティブにすると、例えばmini-buffer内ではBuffersのセクションでカーソル移動がループする。

f:id:nuy:20200912121837j:plain

それじゃあその下のRecentfやCreate Bufferのセクションてどう行くの?って疑問に思う。これは、helmバッファ内でのセクション移動はC-oで行う。

helm-M-xでよく使うから覚えておいた方が良い。helm-M-xはcommand historyが無い時はコマンド候補をすぐに移動できるのだけど、履歴が作られると、Emacs Commands historyからEmacs CommandsC-oしないと飛べない。

f:id:nuy:20200912121849j:plain

helm-echo-input-in-header-line

これをアクティブにするとhelmミニバッファの一番上にエコーエリアで打ち込んでいる内容が表示される。

f:id:nuy:20200912121903j:plain

Helm M-x

EmacsM-xと言えばEmacsでコマンドを実行する時に利用するキーバインドである。

冒頭でも書いた様にhelmはEmacsの対話的な機能の拡張でこれもそれである。

;; Emacsのechoエリアをhelmで拡張
(global-set-key (kbd "M-x") 'helm-M-x)

M-xをタイプし、例えばforward-charと打ち込む。単語を全部打ち込みなくてもすぐに候補が出てくる。候補の移動はカーソルの移動と同じ様にC-nで下にC-pで上に移動する。目的のコマンドにハイライトを合わせてエンターを押せば実行される。

f:id:nuy:20200912121917j:plain

2回目以降はEmacs Commands historyセクションにカーソルが置かれていると思う。実行履歴から再びコマンドを実行したい場合はそこから選ぶ。

そうじゃなくて、新たに候補を探したい場合は上で説明した様にC-oでセクションを飛ぶ。

f:id:nuy:20200912121932j:plain

Helm kill ring

Emacs内でコピーまたはカットした内容を参照し、貼り付けすることができる。

C-kによる行の削除、リージョン選択中M-wC-wの内容が保存されている。

使い方は簡単M-yで起動して、貼り付けたい内容を選び、エンターを押す。

;; helmのkill ringを表示する
(global-set-key (kbd "M-y") 'helm-show-kill-ring)

f:id:nuy:20200912122006j:plain

Helm mini buffer

helmの最も魅力的な機能で、バッファーの一覧"Buffers"、最近開いたファイル一覧"Recentf"、あと殆ど使わないけど"Create buffer"がある。

;; 様々なソースへアクセスできるバッファ
(global-set-key (kbd "C-x C-a") 'helm-mini)

上のコードのキーバインドC-x C-aはhelmの元となったanythingで使われたもので、僕はすっかりこれに慣れちゃったので今もそうしている。他の人のコードの見るとC-x bとかしてるので好きな様にしてみて。

Buffers

バッファーでは今Emacsで開いているバッファを一覧で確認し移動できる。 カーソルの移動は他と同じくC-nで下にC-pで上にいく。移動したいファイルが見つかったから、エンターを押せばそのファイルのバッファが開く。

色々ファイルを開きまくると、バッファがものすごい量になるので、使わないバッファが出てきたらカーソルを当ててC-c dで削除できる。

f:id:nuy:20200912121948j:plain

Recentf

これは最近利用したファイルの履歴が出ている。最近使ったものなら、いちいちC-x C-fして探さなくてもこの候補から開くことができる。

ミニバッファを開くとカーソルはBuffersセクションにいるので、Recentfに移動するときはC-oで移動する。

Create buffer

ミニバッファから直接利用することはあまり無いが、エコーエリアでファイル名を入力した時に、BuffersにもRecentfにも候補がない場合Create bufferがアクティブになり、ファイルを作成できる。

f:id:nuy:20200912122043j:plain

helm-find-files

Emacsのファイル探索機能を拡張してくれる。検索機能やディレクトリ移動も便利になる。

下のコードではファイルとフォルダの候補の絞り込み、移動にタブを使う設定を加えている。

これhelmではアンチパターンである。helmではそういった操作をする時にタブを使うのではなく、ファイル名またはフォルダ名をタイプしてエンター、タイプしてエンターを繰り返して移動する事を推奨している。

しかしLinux系ではディレクトリの候補の表示と移動ではタブを使うことが多い。その使い方に慣れていると、helmの候補の絞り込みと移動はやりづらい。個人的にhelmの思想を無視してタブで候補に移動したり絞り込んだりできる様にしている。

もしも、helmの本来のやり方にしたい場合は下のコードのタブの記述をコメントアウトして使って欲しい。

;; ファイル探すのをhelmモードにする
(global-set-key (kbd "C-x C-f") 'helm-find-files)
;; ファイル探し候補をタブで補完
(define-key helm-read-file-map (kbd "TAB") 'helm-execute-persistent-action)
(define-key helm-find-files-map (kbd "TAB") 'helm-execute-persistent-action)

file-filesの使い方

候補の移動は他の場合と同じ様にC-nで下にC-pで上に移動する。

フォルダにカーソルを当てて、TABを押すとそのフォルダの中に入れる。1つ上の階層に戻るときはC-lで移動する。

エコーエリアにキーワードをタイプするとそれにマッチするファイルかフォルダだけが表示される。

目的のファイルが見つかったら、それにカーソルを合わせて、エンターを押すとファイルが開く。

f:id:nuy:20200912122107j:plain

helm-occur

helm-occurはファイル内のキーワード複数検索機能だ。

キーワードがあらかじめ複数あると分かっていて、その中のどれかを探す時にoccurは役に立つ。

;; ファイル内のキーワード検索と絞り込み移動
(global-set-key (kbd "C-c o") 'helm-occur)

例えば、Lispコードの中からざっくりsetqだけを表示できる。C-sで探すこともできるが、候補が多いと移動が大変なのでこれはありがたい。

f:id:nuy:20200912122120j:plain

helm-imenu

ファイル内の関数一覧を表示してくれる。しかし、jsのes6のクラス内関数とかちょっと複雑なものは表示してくれない。

;; 関数をざっくり一覧で表示
(global-set-key (kbd "C-c i") 'helm-imenu)

f:id:nuy:20200912122134j:plain

その他

バッファーとRecentf単体で表示できるキーバインドも用意しておく。ほとんどの場合helm mini-bufferで事足りるので滅多に使わない。

;; 最近利用したファイル一覧を表示
(global-set-key (kbd "C-x C-r") 'helm-recentf)

;; バッファーリストを表示
(global-set-key (kbd "C-x b")   'helm-buffers-list)

最後に

helmはあまりに変数と関数があるので、ここでは紹介しきれないものが多くあります。この記事で興味を持った方はgithubをみたりして、カスタマイズに挑戦してみて欲しい。

僕のEmacsの基本設定紹介します

最近、ちょっと時間ができたのでinit.elを見てたら、自分の基本設定見返す時があったのでブログにまとめる。

ここで言う基本設定って、meplaとかel-getを使ってサードパーティのライブラリを利用しない純粋にEmacsに搭載されている関数や変数で設定できる機能のことを指す。

あと記事を書くにあたって、googleで「Emacs 基本設定」ってググったら結構様々な人が公開してた。

最後にコード全て載せてあるので、そっち見たい人は下までスクロールして。

日本語言語設定

;; ユーザーの自然言語と文字エンコーディングを設定
(set-language-environment "Japanese")
(prefer-coding-system 'utf-8)

コーディングしかしないのに日本語の設定いる?みたいに思ってたけど、org-modeやmarkdownでなんやかんや使うので一応書いている。

メニューバーを隠す

Emacsのターミナル版では下の画像のように、上に白いメニューバーが表示されているが、ほとんど利用されていないので非表示にする。

f:id:nuy:20200906145049j:plain

;; メニューバーを消す
(menu-bar-mode -1)

f:id:nuy:20200906145058j:plain

折り返し文字の非表示

ターミナルでEmacs使っていると長いテキストはこんな感じで折り返しの時は\が行末に表示されて、折り返さない時は$が表示される。これが邪魔なので設定で削除する。

f:id:nuy:20200906145429j:plain

f:id:nuy:20200906145439j:plain

;; 文字が画面から飛び出る時にでる$マークを表示させない。
;; https://stackoverflow.com/questions/8370778/remove-glyph-at-end-of-truncated-lines
(set-display-table-slot standard-display-table 0 ?\ )

;; 改行の時にバックスラッシュを表示させない
;; https://www.emacswiki.org/emacs/LineWrap
(set-display-table-slot standard-display-table 'wrap ?\ )

なお、init.elbyte-compile-fileする時は作られたelcでエラーが発生してしまうのでその時はコメントアウトしてあげて。

行の折り返しの切り替え

エディタ上で一行が長いときに、テキスト折り返す、折り返さないを交互に変更できる。

;; 行の画面外の折り返しを切り替えるショートカット
(define-key global-map (kbd "M-l") 'toggle-truncate-lines)

選択範囲一括コメントアウト、コメントイン

範囲を選択して一括でコメントアウトしたい時に利用する。既にコメントアウトされているところではコメントインしてくれる。コード書く時にめちゃ便利。

f:id:nuy:20200906144208j:plain

;; 選択範囲を全てコメントアウト、コメントインする
(define-key global-map (kbd "C-c /") 'comment-or-uncomment-region)

バッファの再読み込み

Emacsでファイルを編集していても、gitや他のエディタでファイルを更新し、Emacsで読み込んでいるファイル情報が古くなる場合がある。

そんな時に、最新の状態に更新するのがバッファのリロード機能である。

;; バッファの再読み込みをM-rで実行する
(defun revert-buffer-no-confirm (&optional force-reverting)
  (interactive "P")
  (if (or force-reverting (not (buffer-modified-p)))
      (revert-buffer :ignore-auto :noconfirm)
    (error "The buffer has been modified")))
(global-set-key "\M-r" 'revert-buffer-no-confirm)

行番号の表示

モードラインにカーソルがいる場所の行数を表示する。左が行数で、右がその行の先頭から何文字目にいるかを表示している。

f:id:nuy:20200906144221j:plain

;; 行番号を表示
(column-number-mode t)

ファイルサイズを表示

同じく、モードラインに開いているファイルのサイズを表示する。

f:id:nuy:20200906144235j:plain

;; ファイルサイズを表示
(size-indication-mode t)

対応する括弧のハイライト

コードの括弧に対応する箇所を自動でハイライトしてくれる。コーダーなら必須の設定。 カーソルを置いた時に、デフォルトだと0.125秒の遅延があるので0に設定。

画像だと赤くなっているのがそれ。

f:id:nuy:20200906144247j:plain

;; カーソルを括弧に合わせると範囲を表示する
(show-paren-mode t)
;; 範囲表示の遅延を0秒にする
(setq show-paren-delay 0)

インデントの設定

今はほぼいないけどコードのインデントにタブを使っている人がいたりする。これをタブじゃなくてスペースにする設定。indent-tabs-modeをオフにし、インデントの深さをスペース2つにする。

ここら辺は好みもあるけど、タブ使うのはやめた方が良いと思うよ。スペースの個数に関してはpython見てるとjupyterとかデフォルトで4だし、ありなんかなぁ〜。

f:id:nuy:20200906144300j:plain

;; インデントをタブにするモードをof
(setq-default indent-tabs-mode nil)

;; デフォルトタブ幅の設定
(setq default-tab-width 2)
(setq tab-width 2)

ファイルのバックアップ設定

Emacsでファイルを編集していると同じ場所にファイル名+~なバックアップファイルが作られる。邪魔以外の何物でもないのだけど、何かあった時のためにバックアップファイルは欲しいのでそれを~/.emacs.d/baskupsに集める。

;; オートセーブファイルを~/.emacs.d/backups/へ集める
(add-to-list 'backup-directory-alist(cons "." "~/.emacs.d/backups/"))
(setq auto-save-file-name-transforms
      `((".*" ,(expand-file-name "~/.emacs.d/backups/") t)))

全体のコード

最後にここで紹介した設定全て載せておく。

;; ユーザーの自然言語と文字エンコーディングを設定
(set-language-environment "Japanese")
(prefer-coding-system 'utf-8)

;; メニューバーを消す
(menu-bar-mode -1)

;; 文字が画面から飛び出る時にでる$マークを表示させない。
;; https://stackoverflow.com/questions/8370778/remove-glyph-at-end-of-truncated-lines
(set-display-table-slot standard-display-table 0 ?\ )

;; 改行の時にバックスラッシュを表示させない
;; https://www.emacswiki.org/emacs/LineWrap
(set-display-table-slot standard-display-table 'wrap ?\ )

;; 行の画面外の折り返しを切り替えるショートカット
(define-key global-map (kbd "M-l") 'toggle-truncate-lines)

;; 選択範囲を全てコメントアウト、コメントインする
(define-key global-map (kbd "C-c /") 'comment-or-uncomment-region)

;; ページアップのキーにctrl+]を追加
(define-key global-map (kbd "C-]") 'scroll-down)

;; バッファの再読み込みをM-rで実行する
(defun revert-buffer-no-confirm (&optional force-reverting)
  (interactive "P")
  (if (or force-reverting (not (buffer-modified-p)))
      (revert-buffer :ignore-auto :noconfirm)
    (error "The buffer has been modified")))
(global-set-key "\M-r" 'revert-buffer-no-confirm)

;; 行番号を表示
(column-number-mode t)

;; ファイルサイズを表示
(size-indication-mode t)

;; カーソルを括弧に合わせると範囲を表示する
(show-paren-mode t)
;; 範囲表示の遅延を0秒にする
(setq show-paren-delay 0)

;; インデントをタブにするモードをof
(setq-default indent-tabs-mode nil)

;; デフォルトタブ幅の設定
(setq default-tab-width 2)
(setq tab-width 2)

;; オートセーブファイルを~/.emacs.d/backups/へ集める
(add-to-list 'backup-directory-alist(cons "." "~/.emacs.d/backups/"))
(setq auto-save-file-name-transforms
      `((".*" ,(expand-file-name "~/.emacs.d/backups/") t)))

Emacsの公式Elispマニュアルを日本語化する

この記事は Emacs Advent Calendar 2019 の16日目の記事となります。 https://qiita.com/advent-calendar/2019/emacs

前回はEmacsの公式マニュアルを日本語化した。

他にも日本語化されたマニュアルがあるのかなと思い、その方のgithubリポジトリを回遊すると、elispも日本語化されていたので、そちらも日本語化してみる。

利用する環境は以下の通りである。

なお、elispマニュアルはEmacs25.1まで翻訳が終わっていたのでそちらを利用する。

日本語版elipsドキュメントのダウンロード

前回のEmacsリファレンスではmakeinfoコマンドを利用し、マニュアルを生成する必要があったが、githubを見ると、こちらはあらかじめコンパイルされたファイルが用意されていたのでそちらを利用するだけで良い。

まずは、~/.emacs.dに移動する。

cd ~/.emacs.d/

ダウンロードする。

wget https://github.com/ayatakesi/emacs-25.1-doc-lispref/archive/master.zip

解凍する

unzip master.zip 

分かりやすいように、ファイル名を変更する。

mv emacs-25.1-doc-lispref-master elisp-ja-doc

ダウンロードしたzipファイルを削除

rm master.zip

elisp日本語を読み込む

~/.emacs.d/init.elを開いて 下のコードを書き込む。

 (setq Info-default-directory-list
   (append Info-default-directory-list (list (expand-file-name "~/.emacs.d/elisp-ja-doc/"))))
 (defun Info-find-node--elisp-ja (orig-fn filename &rest args)
   (apply orig-fn
     (pcase filename
       ("elisp" "elisp-ja")
       (t filename))
     args))
 (advice-add 'Info-find-node :around 'Info-find-node--elisp-ja)

emacsを起動して、C-h iEmacsのインフォページに移動する。 そのまま、Elispの箇所にカーソルを移動させて、エンターを押す。

f:id:nuy:20191216144440p:plain

日本語のElispマニュアルが表示される。

f:id:nuy:20191216144515p:plain

あとがき

elispって現代ではなかなか学習できないジャンルなので、こういう風に日本語化されてマニュアルがあると本当に助かる。初心者の方からプロフェッショナルな方まで1度は目を通してみると良いかもしれない。

なお、ボリュームはすごい模様。

Emacs公式マニュアルを日本語化する

Emacsのマニュアルとは

Emacsには標準でマニュアルが用意されている。このマニュアルには膨大な量のEmacsに関する情報が記載されている。

便利は便利なのだが、如何せん英語で記述されている。初心者にとってはLisp+英語で厳しい面がある。

この記事ではマニュアルの日本語化に挑戦してみる。ただし、ちょっと大変だからゆっくりやっていこう。

なお利用する環境は以下の通りである。

こちらの記事を参考にさせてもらいました。

http://emacs.rubikitch.com/emacs245-manual-ja/

必要なコマンドを揃える

日本語のマニュアルを利用するにあたりmakeinfoコマンドが必要になる。Macには標準でこのコマンドがあるが、バージョンが古く--document-languageオプションが無い事がある。筆者のコマンドにはなかった。

$ makeinfo --version

makeinfo (GNU texinfo) 4.8

Copyright (C) 2004 Free Software Foundation, Inc.
There is NO warranty.  You may redistribute this software
under the terms of the GNU General Public License.
For more information about these matters, see the files named COPYING.

下のコマンドを実行し、「General options」に--document-languageがあるか確認する。

makeinfo --help

あればそれを使う。なければbrewからインストールする。

makeinfoコマンドはtexinfoコマンドに付随してるらしいのでtexinfoをインストールする。

こちらを参考にさせてもらいました。

https://stackoverflow.com/questions/44379909/how-to-upgrade-update-makeinfo-texinfo-from-version-4-8-to-4-13-on-macosx-termin

brew install texinfo

インストールが終わったらシンボリックリンクをはる。これでシステムコマンドがbrewのコマンドになる。

brew ln texinfo --force

brew lnコマンドを実行すると以下のような情報が出ると思う。

Warning: Refusing to link macOS-provided software: texinfo
If you need to have texinfo first in your PATH run:
  echo 'export PATH="/usr/local/opt/texinfo/bin:$PATH"' >> ~/.bash_profile

そしたら、そこに表示されているechoコマンドを実行する。

echo 'export PATH="/usr/local/opt/texinfo/bin:$PATH"' >> ~/.bash_profile

別のターミナルを起動して、makeinfoコマンドをリロードして、再度makeinfoコマンドを確認する。

 $ makeinfo --version
texi2any (GNU texinfo) 6.7

Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

ヘルプを見ると、document-languageがあるはずだ。

makeinfo -help

日本語マニュアルをダウンロード

続いて日本語マニュアルを用意する。

ソースファイルはここに置かれている。

https://ayatakesi.github.io

今回はVer26.3を利用する。ファイルはいくつかあるけど、Texinfo sourceというのを利用する。

まず、~/emacs.dに移動する。

cd ~/.emacs.d

wgetでダウンロード。

wget https://ayatakesi.github.io/emacs/26.3/emacs-ja.texis.tar.gz

解凍する。

tar xzvf emacs-ja.texis.tar.gz

不要な圧縮ファイルを削除する。

rm -y emacs-ja.texis.tar.gz

準備ができました。

Emacsマニュアルの展開

解凍したフォルダに移動する。

cd emacs-ja.texis

makeinfoコマンドで日本語のマニュアルを生成する。

makeinfo --document-language=ja --no-split -o emacs263-ja.info emacs-ja.texi

f:id:nuy:20191211152521p:plain

emacs263-ja.infoというファイルが作られている。

これをEmacsで読み込み、正しく日本語が表示されるか確認してみる。
emacsを起動して、このコマンドでファイルをロードする。

C-u M-x info ↩︎(リターン) ~/.emacs.d/emacs-ja.texis/emacs263-ja.info

f:id:nuy:20191211152536p:plain

f:id:nuy:20191211152547p:plain

と、この様にばっちし日本語になっているはずだ。

常に日本語をロード

上のコマンドでは用意した日本語のドキュメントを明示的に読み込んだ。一方で、普通にemacsのマニュアルを開くと英語版が読み込まれてしまう。そこで、~/.emacs.d/init.elファイルに日本語のリファレンスへのパスを通してあげて常に日本語が開くようにする。

 (setq Info-default-directory-list
   (append Info-default-directory-list (list (expand-file-name "~/.emacs.d/emacs-ja.texis/"))))
 (defun Info-find-node--info-ja (orig-fn filename &rest args)
   (apply orig-fn
     (pcase filename
       ("emacs" "emacs263-ja")
       (t filename))
     args))
 (advice-add 'Info-find-node :around 'Info-find-node--info-ja)

ファイルを保存して再度Emacsを起動してC-h rでマニュアルを開くと日本語になっている。

余談

余談だけど、これさえもEmacsのヘルプの一部分なんだよね。マニュアルを開いた状態でuキーを押すと、1つ上の階層に行けるんだけど、そこに行くと他にも大量のドキュメントがあるのが分かるよね。

今、日本語化したのはこの中でも「Emacs」っていう項目のところだけ。

f:id:nuy:20191211152610p:plain

Emacsの.emacs.dフォルダと設定ファイルinit.elの作り方

Emacsの設定ファイルとは

Emacsは他の多くのエディタと同じ様に、複雑な設定を記述する事ができる。

その為には設定を記述できる環境を作らなければならない。

この記事ではEmacsの設定をするための環境構築をしてみる。

Emacsの設定ファイルはどこにあるの?

まず、Emacsの設定ファイルは自分で用意する必要がある。システムが用意している場合もあるが、できるだけ自分でやったほうが身になるだろう。

Emacsはあらかじめ幾つかの設定ファイルを自動でロードする機能がある。

代表的なのが~/.emacsファイルと~/.emacs.d/init.elファイルだ。

昔は~/.emacsファイルに設定を記述してそれをロードさせる事が多かった。

しかし、だんだんとライブラリやバックアップファイル、キャッシュファイルが増えていく中で、emacsに関する全てのファイルを~/.emacs.dフォルダにまとめようという流れになった。

同じ流れでEmacsの設定ファイルも.emacsからinit.elというファイル名にし、~/.emacs.dフォルダに入れるようになった。この記事もそのやり方を採用している。

設定ファイルを確認してみよう

さっきも書いたように、自分がEmacsの設定ファイルを作っていなくても、システムが予め用意していたりする。

新しく設定ファイルを作る前にEmacsの設定ファイルがあるか確認しておこう。

設定ファイルがあるのに複数設定ファイルを作ると設定が競合し、厄介な事になるので最初にそのリスクを避ける。

.emacsファイル

ターミナルを開いてホームディレクトリに.emacsファイルがあるか確認する。

ls -la ~/
cat ~/.emacs

もしも、.emacsファイルがあれば中身を確認して、何も書かれていなければ~/.emacsファイルを削除する。削除が不安だったら何もしなくても平気。

もしも、中に何か書かれてたら、念のためコメントアウトしてコードが実行されないようにしておく。

.emacs.dフォルダ

次に~/.emacs.dフォルダあるか確認しよう。

ls -la ~/

フォルダがあれば、そのまま使えばいいし、なければ下のコマンドでフォルダを作成する。

mkdir ~/.emacs.d

この.emacs.dフォルダにこれから色々な設定やライブラリを置いていく。

init.elファイル

init.elemacsの設定を記述するメインファイルになる。

ファイル名はinit.elでないと、多分読み込まれないから気をつける。

.emacs.dフォルダに移動して、init.elファイルを作る。

cd ~/.emacs.d
touch init.el

Emacsの設定を記述する準備ができた。

最初の設定

ここからEmacsの大きな開発に乗り出すわけだけど、最初の設定はわかりやすくEmacsに用意されているテーマを反映させてみよう。

emacsは初めからいくつかのカラーテーマを用意しているので自分の好きなテーマを反映させてみよう。 とは言っても今回はmanoj-darkを使ってみよう。init.elに下のコードを書き込む。

(load-theme 'manoj-dark t)

f:id:nuy:20191209125203p:plain

C-x C-sで保存し、Emacsを閉じて再度開いてみよう。すると色がこのように変わっているはずだ。

f:id:nuy:20191209125226p:plain

おめでとうこれでEmacsの開発環境が整った。

Emacs初心者は公式チュートリアルをまずは読もう

Emacsチュートリアルとは

Emacsは標準でチュートリアルが用意されている。しかも日本語対応。公式ドキュメントならぬ公式チュートリアルがある。だったらやらないわけにはいかない。

「いきなりチュートリアルやるの? 大丈夫かなぁ?」と思っても大丈夫。
ちゃんとEmacsの操作方法から説明してくれるので、安心して始められる。

ここにチュートリアルで学べることをざっくりまとめておく。

  • カーソルの操作
  • 簡単なエディタウィンドウの操作
  • 文字の追加と削除
  • 操作のやり直し(undo)
  • ファイルを開く、保存する
  • Emacsのコマンドについて
  • モードライン
  • メジャーモードとマイナーモード
  • 検索
  • ヘルプコマンドについて

とても丁寧に書かれていいるので、他の本や記事を読むよりもずっと良い。

Emacsチュートリアルを開く

emacsチュートリアルはターミナル版emacsでも、アプリ版でもどちらでも構わない慣れている方を使おう。

私は使い慣れているiTerm2のターミナル版Emacsを使って解説していく。

eamcs

Emacsの軌道とともにスタートアップ画面が表示される。

f:id:nuy:20191208135835p:plain

画面をよく見ると「Emacs tutorial」とあるのが分かる。十字キーでそこにカーソルを持って行ってエンターを押すとチュートリアルが開く。ショートカットキーの使い方が分かる人はC-h tチュートリアルが開ける。

スタートアップページは英語だったけど、チュートリアルはしっかりと日本語になっている。

f:id:nuy:20191208140211p:plain

後は読み進めていけばok

このチュートリアルは長さもそこそこで読みやすいので一通りやれば、emacsでの操作が身につくだろう。emacsの便利な機能を実際に使う前にここで学んだ操作を自分のものにしておくことが重要だ。基本操作を忘れてしまうと、後々いろんなことをやる時にまごついて進まなくなってしまう。だから初心者はここでやった(C-f)カーソルを進めるや(C-x C-s)ファイルを保存するなどの操作をしっかりマスターしておこう。

ここが難しいよEmacs Elisp

この最初の記事は9年間Emacs使ってきて、ここツレェと思ったところをまとめてみた。

EmacsElispガチ勢からしたら「なにいってんだこいつ」という感じだろうが暖かい目で見てくれると嬉しい。

予め用意されている関数と値が多い

Emacsはとにかく膨大な関数や値が予め用意されている。玄人はそれを使って設定ができるのが便利なんだと思う。でもその反面、関数を知らないと、どう記述すれば良いのか分からなくて大変だ。

私は「とりあえずなんか書いとけば動く」みたいなノリでコピペするんだけど、そもそもこれがどういう値を受け入れて、何しているかよく分からんのだよ。

例えば、この一文の設定は一行の文字が長すぎて画面の外に行った時に折り返すのかそのまま画面外にはみ出して表示させるのかを切り替えるショートカットを設定しているものだ。

(define-key global-map (kbd "M-l") 'toggle-truncate-lines)

慣れてしまえば、define-keyもglobal-mapも見たまんまなんだと思う。でも素人はどこでも使えるショートカットキーの設定をこうやって書けばいけると分かるまでに、どのくらいかかることやら。もちろんググればそれなりに出てくるけど大変だよね。

Elispむずすぎ

これは世代的なものもあるんだろうけどさ、今のプログラミング言語ってC言語からほとんど来てるじゃん。でもElispもといLispってここまでC言語がメジャー化する前のFortranとかCobolとかPascalとかあの辺のプログラミング言語が生存競争していた時にすでにあった言語の1つだよ。

そうなるとC言語系の記述に慣れきった自分からするとLispの書き方ってすっごく難しく感じる。自然言語で言えば英語習ってドイツ語、フランス語、イタリア語習得したら、いきなりアラビア語くるみたいな難しがあるんだよね。

Emacs好きだし、かっこいい色の設定して、バシバシコーディングしたいから必死こいてelisp読んではみるんだけど、正直、イマイチ身につかない。

記事が強い

Emacsの記事を見に行くと、記事書いてる人のほとんどがelispをマスターしてるんだろうなぁっていう印象を受ける。だから説明も割と少なめでガシガシコードだけ書いている人が多い。初心者からしたら記事にまとめてくれて嬉しい反面、コードがなにやってるか分からんのじゃあ。

そう言ったelispコピペプログラマからしたら、コードの記述が他のコードと競合した時なんてもう目も当てられない。

古くなって、レガシる

Emacsのパッケージは油断するとすぐにレガシーになる。私の大好きなanythingも最近レガシって、melpaから削除された(涙)。

良さげなパッケージがあってgithubに見にいけば、最終更新日が4年前とかざらにあるし、そもそもemacsのパッケージがgithubにないこともある(最近はそうでもないけどね)。

記事もすぐに古くなる。良質な記事を書いてくれていたemacsおじさん、おばさん達も、emacsとパッケージの更新ごときで、ブログを更新するわけではないので、古い記事がインターネットの電子海に昆布のごとく漂っている。

なんだよー。オライリーGNU Emacs 第3版出版されたの2007年やぞ12年前やぞ!

それでもEmacs使っていこうと思ってる

だからと言ったら烏滸がましいが、このブログでは初心者Emacsユーザーでも分かるように出来るだけ、楽しく、面白く、詳しく、Emacsについて書いていくよ。よかったら購読者になってね。