gofujita notes

on outline processing, writing, and human activities for nature


Org との日々 #8

4. 最小限のセットアップ

4-a. .spacemacs

起動した Spacemacs が、最初によみに行くファイルが.spacemacs。「dotspacemacs」とスペルアウトされることもあります。これが Spacemacs の configuration file (設定ファイル) です。

前節でかいたように、.ではじまるファイルは hidden file と呼ばれ、macOS の finder で見ることができません。なのでまずは、.spacemacsのあるフォルダ「Macintosh HD/Users/gofujita (ユーザー名)」のフォルダーを開いた状態でshift + .とタイプし、このファイルを見えるようにします。

.spacemacs というファイル名に「.txt」のような拡張子がないのが気になるかもしれませんが、安心してください。このファイルも「.txt」や「.org」と同じテキストファイルです。そして、Emacs や Spacemacs は、拡張子なんて無くてもテキストファイルを開くことができます。あたり前といえば、あたり前ですね (笑)。

この.spacemacsは、Spacemacs ユーザーが自分の希望を Spacemacs に伝える手紙だと、ぼくは理解しています。

 

4-b. 準備

.spacemacsファイルを開く前に、準備を少し。

まず、何も手を入れていない.spacemacsのバックアップをとっておきます。いつでも現状にもどることができるように。

具体的には、例えば finder でこのファイルをコピーしてたとえば .spacemacs.bakといった名前に変え、同じホームディレクトリ「Macintosh HD/Users/gofujita (ユーザー名)/」に置いておくのでよいと思います。

もうひとつ。もしあなたが Emacs の初心者なら、Emacs の基本中の基本と言っていいキーバインド (ショートカット) を3つ、覚えてください。

  • C-x C-s: ファイル保存
  • C-x C-c: Emacs (Spacemacs) 終了
  • C-g: キャンセル

とくに最後のC-gはとても便利。キーバインドの途中でまちがいに気づいたときは、とりあえずこれ。一度でダメなら二度。二度でダメならC-gをくりかえせば、まちがいをキャンセルできます。

 

4-c. .spacemacsを開く

では、Spacemacs を起動しましょう。Applications フォルダにあるEmacs.app をダブルクリック、でしたね。

起動画面が開いたら、前回と同じようにキーバインドC-x C-f.spacemacsとファイル名をタイプすれば開きます。でも今回は.spacemacsを開く専用キーバインドを使ってみましょうか。

M-m f e d

え、長いって? でもマッスルメモリーすれば、意外と楽にタイプできるようになります。Mは、メタキーのこと。macOS の場合escキーを指します。escを押して離し、f e dと順番にキーを押します。

タイプし終わると同時に.spacemacsが開きます。

このファイルがほんとうにテキストだらけなことに、ちょっと圧倒されるかもしれません。短編小説くらいの文字がびっしりつまったファイルです。

 

4-d. .spacemacsは2種類のことばでかかれている

.spacemacsは、2種類のことばでかかれています。

ひとつめのことばは、ぼくたち人間がよむことのできることば。;;(セミコロン2つ) で始まる行にかかれたコメントです。一部、" " (ダブルクォーテーション) で囲まれたことばも、同じく人間へのメッセージ。上の図では青みがかった緑色の文字になっています。この図では英語だけですが、もちろん日本語でかくこともできます。

そして、もうひとつのことばが Emacs Lisp。Emacs や Spacemacs が理解できることばです。短く「elisp」とかかれることもあります。これが、.spacemacsのコード本体です。上の図では、ピンクと水色、そして白い文字になっています。

elisp は、Lisp とよばれるプログラミング言語グループのひとつ。Lisp は、1958年にアメリカのマサチューセッツ工科大 (MIT) でAI の研究をしていた数学者 John McArthy さんがつくったとされる、長い歴史をもつプログラミング言語です。

個人的には、誕生から60年以上たった今もなお活発に開発が進められている点に、興味をもっています。プログラム言語でありながら数学の式のようでもある、個人的に好きな言語のひとつです。

 

