投稿日: 2022-05-15 日 20:25

個人PCの TojoQK ユーザーの Laptop の設定
QEMU/KVM 上で動いている Guix System の設定

目次

はじめに

記事を書いたり将来何らかの動画の投稿をしたりすることを想定して、 GNU Guix System にプライベートと完全に分離した tojoqk 用の仮想OS(QEMU/KVM)を作成しました。 画面に個人的な通知が入ったり、 サイトの記事に個人的な情報が紛れこむリスクをなくすための対処としてプライベートと完全に分けることを目的としています。

Emacs の org-mode を用いた文芸的な方法で設定しているため、これをそのまま記事にしました。

注意事項: 流動的な記事

この記事は個人の tojoqk ユーザーの設定ファイルです。 そのためこの記事は流動的であり私が設定の変更を必要としたタイミングで更新されることに注意してください。 どれだけ大きな変更をしても一切変更履歴を残すことはありません(最終更新日なども残しません)。

この記事から文言を引用する場合には上記について十分注意してください。

<2022-05-22 日>: Google にインデックスされてしまったので、 変更した際にはなるべく過去の設定も残すようにして一応ドキュメントとして参照できるようにします。

Guix のマニフェストを生成するための準備

GNU Guix の profile のマニフェストを生成します。 この org-file の #+PROPERTY で下記の設定をしていて、 これにより Scheme のコードを文書中に含めた場合は org-mode の tangle という機能によって ~/manifest.scm ファイルに書き出せるようになっています。

#+PROPERTY: header-args:scheme :noeval :tangle ~/manifest.scm

必要なパッケージを宣言的に表現するために下記を manifest.scm 書き込みます。

