#+TITLE: サブ環境の Emacs の設定ファイル * はじめに サブ環境用の Emacs の設定ファイル。 可能な限りの可搬性を優先し、自動化や一部の詳細な設定はこのファイルではおこなわない。 * 環境構築の仕方 ホームディレクトリで下記を実行する。 #+begin_src shell :eval no git clone https://git.tojo.tokyo/init.el.git #+end_src =~/.emacs.d/init.el= の先頭に下記を追記。 #+begin_example (org-babel-load-file "~/init.el.git/init.org") #+end_example Emacs を起動したら下記をを実行して、SKK の辞書をダウンロードする。 #+begin_example M-x skk-get #+end_example 設定はこれで完了。 環境依存の設定はこのファイルを変更するのではなくて、 =~/.emacs.d/init.el= に設定を追記するように。 * パッケージマネージャの導入 =straight.el= を導入する。 #+begin_src emacs-lisp (defvar bootstrap-version) (let ((bootstrap-file (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory)) (bootstrap-version 5)) (unless (file-exists-p bootstrap-file) (with-current-buffer (url-retrieve-synchronously "https://raw.githubusercontent.com/raxod502/straight.el/develop/install.el" 'silent 'inhibit-cookies) (goto-char (point-max)) (eval-print-last-sexp))) (load bootstrap-file nil 'nomessage)) #+end_src * バックアップファイルを作らないようにする 助けられた経験よりも邪魔に感じたことの方が明らかに多いため。 #+begin_src emacs-lisp (setq make-backup-files nil) #+end_src * インデントの設定 デフォルト設定は空白とタブを混ぜてインデントしてしまう。 空白のみを使ってインデントする。 #+begin_src emacs-lisp (setq-default indent-tabs-mode nil) #+end_src * 文字コードの設定 #+begin_src emacs-lisp (prefer-coding-system 'utf-8-unix) #+end_src * undo-tree-mode の設定 #+begin_src emacs-lisp (straight-use-package 'undo-tree) #+end_src #+begin_src emacs-lisp (setq undo-tree-auto-save-history nil) (global-undo-tree-mode) #+end_src * ベルを無効化する ベルが鳴らないようにする。 #+begin_src emacs-lisp (setq ring-bell-function 'ignore) #+end_src * SKK =ddskk= をインストールする。 #+begin_src emacs-lisp (straight-use-package 'ddskk) #+end_src SKK をデフォルトの入力メソッドに設定する。 #+begin_src emacs-lisp (setq default-input-method "japanese-skk") #+end_src システムサイドの辞書には =skk-get= コマンドでダウンロードした辞書を使う。 #+begin_src emacs-lisp (setq skk-large-jisyo "~/.emacs.d/skk-get-jisyo/SKK-JISYO.L") #+end_src * Helm Helm をインストールする。 #+begin_src emacs-lisp (straight-use-package 'helm) #+end_src 基本的な設定をする。 #+begin_src emacs-lisp (helm-mode t) (global-set-key (kbd "M-x") 'helm-M-x) (global-set-key (kbd "C-h") 'helm-command-prefix) #+end_src * which-key-mode うろ覚えでもキーバインドを叩けるようにする。 #+begin_src emacs-lisp (straight-use-package 'which-key) #+end_src which-key-mode を有効にする。 #+begin_src emacs-lisp (which-key-mode) #+end_src * Projectile #+begin_src emacs-lisp (straight-use-package 'projectile) #+end_src projectile-mode を有効にし、キーコンフィグを設定する。 #+begin_src emacs-lisp (projectile-mode 1) (define-key projectile-mode-map (kbd "C-c p") 'projectile-command-map) #+end_src * 常に時刻が日本語で表示されるようにする 日本語で時刻が表示されるようにする。 この設定の必要性については [[https://www.tojo.tokyo/org-mode-japanese-timestamp.html][Emacs の時刻表記が日本語から英語に変わる問題の解決法]] を参照。 #+begin_src emacs-lisp (setq system-time-locale nil) #+end_src * Emacs を再起動する #+begin_src emacs-lisp (straight-use-package 'restart-emacs) #+end_src * Paredit Lisp の構造的な編集を実現するのに必要。 #+begin_src emacs-lisp (straight-use-package 'paredit) #+end_src 下記の設定は [[https://wikemacs.org/wiki/Paredit-mode][Paredit-mode - WikEmacs]] を参考にしている。 #+begin_src emacs-lisp (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) #+end_src * facemenu を require なんかよくわからんけど facemenu を Require しないと起動時に警告がでる。 #+begin_src emacs-lisp (require 'facemenu) #+end_src * フォントの設定 Noto Sans Mono を使う。 システムに入ってなかったら入れる。 #+begin_src emacs-lisp (when (display-graphic-p) (set-face-attribute 'default nil :family "Monospace" :height 120) (set-fontset-font t 'japanese-jisx0208 "Noto Sans Mono CJK JP") (add-to-list 'face-font-rescale-alist '(".*Noto Sans Mono CJK JP.*" . 1.3))) #+end_src * 見た目の設定 ** 装飾を非表示にする スクロールバー、メニューバー、タブバーがあると画面が狭くなるので消す。 メニュー機能は有用なので迷ったときには F10 でメニューを出せることを覚えておく。 #+begin_src emacs-lisp (scroll-bar-mode -1) (tool-bar-mode -1) (menu-bar-mode -1) #+end_src ** テーマ ドラキュラテーマを使う。 #+begin_src emacs-lisp (straight-use-package 'doom-themes) #+end_src #+begin_src emacs-lisp (load-theme 'doom-dracula t) #+end_src ** モードライン Doom Emacs と同じモードラインを使う。 #+begin_src emacs-lisp (straight-use-package 'doom-modeline) #+end_src doom-mode-line や mode-line に関する設定をする #+begin_src emacs-lisp (doom-modeline-mode) (setq doom-modeline-project-detection 'projectile) (setq doom-modeline-buffer-file-name-style 'auto) (column-number-mode t) #+end_src * Magit #+begin_src emacs-lisp (straight-use-package 'magit) #+end_src * Org-mode ** org-directory を設定する #+begin_src emacs-lisp (setq org-directory "~/org/") #+end_src ** スピードコマンドを有効にする =*= の上で簡単に org の操作ができる。めっちゃ早い。 ヘルプは =?= 。 #+begin_src emacs-lisp (setq org-use-speed-commands t) #+end_src ** HTML 系 HTML を生成したときの =validation-link= を削除する。 #+begin_src emacs-lisp (setq org-html-validation-link nil) #+end_src ** org-refile #+begin_src emacs-lisp (setq org-refile-targets '((org-agenda-files :maxlevel . 3))) #+end_src *** 逆順に refile する refile したときに最後に追加するのではなくて先頭に追加したい。 #+begin_src emacs-lisp (setq org-reverse-note-order t) #+end_src ** org-agenda org-directory 直下を org-agenda の対象する。 #+begin_src emacs-lisp (setq org-agenda-files (list org-directory)) #+end_src *** キーバインドを設定 #+begin_src emacs-lisp (global-set-key (kbd "C-c a") 'org-agenda) #+end_src *** =TODO= のキーワードを設定 - やることは =TODO= - 待ち状態のタスクは =WAIT= - 完了したタスクは =DONE= - やめたタスクは =CANCELED= #+begin_src emacs-lisp (setq org-todo-keywords '((sequence "TODO(t)" "WAIT(w)" "|" "DONE(d)" "CANCELED(c)"))) #+end_src *** 週の最初から表示するのではなく今日から表示されるようにする #+begin_src emacs-lisp (setq org-agenda-start-on-weekday nil) #+end_src *** 今やらなくていいタスクを org-agenda に表示しないようにする SCHEDULE が設定されているタスクで、 始まっていないタスクが org-agenda に表示されないようにする。 #+begin_src emacs-lisp (setq org-agenda-todo-ignore-scheduled 'future) #+end_src *** タスクをブロックする系の設定 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 のタスクが灰色になってしまう問題が生じる。 #+begin_src emacs-lisp (setq org-enforce-todo-dependencies t) (setq org-agenda-dim-blocked-tasks t) (setq org-enforce-todo-checkbox-dependencies nil) #+end_src *** =DONE= したときの時刻を残す 後からその日に何個のタスクを終了したかを記録するため。 #+begin_src emacs-lisp (setq org-log-done t) #+end_src *** =DONE= したときの時刻は邪魔なので Agenda から見えないようにする #+begin_src emacs-lisp (setq org-agenda-log-mode-items '(clock)) #+end_src *** org-agenda-custom-commands #+begin_src emacs-lisp (setq org-agenda-custom-commands '(("n" "日程とタスク" ((agenda "" ((org-agenda-span 14))) (todo ""))))) #+end_src ** org-store-link Emacs の任意の場所のリンクを取得する機能。 #+begin_src emacs-lisp (global-set-key (kbd "C-c l") 'org-store-link) #+end_src ** org-table =org-table-automatic-realign= を無効化しないと org-capture で表に追記したときに謎の空行が生じて表が破壊される現象を観測していて、 これを防ぐために =nil= に設定している。 #+begin_src emacs-lisp (setq org-table-automatic-realign nil) #+end_src ** htmlize htmlize は良い感じに org-mode を HTML で出力するのに必要。 #+begin_src emacs-lisp (straight-use-package 'htmlize) #+end_src ** org-startup 系 org-mode のファイルを開いたときにインデントされていてかつ折り畳まれた状態にする。 #+begin_src emacs-lisp (setq org-startup-indented t) (setq org-startup-folded t) #+end_src ** org-archive org-mode のアーカイブ先を設定する。 #+begin_src emacs-lisp (setq org-archive-location "~/org/archive/archive.org::datetree/") #+end_src デフォルトでは tag でアーカイブする。 #+begin_src emacs-lisp (setq org-archive-default-command 'org-archive-set-tag) #+end_src ** 今日の定義は変更しない 深夜のタイムスタンプが正常に動作しなくなるため、明示的にデフォルトのままに設定する。 #+begin_src emacs-lisp (setq org-extend-today-until 0) #+end_src ** org-capture #+begin_src emacs-lisp (global-set-key (kbd "C-c c") 'org-capture) (setq org-default-notes-file (concat org-directory "notes.org")) #+end_src *** Template #+begin_src emacs-lisp (setq org-capture-templates `(("c" "メモ" entry (file+headline "" "メモ") "* %?\n%U" :empty-lines 1) ("a" "TODO + Location" entry (file+headline "" "タスク") "* TODO %?\n%U\n%a" :empty-lines 1) ("t" "TODO" entry (file+headline "" "タスク") "* TODO %?\n%U" :empty-lines 1) ("T" "すぐにはじめる TODO" entry (file+headline "" "タスク") "* TODO %?\n%U" :empty-lines 1 :clock-in t :clock-keep t) ("i" "Issue" entry (file+headline "" "Issue") "* TODO %?\n:PROPERTIES:\n:CUSTOM_ID: %<%Y-%m-%d>-%^{ID}\n%U" :empty-lines 1 :jump-to-captured t) ("I" "すぐに始める Issue" entry (file+headline "" "Issue") "* TODO %?\n:PROPERTIES:\n:CUSTOM_ID: %<%Y-%m-%d>-%^{ID}\n%U" :empty-lines 1 :clock-in t :clock-keep t :jump-to-captured t) ("C" "日程" entry (file+headline "" "日程") "* %?\n%^t\n" :empty-lines 1) ("n" "今やっているタスクにサブタスクを追加" entry (clock) "* TODO %?%U" :empty-lines 1) ("N" "(clock-keep) サブタスクを開始する" entry (clock) "* TODO %?%U" :empty-lines 1 :clock-in t :clock-keep t))) #+end_src ** org-clock *** org-clock-goto グローバルに org-clock-goto できるようにする #+begin_src emacs-lisp (global-set-key (kbd "C-c g g") 'org-clock-goto) #+end_src