~taiju/Taix

My personal computer

cf2ffce nyxt: update config

~taiju pushed to ~taiju/taix git

10 months ago

609dc68 package: Remove sqlite version

~taiju pushed to ~taiju/taix git

11 months ago

#Taix

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

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

  1. Guix の設定
    1. Guix の設定ファイルの適用
      1. 前処理
      2. システムのセットアップ
      3. ホームのセットアップ
      4. パッケージのセットアップ
      5. 各設定ファイルのリンク
    2. チャンネルの設定ファイル
      1. NonGuix チャンネルの定義
      2. 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. emacs-xyz.scm
    2. 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-present
      18. ob-async.el
      19. ox-gfm.el
      20. scroll-bar.el
      21. sendmail.el
      22. skk*.el
        1. skk-kanagaki.el
        2. skk-tut.el
        3. skk-vars.el
      23. smtpmail.el
      24. which-key.el
      25. faces.el
      26. ibuffer.el
      27. bash-completion.el
      28. server.el
      29. cus-edit.el
      30. editorconfig.el
      31. inf-lisp.el
      32. slime.el
      33. yasnippet.el
      34. copyright.el
      35. geiser-guile.el
      36. geiser-repl.el
      37. simple.el
      38. mastodon.el
      39. elfeed.el
      40. inf-ruby.el
      41. robe.el
      42. flycheck.el
      43. env.el
      44. kintai.el
      45. js.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. Ruby の設定
    1. irb の設定ファイル
  5. Nyxt の設定
    1. Nyxt の設定ファイル
    2. Nyxt のバッファ設定
    3. Search Engine 設定
  6. SBCL の設定
    1. ASDF の設定
    2. QuickLisp の設定
    3. CFFI の設定
  7. フォントの設定

#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 irb

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

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

<<ヘッダ行>>

(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"))))

#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
                     syncthing)

(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")
             (specification->package "tzdata"))
       %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)
             (service syncthing-service-type
                      (syncthing-configuration (user "taiju"))))
       (modify-services %desktop-services
         (gdm-service-type
          config => (gdm-configuration
                     (gnome-shell-assets
                      (list (specification->package "font-google-noto")
                            (specification->package "adwaita-icon-theme")
                            (specification->package "font-abattis-cantarell"))))))))
  (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)
             (guix transformations))

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

