~taiju/Taix

My personal computer

d834c66 channel: Remove ibus-anthy.

~taiju pushed to ~taiju/taix git

2 days ago

ded00e3 package: Add fzf.

~taiju pushed to ~taiju/taix git

8 days ago

#Taix

個人用端末 (Taix) の構成.

OS は GNU Guix を使用し, 可能な限り宣言的に構成を記述している.

  1. Guix の設定
    1. Guix の設定ファイルの適用
      1. 前処理
      2. システムのセットアップ
      3. ホームのセットアップ
      4. パッケージのセットアップ
      5. 各設定ファイルのリンク
    2. チャンネルの設定ファイル
      1. NonGuix チャンネルの定義
      2. Guix 'R Us チャンネルの定義
      3. Taix チャンネルの定義
    3. システムの設定ファイル
      1. libinput の設定
    4. ホームの設定
    5. パッケージの設定
      1. デスクトップ
      2. パッケージマネージャ
      3. Emacs
      4. シェル
      5. アプリケーション
      6. フォント
      7. 開発
      8. GNU Build System
      9. ユーティリティ
      10. 関数定義
        1. with-poppler-data
  2. Taix チャンネル
    1. pdf.scm
  3. Emacs の設定
    1. Emacs の設定ファイル
    2. プリミティブ実装部分のカスタマイズ
      1. dispnew.c
      2. fontset.c
      3. frame.c
      4. xdisp.c
      5. editfns.c
    3. パッケージのカスタマイズ
      1. ace-window.el
      2. files.el
      3. browse-url.el
      4. company.el
      5. minibuffer.el
        1. 参考
      6. custom.el
      7. battery.el
      8. time.el
      9. electric-pair.el
      10. eldoc.el
      11. paredit.el
      12. rcirc.el
      13. em-cmpl.el
      14. icomplete.el
      15. startup.el
      16. org*.el
        1. org.el
        2. org-agenda.el
        3. org-capture.el
      17. org-roam*.el
        1. org-roam-migrate.el
        2. org-roam-mode.el
        3. org-roam-node.el
        4. org-roam-graph.el
        5. org-roam-capture.el
        6. org-roam-db.el
      18. org-present
      19. ob-async.el
      20. ox-gfm.el
      21. projectile.el
      22. scroll-bar.el
      23. sendmail.el
      24. skk*.el
        1. skk-kanagaki.el
        2. skk-tut.el
        3. skk-vars.el
      25. smtpmail.el
      26. which-key.el
      27. faces.el
      28. ibuffer.el
      29. bash-completion.el
      30. projectile.el
      31. server.el
      32. cus-edit.el
      33. editorconfig.el
      34. inf-lisp.el
      35. slime.el
      36. lsp-mode.el
      37. yasnippet.el
      38. copyright.el
      39. geiser-guile.el
      40. geiser-repl.el
      41. simple.el
    4. 変数定義
      1. my-sans-serif-font
      2. my-serif-font
      3. guix-source-path
    5. 関数定義
      1. my-add-hooks
      2. my-toggle-delete-trailing-whitespace-on-save
  4. Nyxt の設定
    1. Nyxt の設定ファイル
    2. Nyxt のバッファ設定
    3. Nyxt のコマンド定義
      1. copy-tver-streaming-url
      2. play-tver-movie-on-mpv
      3. play-tver-movie-on-mpv-x2
    4. 関数定義 1. make-streaming-url 2. make-mpv-command
    5. Nyxt の Common Lisp バージョン
  5. SBCL の設定
    1. ASDF の設定
    2. QuickLisp の設定
    3. CFFI の設定
  6. フォントの設定

#Guix の設定

#Guix の設定ファイルの適用

以下の手順を実行して, Guix を設定する.

#前処理

このファイルから各種設定ファイルを生成する.

emacs -Q --batch --eval "(progn (require 'ob-tangle) (with-current-buffer (find-file-noselect \"taix.org\") (org-babel-tangle)))"

チャンネル情報を更新する.

guix pull

#システムのセットアップ
sudo guix system reconfigure guix-config/system-config.scm

#ホームのセットアップ
# guix home reconfigure guix-config/home-config.scm

#パッケージのセットアップ
guix package --manifest=guix-config/package-config.scm

#各設定ファイルのリンク

GNU Stow を使用し, 生成された各設定ファイルを規定のパスにリンクする.

