博士以前

人間です

土曜日とEmacs

エディタはEmacsを使っている。特に宗教上の理由などはなく、雛鳥が最初に見たものをずっと親だと思うように、初めて使ったものがEmacsだったというだけだ。 Emacsの魅力の一つは拡張性の高さだろう。設定ファイルで自分好みに魔改造できるし、世界中のいろいろな人が色々と便利なパッケージを作っている。

僕の主な用途は数値計算用のコーディングとLaTeX原稿書きだ。 LaTeXというとTeXShopなどの統合環境を使っている人が周りには多いけど、それを見るといつもの逆張り精神が出てきてしまい結果LaTeXにもemacsを使っている。 EmacsにはAUCTeXという強力なパッケージがあって、コマンドの補完等が非常に便利であるし、preview-latexというパッケージと組み合わせると、エディタ内で数式のプレビューもできてすごい。

そういうふうにEmacsを愛用しているわけだけど、プログラミングで食べているわけでもないのでまあ使えればいいやという感じで使ってきた。 それで今日は暇だったので(本当か?)、もうちょっと使いやすくしようと思って色々弄っていた。

テーマを変えたい

デフォルトのテーマは味気ない。適当にググったところ

  • Spacemacs (spacemacsというEmacsの亜種(?)のテーマらしい)

  • Solarized (Macのターミナルのテーマとして紹介されているのをよく見る)

  • Tomorrow (よくわからないけどtomorrowって名前が良い)

あたりが良さそう。コード書きの時はダークなテーマのほうが良い気がするけど、LaTeX原稿書きの時はホワイトの方が読みやすいかなあという気もする。 とりあえずspacemacs-light をデフォルトにした。こんな感じになる。 f:id:predoc:20180120220319p:plain ちなみにpreview-latexを使うとこんな感じでエディタ内に数式を表示できるので、ちゃんと書けてるかどうかチェックするのに便利。

フレームサイズを画面のちょうど半分にできると嬉しいんだけど…

画面の左半分にTeXのソースファイル、右半分にコンパイルしたPDFを表示したいということはよくある。 だから、起動時に自動的にEmacsのフレームが画面のちょうど左半分のサイズになってくれると嬉しい。 特に、複数のPCで同じ設定ファイルを共有しているので、マシンに応じて適切なサイズを自動で選んで欲しい。 もちろんこういうのはコンピュータの得意分野のはずだ。

"emacs サイズ 設定"みたいなキーワードでググると、固定値で横に何文字、縦に何行かを指定する方法は出てくるのだけど、ディスプレイに合わせて調節するやり方がなかなか見つからない。 サイズを取得して、それを固定値のところに入れればいいはずなので例えば次のように書いてみる

(setq half-width (/ (display-pixel-width) 2))
(setq default-frame-alist
    '((left   . 0)
      (top    . 0)                 
      (width  . (text-pixels . half-width)) 
      (height . (text-pixels . 600))))

が、これはうまくいかない。なぜ。Lisp雑魚つらい。 *1

さらにググってみたところ代替案としてautofit-frame というパッケージを使えばよいことがわかった。 オプション等々はこのページを参考にして設定する。 設定ファイル(init.el)には次のように書いた*2

(use-package autofit-frame
  :config
  (add-hook 'after-make-frame-functions 'fit-frame)
  (setq fit-frame-max-width-percent 50) ;最大でも画面の左半分を超えないようにする
  (setq fit-frame-min-width 65) ;ここは適当に65文字
  (setq fit-frame-min-height 70)) ;縦ははみ出ても問題ないはずなので多めの70行を指定

fit-frame-min-widthとfit-frame-min-heightでそれぞれ横と縦の最小値を設定する。単位は文字数(widthの場合)と行数(heightの場合)。 autofit-frame は開くファイルの内容に応じて自動的に横幅を決定してくれる。 横に長々書いてあるコードは横長に表示される。 それを (setq fit-frame-max-width-percent 50) によって長くても横幅が全体の50%を超えないように設定することで、一応望んでいたことはできた。

ベスト・プラクティス…

とにかくググって情報が古すぎず、良さそうに見えるものをコピペして使っているのが現状なので、絶対バッドノウハウが含まれているはずである。 助けて…

追記

こちらの記事を参考にしたところ、以下のようにしても画面半分のフレームサイズにできた

(when (window-system)
  (set-frame-size
   (selected-frame)
   (- (/ (/ (x-display-pixel-width) 2) (frame-char-width)) 1)
   (- (/ (x-display-pixel-height) (frame-char-height)) 1)))

autofit-frameは僕の環境と微妙にconflictして表示が崩れたり、ミニバッファのサイズがおかしくなったりしたのでこのやり方のほうが良さそう。 ただし、なぜか(tool-bar-mode 0)を書いてツールバーを消しておいて、更にこれより後方に上記の設定を入れないと上手くいかない。 内部でどういう手順で設定が反映されるかに依っているのだろうが今の僕には解明できなかった…

*1:というかどのプログラミング言語もまともに勉強したことがない。つらい

*2:通常の(?)require ではなくuse-package を使っている。こっちのほうがモダンらしい。