(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-debbugs")
((options->transformation
  '((with-commit . "emacs-ddskk=3ed86d42717ab2a54ec8de6ab32d552dc0a4c3b0")))
  (specification->package "emacs-ddskk-nicola"))
(specification->package "emacs-docker")
(specification->package "emacs-docker-tramp")
(specification->package "emacs-editorconfig")
(specification->package "emacs-eglot")
(specification->package "emacs-ement")
(specification->package "emacs-elfeed")
(specification->package "emacs-esa")
(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-inf-ruby")
(specification->package "emacs-kintai")
(specification->package "emacs-magit")
(specification->package "emacs-markdown-mode")
(specification->package "emacs-mastodon")
(specification->package "emacs-ob-async")
(specification->package "emacs-org-contrib")
(specification->package "emacs-org-present")
(specification->package "emacs-ox-gfm")
(specification->package "emacs-paredit")
(specification->package "emacs-robe")
(specification->package "emacs-ruby-mode")
(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 "direnv")
(specification->package "fzf")
(specification->package "openssh")
(specification->package "rlwrap")
(specification->package "stow")
(specification->package "tree")

#アプリケーション

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

(specification->package "anki")
(specification->package "gimp")
(specification->package "icecat")
(specification->package "inkscape")
(specification->package "libreoffice")
(specification->package "nyxt")
(specification->package "mpv")
(specification->package "pelican")
(specification->package "youtube-dl")

#フォント

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

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

#開発

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

(specification->package "docker-compose")
(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")
(specification->package "sqlite")

#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 "ruby")
(specification->package "ruby-pry")
(specification->package "ruby-pry-doc")
(specification->package "ruby-webrick")
(specification->package "unzip")
(specification->package "zip")
(specification->package "markdown")
(specification->package "patchelf")

#関数定義

#with-poppler-data

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

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

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

#Taix チャンネル

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

#emacs-xyz.scm

<<ヘッダ行>>

(define-module (taix packages emacs-xyz)
  #:use-module ((guix licenses) #:prefix license:)
  #:use-module (guix gexp)
  #:use-module (guix packages)
  #:use-module (guix git-download)
  #:use-module (guix build-system emacs))

(define-public emacs-kintai
  (package
    (name "emacs-kintai")
    (version "0.1.1")
    (source
     (origin
       (method git-fetch)
       (uri (git-reference
             (url "https://git.sr.ht/~taiju/kintai-el")
             (commit version)))
       (file-name (git-file-name name version))
       (sha256
        (base32 "0g8z0zgy5d1pr4x5nykx9x96pnffhdm16b7gnwb0b37kwmx5kj4b"))))
    (build-system emacs-build-system)
    (home-page "https://git.sr.ht/~taiju/kintai-el")
    (synopsis "Posting kintai")
    (description
     "This package provides commands that post messages that start work and end work to a specific slack channel.")
    (license license:gpl3+)))

(define-public emacs-esa
  (let ((commit "417e0ac55abe9b17e0b7165d0df26bc018aff42e")
        (revision "0"))
    (package
      (name "emacs-esa")
      (version (git-version "0.0.0" revision commit))
      (source
       (origin
         (method git-fetch)
         (uri (git-reference
               (url "https://github.com/nabinno/esa.el.git")
               (commit commit)))
         (file-name (git-file-name name version))
         (sha256
          (base32 "0hib8q9fslvw02i1y19z78fv6yy88q09lhfdfmbdyn6yal21855q"))))
      (build-system emacs-build-system)
      (home-page "https://github.com/nabinno/esa.el")
      (synopsis "Interface to esa.io (\( ⁰⊖⁰)/)")
      (description "Emacs paste, view and edit modes, this one for esa.io (\( ⁰⊖⁰)/). Like email client.")
      (license license:gpl2+))))

(define-public emacs-ruby-mode
  (let ((commit "e3748c323320c0bde6ad8f70f0c2ab8f686255a5")
        (revision "0"))
    (package
      (name "emacs-ruby-mode")
      (version (git-version "1.2" revision commit))
      (source
       (origin
         (method git-fetch)
         (uri (git-reference
               (url "https://git.savannah.gnu.org/git/emacs.git")
               (commit commit)))
         (file-name (git-file-name name version))
         (sha256
          (base32
           "1fsg9rjl56x8qmc1r8iv7a29r3jjcbjflmzq6529ja1barglzri8"))))
      (build-system emacs-build-system)
      (arguments
       (list #:phases
             #~(modify-phases %standard-phases
                 (replace 'unpack
                   (lambda* (#:key source #:allow-other-keys)
                     (mkdir "source")
                     (chdir "source")
                     (copy-file (string-append source "/lisp/progmodes/ruby-mode.el")
                                "ruby-mode.el"))))))
      (home-page "https://www.emacswiki.org/cgi-bin/wiki/RubyMode")
      (synopsis "Major mode for editing Ruby files")
      (description
       "Provides font-locking, indentation support, and navigation for Ruby code.")
      (license license:gpl3+))))

#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 の設定ファイルは, 下記の構成で記述されている.

<<ヘッダ行>>

<<変数定義>>

<<関数定義>>

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

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

;; リポジトリに含めたくない設定は private.el に記述する.
(load (expand-file-name "private.el" user-emacs-directory))

出力されたファイル: 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 を使用する.

(setf use-default-font-for-symbols nil)
(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 #ruby")
                           :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)

縦並びにする.

(customize-set-variable 'fido-vertical-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"))
                           "* %?")))

#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))

#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)

#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"))
(if (file-exists-p custom-file)
    (load-file custom-file))

#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))

#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

#simple.el

basic editing commands for Emacs

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

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

#mastodon.el

Client for Mastodon

インスタンスの URL を設定する.

(customize-set-variable 'mastodon-instance-url "https://fosstodon.org")

アクティブユーザーのユーザー名を指定する.

(customize-set-variable 'mastodon-active-user "taiju")

#elfeed.el

an Emacs Atom/RSS feed reader

キーバインドを設定する.

(global-set-key (kbd "C-x w") 'elfeed)

#inf-ruby.el

Run a Ruby process in a buffer

ruby-mode で inf-ruby-minor-mode を使う.

(add-hook 'ruby-mode-hook 'inf-ruby-minor-mode)

デバッガで inf-ruby を使う.

(add-hook 'compilation-filter-hook 'inf-ruby-auto-enter)

#robe.el

Code navigation, documentation lookup and completion for Ruby

ruby-mode で robe-mode 使用する.

(add-hook 'ruby-mode-hook 'robe-mode)

company-robe を使用する.

(eval-after-load 'company
  '(push 'company-robe company-backends))

#flycheck.el

On-the-fly syntax checking

ruby-mode で flycheck-mode を使用する.

(add-hook 'ruby-mode-hook 'flycheck-mode)

#env.el

functions to manipulate environment variables

Emacs の中では基本的に pager を使わないため, PAGER 環境変数に cat コマンドを設定する.

(setenv "PAGER" "cat")

#kintai.el

勤怠情報を Slack に投稿する自作プラグイン.

キーバインドを設定する.

(global-set-key (kbd "C-c k s") 'kintai-start)
(global-set-key (kbd "C-c k e") 'kintai-end)

#js.el

Major mode for editing JavaScript

デフォルトインデントを設定する.

(customize-set-variable 'js-indent-level 2)

#変数定義

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"))))

#Ruby の設定

#irb の設定ファイル

Emacs の inf-ruby を正しく動かすための設定をする.

IRB.conf[:USE_MULTILINE] = false if ENV['INSIDE_EMACS']
IRB.conf[:USE_READLINE] = false if ENV['INSIDE_EMACS']

#Nyxt の設定

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

#Nyxt の設定ファイル

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

<<ヘッダ行>>

(in-package :nyxt)

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

<<Nyxt  Search Engine 設定>>

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

#Nyxt のバッファ設定

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

(define-configuration buffer
  ((default-modes
    (pushnew 'nyxt/mode/emacs:emacs-mode %slot-value%))))

#Search Engine 設定

Search Engine を設定する.

(define-configuration buffer
    ((search-engines
      (let ((ddg-completion
             (make-search-completion-function :base-url
                                              "https://duckduckgo.com/ac/?q=~a"
                                              :processing-function
                                              #'(lambda (results)
                                                  (when results
                                                    (map 'list
                                                         (lambda (hash-table)
                                                           (first
                                                            (alexandria:hash-table-values
                                                             hash-table)))
                                                         (j:decode results)))))))
        (list
         (make-instance 'search-engine :name "DuckDuckGo" :shortcut "ddg" :search-url
                        "https://duckduckgo.com/?q=~a" :fallback-url
                        (quri.uri:uri "https://duckduckgo.com/") :completion-function
                        ddg-completion))))))

#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