cd dotfiles
stow -vt $HOME emacs.d guix nyxt sbcl fontconfig

#チャンネルの設定ファイル

チャンネルの設定ファイルは, 下記の構成で記述されている.

<<ヘッダ行>>

(cons*
 <<custom-channels>>
 %default-channels)

出力されたファイル: dotfiles/guix/.config/guix/channels.scm

#NonGuix チャンネルの定義

NonGuix をチャンネルに加える.

(channel
 (name 'nonguix)
 (url "https://gitlab.com/nonguix/nonguix")
 (introduction
  (make-channel-introduction
   "897c1a470da759236cc11798f4e0a5f7d4d59fbc"
   (openpgp-fingerprint
    "2A39 3FFF 68F4 EF7A 3D29  12AF 6F51 20A0 22FB B2D5"))))

#Guix 'R Us チャンネルの定義

emacs-edge などを提供している WhereIsEveryone の guixrus をチャンネルに加える.

(channel
   (name 'guixrus)
   (url "https://git.sr.ht/~whereiseveryone/guixrus")
   (introduction
    (make-channel-introduction
     "7c67c3a9f299517bfc4ce8235628657898dd26b2"
     (openpgp-fingerprint
      "CD2D 5EAA A98C CB37 DA91  D6B0 5F58 1664 7F8B E551"))))

#Taix チャンネルの定義

既存のチャンネルに存在しないパッケージを管理するために, 独自チャンネルを追加する.

(channel
 (name 'taix)
 (url "https://git.sr.ht/~taiju/taix"))

#システムの設定ファイル

システムの設定ファイルは, 下記の構成で記述されている.

<<ヘッダ行>>

(use-modules (gnu)
             (nongnu packages linux)
             (nongnu system linux-initrd))

(use-service-modules desktop
                     networking
                     ssh
                     xorg
                     docker
                     virtualization)

(operating-system
  (kernel linux)
  (initrd microcode-initrd)
  (firmware (list linux-firmware))
  (locale "ja_JP.utf8")
  (timezone "Asia/Tokyo")
  (keyboard-layout
   (keyboard-layout
    "jp"
    #:options
    '("ctrl:nocaps")))
  (host-name "Taix")
  (users (cons* (user-account
                 (name "taiju")
                 (comment "Taiju HIGASHI")
                 (group "users")
                 (home-directory "/home/taiju")
                 (supplementary-groups
                  '("wheel" "netdev" "audio" "video" "docker" "kvm" "libvirt")))
                %base-user-accounts))
  (packages
   (append
       (list (specification->package "nss-certs")
             (specification->package "font-google-noto"))
       %base-packages))
  (services
   (append
       (list (service gnome-desktop-service-type)
             (set-xorg-configuration
              (xorg-configuration
               (keyboard-layout keyboard-layout)
               (extra-config (list
                              <<libinput-config>>))))
             (service docker-service-type)
             (service libvirt-service-type
                      (libvirt-configuration
                       (unix-sock-group "libvirt")))
             (service virtlog-service-type)
             (extra-special-file "/var/lib/gdm/.config/fontconfig/fonts.conf"
                                 (plain-file "gdm-fonts.conf"
                                             "<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>
  <dir>/run/current-system/profile/share/fonts/</dir>
</fontconfig>
")))
       %desktop-services))
  (bootloader
   (bootloader-configuration
    (bootloader grub-efi-bootloader)
    (targets '("/boot/efi"))
    (keyboard-layout keyboard-layout)))
  (mapped-devices
   (list (mapped-device
          (source
           (uuid "6563ab41-2324-469f-9664-683cf4ba0065"))
          (target "cryptroot")
          (type luks-device-mapping))
         (mapped-device
          (source
           (uuid "738e914a-a68a-4c4b-b7e1-62dda98cd2f8"))
          (target "crypthome")
          (type luks-device-mapping))))
  (file-systems
   (cons* (file-system
            (mount-point "/boot/efi")
            (device (uuid "A0B0-3FC0" 'fat32))
            (type "vfat"))
          (file-system
            (mount-point "/")
            (device "/dev/mapper/cryptroot")
            (type "ext4")
            (dependencies mapped-devices))
          (file-system
            (mount-point "/home")
            (device "/dev/mapper/crypthome")
            (type "ext4")
            (dependencies mapped-devices))
          %base-file-systems)))

出力されたファイル: system-config.scm

#libinput の設定

タッチパッドをタップした時にクリックとして扱われるようにする.

"Section \"InputClass\"
        Identifier \"TouchPad\"
        MatchIsTouchpad \"on\"
        Driver \"libinput\"
        Option \"Tapping\" \"on\"
EndSection"

#ホームの設定

TBD

#パッケージの設定

パッケージのマニフェストは, 下記の構成で記述されている.

<<ヘッダ行>>

(use-modules (guix packages)
             (gnu packages pdf)
             (taix packages pdf))

<<パッケージマニフェスト用のユーティリティ定義>>

(packages->manifest
 (list
  <<Guix Packages>>))

出力されたファイル: package-config.scm

#デスクトップ

デスクトップ関連のパッケージとして下記をインストールする.

(with-poppler-data (specification->package "evince"))
(specification->package "gnome-shell")
(specification->package "gnome-shell-extension-dash-to-dock")
(specification->package "gnome-shell-extensions")
(specification->package "gnome-tweaks")
(specification->package "ibus")
(specification->package "ibus-anthy")
(specification->package "xdg-desktop-portal")
(specification->package "xdg-desktop-portal-gtk")
(specification->package "xdg-utils")

#パッケージマネージャ

パッケージマネージャ関連のパッケージとして下記をインストールする.

Guix のパッケージになっていないソフトウェアのインストールや管理に Flatpak を使用する.

(specification->package "flatpak")

#Emacs

Emacs 関連のパッケージとして下記をインストールする.

(specification->package "emacs")
(specification->package "emacs-ace-window")
(specification->package "emacs-bash-completion")
(specification->package "emacs-company")
(specification->package "emacs-ddskk-nicola")
(specification->package "emacs-docker")
(specification->package "emacs-docker-tramp")
(specification->package "emacs-editorconfig")
(specification->package "emacs-flycheck")
(specification->package "emacs-geiser")
(specification->package "emacs-geiser-guile")
(specification->package "emacs-guix")
(specification->package "emacs-go-mode")
(specification->package "emacs-hide-mode-line")
(specification->package "emacs-haskell-mode")
(specification->package "emacs-htmlize")
(specification->package "emacs-lsp-mode")
(specification->package "emacs-lsp-ui")
(specification->package "emacs-magit")
(specification->package "emacs-markdown-mode")
(specification->package "emacs-ob-async")
(specification->package "emacs-org-contrib")
(specification->package "emacs-org-present")
(specification->package "emacs-org-roam")
(specification->package "emacs-ox-gfm")
(specification->package "emacs-paredit")
(specification->package "emacs-projectile")
(specification->package "emacs-slime")
(specification->package "emacs-slime-company")
(specification->package "emacs-vterm")
(specification->package "emacs-which-key")
(specification->package "emacs-yaml-mode")
(specification->package "emacs-yasnippet")
(specification->package "emacs-yasnippet-snippets")

#シェル

シェル関連のパッケージとして下記をインストールする.

(specification->package "bash")
(specification->package "bash-completion")
(specification->package "fzf")
(specification->package "openssh")
(specification->package "rlwrap")
(specification->package "stow")
(specification->package "tree")

#アプリケーション

アプリケーションとして下記をインストールする.

(specification->package "anki")
(with-poppler-data (specification->package "calibre"))
(specification->package "cawbird")
(specification->package "gimp")
(specification->package "icecat")
(specification->package "inkscape")
(specification->package "libreoffice")
(specification->package "nyxt")
(specification->package "mpv")
(specification->package "pelican")
(specification->package "tootle")
(specification->package "youtube-dl")

#フォント

フォント関連のパッケージとして下記をインストールする.

(specification->package "font-google-noto")
(specification->package "font-plemoljp")

#開発

開発関連のパッケージとして下記をインストールする.

(specification->package "git")
(list (specification->package "git") "send-email")
(specification->package "guile")
(specification->package "guile-hall")
(specification->package "nss-certs")
(specification->package "sbcl")
(specification->package "ghq")

#GNU Build System

GNU Build System のパッケージとして下記をインストールする.

(specification->package "autoconf")
(specification->package "automake")
(specification->package "m4")
(specification->package "make")
(specification->package "texinfo")

#ユーティリティ

ユーティリティ関連のパッケージとして下記をインストールする.

(specification->package "curl")
(specification->package "jq")
(specification->package "perl")
(specification->package "pinentry")
(specification->package "python")
(specification->package "recutils")
(specification->package "unzip")
(specification->package "zip")

#関数定義

#with-poppler-data

poppler を依存関係に持つパッケージに poppler-data を追加するためのラッパ関数.

(define with-poppler-data
  (package-input-rewriting `((,poppler . ,poppler-with-data))))

このラッパ関数でパッケージを包むと, PDF ファイル中の日本語を描画したり, 日本語のテキストの抽出できるようになる.

#Taix チャンネル

Guix の公式チャンネルなどに未登録で, 独自にパッケージ定義しているものは, 独自チャンネルを作成して管理する.

#pdf.scm

<<ヘッダ行>>

(define-module (taix packages pdf)
  #:use-module (guix packages)
  #:use-module (gnu packages pdf))

(define-public poppler-with-data
  (package/inherit poppler
    (name "poppler-with-data")
    (inputs `(("poppler-data" ,poppler-data)
             ,@(package-inputs poppler)))
    (synopsis "Poppler with poppler-data.")
    (description
     "Poppler is a PDF rendering library based on the xpdf-3.0 code base.
This package includes Poppler encoding files for rendering of CJK and Cyrillic text")))

#Emacs の設定

Org Mode を使用して Literature Programming 方式で Emacs を設定する.

#Emacs の設定ファイル

Emacs の設定ファイルは, 下記の構成で記述されている.

<<ヘッダ行>>

<<変数定義>>

<<関数定義>>

<<プリミティブ実装部分のカスタマイズ>>

<<パッケージのカスタマイズ>>

出力されたファイル: dotfiles/emacs.d/.emacs.d/init.el

#プリミティブ実装部分のカスタマイズ

プリミティブ実装部分のカスタマイズ内容を定義する.

#dispnew.c

Updating of data structures for redisplay.

ベル音を抑制して, 画面が光る表現で代替する.

(customize-set-variable 'visible-bell t)

#fontset.c

Fontset handler.

JIS X 0208 の文字セットでデフォルトの sans-serif フォントを使用する.

(set-fontset-font t 'japanese-jisx0208 (font-spec :family *my-sans-serif-font*))

絵文字の範囲は Noto Color Emoji を使用する.

(set-fontset-font t 'symbol (font-spec :family "Noto Color Emoji"))

#frame.c

Generic frame functions.

メニューバーを非表示にする.

(customize-set-variable 'menu-bar-mode nil)

ツールバーを非表示にする.

(customize-set-variable 'tool-bar-mode nil)

#xdisp.c

Display generation from window structure and buffer text.

ポイントが画面枠外に出た際の自動スクロールでウィンドウのセンタリングを抑制し, 1 行ずつスクロールされるようにする.

(customize-set-variable 'scroll-conservatively 100)

#editfns.c

Lisp functions pertaining to editing.

ユーザーフルネームを設定する.

(customize-set-variable 'user-full-name "Taiju HIGASHI")

#パッケージのカスタマイズ

各種パッケージのカスタマイズ内容を定義する.

#ace-window.el

Quickly switch windows.

ace-window のキーをモードラインに表示する.

(customize-set-variable 'ace-window-display-mode t)

ace-window にグローバルなキーをバインドする.

(global-set-key (kbd "M-o") 'ace-window)

#files.el

file input and output commands for Emacs

使用中のファイルを自動保存する.

(customize-set-variable 'auto-save-visited-mode t)

バックアップファイルを作らない.

(customize-set-variable 'make-backup-files nil)

ファイルの保存時とファイル使用時に最終行に空行を追加する.

(customize-set-variable 'require-final-newline 'visit-save)

read-only でファイルを開いた場合は view-mode を有効にする.

(customize-set-variable 'view-read-only t)

ファイル保存時に不要な空白を削除するようにする.

(add-hook 'before-save-hook #'delete-trailing-whitespace)

#browse-url.el

pass a URL to a WWW browser

Emacs で使用するデフォルトのブラウザを EWW に設定する.

(customize-set-variable 'browse-url-browser-function 'eww-browse-url)

#company.el

Modular text completion framework

company-mode をグローバルに有効にする.

(customize-set-variable 'global-company-mode t)

company による補完を 1 文字目で開始する.

(customize-set-variable 'company-minimum-prefix-length 1)

#minibuffer.el

Minibuffer completion functions

ミニバッファの補完スタイルは initials, flex を使用する.

(customize-set-variable 'completion-styles '(initials flex))

#参考
  • initials
    • 頭文字とイニシャルで補完する.
    • 例: M-x lch -> list-command-history
  • flex
    • fuzzy 補完.
    • 例: M-x foo -> fbarbazoo

#custom.el

tools for declaring and initializing options

テーマに leuven を使用する.

(customize-set-variable 'custom-enabled-themes '(leuven))

#battery.el

display battery status information

モードラインにバッテリの状態を表示する.

(customize-set-variable 'display-battery-mode t)

#time.el

display time, load and mail indicator in mode line of Emacs

モードラインに現在時刻を表示する.

(customize-set-variable 'display-time-mode t)

フォーマットは %m-%d %H:%M にする.

(customize-set-variable 'display-time-format "%m-%d %H:%M")

#electric-pair.el

Automatic parenthesis pairing

開き括弧を入力した時に, 閉じ括弧を自動入力するようにする.

(customize-set-variable 'electric-pair-mode t)

#eldoc.el

Show function arglist or variable docstring in echo area

emacs-lisp-mode, lisp-mode, scheme-mode で eldoc-mode を有効にする.

(my-add-hooks
 '(emacs-lisp-mode-hook lisp-mode-hook scheme-mode-hook)
 #'eldoc-mode)

#paredit.el

minor mode for editing parentheses

Lisp 系の各種モードで paredit-mode を有効にする.

(my-add-hooks
 '(emacs-lisp-mode-hook
   lisp-mode-hook
   scheme-mode-hook
   eval-expression-minibuffer-setup-hook
   ielm-mode-hook
   slime-repl-mode-hook)
 #'enable-paredit-mode)

#rcirc.el

default, simple IRC client

ニックネームやサーバなどの初期設定をする.

(customize-set-variable 'rcirc-server-alist
                        '(("irc.libera.chat" :channels ("#emacs #guix #guix-jp #nyxt #commonlisp #guile #fsf")
                           :port 6697 :encryption tls :user-name "taiju" :full-name "Taiju HIGASHI")))
(customize-set-variable 'rcirc-default-nick "taiju")
(add-hook 'rcirc-mode-hook #'rcirc-track-minor-mode)
(add-hook 'rcirc-mode-hook #'rcirc-omit-mode)

#em-cmpl.el

completion using the TAB key

EShell のコマンド補完候補に Emacs Lisp 関数も表示するようにする.

(customize-set-variable 'eshell-show-lisp-completions t)

#icomplete.el

minibuffer completion incremental feedback

ミニバッファで使用する icomplete-mode を ido-mode のような挙動にする.

(customize-set-variable 'fido-mode t)

#startup.el

process Emacs shell arguments

Emacs の初期表示画面を抑制する.

(customize-set-variable 'inhibit-startup-screen t)

メールアドレスを設定する.

(customize-set-variable 'user-mail-address "higashi@taiju.info")

#org*.el

#org.el

Outline-based notes management and organizer

アウトラインレベルに合わせてインデントされるようにする.

(customize-set-variable 'org-adapt-indentation t)

~/org 以下のファイルを Org Agenda で使用する.

(customize-set-variable 'org-agenda-files (list (expand-file-name "~/org")))

タスクを完了にする際に, タイムスタンプを追加する.

(customize-set-variable 'org-log-done 'time)

org-babel で使用する言語を指定する.

(org-babel-do-load-languages
 'org-babel-load-languages
 '((emacs-lisp . t)
   (sql . t)
   (shell . t)))

#org-agenda.el

Dynamic task and appointment lists for Org

C-c a で Org Agenda を起動する.

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

#org-capture.el

Fast note taking in Org

C-c c で Org Capture を起動する.

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

タスクと時系列のメモは org-capture で記録する.

(customize-set-variable 'org-capture-templates
                        `(("t" "TODO" entry (file ,(expand-file-name "~/org/inbox.org"))
                           "* TODO %?")
                          ("n" "Notes" entry (file+olp+datetree ,(expand-file-name "~/org/notes.org"))
                           "* %?%<%H:%M>")))

#org-roam*.el

A database abstraction layer for Org-mode

#org-roam-migrate.el

Migration utilities from v1 to v2

(setq org-roam-v2-ack t)

#org-roam-mode.el

Major mode for special Org-roam buffers

(global-set-key (kbd "C-c n l") 'org-roam-buffer-toggle)

#org-roam-node.el
(global-set-key (kbd "C-c n f") 'org-roam-node-find)
(global-set-key (kbd "C-c n i") 'org-roam-node-insert)

#org-roam-graph.el
(global-set-key (kbd "C-c n g") 'org-roam-graph)

#org-roam-capture.el
(global-set-key (kbd "C-c n c") 'org-roam-capture)

#org-roam-db.el
(customize-set-variable 'org-roam-db-autosync-mode t)

#org-present

Minimalist presentation minor-mode for Emacs org-mode.

org-present-mode に切り替えた際に, プレゼン用に設定を変更し, プレゼン終了時に後始末する.

(eval-after-load "org-present"
  '(progn
     (add-hook 'org-present-mode-hook
               (lambda ()
                 (org-present-big)
                 (org-display-inline-images nil t)
                 (org-present-hide-cursor)
                 (org-present-read-only)
                 (toggle-frame-fullscreen)
                 (hide-mode-line-mode)))
     (add-hook 'org-present-mode-quit-hook
               (lambda ()
                 (org-present-small)
                 (org-remove-inline-images)
                 (org-present-show-cursor)
                 (org-present-read-write)
                 (toggle-frame-fullscreen)
                 (hide-mode-line-mode)))))

#ob-async.el

Asynchronous org-babel src block execution

Org Babel を非同期に実行できるようにする.

(require 'ob-async)

#ox-gfm.el

Github Flavored Markdown Back-End for Org Export Engine

Github Flavored Markdown でエクスポートできるようにデフォルトで有効化する.

(eval-after-load "org"
  '(require 'ox-gfm nil t))

#projectile.el
(customize-set-variable 'projectile-mode t)

#scroll-bar.el
(customize-set-variable 'scroll-bar-mode nil)

#sendmail.el
(customize-set-variable 'send-mail-function 'smtpmail-send-it)

#skk*.el

#skk-kanagaki.el
(customize-set-variable 'skk-kanagaki-keyboard-type '106-jis)

#skk-tut.el
(global-unset-key "\C-xt")
(define-key ctl-x-map "t" tab-prefix-map)

#skk-vars.el
(customize-set-variable 'skk-large-jisyo (expand-file-name "skk-get-jisyo/SKK-JISYO.L" user-emacs-directory))
(customize-set-variable 'skk-use-kana-keyboard t)

#smtpmail.el
(customize-set-variable 'smtpmail-smtp-server "smtp.gmail.com")
(customize-set-variable 'smtpmail-smtp-service 587)

#which-key.el
(customize-set-variable 'which-key-mode t)

#faces.el
(mapc (lambda (face) (set-face-attribute face nil :family *my-sans-serif-font*))
      '(default fixed-pitch variable-pitch))
(set-face-attribute 'bold nil :family *my-sans-serif-font*)
(set-face-attribute 'fixed-pitch-serif nil :slant 'italic :family *my-serif-font*)
(set-face-attribute 'tab-bar-tab nil :inherit 'tab-bar :background "white")

#ibuffer.el
(global-set-key (kbd "C-x C-b") 'ibuffer)

#bash-completion.el
(require 'bash-completion)
(bash-completion-setup)

#projectile.el
(define-key projectile-mode-map (kbd "C-c p") 'projectile-command-map)

#server.el
(require 'server)
(unless server-process
  (server-start))

#cus-edit.el

tools for customizing Emacs and Lisp packages

カスタムファイルを init.el と別にする.

(customize-set-variable 'custom-file (expand-file-name "~/.emacs.d/custom.el"))

#editorconfig.el

EditorConfig Emacs Plugin

EditorConfig を有効にする.

(customize-set-variable 'editorconfig-mode 1)

#inf-lisp.el

an inferior-lisp mode

Inferior Lisp mode で SBCL を使用する.

(customize-set-variable 'inferior-lisp-program "sbcl")

SLIME などでこの値が参照される.

#slime.el

Superior Lisp Interaction Mode for Emacs

SLIME で使用する Contrib Package をロードする.

(setq slime-setup-contribs '(slime-fancy slime-quicklisp slime-asdf slime-company slime-fuzzy))

#lsp-mode.el

LSP mode

LSP モードのキーバインディングを設定する.

(customize-set-variable 'lsp-keymap-prefix "C-c l")

#yasnippet.el

Yet another snippet extension for Emacs

Guix のスニペットを登録する.

(customize-set-variable 'yas-snippet-dirs (list "~/.emacs.d/snippets"
                                                (concat *guix-source-path* "/etc/snippets")))

参考: The Perfect Setup (GNU Guix Reference Manual)

Yasnippet をグローバルに有効化する.

(yas-global-mode 1)

#copyright.el

update the copyright notice in current buffer

Copyright の検索範囲を広げる.

(customize-set-variable 'copyright-limit 20000)

copyright-update 等で使用するユーザー名の正規表現を設定する.

(customize-set-variable 'copyright-names-regexp
      (format "%s <%s>" user-full-name user-mail-address))

Guix のコントリビュート時に著作権表示を簡単に更新できるようにする.

(load-file (concat *guix-source-path* "/etc/copyright.el"))

参考: The Perfect Setup (GNU Guix Reference Manual)

#geiser-guile.el

Guile's implementation of the geiser protocols

Guix のソースコードを Geiser のロードパスに追加する.

(with-eval-after-load 'geiser-guile
  (add-to-list 'geiser-guile-load-path *guix-source-path*))

参考: The Perfect Setup (GNU Guix Reference Manual)

#geiser-repl.el

Geiser's REPL

Project 関数を projectile にする.

(customize-set-variable 'geiser-repl-current-project-function 'projectile-project-root)

#simple.el

basic editing commands for Emacs

インデントはスペースをデフォルトにする.

(customize-set-variable 'indent-tabs-mode nil)

#変数定義

Emacs のコンフィグで使用する変数を定義する.

#my-sans-serif-font

sans-serif には PlemolJP Console を使用する.

(defvar *my-sans-serif-font* "PlemolJP Console")

serif には Noto Sans Serif CJK JP を使用する.

#my-serif-font
(defvar *my-serif-font* "Noto Sans Serif CJK JP")

#guix-source-path

Guix のソースコードのパスを定義する.

(defvar *guix-source-path* "~/repos/savannah/guix")

#関数定義

Emacs のコンフィグで使用する関数を定義する.

#my-add-hooks

コマンドまたは関数を複数のフックにまとめて登録するためのユーティリティ関数.

(defun my-add-hooks (hooks func)
  (mapc (lambda (hook) (add-hook hook func)) hooks))

#my-toggle-delete-trailing-whitespace-on-save

ファイル保存時に不要なスペースを削除するかどうかを切り替えられるようにする関数.

(defun my-toggle-delete-trailing-whitespace-on-save ()
  (interactive)
  (cond ((member 'delete-trailing-whitespace before-save-hook)
         (remove-hook 'before-save-hook 'delete-trailing-whitespace)
         (message "delete-trailing-whitespace: OFF"))
        (t
         (add-hook 'before-save-hook 'delete-trailing-whitespace)
         (message "delete-trailing-whitespace: ON"))))

#Nyxt の設定

メインブラウザとして使用している Nyxt を設定する.

#Nyxt の設定ファイル

Nyxt の設定ファイルは, 下記の構成で記述されている.

<<ヘッダ行>>

<<Nyxt のバッファ設定>>

<<Nyxt の関数定義>>

<<Nyxt のコマンド定義>>

出力されたファイル: dotfiles/nyxt/.config/nyxt/init.lisp

#Nyxt のバッファ設定

Nyxt は Emacs のキーバインドで操作する.

(define-configuration buffer
  ((default-modes (append '(nyxt::emacs-mode nyxt::blocker-mode) %slot-default%))))

#Nyxt のコマンド定義

Nyxt で使用する独自コマンドを定義する.

#copy-tver-streaming-url

某動画配信サービスの動画を mpv で再生するための URL を取得するコマンド.

(define-command-global copy-tver-streaming-url ()
  "Copy TVer streaming URL from a buffer."
  (let ((url (make-tver-streaming-url (document-model (current-buffer)))))
    (if url
        (progn (copy-to-clipboard url)
               (echo "~a copied to clipboard." url))
        (echo "Not found streaming url."))))

#play-tver-movie-on-mpv

某動画配信サービスの動画を mpv で再生するコマンド.

(define-command-global play-movie-of-tver-on-mpv ()
  "Make TVer streaming URL from a buffer and play the movie on mpv"
  (let ((url (make-tver-streaming-url (document-model (current-buffer)))))
    (if url
        (progn
          (echo "run command: ~a" (make-mpv-command url))
          (uiop:run-program (make-mpv-command url)))
        (echo "Not found streaming url."))))

#play-tver-movie-on-mpv-x2

某動画配信サービスの動画を 2 倍速で mpv で再生するコマンド.

(define-command-global play-movie-of-tver-on-mpv-x2 ()
  "Make streaming URL from a buffer and play the movie on mpv (speed=2.0)"
  (let ((url (make-tver-streaming-url (document-model (current-buffer)))))
    (if url
        (let ((command (format nil "~a --speed=2.0" (make-mpv-command url))))
          (echo "run command: ~a" command)
          (uiop:run-program command))
        (echo "Not found streaming url."))))

#関数定義

定義したコマンド等で使用する関数を定義する.

#make-streaming-url

バッファから URL を生成するユーティリティ関数.

(defun make-tver-streaming-url (dom)
  "Make streaming URL from a buffer."
  (let ((els (clss:select "[data-video-id]" dom)))
    (when (> (length els) 0)
      (let* ((el (aref els 0))
             (account (plump:attribute el "data-account"))
             (video-id (plump:attribute el "data-video-id")))
        (format nil "http://players.brightcove.net/~a/default_default/index.html?videoId=~a" account video-id)))))

#make-mpv-command

URL から mpv コマンドを生成するユーティリティ関数.

(defun make-mpv-command (url)
  "Make mpv command from url."
  (format nil "mpv ~a" url))

#Nyxt の Common Lisp バージョン

Nyxt のデバッグや拡張の開発のために, Common Lisp のまま使用できるようにする.

その際, 下記のパッケージが依存関係にないと、Common Lisp の Nyxt パッケージがロードできないため, Guix でインストールする.

(specification->package "gcc-toolchain")
(specification->package "gobject-introspection")
(specification->package "sbcl-iolib")
(specification->package "webkitgtk")
(specification->package "openssl")

#SBCL の設定

SBCL を設定する.

<<ASDF の設定>>

<<QuickLisp の設定>>

<<CFFI の設定>>

出力されたファイル: dotfiles/.sbclrc

#ASDF の設定

いつでも ASDF が使用できるようにする.

(require "asdf")

#QuickLisp の設定

いつでも QuickLisp が使用できるようにする.

#-quicklisp
(let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp"
                                       (user-homedir-pathname))))
  (when (probe-file quicklisp-init)
    (load quicklisp-init)))

#CFFI の設定

CFFI が Guix 上で C ライブラリを参照できるようにする.

(let ((guix-profile (format nil "~a/.guix-profile/lib/" (uiop:getenv "HOME"))))
  (when (and (probe-file guix-profile)
             (ignore-errors (asdf:load-system "cffi")))
    (push guix-profile
          (symbol-value (find-symbol (string '*foreign-library-directories*)
                                     (find-package 'cffi))))))

参考: Nyxt Developer Readme

#フォントの設定

フォントを設定する.

等幅フォントには PlemolJP Console を指定し、その他は Noto フォントを指定する.

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
  <match>
    <edit mode="prepend" name="family">
      <string>Noto Sans CJK JP</string>
    </edit>
  </match>
  <match>
    <test compare="contains" name="lang">
      <string>ja</string>
    </test>
    <edit mode="prepend" name="family">
      <string>Noto Sans CJK JP</string>
    </edit>
  </match>
  <match target="pattern">
    <test qual="any" name="family"><string>sans-serif</string></test>
    <!--<test qual="any" name="lang"><string>ja</string></test>-->
    <edit name="family" mode="prepend" binding="strong"><string>Noto Sans CJK JP</string></edit>
  </match>
  <match target="pattern">
    <test qual="any" name="family"><string>serif</string></test>
    <edit name="family" mode="prepend" binding="strong"><string>Noto Serif CJK JP</string></edit>
  </match>
  <match target="pattern">
    <test qual="any" name="family"><string>monospace</string></test>
    <edit name="family" mode="prepend" binding="strong"><string>PlemolJP Console</string></edit>
  </match>
  <alias>
    <family>serif</family>
    <prefer>
      <family>Noto Serif CJK JP</family>
    </prefer>
  </alias>
  <alias>
    <family>sans-serif</family>
    <prefer>
      <family>Noto Sans CJK JP</family>
    </prefer>
  </alias>
  <alias>
    <family>monospace</family>
    <prefer>
      <family>PlemolJP Console</family>
    </prefer>
  </alias>
</fontconfig>

参考: フォント設定 - ArchWiki