個人用端末 (Taix) の構成.
OS は GNU 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 をチャンネルに加える.
(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"))))
既存のチャンネルに存在しないパッケージを管理するために, 独自チャンネルを追加する.
(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
タッチパッドをタップした時にクリックとして扱われるようにする.
"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 関連のパッケージとして下記をインストールする.
(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 のパッケージとして下記をインストールする.
(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")
poppler を依存関係に持つパッケージに poppler-data を追加するためのラッパ関数.
(define with-poppler-data
(package-input-rewriting `((,poppler . ,poppler-with-data))))
このラッパ関数でパッケージを包むと, PDF ファイル中の日本語を描画したり, 日本語のテキストの抽出できるようになる.
Guix の公式チャンネルなどに未登録で, 独自にパッケージ定義しているものは, 独自チャンネルを作成して管理する.
<<ヘッダ行>>
(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+))))
<<ヘッダ行>>
(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")))
Org Mode を使用して Literature Programming 方式で Emacs を設定する.
Emacs の設定ファイルは, 下記の構成で記述されている.
<<ヘッダ行>>
<<変数定義>>
<<関数定義>>
<<プリミティブ実装部分のカスタマイズ>>
<<パッケージのカスタマイズ>>
;; リポジトリに含めたくない設定は private.el に記述する.
(load (expand-file-name "private.el" user-emacs-directory))
出力されたファイル: dotfiles/emacs.d/.emacs.d/init.el
プリミティブ実装部分のカスタマイズ内容を定義する.
Updating of data structures for redisplay.
ベル音を抑制して, 画面が光る表現で代替する.
(customize-set-variable 'visible-bell t)
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"))
Generic frame functions.
メニューバーを非表示にする.
(customize-set-variable 'menu-bar-mode nil)
ツールバーを非表示にする.
(customize-set-variable 'tool-bar-mode nil)
Display generation from window structure and buffer text.
ポイントが画面枠外に出た際の自動スクロールでウィンドウのセンタリングを抑制し, 1 行ずつスクロールされるようにする.
(customize-set-variable 'scroll-conservatively 100)
Lisp functions pertaining to editing.
ユーザーフルネームを設定する.
(customize-set-variable 'user-full-name "Taiju HIGASHI")
各種パッケージのカスタマイズ内容を定義する.
Quickly switch windows.
ace-window のキーをモードラインに表示する.
(customize-set-variable 'ace-window-display-mode t)
ace-window にグローバルなキーをバインドする.
(global-set-key (kbd "M-o") 'ace-window)
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)
pass a URL to a WWW browser
Emacs で使用するデフォルトのブラウザを EWW に設定する.
(customize-set-variable 'browse-url-browser-function 'eww-browse-url)
Modular text completion framework
company-mode をグローバルに有効にする.
(customize-set-variable 'global-company-mode t)
company による補完を 1 文字目で開始する.
(customize-set-variable 'company-minimum-prefix-length 1)
Minibuffer completion functions
ミニバッファの補完スタイルは initials
, flex
を使用する.
(customize-set-variable 'completion-styles '(initials flex))
initials
M-x lch
-> list-command-history
flex
M-x foo
-> fbarbazoo
tools for declaring and initializing options
テーマに leuven
を使用する.
(customize-set-variable 'custom-enabled-themes '(leuven))
display battery status information
モードラインにバッテリの状態を表示する.
(customize-set-variable 'display-battery-mode t)
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")
Automatic parenthesis pairing
開き括弧を入力した時に, 閉じ括弧を自動入力するようにする.
(customize-set-variable 'electric-pair-mode t)
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)
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)
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)
completion using the TAB key
EShell のコマンド補完候補に Emacs Lisp 関数も表示するようにする.
(customize-set-variable 'eshell-show-lisp-completions t)
minibuffer completion incremental feedback
ミニバッファで使用する icomplete-mode を ido-mode のような挙動にする.
(customize-set-variable 'fido-mode t)
縦並びにする.
(customize-set-variable 'fido-vertical-mode t)
process Emacs shell arguments
Emacs の初期表示画面を抑制する.
(customize-set-variable 'inhibit-startup-screen t)
メールアドレスを設定する.
(customize-set-variable 'user-mail-address "higashi@taiju.info")
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)))
Dynamic task and appointment lists for Org
C-c a
で Org Agenda を起動する.
(global-set-key (kbd "C-c a") 'org-agenda)
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"))
"* %?")))
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)))))
Asynchronous org-babel src block execution
Org Babel を非同期に実行できるようにする.
(require 'ob-async)
Github Flavored Markdown Back-End for Org Export Engine
Github Flavored Markdown でエクスポートできるようにデフォルトで有効化する.
(eval-after-load "org"
'(require 'ox-gfm nil t))
(customize-set-variable 'scroll-bar-mode nil)
(customize-set-variable 'send-mail-function 'smtpmail-send-it)
(customize-set-variable 'skk-kanagaki-keyboard-type '106-jis)
(global-unset-key "\C-xt")
(define-key ctl-x-map "t" tab-prefix-map)
(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)
(customize-set-variable 'smtpmail-smtp-server "smtp.gmail.com")
(customize-set-variable 'smtpmail-smtp-service 587)
(customize-set-variable 'which-key-mode t)
(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")
(global-set-key (kbd "C-x C-b") 'ibuffer)
(require 'bash-completion)
(bash-completion-setup)
(require 'server)
(unless server-process
(server-start))
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 Emacs Plugin
EditorConfig を有効にする.
(customize-set-variable 'editorconfig-mode 1)
an inferior-lisp mode
Inferior Lisp mode で SBCL を使用する.
(customize-set-variable 'inferior-lisp-program "sbcl")
SLIME などでこの値が参照される.
Superior Lisp Interaction Mode for Emacs
SLIME で使用する Contrib Package をロードする.
(setq slime-setup-contribs '(slime-fancy slime-quicklisp slime-asdf slime-company slime-fuzzy))
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)
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)
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's REPL
basic editing commands for Emacs
インデントはスペースをデフォルトにする.
(customize-set-variable 'indent-tabs-mode nil)
Client for Mastodon
インスタンスの URL を設定する.
(customize-set-variable 'mastodon-instance-url "https://fosstodon.org")
アクティブユーザーのユーザー名を指定する.
(customize-set-variable 'mastodon-active-user "taiju")
an Emacs Atom/RSS feed reader
キーバインドを設定する.
(global-set-key (kbd "C-x w") 'elfeed)
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)
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))
On-the-fly syntax checking
ruby-mode で flycheck-mode を使用する.
(add-hook 'ruby-mode-hook 'flycheck-mode)
functions to manipulate environment variables
Emacs の中では基本的に pager を使わないため, PAGER
環境変数に cat
コマンドを設定する.
(setenv "PAGER" "cat")
勤怠情報を Slack に投稿する自作プラグイン.
キーバインドを設定する.
(global-set-key (kbd "C-c k s") 'kintai-start)
(global-set-key (kbd "C-c k e") 'kintai-end)
Major mode for editing JavaScript
デフォルトインデントを設定する.
(customize-set-variable 'js-indent-level 2)
Emacs のコンフィグで使用する変数を定義する.
sans-serif
には PlemolJP Console
を使用する.
(defvar *my-sans-serif-font* "PlemolJP Console")
serif
には Noto Sans Serif CJK JP
を使用する.
(defvar *my-serif-font* "Noto Sans Serif CJK JP")
Guix のソースコードのパスを定義する.
(defvar *guix-source-path* "~/repos/savannah/guix")
Emacs のコンフィグで使用する関数を定義する.
コマンドまたは関数を複数のフックにまとめて登録するためのユーティリティ関数.
(defun my-add-hooks (hooks func)
(mapc (lambda (hook) (add-hook hook func)) hooks))
ファイル保存時に不要なスペースを削除するかどうかを切り替えられるようにする関数.
(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"))))
Emacs の inf-ruby を正しく動かすための設定をする.
IRB.conf[:USE_MULTILINE] = false if ENV['INSIDE_EMACS']
IRB.conf[:USE_READLINE] = false if ENV['INSIDE_EMACS']
メインブラウザとして使用している Nyxt を設定する.
Nyxt の設定ファイルは, 下記の構成で記述されている.
<<ヘッダ行>>
(in-package :nyxt)
<<Nyxt のバッファ設定>>
<<Nyxt の Search Engine 設定>>
出力されたファイル: dotfiles/nyxt/.config/nyxt/config.lisp
Nyxt は Emacs のキーバインドで操作する.
(define-configuration buffer
((default-modes
(pushnew 'nyxt/mode/emacs:emacs-mode %slot-value%))))
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 を設定する.
<<ASDF の設定>>
<<QuickLisp の設定>>
<<CFFI の設定>>
出力されたファイル: dotfiles/.sbclrc
いつでも ASDF が使用できるようにする.
(require "asdf")
いつでも QuickLisp が使用できるようにする.
#-quicklisp
(let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp"
(user-homedir-pathname))))
(when (probe-file quicklisp-init)
(load quicklisp-init)))
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))))))
フォントを設定する.
等幅フォントには 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>