4-e. .spacemacsは4つの関数でできている

Lisp は、括弧で階層構造を表現する特徴的な外見をもっています。

たとえば、(data_a (data_b (data_c)))

  • data_a ;; 第1階層
    • data_b ;; 第2階層
      • data_c ;; 第3階層

という構造を示しています。

この括弧による階層構造のルールを元に.spacemacs全体を眺めると、4つの第1階層、普通の書籍で言えば「章」にあたるような大きな塊でできていることが分かります。上から順番にかくと、以下の4つの塊です。

  • (defun dotspacemacs/layers () ..)
  • (defun dotspacemacs/init () ..)
  • (defun dotspacemacs/user-init () ..)
  • (defun dotspacemacs/user-config () ..)

以下、それぞれを「layers 関数」「init 関数」「user-init 関数」「user-config 関数」と呼ぶことにします。すべてdefunではじまっていますね。この(defun .. () ..)は「こんな形の計算や作業を、こんな名前の関数に定義しますよ」というメッセージです。

それぞれの「章」の2行目からダブルクォーテーションマーク「" "」で囲まれたコメントがあります。まずはこれをよんでみましょう。

(i) 「layers 関数」のコメント

"Configuration Layers declaration. You should not put any user code in this function besides modifying the variable values."

(Configuration Layers の宣言。変数の値をかき変える以外、この関数には一切ユーザーコードをかいてはいけません)

レイヤーは、パッケージとおよそ似た意味をもった、Emacs にある機能群を提供するセットだと、ぼくは理解しています。この関数によって、最初によみこむレイヤーを決めています。

(ii)「init 関数」のコメント

"Initialization function. This function is called at the very startup of Spacemacs initialization before layers configuration. You should not put any user code in there besides modifying the variable values."

(初期化関数。Spacemacs 初期化のいちばん最初、leyers 設定の前に呼び出されます。変数値をかき変える以外、この関数には一切ユーザーコードをかいてはいけません)

(iii)「User-init 関数」のコメント

"Initialization function for user code. It is called immediately after dotspacemacs/init, before layer configuration executes. This function is mostly useful for variables that need to be set before packages are loaded. If you are unsure, you should try in setting them in dotspacemacs/user-config first."

(ユーザーコードの初期化関数。init 呼び出しのすぐあと、layer 設定の前に呼び出されます。ここは、パッケージを読み込む前に設定が必要な変数をかいておく場所です。よく分からない場合は、まず (iv) user-config 関数で設定するのがいいでしょう)

(iv)「user-config 関数」のコメント

"Configuration function for user code. This function is called at the very end of Spacemacs initialization after layers configuration. This is the place where most of your configurations should be done. Unless it is explicitly specified that a variable should be set before a package is loaded, you should place your code here."

(ユーザーコードの設定関数。この関数は layers 設定初期化のあと、Spacemacs 初期化のいちばん最後に呼び出されます。あなたの設定のほとんどを行なう場所になります。パッケージが読み込まれる前に設定される変数でなければ、ここにそのコードを書いてください)

 

4-f. ユーザーがコードをかきこむのは「user-init 関数」と「user-config 関数」

これらのコメントから、Spacemacs がこの4つの関数を「init」「user-init」「layers」「user-config」の順によむことが分かります。

そして「init 関数」に基本設定があり、ぼくたちユーザーは、たとえばtnilのような変数値をかき変えることで設定変更できること、ぼくたちが自由に、そして本格的にコードをかく場所は「user-init 関数」と「user-config 関数」であることも分かります。

さらに「user-init」と「user-config」のどちらにメッセージをかいていいかよく分らない場合は、とりあえず「user-config」にかきなさいという、アドバイスもあります。

 

4-g. 表示テーマを変える

ではいよいよ、この.spacemacsをかき変えて、Spacemacs を変化させます。

あなたが Spacemacs に伝えたいことはいっぱいあるでしょうけれど、まずは欲張らずにかんたんな作業から。