(define manifest '())
(define (adjoin x l)
  (if (member x l)
      l
      (cons x l)))
(define-syntax-rule (install name)
  (set! manifest (adjoin 'name manifest)))

これにより、今後は (install <package>) と記載するだけで manifest 変数に必要なパッケージを追加できるようになりました。 このファイルの最後の方で manifest.scm を完成させます。

このファイルで C-c C-v C-t というコマンドを実行してから、 shell 上で guix package -m ~/manifest.scm を実行すれば必要なパッケージが全てインストールされます。

紛らわしいのですが、本記事中に出てくる (install <package>) は全部 Guix の話だと思ってください

Guix チャンネルの設定

手製のパッケージを利用するため、 tojo-tokyo の Guix Channel を導入します。 ~/.config/guix/channels.scmtangle しています。

(cons* (channel
    (name 'tojo-tokyo)
    (url "https://git.tojo.tokyo/tojo-tokyo-guix-channel.git")
    (introduction
     (make-channel-introduction
      "9da13b0110441fcd0ab8d36a6de9b78ccb4e775b"
      (openpgp-fingerprint
       "B775 914C 3270 E318 29AD  FD1A B348 8785 AB14 7405"))))
   %default-channels)

Guix System の設定

下記のように config.scm を設定します。

(use-modules (gnu)
             (gnu packages file-systems)
             (gnu packages gnome))
(use-service-modules desktop networking ssh xorg audio web spice)

(operating-system
 (locale "ja_JP.utf8")
 (timezone "Asia/Tokyo")
 (keyboard-layout
  (keyboard-layout "us" "altgr-intl"
                   #:options '("ctrl:nocaps")))
 (host-name "virtual")
 (users (cons* (user-account
                (name "tojoqk")
                (comment "TojoQK")
                (group "users")
                (home-directory "/home/tojoqk")
                (supplementary-groups
                 '("wheel" "netdev" "audio" "video")))
               %base-user-accounts))
 (packages
  (append (list (specification->package "nss-certs"))
          %base-packages))
 (services (cons* %desktop-services))
 (bootloader
  (bootloader-configuration
   (bootloader grub-bootloader)
   (targets '("/dev/sda"))
   (keyboard-layout keyboard-layout)))
 (file-systems
  (cons* (file-system
          (mount-point "/")
          (device "/dev/sda2")
          (type "ext4"))
         %base-file-systems))
 (swap-devices
  (list
   (swap-space (target "/dev/sda1")))))

初期化ファイルについて

ホームディレクトリ直下の ~/.init.sh ファイルに環境変数等の設定を書き込みます。 ~/.init.sh.xsession で読み込みます。

~/.init.sh に下記を追記:

# このファイルは .xsession から読み込まれます

Emacs の基本設定

まず、Emacs が必要なので Emacs をインストールします。

(install emacs)

tangle を使って ~/emacs.d/init.el ファイルを作成します。 org-mode で下記の記述によって ~/emacs.d/init.el から org-babel-load-file でこのファイルを読み込むようにします。

(org-babel-load-file "~/org/www/tojoqk-laptop.org")

バックアップファイルを作らないようにする

長い間有効にしてきた設定なのですが、正直このバックアップファイルに助けられたことがありません。 様々な状況において邪魔になることが多いためバックアップファイルは作らないことにします。

(setq make-backup-files nil)

インデントの設定

Emacs のデフォルト設定はインデントをしたときにタブと空白を混ぜてくるという嫌な感じになってます。 なので、 indent-tabs-modenil に設定することで空白のみでインデントするように変更します。 また、正直正確には理解できていないのですが indent-tabs-mode はバッファローカルな変数らしく、 setq ではなくて setq-default を使う必要があるようです。

(setq-default indent-tabs-mode nil)

文字コードの設定

念のため明示的に文字コードは utf-8-unix を使用するように指定しています。

(prefer-coding-system 'utf-8-unix)

undo-tree-mode の設定

undo を木を辿るような感じでできるようにするものです。 これが有効になっているだけ過去の編集履歴を失なうリスクがだいぶ下がるので少し安心できます。

(install emacs-undo-tree)
(global-undo-tree-mode)

ベルを無効化する

ベルが鳴らないようにします。

(setq ring-bell-function 'ignore)

見た目に関係する設定

スクロールバー、メニューバー、タブバーがあると画面が狭くなるので消しています。 ただメニュー機能は自体は割と有用なので迷ったときには F10 でメニューを出せることを覚えておくと便利です。

(scroll-bar-mode -1)
(tool-bar-mode -1)
(menu-bar-mode -1)
(tab-bar-mode -1)

Emacs のテーマ

Emacs のデフォルトのテーマ使います。 普段の環境では背景が黒いテーマを利用しているのですが、 人と画面共有をするときには白地に黒の方が実は見やすいということに気づいたので、 tojoqk ユーザーではデフォルトのままでよいという結論に至りました。

モードラインの設定

格好いいのため、Doom Emacs と同じモードラインを使います。

(install emacs-doom-modeline)

doom-mode-line や mode-line に関する設定をする:

(doom-modeline-init)
(setq doom-modeline-project-detection 'projectile)
(setq doom-modeline-buffer-file-name-style 'auto)
(setq doom-modeline-gnus t)
(setq doom-modeline-gnus-timer 2)
(column-number-mode t)

Helm 系

Helm に関する設定をします。 Helm はコマンドやファイル名を良い感じにあいまい検索できるものです。 Emacs の Help は F1 でも見れるので、helm の prefix には C-h を使うことにしています。

(install emacs-helm)

Helm の基本的な設定

(helm-mode t)
(global-set-key (kbd "M-x") 'helm-M-x)
(global-set-key (kbd "C-h") 'helm-command-prefix)

which-key-mode

which-key-mode はあまりコマンドを正確に覚えてなくても、途中まで覚えていれば表示してくれます。

(install emacs-which-key)

which-key-mode を有効にする

(which-key-mode)

プロジェクト管理

プロジェクトっぽいものを良い感じに管理してくれるものです。 正直なにがプロジェクトで何がプロジェクトでないのかはよく分かってませんが、 とりあえず git で管理されている範囲は勝手にプロジェクトとして扱われるようです。

(install emacs-projectile)

projectile-mode を有効にし、キーコンフィグをする

(projectile-mode 1)
(define-key projectile-mode-map (kbd "C-c p") 'projectile-command-map)

常に時刻が日本語で表示されるようにする

日本語で時刻が表示されるようにします。 この設定の必要性については Emacs の時刻表記が日本語から英語に変わる問題の解決法 を参照してください。

(setq system-time-locale nil)

Emacs の操作を録画する

主に Emacs での操作を人に共有するために使います。 このプラグインは ImageMagick に依存しています。

(install emacs-gif-screencast)
(install imagemagick)

gif-screenshot の設定:

(with-eval-after-load 'gif-screencast
  (define-key gif-screencast-mode-map (kbd "<f8>") 'gif-screencast-toggle-pause)
  (define-key gif-screencast-mode-map (kbd "<f9>") 'gif-screencast-stop))

Emacs を再起動する

(install emacs-restart-emacs)

Paredit

Lisp のコードを編集する際に必須です。 これがないと Lisp のコードを安心して書けません。

(install emacs-paredit)

下記の設定は Paredit-mode - WikEmacs を参考にしています。

(autoload 'enable-paredit-mode "paredit"
  "Turn on pseudo-structural editing of Lisp code."
  t)
(add-hook 'emacs-lisp-mode-hook       #'enable-paredit-mode)
(add-hook 'eval-expression-minibuffer-setup-hook #'enable-paredit-mode)
(add-hook 'ielm-mode-hook             #'enable-paredit-mode)
(add-hook 'lisp-mode-hook             #'enable-paredit-mode)
(add-hook 'lisp-interaction-mode-hook #'enable-paredit-mode)
(add-hook 'scheme-mode-hook           #'enable-paredit-mode)
(add-hook 'racket-mode-hook           #'enable-paredit-mode)

Org-mode 系

メインの環境ではなくプライベートな情報を含めないために設定は少なめです。 org-directory は www.tojo.tokyo のソースに設定します。 私の公開タスク的なページをサイト中に作る予定です。

(setq org-directory "/home/tojoqk/org/www/")

HTML 系

HTML を生成したときの validation-link は要らないので無効にします。

(setq org-html-validation-link nil)

org-refile

リファイルは一応有効にします。これで記事を書くのが少し楽になるかもしれません。

(setq org-refile-targets '((org-agenda-files :maxlevel . 3)))

org-agenda

org-directory 直下を org-agenda の対象にします。

(setq org-agenda-files (list org-directory))

キーバインドを設定します。

(global-set-key (kbd "C-c a") 'org-agenda)

TODO のキーワードを設定

  • やることは TODO
  • 待ち状態のタスクは WAIT
  • 完了したタスクは DONE
  • やめることにしたタスクは CANCELED
(setq org-todo-keywords
     '((sequence "TODO(t)" "WAIT(w)" "|" "DONE(d)" "CANCELED(c)")))

今やらなくていいタスクを org-agenda に表示しないようにする

SCHEDULE が設定されているタスクで、 まだ始まっていないのに org-agenda で表示されるのがうっとうしいため必要な設定です。

(setq org-agenda-todo-ignore-scheduled 'future)

タスクをブロックする系の設定

TODO は階層構造になることがありサブタスクが完了してからでないとタスクを完了できないようにしたり、 順番にやらないといけないタスクなどでまだ始められないタスクの表示を灰色にしたりするための設定です。

org-enforce-todo-dependencies を設定すると、 子の TODO が全て終わりになってからでないと DONE にできなくなります。

org-agenda-dim-blocked-tasks を設定すると、 org-agenda でタスクを見たときにブロックされたタスクが暗く表示されます。

org-enforce-todo-checkbox-dependencies は明示的にデフォルトと同じ nil に設定します。 これは一見有効にしたくなる設定ですが、これが t だとチェックボックスが全てチェックされた状態にならないと、前述した org-agenda-dim-blocked-tasks の効果により実際にはやらなければならない TODO のタスクが灰色になってしまう問題が生じます。

(setq org-enforce-todo-dependencies t)
(setq org-agenda-dim-blocked-tasks t)
(setq org-enforce-todo-checkbox-dependencies nil)

org-store-link

Emacs の任意の場所のリンクを取得する機能です(正直あまり使いこなせてない…)。

(global-set-key (kbd "C-c l") 'org-store-link)

org-capture

C-c c で org-capture を使ってメモできるようにします。 このメモは基本的に公開する予定です。

(global-set-key (kbd "C-c C") 'org-capture)
(setq org-default-notes-file (concat org-directory "task.org"))

org-capture-templates の設定をします。

(setq org-capture-templates
      `(("t" "公開タスク" entry (file+headline "" "やること")
         "* TODO %?\n%u"
         :empty-lines 1)
        ("C" "公開メモ" entry (file+headline "" "メモ")
         "* TODO %?\n%u"
         :empty-lines 1)))

org-table

org-table-automatic-realign を無効化しないと org-capture で表に追記したときに謎の空行が生じて表が破壊される現象を観測していて、 これを防ぐために nil に設定しています。

(setq org-table-automatic-realign nil)

htmlize

htmlize は良い感じに org-mode を HTML で出力するのに必要なものです。

(install emacs-htmlize)

org-startup 系

org-mode のファイルを開いたときにインデントされていてかつ折り畳まれた状態にします。

(setq org-startup-indented t)
(setq org-startup-folded t)

org-babel

org-babel で使いたい言語を指定します。 毎回、本当に実行していいか聞かれるとうっとうしいため org-confirm-babel-evaluatenil に設定しています。

(org-babel-do-load-languages
 'org-babel-load-languages
 '((shell . t)
   (emacs-lisp . t)
   (scheme . t)
   (acl2 . t)
   (lisp . t)))
(setq org-confirm-babel-evaluate nil)

org-tree-slide

Org-mode で Slide 発表をするためのソフトウェア

(install emacs-org-tree-slide)

www.tojo.tokyo 用の設定

RSS の配信のために ox-rss を利用するため、 emacs-org-contrib パッケージをインストールします。

(install emacs-org-contrib)

org-publish を直接使わずに publish-www というラッパー関数を定義して使っています。 html-head/post などが激長でとても雑にサイトのヘッダを作成していることがバレてしまっていますが気にしないこととします。

(defun publish-www (arg)
  (interactive "P")
  (let* ((base-directory "~/org/www")
         (publishing-directory "~/site/www/")
         (html-head/share "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/><link rel=\"icon\" type=\"image/png\" href=\"/static/image/QK.png\"/><link rel=\"stylesheet\" href=\"/static/css/base.css\"/>")
         (html-head/index
          (concat html-head/share "<link rel=\"stylesheet\" href=\"/static/css/index.css\"/>"))
         (html-head/post
          (concat html-head/share "<link rel=\"stylesheet\" href=\"/static/css/post.css\"/>"))
         (html-head/projects-index
          (concat html-head/share "<link rel=\"stylesheet\" href=\"/static/css/projects-index.css\"/>"))
         (html-head/projects-post
          (concat html-head/share "<link rel=\"stylesheet\" href=\"/static/css/post.css\"/>"))
         (html-preamble/share "<div class=\"nav\"><div class=\"nav-bar\"><div class=\"nav-list\"><div class=\"nav-logo\"><a href=\"/\">TojoQK</a></div><div class=\"nav-item\"><a href=\"/about-me.html\">About me</a></div><div class=\"nav-item\"><a href=\"/projects/index.html\">Projects</a></div><div class=\"nav-item\"><a href=\"/index.xml\">RSS</a></div><div class=\"nav-item\"><a href=\"/contact.html\">Contact</a></div></div></div></div>")
         (html-preamble/post (concat html-preamble/share "<div class=\"head-wrap\"><div class=\"head\"><p>投稿日: %d</p></div></div>"))
         (html-preamble/index html-preamble/share)
         (html-preamble/projects html-preamble/share)
         (html-postamble "<p class=\"author\">著者: <a href=\"/about-me.html\">%a</a> (%e)</p><p>Twitter: <a href=\"https://twitter.com/tojoqk\">@tojoqk</a></p><p>Mastodon: <a href=\"https://mastodon.tojo.tokyo/@tojoqk\">@tojoqk</a></p><p><a href=\"/index.xml\">RSS を購読する</a></p><p><a href=\"/\">トップページに戻る</a></p>"))
    (let ((user-full-name "Masaya Tojo")
          (user-mail-address "masaya@tojo.tokyo")
          (org-publish-project-alist
           `(("www-post"
              :language "ja"
              :base-directory ,base-directory
              :with-email t
              :base-extension "org"
              :publishing-directory ,publishing-directory
              :publishing-function org-html-publish-to-html
              :exclude "index.org"
              :html-head ,html-head/post
              :html-preamble ,html-preamble/post
              :html-postamble ,html-postamble)
             ("www-index"
              :language "ja"
              :base-directory ,base-directory
              :with-email t
              :base-extension "org"
              :publishing-directory ,publishing-directory
              :publishing-function org-html-publish-to-html
              :exclude ".*"
              :include ("index.org")
              :html-head ,html-head/index
              :html-preamble ,html-preamble/index
              :html-postamble ,html-postamble)
             ("www-projects-index"
              :language "ja"
              :base-directory ,(concat base-directory "/projects")
              :with-email t
              :base-extension "org"
              :exclude ".*"
              :include ("index.org")
              :publishing-directory ,(concat publishing-directory "/projects")
              :publishing-function org-html-publish-to-html
              :html-head ,html-head/projects-index
              :html-preamble ,html-preamble/projects
              :html-postamble "")
             ("www-projects-post"
              :language "ja"
              :base-directory ,(concat base-directory "/projects")
              :with-email t
              :base-extension "org"
              :exclude "index.org"
              :publishing-directory ,(concat publishing-directory "/projects")
              :publishing-function org-html-publish-to-html
              :html-head ,html-head/projects-post
              :html-preamble ,html-preamble/projects
              :html-postamble ,html-postamble)
             ("www-static"
              :language "ja"
              :base-directory ,base-directory
              :base-extension "css\\|js\\|png"
              :recursive t
              :publishing-directory ,publishing-directory
              :publishing-function org-publish-attachment)
             ("www-rss"
              :language "ja"
              :base-directory ,base-directory
              :base-extension "org"
              :html-link-home "https://www.tojo.tokyo/"
              :html-link-use-abs-url t
              :rss-extension "xml"
              :rss-image-url "https://www.tojo.tokyo/static/image/QK.png"
              :publishing-directory ,publishing-directory
              :publishing-function (org-rss-publish-to-rss)
              :section-numbers nil
              :exclude ".*"
              :include ("index.org")
              :table-of-contents nil))))
      (when arg
        (delete-directory publishing-directory t))
      (let ((update-p (and arg t)))
        (org-publish-project "www-post" update-p)
        (org-publish-project "www-index" update-p)
        (org-publish-project "www-projects-index" update-p)
        (org-publish-project "www-projects-post" update-p)
        (org-publish-project "www-static" update-p)
        (org-publish-project "www-rss" update-p)))))

www.tojo.tokyo にデプロイするのに、Makefile を利用しています。

(install make)

www.tojo.tokyo にデプロイするのに rysnc を利用しています。

(install rsync)

StumpWM

<2022-05-22 日>: ゲームを紹介する際にタイル型のウィンドウマネージャーだとウィンドウのタイトルが分かりにくいことが問題だったため、現在は StumpWM を使用していません。 しかし、下記の設定に従えば問題なく StumpWM の設定ができます。 メインで使用しているプライベートなユーザーでは StumpWM を使用し続けています。 Guix System での StumpWM の設定に関する日本語の情報は有益かもしれないので設定を残しています。

Common Lisp で実装され Common Lisp で設定ができ、 Common Lisp を使ってオンラインハッキングできる Window Manager である、 StumpWM を採用しています。

StumpWM の導入:

(install stumpwm)

クリックすることでウィンドウにフォーカスできるようにする

これは StumpWM のデフォルト設定の一番きつい問題だと思っていて、 クリックしたときにフォーカスしてくれないんですよね。 普通クリックしたらフォーカスするんでクリックしたあとに、 何か文字を入力したらそっちのウィンドウに文字が入力されるんですが、 デフォルトではそうではないので元のウィンドウに文字入力しちゃうことが多いです。

パスワードの入力とかで結構重い事故を引き起しかねないので最重要設定です。

(setq *mouse-focus-policy* :click)

SLIME からアクセスできるようにする

SLIME を使う時点で SBCL と SLIME は必須なのでインストールします。

(install sbcl)
(install emacs-slime)

下記のように設定することで SLIME から StumpWM の Lisp 環境に入れるようになります。 EmacsWiki: Stump WM を参考にしています。

;; XXX: SLIME のバージョンが変わったら書き換える
;;      いつかバージョンアップされても大丈夫なように修正する
(load "~/.guix-profile/share/emacs/site-lisp/slime-2.27/swank-loader.lisp")
(swank-loader:init)
(defcommand swank () ()
    (swank:create-server :port 4005
                       :style swank:*communication-style*
                       :dont-close t)
  (echo-string (current-screen)
               "Starting swank. M-x slime-connect RET RET, then (in-package stumpwm)."))

Emacs Wiki の方では swank の起動までやっていたのですが、 別に常に SLIME から接続できた方が嬉しいということはないので、 StumpWM で C-t ; swank を実行した後に swank が起動するようにしています。 Emacs で SLIME を利用していれば、 slime-connect RET RET と実行するだけで stumpwm の REPL に入れるようになります。

なお、Guix の環境でこれを実行したら SB-CLTL2require できないぞ!っていうエラーがでて困りました。 error when compiled with sbcl 2.0.3 · Issue #760 · stumpwm/stumpwm · GitHub によると、 環境変数 SBCL_HOME を正しく設定して sb-cltl2 が読めるようにしておく必要があるらしいです。 これは StumpWM の設定じゃなくて後の Lisp の設定のところで記述しておく必要がありそうなことなのですが、 実際ここで必要になっているのでとりあえずここで設定しておきます。

export SBCL_HOME=~/.guix-profile/lib/sbcl/

モードラインの設定

Guix でインストールした StumpWM のモジュールを読み込むには、 set-module-dir 関数を使用します。

(set-module-dir "~/.guix-profile/share/common-lisp/sbcl")

必要なモジュールを Guix でインストールします。

(install sbcl-stumpwm-cpu)
(install sbcl-stumpwm-mem)
(install sbcl-stumpwm-net)
(install sbcl-stumpwm-disk)
(install sbcl-stumpwm-stumptray)

モードラインの更新頻度を設定します。 1秒に一回くらい更新することにします。

(setq *mode-line-timeout* 1)

モードラインの設定

(load-module "mem")
(load-module "cpu")
(load-module "disk")
(load-module "net")
(load-module "stumptray")
;; (stumptray:add-mode-line-hooks)

(setq *window-format* "%m%n%s%c")
(setq disk:*disk-modeline-fmt* "Disk: %a")
(setq net:*net-device* "wlp0s20f3")
(setq *screen-mode-line-format* "[^B%n^b] %W^>%C %D%M%l             ")
(mode-line)

*screen-mode-line-format* の右の謎の空白は stumptray 用のスペースです。

キーバインドの設定

起動するターミナルの変更

デフォルトでは C-c c または C-c C-c で xterm を起動するという、 xterm 推しを感じます。 ちゃんと設定すれば普通に使えるものだというのは理解していますが正直 そもそも Emacs ばかり使うし Terminal の設定に労力をかけたくないので、 別のターミナルに変更します。

私は sakura というターミナルをメインで使っているのでこれにします。

(install sakura)
(define-key *root-map* (kbd "c") "exec sakura")
(define-key *root-map* (kbd "C-c") "exec sakura")

スクリーンショットの設定

スクリーンショットには scrot 使います。

(install scrot)
(defparameter *scrot-bindings*
  (let ((m (make-sparse-keymap)))
    (define-key m (stumpwm:kbd "a") "exec sh -c 'cd ~/Pictures ; scrot'")
    (define-key m (stumpwm:kbd "s") "exec sh -c 'cd ~/Pictures ; scrot -s'")
    (define-key m (stumpwm:kbd "w") "exec sh -c 'cd ~/Pictures ; scrot -u'")
    m))
(define-key *root-map* (kbd "C-s") '*scrot-bindings*)

xsession に関する設定

xsession に関連する設定をします。 なお、この章の Shell のコードは ~/.xsessiontangle しています。

ベルの無効化

ベルを無効化するために xset を導入します。

(install xset)

ベルの無効化をします。

xset b off

初期化ファイルの読み込み

基本的に X しか使わないため、環境変数等の読み込みは .xsession の段階でやります。 ホームディレクトリ直下の ~/.init.shsource で読みこみます。

source ~/.init.sh

~/.Xresources を xrdb で読み込む

(install xrdb)
xrdb ~/.Xresources

setxkbmap で ctrl:nocaps にする

(install setxkbmap)
setxkbmap us -option ctrl:nocaps

タップでクリックできるようにする

この設定には xinput が必要です。

(install xinput)

私の環境では下記を実行することで、タップでクリックできるようになります。

xinput set-prop 'DLL09FF:01 06CB:CE39 Touchpad' 'libinput Tapping Enabled' 1

xss-lock を有効にする

サスペンドしたあとに画面ロックがかかるようにします。

(install xss-lock)
(install slock)
xss-lock -- slock &

xrandr でディスプレイのサイズを設定する

(install xrandr)
xrandr --output Virtual-1 --mode 1920x1200

StumpWM を起動する

exec stumpwm

アイコンの設定

(install gnome-icon-theme)
(install adwaita-icon-theme)

日本語入力

uim

Emacs 以外では uim を使用します。

(install uim)
(install uim-gtk)

Guix では uim パッケージに SKK も含まれています。

uim を利用できるようにするための設定を ~/.init.sh に下記を追記:

uim-toolbar-gtk3-systray &
export GTK_IM_MODULE=uim
export QT_IM_MODULE=uim
uim-xim &
export XMODIFIERS=@im=uim

Emacs では ddskk を使用するため、 Emacs では uim が動作しないように設定します。 下記を ~/.Xresources 追記します。

Emacs*useXIM: false

Emacs

ddskk を使用します。

(install emacs-ddskk)

default-input-method に SKK を設定します。

(setq default-input-method "japanese-skk")

システムサイドの辞書には skk-get コマンドでダウンロードした辞書を使います。

(setq skk-large-jisyo "~/.emacs.d/skk-get-jisyo/SKK-JISYO.L")

フォントの設定

プログラミング用には font-hermit, 日本語用のフォントとしては font-google-noto を利用します。

(install font-hermit)
(install font-google-noto)

Emacs の Font 設定

Emacs では Hermit と Noto Sans Mono CJK の二つを使います。 'face-font-rescale-alist に良い感じの値を入れることで日本語のフォントのサイズを調節します。 これをやらないと org-mode 表を作ったときに表がズレます。

フォントの設定をする:

(when (display-graphic-p)
  (set-face-attribute 'default nil :family "Hermit" :height 120)
  (set-fontset-font (frame-parameter nil 'font)
                    'japanese-jisx0208
                    (font-spec :family "Noto Sans Mono CJK JP"))
  (add-to-list 'face-font-rescale-alist
               '(".*Noto Sans Mono CJK JP.*" . 1.2)))

フォントの管理や設定のために fontconfig パッケージをインストールします:

(install fontconfig)

Guix パッケージ

guix パッケージをインストールしておかないと root ユーザーの guix を使ってしまいます。 トラブルの元なのでインストールしておきます。

(install guix)

ロケール

日本語のロケールを利用するために必要です。

(install glibc-locales)

日本語ロケールを使用するために ~/.init.sh で LANG 環境変数を設定します。

export LANG=ja_JP.UTF-8

GnuPG

GPG で秘密鍵や公開鍵を管理し、暗号化したり署名したりするのに使います。 pinentrygpg で秘密鍵にかけたパスフレーズを入力するのに使います。

(install gnupg)
(install pinentry)

NetworkManager

私は NetworkManager というソフトウェアを利用していて、 このソフトウェアは Guix のシステム側の方でインストールされ動作しています。

ユーザー側の設定として必要なのは、 nm-applet 起動のみです。 ~/.init.sh に下記を追記します。

nm-applet &

シェルから使う便利ソフトウェア

file

file コマンド、これを使うとファイルの種類がなんとなく分かります。

(install file)

wget

ファイルをダウンロードするのに使います。

(install wget)

rlwrap

REPL の環境が貧弱な対話的なソフトウェアに対して readline を有効にするために使用します。

(install rlwrap)

標準出力をクリップボードに送る

xsel にはおそらく他の用途もあると思うのですが、 私は標準出力をクリップボードを送る用途以外で使用したことがありません。

(install xsel)

音に関する設定

pulseaudio を使って音を管理します。 pavucontrol は音量を調節したり設定をしたりするために使います。

(install pulseaudio)
(install pavucontrol)

システムトレイから音量を簡単に調節できると楽なので volumeicon をインストールします。

(install volumeicon)

~/.init.sh で volumeicon を起動します。

volumeicon &

通知に関する設定

notify-send

通知のデバッグのために、 libnotify をインストールします。 notify-send コマンドが使えるようになります。

(install libnotify)

Dunst

dunst を使って通知を管理します。

(install dunst)

ターミナル

なんとなく sakura というターミナルを利用しています。

(install sakura)

Scheme 系

Guile

(install guile)

Guix でインストールした Guile のモジュールを使うために下記を .init.sh に追記します。

export GUILE_EXTENSIONS_PATH=~/.guix-profile/lib

Emacs 側の設定

Geiser という統合開発環境を利用します。

(install emacs-geiser-guile)
(setq geiser-active-implementations '(guile))

Racket

(install racket)

Emacs の設定

Emacs からは racket-mode を使用して Racket を使います。

(install emacs-racket-mode)

ACL2

定理証明支援系、tojo-tokyo チャンネルで定義されています。

(install acl2)

TAGS_ACL2_DOC を有効にするため .init.sh に下記を追記します。

export TAGS_ACL2_DOC=t

Emacs 側の設定

ACL2 の emacs-acl2.el ファイルを読み込みます。 ~/acl2-8.4/emacs/emacs-acl2.el は編集が必要なファイルなので注意が必要です。

(defvar acl2-skip-shell t)
(when (file-directory-p "~/acl2-8.3")
  (load "~/acl2-8.4/emacs/emacs-acl2.el")
  (put 'defthm 'lisp-indent-function 1))

ob-acl2

私が作成した ob-babel に ACL2 を対応させるためのプログラムです。 tojo-tokyo の Guix チャンネルに登録されています。 まあまあ便利で ACL2 の記事を作成するときに使っているものなのですが、 ACL2のプログラムを*shell*バッファに流し込む仕様のため危険です。 これは、もともと ACL2 の Emacs サポート的に ACL2 は *shell* バッファで実行するのが普通という感じの文化みたいなので仕方がない感じはするのですが正直危ないので人におすすめできません。

(install emacs-ob-acl2)
(add-to-list 'org-src-lang-modes '("acl2" . lisp))

Common Lisp

今は SBCL をメインに利用しています。

(install sbcl)

Emacs の設定

SLIME を起動せずに Lisp のプログラムを扱う場合にインデントが良い感じになります。

(add-hook 'lisp-mode-hook
          (lambda ()
            (set (make-local-variable 'lisp-indent-function)
                 'common-lisp-indent-function)))

統合開発環境として SLIME をインストールします。

(install emacs-slime)

C コンパイラ

C 言語のプログラムをコンパイルするのに使います。

(install gcc-toolchain)

基本的に C 言語は GNU スタイルで書くのでインデントのスタイルの変更はしません。

デバッガ

(install gdb)

ブラウザ

GNU IceCat

Firefox を GNU が改造したブラウザです。メインで利用しています。

(install icecat)

ungoogled-chromium

Web サイト側の理由で GNU IceCat だと何らかの支障がある場合に ungoogled-chromium を使います。

(install ungoogled-chromium)

画像編集系

画像変換をコマンドでさっとやりたいときに ImageMagick を利用しています。

(install imagemagick)

エディタ

Emacs

メインで使用しているエディタです。

(install emacs)

nvi

シェルからちょっとしたファイルの変更をするのに利用するエディタです。

(install nvi)

OpenSSH

サーバーに接続するのに使用します。

(install openssh)

画像ビューア

主に Ristretto を使っています。 Xfce4 を使っていた時代の名残りです。

(install ristretto)

サムネイルサービス

サムネイルを生成してくるソフトウェアである tumbler を導入します。

(install tumbler)

マルチメディア関連

音楽や動画の再生のためには vlc を利用しています。

(install vlc)
(install obs)
(install pitivi)

Git による Version 管理

(install git)

.gitconfig を下記のように設定します。

[user]
        email = masaya@tojo.tokyo
        name = Masaya Tojo
        signingkey = B3488785AB147405
[commit]
        gpgsign = true
[init]
        defaultBranch = main

GNU にパッチを送るときのために git:send-email をインストールしています。

(install git:send-email)

Emacs 側の設定

Magit を使って git の操作を楽にします。 browse-at-remote は Emacs 上のコードに対応する場所をブラウザで開くパッケージです。

私は主に自前の cgit サーバーを使っていますが、 git 側の設定少しを工夫すれば私のサイトのリポジトリでも問題なく動作します(ほとんどの人にとってはおそらく関係のない問題です)。

(install emacs-magit)
(install emacs-browse-at-remote)

browse-at-remote のキーコンフィグをする

(global-set-key (kbd "C-c b r") 'browse-at-remote)

ディスプレイ輝度のコントロールする

light パッケージを利用して輝度を調節します。

(install light)

おわりに

だいたい設定は完了しました。 最後に下記を ~/manifest.scm に追記して tojoqk ユーザーの laptop の設定は完了です。

(specifications->manifest (map symbol->string manifest))

必要なパッケージは、 このファイルで C-c C-v C-t を実行してから guix package -m ~/manifest.scm を実行することで全てインストールされます。

著者: Masaya Tojo (masaya@tojo.tokyo)

Twitter: @tojoqk

Mastodon: @tojoqk

RSS を購読する

トップページに戻る