「init 関数」の変数の値をかき変えて、Spacemacs を小さく変化させます。たとえばそうですね、全体の見かけを決める「テーマ」を変えてみましょうか。

Spacemacs には、既存のテーマもたくさんつくられています。まずは、以下のテーマを集めたサイトに行ってみてください。

 

Spacemacs Themes

 

すごいですね。この中から好みのテーマを選び、名前を覚えてください。ぼくはとりあえず、デフォルトに近いspacemacs-lightに決めました。

でも、このテーマをよみこみ、Spacemacs で表示するには、何をどうすればよいのでしょうか。最初はちょっと途方にくれて Google したくなります。でも、あわてずにこのページをダメモトで眺めてみましょう。

ぼく個人の経験では、Emacs や Spacemacs のための情報サイトには、大体それを使う Emacs Lisp やキーバインドなどの操作がどこかにかいてあることが多いと思います。このサイトをそういう目でみると、目立つ場所、タイトルの下の灰色の帯の左側にこんな文章があります。

「load themes on start up」(起動時にテーマをよみこむ)

そしてその下に、こんなまじないのようなことばがかいてあります。

(setq-default dotspacemacs-themes '(list-themes-here))

括弧でくくられていますから、elisp のコードだろうと予想がつきます。少しくわしく見ると、まず左端のsetqは、set に似ていますから、何かをセットするためのことばでしょうか。そのうしろに-defaultってありますから、デフォルト値をセットするためのことばでしょうか。

余談になりますが、Lisp では、ひとつの単語をアトム atom と呼びます。ここでは、setq-defaultがひとつのアトムです。

このアトムは、たぶんすぐうしろにつづくdotspacemacs-themesというアトムに、'(list-themes-here)という変数か何かを当てはめるためのメッセージかなと、何となく予想できます (よしよし)。

このメッセージの2番目のアトムdotspacemacs-themesは、そのものズバリ.spacemacsのテーマでしょう。

そして3番目のアトム'( )は Lisp のことばでは括弧内のリストを引用するという記号です。なので、この中にあるlist-themes-hereの替わりに自分がよみこませたいテーマ名を入れておけば良さそうです。

themes と複数形なので2つ以上のテーマ名を書いてもよさそうですがまずはひとつ、このリストに先に選んだspacemacs-lightを入れましょう。

 

(setq-default dotspacemacs-themes '(spacemacs-light))

 

これでよし。

 

4-h. 「init 関数」の変数値をかき変える

つぎに「init 関数」のいちばん上の行にカーソルを移動し、この関数の中に上のコードが含まれていないか、検索してみます。すでに上の設定コードがかかれてあるとすれば、この「init 関数」である可能性が高いからです。検索することばは「theme」にしましょう。

Emacs の検索は強力かつ快速で、キーバインドもシンプルにC-sです。そうタイプすると画面いちばん下にあるミニバッファと呼ばれる行に「I-search: 」という文字がでます。カーソルも自動的にミニバッファに移動しているはず。そのまま検索したい語をタイプしてみてください。

「t」と入力した段階でファイル内すべての「t」がハイライトされ、「th」ではハイライトが「th」に絞られ、さらに「the」で.. と軽快に検索結果がしぼりこまれていく風景は、テキストエディタを使っているからこそ味わえる心地よさです。

で、この「init 関数」に「theme」という文字列を含むアトムが使われていることがすぐに分かります。以下の行です。

spacemacs-darkspacemacs-lightのあいだに改行が入っていますが、先にかいたコードとほぼ同じです。

このコードの上の階層をしらべると、ずっと上に(setq-default ..というコードもありますから、ここがテーマ設定のメッセージであることはまちがいなさそうです (よしよし)。

なので、この'( )の中の変数値をspacemacs-lightだけに変えます。かんたんですね。

変更を反映するために Spacemacs を再起動するのもひとつの手ですが、修正内容を再起動せずによみこむキーバインドがありますから、それをつかってみましょう。

M-m f e R

長いですが、これもマッスルメモリーすると便利なキーバインドです。escを押して放し、mfとタイプ。最後のRshift + rですね。

テーマのデータをダウンロードしてますよというメッセージがミニバッファにでます。うまく行ってる感じ (にやり)。

何秒か時間がかかる場合もありますが、これで、今までダークモードだった画面がライトモードに切り替わるはずです。このキーバインドがうまく行かなかったときは、悩まず Spacemacs を再起動しましょう。

さぁ、これでぼくたちは、Spacemacs のテーマを変えられるようになりました。

そうそう。この作業をしていて、その2つ下のコードがフォント設定のメッセージだと気づいたので、ついでにフォントも変えました。

好みは等幅フォントですが、ぼくの MacBook Pro で気に入った日本の文字にも対応した等幅フォントをみつけられなかったので、とりあえず Meiryo を使うことにしてサイズも少し大きく設定しました。

 

4-i. 行を折り返し表示する: 「user-config 関数」にコードをかく

テーマが変わった画面を眺めて満足したら、先へ進みましょう。つぎは、行の折り返し表示を試してみます。

Emacs や Spacemacs は、プログラマーがプログラムのコードをかくことを第一に、デザインとその実装が行なわれています。

コードをかいているときは、画面右端に文字が届いてもそこで行を折り返さず、同じ行のまま右へ進みつづける方が便利ですから、Spacemacs も行の折り返しをしない設定になっています。前節でつくったtest.orgに、右につづく長い文字をかいてみるとこんな感じ。

さて、どうすれば、この行の折り返し表示ができるようになるでしょうか。まずはざっと、Org と Emacs Lisp ドキュメントの目次などに目をとおしましたが、よさそうな説明をみつけることができませんでした。

なので、Google しました。だいたい、「行の折り返し」ということばもみんなが使っているかよく分らないのですが、気にせず「org 行 折り返し」ということばで Google してみたら、幸運なことにほぼドンピシャの記事がみつかりました。

 

org-modeの行を折り返す設定

 

そこにでてくる(setq org-startup-truncated nil)というコードが使えそうです。

またもやsetq

少なくとも configure file では、変数設定のための elisp 語として、このsetqがよく使われていそうです。

つづくorg-startup-truncatedというアトムは、名前からおそらく Org 起動時 (startup) 設定のための関数のようです。

truncate は通り抜けるという意味ですから、org-startup-truncatedは、たぶん行を折り返さずにまっすぐ表示しつづける関数のようです。

そして、最後のnilというアトムは、Lisp によくでてくる基本的なことばで、他の言語だと false に対応しているとぼくは理解しています。

true (1) と false (0) の false です。だからorg-startup-truncated関数の機能をオフにする (つまり、行を折り返し表示する)、ということでしょう。

さて。では、このコードを.spacemacsのどこに置くか。上の記事は Emacs で Org をつかっている人向けの説明なので、Spacemacs でどうすればいいのかはかいていません。Emacs や Spacemacs についてしらべていると、これはよくあることですから気にしない、気にしない。

まずは上の「init 関数」にorg-startup-truncatedや、truncate という語がつかわれていないか検索し (C-s)、ないことを確かめます。

で、先ほどのコメントを思い出し、「user-config 関数」の中にこのコードを置いてみます。

そして、修正内容を実行するために、M-m f e R、あるいは Spacemacs を再起動。

うまく行きました。

みつけた Emacs Lisp をそのままつかっただけですが、とにかく.spacemacsに自分の気持ちを伝えることばをかいて、ぼくの気もちを伝えることに成功したワケです (やったぜ)。

 

4-j. ぼくの「user-init 関数」と「user-config 関数」

最後に、ぼくの今の段階の「user-init 関数」と「user-config 関数」の一部を、はずかしいですが紹介します。

複雑なことが好きではないので、かきこむ量も種類もできるだけ必要最小限にしているつもりです。

実際は、次節と次々節でお話しするキーバインディング設定と手づくり関数が、ここに加わっています。