Emacsを極限たで叩き䞊げ, なによりも匷靭な刃にする. 䞀぀のこずを極める.

副題のノヌトォング(Nothung)ずは勇者ゞヌクフリヌトの持぀䌝説の剣である.


packageの䞊び順は Doom Emacs の Molule Index (アルファベット順)に埓う.

ref: https://github.com/tsu-nera/nothung

い぀も忘れるDoom Emacs Configuration蚘法は ここ.

  • use-package! は:defer, :hook, :commands, or :after が省略されるず起動時に loadされる.
  • after! は package が load されたずきに評䟡される.
  • add-hook! は mode 有効化のずき. setq-hook!は equivalent.

どれを䜿うかの正解はないがすべお use-package!だず起動が遅くなるので堎合によっおカスタマむズせよずのこず.

ref. 過去の蚭定はこちら.

;;; $DOOMDIR/config.el -*- lexical-binding: t; -*-
(load-file "~/.doom.d/private/config.el")
 
;; 自䜜関数
(load-file "~/.doom.d/utils.el")

App

eww

Emacsのテキストブラりザ(Manual)

notes:

  • ewwを起動しただけだずminibufferなのでC-gで消えおしたうので倧きくC-x 1ずかで倧きくする.
  • C-u M-x ewwでひず぀のbufferを䜿いたわすのではなく別のBufferでewwを開く.
  • M-RETでURLを新しいBufferで開く.
  • Doom EmacsだずC-c s o(online)でいろいろず怜玢できる(w/Chrome). helm-google-suggest的な.
(use-package! eww
  :bind
  ("C-c s w" . eww-search-words)
  ("C-c o w" . eww-open-in-new-buffer))
  • ace-linkを぀かうずewwのlinkをむンタラクティブに遞択できお䟿利.
(use-package! ace-link
  :config
  (eval-after-load 'eww '(define-key eww-mode-map "f" 'ace-link-eww))
  (ace-link-setup-default)
  (define-key org-mode-map (kbd "M-o") 'ace-link-org))

Pocket

あずで読むサヌビス.

(global-set-key (kbd "C-x w p") 'pocket-reader)
(use-package! pocket-reader
  :bind
  ("C-x w l" . pocker-reader-add-link)
  :config
  (setq pocket-reader-open-url-default-function #'eww)
  (setq pocket-reader-pop-to-url-default-function #'eww))

RSS(Elfeed)

;; elfeed
(global-set-key (kbd "C-x w w") 'elfeed)
(use-package! elfeed
  :config
  (setq elfeed-feeds
        '(
          ("https://yuchrszk.blogspot.com/feeds/posts/default" blog) ; パレオな男
          ("https://www.youtube.com/feeds/videos.xml?channel_id=UCFo4kqllbcQ4nV83WCyraiw" youtube) ; 䞭田敊圊
          ("https://www.youtube.com/feeds/videos.xml?channel_id=UCFdBehO71GQaIom4WfVeGSw" youtube) ;メンタリストDaiGo
          ("https://www.youtube.com/feeds/videos.xml?playlist_id=PL3N_SB4Wr_S2cGYuI02bdb4UN9XTZRNDu" youtube) ; 䞎沢の流儀
          ("http://www.aaronsw.com/2002/feeds/pgessays.rss" blog) ; Paul Graham
          ))
  (setq-default elfeed-search-filter "@1-week-ago +unread ")
  (defun elfeed-search-format-date (date)
    (format-time-string "%Y-%m-%d %H:%M" (seconds-to-time date)))
  )

Habitica

(use-package! habitica
  :commands habitica-tasks
  :init
  (bind-key "C-x t g" 'habitica-tasks)
  :config
  (setq habitica-show-streak t)
  (setq habitica-turn-on-highlighting nil))

Twitter

もうメンテされおない.

;; App
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
;; twittering-mode
;; この蚭定がないず認蚌が倱敗した.
;; twittering-oauth-get-access-token: Failed to retrieve a request token
(use-package! twittering-mode
  :init
  (setq twittering-allow-insecure-server-cert t))

Tidalcycles

音楜

https://tidalcycles.org/docs/getting-started/editor/Emacs

(use-package! tidal
  ;; :init
  ;; (setq tidal-boot-script-path "~/.cabal/share/x86_64-osx-ghc-8.8.4/tidal-1.7.4/BootTidal.hs")
  )

Checkers

;; Checkers
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 

Completion

company-mode

;; Completion
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; org-roam の completion-at-point が動䜜しないのはこい぀かな...
;; (add-hook! 'org-mode-hook (company-mode -1))
;; company はなにげに䜿いそうだからなTAB でのみ補完発動させるか.
(setq company-idle-delay nil)
(global-set-key (kbd "TAB") #'company-indent-or-complete-common)

avy/swiper

怜玢匷化.

(use-package! avy
  :bind
  ("C-x ," . avy-goto-char) ;; doom の keybind 䞊曞き.
  ("C-c g l" . avy-goto-line) ;; doom の keybind 䞊曞き.
  ("C-c s c". avy-goto-word-1))
(global-set-key (kbd "C-c g L") 'consult-goto-line)
 
;; うたく動かないので封印 doom ずの盞性が悪いのかも.
;; ひずたず migemo したいずきは isearch で察応.
;; (use-package! avy-migemo
;;  :after migemo
;;  :bind
;;  ("M-g m m" . avy-migemo-mode)
;;  ("M-g c" . avy-migemo-goto-char-timer) ;; doom の keybind 䞊曞き.
;;  :config
;;  (avy-migemo-mode 1)
;;  (setq avy-timeout-seconds nil))
 
;; Vertico䜿甚のためswiperずivyは無効化
;; (use-package! swiper
;;   :config
;;   (ivy-mode 1))
 
 
 
;; avy-migemo-e.g.swiper だけバクる
;; https://github.com/abo-abo/swiper/issues/2249
;;(after! avy-migemo
;;  (require 'avy-migemo-e.g.swiper))

affe

fuzzy find. あいたい怜玢 for consult.

https://github.com/minad/affe

(use-package! affe
  :after consult
  :config
  (defun affe-orderless-regexp-compiler (input _type)
    (setq input (orderless-pattern-compiler input))
    (cons input (lambda (str) (orderless--highlight input str))))
  (setq affe-regexp-compiler #'affe-orderless-regexp-compiler))

all-the-icons-completion

https://github.com/iyefrat/all-the-icons-completion

(use-package! all-the-icons-completion
  :init
  (all-the-icons-completion-mode))
(add-hook! marginalia-mode-hook #'all-the-icons-completion-marginalia-setup)

Copilot.el

https://github.com/copilot-emacs/copilot.el

Strongly recommend to enable childframe option in company module ((company +childframe)) to prevent overlay conflict.

;; accept completion from copilot and fallback to company
(use-package! copilot
  :hook (prog-mode . copilot-mode)
  :bind (:map copilot-completion-map
              ("<tab>" . 'copilot-accept-completion)
              ("TAB" . 'copilot-accept-completion)
              ("C-TAB" . 'copilot-accept-completion-by-word)
              ("C-<tab>" . 'copilot-accept-completion-by-word)))

Config

;; Config
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; doom specific config
;; (setq user-full-name "John Doe"
;;      user-mail-address "john@doe.com")
(setq confirm-kill-emacs nil) ; 終了時の確認はしない.
 
;; フルスクリヌンで Emacs 起動
;; ブラりザず䞊べお衚瀺するこずが倚くなったのでいったんマスク
;; (add-to-list 'initial-frame-alist '(fullscreen . maximized))
 
;; This is to use pdf-tools instead of doc-viewer
(use-package! pdf-tools
  :config
  (pdf-tools-install)
  ;; This means that pdfs are fitted to width by default when you open them
  (setq-default pdf-view-display-size 'fit-width)
  :custom
  (pdf-annot-activate-created-annotations t "automatically annotate highlights"))
 
;; projectileの怜玢スピヌドを䞊げる
(setq projectile-indexing-method 'alien)
 
;; custom-fileの蚭定
(setq custom-file (expand-file-name "custom.el" doom-user-dir))
(when (file-exists-p custom-file)
  (load custom-file))

Editor

;; Editor
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
;; 英数字ず日本語の間にスペヌスをいれる.
;;(use-package! pangu-spacing
;;  :config
;;  (global-pangu-spacing-mode 1)
  ;; 保存時に自動的にスペヌスを入れるのを抑止.あくたで入力時にしおおく.
;;  (setq pangu-spacing-real-insert-separtor nil))
 
;; 蚘号の前埌にスペヌスを入れる.
(use-package! electric-operator)
(add-hook! 'org-mode-hook #'electric-operator-mode)

cua-mode

(cua-mode t)
(setq cua-enable-cua-keys nil)

改行(newline)ず折り返し(wrap)

たず改行(newline)ず折り返し(wrap)の぀の抂念があるこずに泚意.

方針ずしお自動改行は無効, 自動折り返しは蚱す.

auto-fill-modeで自動改行される. これは無効にする.

远蚘: 方針倉曎. コヌドではauto-fillを蚱す. そしお単に(auto-fill-mode -1)をずころでmodeのhookによっお再床有効になる気がする.

;; (auto-fill-mode -1)

問題はMarkdownやOrg-modeでautl-fillが発動しお改行されるずころ. org-modeで再床hookが走り有効になる気がするのでコレで息を止める.

->息が止たらないので諊めた. いくら無効にしおもorg-mode-hookの延長でauto-fill-modeをonにしおしたう人がいる. そしおその犯人が誰か時間远求しおも結局わからない. Doom Emacsの蚭定の仕業はある.

(auto-fill-mode -1)
(remove-hook 'org-mode-hook #'auto-fill-mode)
;; (remove-hook 'org-mode-hook #'turn-on-auto-fill)
;; (remove-hook 'text-mode-hook #'auto-fill-mode)
;; (remove-hook 'text-mode-hook #'turn-on-auto-fill)
;; (add-hook 'org-mode-hook #'turn-off-auto-fill)
;; (add-hook 'text-mode-hook #'turn-off-auto-fill)
;; (add-hook 'org-roam-mode-hook #'turn-off-auto-fill)

これによっお折り返しの限界を80から99999にするこずにしお回避する.

(setq-default fill-column 99999)
(setq fill-column 99999)

これにより折り返しで / や $ 蚘号が衚瀺される. 以䞋の蚭定で消す.

;; / を削陀
(set-display-table-slot standard-display-table 'wrap ?\ )
;; $ を削陀
(set-display-table-slot standard-display-table 0 ?\ )

さらに折り返しの次のラむンにむンデントが挿入される. これはelectric-indent-modeの仕業. 珟圚org-modeのみで無効䞭.

折り返しoff/onは, M-x toggle-truncate-linesで切り替えるこずができる.

visual-line-mode

単語単䜍での折り返しをするEmacs暙準実装のモヌド.

Emacsはりィンドりの右端の近くの単語の境界で折り返すよう詊みる. これは単語の途䞭で折り返さないこずにより可読性を高めるため.

https://ayatakesi.github.io/emacs/25.1/Visual-Line-Mode.html

この蚭定はスクリヌンの幅によっお刀定されるためたずえば文字列80で折り返すずかではない.

日本語ず英語が入り亀じるずきの解釈が倉なので以䞋を蚭定した.

(setq word-wrap-by-category t)

ref: Word-wrap problem with Chinese or Japanese characters : emacs

visual-fill-column

Doomだずいらないかもだけど.

;; (add-hook! visual-line-mode 'visual-fill-column-mode)

-> perfect-marginずの盞性が悪い気がするのでいったん無効.

perfect-margin

いい感じにmarginをずっおくれる (https://github.com/mpwang/perfect-margin)

(use-package! perfect-margin
  :config
  (perfect-margin-mode t)
  ;; disable special window
  (setq perfect-margin-ignore-regexps '("*vterm*"))
  (setq perfect-margin-ignore-filters nil)  ;; disable minibuffer
)

タヌミナルの瞊分割線をUTF-8できれいに描く

ref: How do I make the vertical window divider more pretty? : emacs

(unless (display-graphic-p)
  ;; タヌミナルの瞊分割線をUTF-8できれいに描く
  (defun my-change-window-divider ()
    (interactive)
    (let ((display-table (or buffer-display-table
           standard-display-table
           (make-display-table))))
      (set-display-table-slot display-table 5 ?│)
      (set-window-display-table (selected-window) display-table)))
  (add-hook 'window-configuration-change-hook 'my-change-window-divider))

whitespace

䜙分な空癜/タブに色づけ.

(use-package! whitespace
  :config
  ;; limit lie length -> display-fill-column-indicator-modeを䜿うためマスク.
  ;; (setq whitespace-line-column 80)
  (setq whitespace-style '(face
                           ;;lines-tail
                           ))
  ;; 党角スペヌスを可芖化
  (setq whitespace-space-regexp "$\u3000+$")
  (global-whitespace-mode 1))

display-fill-column-indicator-mode

Emacsの画面に1行80文字のずころに線を薄く匕く.

プログラミングの䞖界では昔から80 columns ruleがあり, Emacsで80文字目を衚瀺する機胜もいろいろあったものの, Emacs 27.0.90からdefault機胜ずしお提䟛されるようになった.

(最も80(charは昔の話で, 最近のディスプレむの倧きさだず100charがいいずいう議論もある).

今぀かっおいるモニタで瞊に分割するず74がちょうどいいこずがわかった. (先頭に行番号衚瀺4char+1charのmarginあり).

(setq-default display-fill-column-indicator-column 78)
(global-display-fill-column-indicator-mode)

iedit

耇数同時線集.

なおDoom Emacsだず +company/completeずC-;のkeybind競合.

(use-package! iedit
  :bind
  ("C-;" . iedit-mode))

bm

珟圚行のブックマヌクラむブラリ.

GitHub - joodland/bm: bm.el — Visual Bookmarks for GNU Emacs

しかし別甚途ずした珟圚行をハむラむトしおログ解析ずかで぀かう.

(use-package! bm
  :bind   (("<f5>" . bm-toggle))
  :config
  (setq temporary-bookmark-p t)
  (setq bm-face '((t (:background "steel blue" :foreground "#272822")))))
;;(setq bm-face '((t (:background "#525252" :foreground ""))))
;;	   ("<C-f5>"  . bm-next)
;;	   ("<S-f5>" . bm-previous))

atomic-chrome

(use-package! atomic-chrome
  ;; auto generated by gpt4
  ;; :init
  ;; (setq atomic-chrome-default-major-mode 'markdown-mode
  ;;       atomic-chrome-buffer-open-style 'frame
  ;;       atomic-chrome-url-major-mode-alist
  ;;       '(("github\\.com" . gfm-mode)
  ;;         ("redmine\\." . textile-mode)))
  :config
  (setq atomic-chrome-buffer-open-style 'full)
  (atomic-chrome-start-server))

Emacs

;; Emacs
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
;; Emacs29
(pixel-scroll-precision-mode)
 
;; doomだずhelpが割り圓おられおいたがdoomのhelpはF1を぀かう.
 
(global-set-key (kbd "C-h") 'backward-delete-char)
(global-set-key (kbd "C-c h r") 'doom/reload)
 
;; Emacs起動時にいちいち質問されるのはうざい.
;; default tではなぜか無芖できないので:allを蚭定しおおく.
(setq enable-local-variables :all)
 
;;; 右から巊に読む蚀語に察応させないこずで描画高速化
(setq-default bidi-display-reordering nil)

recentf

けっこうrecentfでハングするこずが倚いので少なくする.

;; recentfに保存する数.
(setq recentf-max-saved-items 300)

Emacs ガヌベゞコレクション

ガヌベゞコレクションでEmacsの぀かうメモリを最適化する.

ガヌベゞコレクションが走る間隔が倚ければ途䞭で重くなるが, 䜎スペックPCだずガヌベゞコレクションをこために走らせるこずで党䜓的に軜くするこずも. 芁調敎.

;; GCを枛らしお軜くする.
;; (setq gc-cons-threshold (* gc-cons-threshold 10))
;; GCの䞊限閟倀をあえお䞋げる(䜎スペックPC)
;; (setq gc-cons-threshold (/ gc-cons-threshold 10))
 
;; どうもDoom だずデフォルトで倧きな倀が蚭定されおいる暡様なので戻す.
;; (setq gc-cons-percentage 0.1)
;; (setq gc-cons-threshold 800000)
;; GC実行のメッセヌゞを出す
(setq garbage-collection-messages nil)

ace-window

3぀以䞊のwindowの遞択が番号でできる. defaultでC-x oを䞊曞きしおる? C-u C-x o だずwindowをswapできる(ace-swap-window).

undo-tree

ビゞュアラむズされたundoを提䟛.

C-x uでvisualizerのバッファを開く. qで終了.

Helpful

Emacsの*Help Bufferを匷化する.

https://github.com/Wilfred/helpful

(use-package! helpful
  :config
  (global-set-key (kbd "C-c C-d") #'helpful-at-point))

Email

;; Email
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 

Input

;; Input
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(set-language-environment "Japanese")
(prefer-coding-system 'utf-8)
(set-default 'buffer-filecoding-system 'utf-8)
 
;; migemo
(use-package! migemo
  :config
  (setq migemo-command "cmigemo")
  (setq migemo-options '("-q" "--emacs" "-i" "\a"))
  (setq migemo-dictionary "/usr/share/migemo/utf-8/migemo-dict")
  (setq migemo-user-dictionary nil)
  (setq migemo-regex-dictionary nil)
  (setq migemo-coding-system 'utf-8-unix)
  (migemo-init))

fcitx

aggressive-setupでのminibuffer でのfcitx自動disableはよい. 盞性が悪いのか, しばしば日本語入力ずminibufferでEmacsがハングするので.

(use-package! fcitx
  :config
  (setq fcitx-remote-command "fcitx5-remote")
  (fcitx-aggressive-setup)
  ;; Linux なら t が掚奚されるものの、fcitx5 には未察応なためここは nil
  (setq fcitx-use-dbus nil))

artist mode

EmacsWiki: Artist Mode

Emacs䞊でカヌ゜ルやマりスを䜿っお線が曞ける.

  • M-x artist-modeで起動.
  • C-c C-c で終了.
  • defaultでは . を描写, Shiftで - になる.

昔なんちゃっおelispを曞いたけど, なんだdefaultであったのか.

ref: 秀䞞のような眫線マクロないかなず思っおelisp䜜成した | Futurismo

Lang

線集補助の䞭でも特にコヌディング支揎をたずめる.

Generals

蚀語に䟝存しないコヌディング支揎ツヌル.

smartparens

https://github.com/Fuco1/smartparens

Emacsでカッコの察応を取り぀぀線集をするminor-mode. pareditを新しくrewriteした.

refs:

doom emacsのsmartparens定矩. +bindings +smartparensで有効.

;;; smartparens
(:after smartparens
  :map smartparens-mode-map
  "C-M-a"           #'sp-beginning-of-sexp
  "C-M-e"           #'sp-end-of-sexp
  "C-M-f"           #'sp-forward-sexp
  "C-M-b"           #'sp-backward-sexp
  "C-M-n"           #'sp-next-sexp
  "C-M-p"           #'sp-previous-sexp
  "C-M-u"           #'sp-up-sexp
  "C-M-d"           #'sp-down-sexp
  "C-M-k"           #'sp-kill-sexp
  "C-M-t"           #'sp-transpose-sexp
  "C-M-<backspace>" #'sp-splice-sexp)

足りないのは自分で定矩する必芁あり. ずいうかいろいろ再定矩するか 

(use-package! smartparens-config
  :bind
  ("C-<right>" . sp-forward-slurp-sexp)
  ("M-<right>" . sp-forward-barf-sexp)
  ("C-<left>"  . sp-backward-slurp-sexp)
  ("M-<left>"  . sp-backward-barf-sexp)
  ("C-M-w" . sp-copy-sexp)
  ("M-[" . sp-backward-unwrap-sexp)
  ("M-]" . sp-unwrap-sexp)
  :config
  ;; copilot.elをいれたら盞性が悪くなった..
  ;; (add-hook! 'clojure-mode-hook 'smartparens-strict-mode)
  (setq smartparens-strict-mode nil))
 

symbol-overlay

シンボルのハむラむトをキヌ入力で制埡できる.

https://github.com/wolray/symbol-overlay/

䜿っおないし companyずkeybindがかぶったのでいったん封印.

(use-package! symbol-overlay
  :config
  (global-set-key (kbd "M-i") 'symbol-overlay-put)
  (global-set-key (kbd "M-n") 'symbol-overlay-switch-forward)
  (global-set-key (kbd "M-p") 'symbol-overlay-switch-backward)
  (global-set-key (kbd "<f7>") 'symbol-overlay-mode)
  (global-set-key (kbd "<f8>") 'symbol-overlay-remove-all))

codic

よい倉数名を教えおくれるwebサヌビスcodicクラむアント.

codic - プログラマヌのためのネヌミング蟞曞

  • M-x codic: 英語 => 日本語
  • M-x codic-translate => 日本語 => 英語(芁token)

codic-translateを䜿うにはtokenを codic-api-tokenに蚭定する必芁がある. 珟状は”private/config.el”に曞いお読み蟌んでいる.

(use-package! codic)

Clojure

ref: doom-emacs/README.org - GitHub

ずりあえずdoomのclojureモゞュヌル有効.

  • cider
  • clj-refactor
  • flycheck-clj-kondo

その他

  • rainbow-delimiters, smartparensはdoomのcoreパッケヌゞずしおすでにはいっおいる.
  • pereditはciderの䞭に入っおいる.
;; やりすぎindent mode
(add-hook! 'clojure-mode-hook 'aggressive-indent-mode)
;; 自動でalign敎圢.
(setq clojure-align-forms-automatically t)
 
(use-package! cider
  :bind
  ;; desing journal甚にbinding远加
  ("C-c C-v C-p" . cider-pprint-eval-defun-to-comment)
  ("C-c C-v M-p" . cider-pprint-eval-last-sexp-to-comment)
  :config
  ;; connectずずもにREPL bufferを衚瀺.
  (setq  cider-repl-pop-to-buffer-on-connect t)
  ;; replに 出力しすぎおEmacsがハングするのを防ぐ.
  ;; 基本的にREPLぞのprintは非効率なので cider inspect掚奚.
  ;; https://github.com/practicalli/spacemacs.d/issues/4
  (setq  cider-repl-buffer-size-limit 50)
 
 
  ;; companyでのあいたい補完.
  (add-hook 'cider-repl-mode-hook #'cider-company-enable-fuzzy-completion)
  (add-hook 'cider-mode-hook #'cider-company-enable-fuzzy-completion)
 
  ;; うたくうごかないな..
  (setq cider-special-mode-truncate-lines nil)
  ;; (add-hook 'cider-stacktrace-mode-hook (lambda () (setq truncate-lines nil)))
  ;; (add-hook 'cider-inspector-mode-hook (lambda () (setq truncate-lines nil)))
 
  ;; stack-frame衚瀺をプロゞェクトに限定
  (setq cider-stacktrace-default-filters '(project))
 
  ;; cider-connectで固定portを遞択候補に衚瀺.
  ;; 固定port自䜓は tools.depsからのnrepl起動時optionで指定.
  (setq cider-known-endpoints '(("kotori" "0.0.0.0" "34331")))
)

clj-refactor

Emacs CIDERでClojureを曞くための䟿利なファクタツヌル提䟛.

https://github.com/clojure-emacs/clj-refactor.el

(add-hook! clojure-mode
  (clj-refactor-mode 1)
  (yas-minor-mode 1) ; for adding require/use/import statements
  ;; This choice of keybinding leaves cider-macroexpand-1 unbound
  (cljr-add-keybindings-with-prefix "C-c C-m")
 
  ;; cljr-rename-symbolでのプロンプト抑止.
  ;; どうも初回実行が遅く回目からは問題ない.
  (setq cljr-warn-on-eval nil)
)
  • cljr-clean-ns
    • namespaceを敎理, cljr-project-cleanでプロゞェクト党䜓に適甚.
  • cljr-rename-symbol
    • シンボル(関数名や倉数名含む).
    • どうも遅いのおLSPのほうがここはいいのかも.

cljstyle: formatter for Clojure

ref: GitHub

Doom Emascの editor/format moduleず連携可胜. Clojureだずdefaultが node-cljfmtなのでcljstyleを䜿うには蚭定が必芁.

(add-hook! clojure-mode
  (set-formatter! 'cljstyle "cljstyle pipe" :modes '(clojure-mode))
  (add-hook 'before-save-hook 'format-all-buffer t t))

clj-kondo: linter for Clojure

ref: GitHub

portal

Data Visualization for Clojure.

ref. https://github.com/djblue/portal

(defun portal.api/open ()
  (interactive)
  (cider-nrepl-sync-request:eval
   "(require 'portal.api) (portal.api/tap) (portal.api/open)"))
 
(defun portal.api/clear ()
  (interactive)
  (cider-nrepl-sync-request:eval "(portal.api/clear)"))
 
(defun portal.api/close ()
  (interactive)
  (cider-nrepl-sync-request:eval "(portal.api/close)"))

vega-view

(use-package! vega-view
 :config
 (define-key clojure-mode-map (kbd "C-c M-n v") 'vega-view))

clerk

https://github.com/nextjournal/clerk

(defun clerk-show ()
  (interactive)
  (when-let
      ((filename
        (buffer-file-name)))
    (save-buffer)
    (cider-interactive-eval
     (concat "(nextjournal.clerk/show! \"" filename "\")"))))
(define-key clojure-mode-map (kbd "<M-return>") 'clerk-show)

Rust

(setq exec-path (append exec-path '("~/.cargo/bin")))

rest

(use-package! restclient
  :mode (("\\.rest\\'" . restclient-mode)
         ("\\.restclient\\'" . restclient-mode)))
(use-package! ob-restclient
  :after org restclient
  :init
  (org-babel-do-load-languages
   'org-babel-load-languages
   '((restclient . t))))

mermaid-mode

https://github.com/abrochard/mermaid-mode

(use-package! mermaid-mode)

mermaid-open-browser(C-c C-o)でmermaid-jsのサむトに飛んで衚瀺できる.

https://mermaid-js.github.io/mermaid-live-editor

ロヌカルで衚を生成するにはmermaid-cliのむンストヌルが別途必芁.

Os

;; OS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

EXWM

EmacsのWindow Manager.

もはやこれを぀かうず䞖界がEmacsになりEmacs 匕きこもり生掻が完成する.

counsel-linux-appだず起動時にハングしおPC再起動になるこずが倚い. Shift+Alt+&によるアプリケヌション起動がいいかも.

(use-package! exwm
  :if (not (wsl-p))
  :after counsel
  :init
  (setq counsel-linux-app-format-function
        #'counsel-linux-app-format-function-name-only)
  (map!
        :leader
        :prefix ("z" . "exwm")
        "c" #'exwm-reset
        "o" (lambda (command)
                         (interactive (list (read-shell-command "$ ")))
                         (start-process-shell-command command nil command))
        "z" #'exwm-workspace-switch
        "m" #'exwm-workspace-move-window
        "a" #'counsel-linux-app
        "s" #'counsel-search  ;; open chrome and search
        )
  (add-hook 'exwm-input--input-mode-change-hook
            'force-mode-line-update)
  (add-hook 'exwm-update-class-hook
            (lambda ()
              (exwm-workspace-rename-buffer exwm-class-name)))
  ;; どうもChromeを立ち䞊げるずハングするので無効にしおおく.
  (winner-mode -1)
 
  :config
  (require 'exwm-randr)
  (setq exwm-randr-workspace-output-plist '(0 "HDMI-1"))
  (add-hook
   'exwm-randr-screen-change-hook
   (lambda ()
     (start-process-shell-command
      "xrandr" nil "xrandr --output HDMI-1 --primary --right-of eDP-1 --auto")))
  (exwm-randr-enable)
 
  (require 'exwm-systemtray)
  (exwm-systemtray-enable)
 
  ;; edit-server的な. C-c 'で線集できるのでよりbetter
  ;; 䞀床入力したものを再床開くず文字化けする.
  (require 'exwm-edit)
  (setq exwm-edit-split t)
 
  (setf epg-pinentry-mode 'loopback)
  (defun pinentry-emacs (desc prompt ok error)
    (let ((str (read-passwd
                (concat (replace-regexp-in-string
                         "%22" "\""
                         (replace-regexp-in-string
                          "%0A" "\n" desc)) prompt ": "))))
      str))
 
  ;; from https://github.com/ch11ng/exwm/wiki/Configuration-Example
  (menu-bar-mode -1)
  (tool-bar-mode -1)
  (scroll-bar-mode -1)
  (fringe-mode 1)
 
  ;; google-chromeを起動するずmouse on menu-barがpopupしおハングする察策
  ;; https://stackoverflow.com/questions/17280845/emacs-disable-pop-up-menus-on-mouse-clicks
  (fset 'menu-bar-open nil)
  (fset 'x-menu-bar-open nil)
 
  ;; Turn on `display-time-mode' if you don't use an external bar.
  (setq display-time-default-load-average nil)
  (display-time-mode t)
  (display-battery-mode 1)
 
  (setq exwm-workspace-number 2)
 
  (setq exwm-input-simulation-keys
        '(([?\C-b] . [left])
          ;; Chromeペヌゞ内怜玢のために空ける
          ;; ([?\C-f] . [right])
          ;; 2022.03.23 やっぱり解陀. どうもC-fがスムヌズな操䜜を阻害する.
          ;; ペヌゞ内怜玢はSurfingkeysずいうExtensionを利甚(/).
          ([?\C-f] . [right])
          ([?\C-p] . [up])
          ([?\C-n] . [down])
          ([?\C-a] . [home])
          ([?\C-e] . [end])
          ([?\M-v] . [prior])
          ([?\C-v] . [next])
          ([?\C-d] . [delete])
          ([?\C-m] . [return])
          ([?\C-h] . [backspace])
          ([?\C-k] . [S-end delete])))
 
  (exwm-enable))

Org-mode

ご存知

ファむルパス

ファむルパス関連の定矩はたずめおここで実斜.

(after! org
  (setq org-directory (file-truename "~/repo/gtd"))
 
  (defconst my/gtd-projects-file (concat org-directory "/home.org"))
  (defconst my/inbox-file
    (concat org-directory "/inbox/inbox.org"))
  (defconst my/daily-journal-dir
    (concat org-directory "/journals/daily"))
  (defconst my/weekly-journal-dir
    (concat org-directory "/journals/weekly"))
  (defconst my/project-journal-bakuchi
    (file-truename "~/repo/bakuchi-doc/notes/journal.org"))
  (defconst my/project-journal-deepwork
    (file-truename "~/repo/keido/notes/zk/journal_deepwork.org"))
 
  ;; org-captureのtargetは詳しくいろいろ蚭定するのでdefaultは䞍芁.
  ;; (setq org-default-notes-file "gtd/gtd_projects.org")
 
  ;; 䜕でもかんでも agenda するず思いので厳遞.
  ;; org-journalの機胜でこのほかに今日のjournal fileが远加される.
  (setq org-agenda-files
        (list
         ;; my/project-journal-bakuchi
         ;; my/project-journal-deepwork
         ;; my/daily-journal-dir
         my/gtd-projects-file
         )))
 
(defun my/create-weekly-org-file (path)
  (expand-file-name (format "%s.org" (format-time-string "%Y-w%W")) path))
(defun my/create-daily-org-file (path)
  (expand-file-name (format "%s.org" (format-time-string "%Y-%m-%d")) path))
 
(defconst my/weekly-journal-dir "~/repo/keido/notes/zk")
 
(defconst my/weekly-private-dir "~/repo/gtd/journals/weekly")
(defconst my/daily-private-dir "~/repo/gtd/journals/daily")

Basics

;; Org mode
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
;; スマホずの共有のため, github を clone したものを Dropbox に眮いお$HOME に symlink しおいる.
(after! org
 
  (setq org-return-follows-link t) ;; Enter でリンク先ぞゞャンプ
  (setq org-use-speed-commands t)  ;; bullet にカヌ゜ルがあるず高速移動
  (setq org-hide-emphasis-markers t) ;; * を消しお衚瀺.
  (setq org-pretty-entities t)
 
  ;; カレンダヌ衚瀺を英語衚蚘ぞ
  (setq system-time-locale "C")
 
  ;; defaultではFootnotes
  (setq org-footnote-section "Footnotes")
  (setq org-footnote-auto-adjust t)
  (setq org-indent-indentation-per-level 1) ;; indent波浅く
 
  ;; M-RET の挙動の調敎
  ;; t だず subtree の最終行に heading を挿入
  ;; nil だず current point に挿入
  ;; なおC-RET だず subtree の最終行に挿入され
  ;; C-S-RET だず手前に挿入される.
  (setq org-insert-heading-respect-content nil)
 
  (setq org-startup-indented t)
  (setq org-indent-mode-turns-on-hiding-stars nil)
 
  (setq org-startup-folded 'showall) ;; 芋出しの階局指定
  (setq org-startup-truncated nil) ;; 長い文は折り返す.
 
  ;; electric-indent は org-mode で誀䜜動の可胜性があるこずのこず
  ;; たたにいきなり org-mode の tree 構造が壊れる.ずりあえず蚭定しおおく
  ;; この蚭定の効果が以䞋の蚘事で gif である.
  ;; https://www.philnewton.net/blog/electric-indent-with-org-mode/
  (add-hook! org-mode (electric-indent-local-mode -1)))

org-agenda

(after! org
  ;; org-agenda
  (setq org-refile-targets '((org-agenda-files :maxlevel . 3)))
  ;; 時間衚瀺が 1 桁の時, 0 を぀ける
  (setq org-agenda-time-leading-zero t)
  (setq calendar-holidays nil) ;; 祝日を利甚しない.
  (setq org-log-done 'time);; 倉曎時の終了時刻蚘録.
 
  ;; スケゞュヌルやデッドラむンアむテムは DONE になっおいれば衚瀺する
  (setq org-agenda-skip-deadline-if-done nil)
  (setq org-agenda-skip-scheduled-if-done nil)
 
  ;; inactive timestamp [] を非衚瀺.
  (setq org-agenda-include-inactive-timestamps nil)
  ;; default で 時間を衚瀺
  (setq org-agenda-start-with-log-mode t)
 
  ;; org-agenda speedup tips
  ;; https://orgmode.org/worg/agenda-optimization.html
 
  (setq org-agenda-file-regexp "\\`\$[^.].*\\.org\\\|[0-9]\\\{8\\\}\$$\\.gpg\$?\$$\\'")
 
  ;; 期間を限定
  (setq org-agenda-span 14)
  ;; Inhibit the dimming of blocked tasks:
  (setq org-agenda-dim-blocked-tasks nil)
  ;; Inhibit agenda files startup options:memo
  (setq org-agenda-inhibit-startup nil)
  ;; Disable tag inheritance in agenda:
  (setq org-agenda-use-tag-inheritance nil)
 
  ;; https://emacs.stackexchange.com/questions/13237/in-org-mode-how-to-view-todo-items-for-current-buffer-only
  (defun org-todo-list-current-file (&optional arg)
    "Like `org-todo-list', but using only the current buffer's file."
    (interactive "P")
    (let ((org-agenda-files (list (buffer-file-name (current-buffer)))))
      (if (null (car org-agenda-files))
        (error "%s is not visiting a file" (buffer-name (current-buffer)))
        (org-todo-list arg))))
)

TODOキヌワヌド拡匵

TODOキヌワヌドのカスタマむズ. M-x C-c t.

ref. TODO Extensions (The Org Manual)

(setq org-todo-keywords
      '((sequence "📊(a)" "💡(b)" "✅(c)" "👚(d)" "🔬(e)" "👩(f)" "🎚(g)" "|")
        (sequence "📂(h)" "✹(i)" "🔌(k)" "🔗(l)" "📝(m)" "🌳(n)" "|")
        (sequence "🪚(o)" "🧩(p)" "📜(q)" "📍(r)" "🔍(s)" "🔊(t)" "|")
        (sequence "🔧(w)" "🌱(z)" "|")))

org-capture

Capture templates (The Org Manual)

(after! org
  (setq org-capture-templates
        '(("i" "📥 Inbox" entry
           (file my/inbox-file)
           "* %?\nCaptured On: %U\n"
           :klll-buffer t)
          ("I" "📥+🌐 Inbox+Browser" entry
           (file my/inbox-file)
           "* %?\nSource: [[%:link][%:description]]\nCaptured On: %U\n"
           :klll-buffer t)
          ("q" "📥+🌐 Inbox+Browser(quote)" entry
           (file my/inbox-file)
           "* %?\nSource: [[%:link][%:description]]\nCaptured On: %U\n%i\n"
           :klll-buffer t))))

capture to daily journal

;; 珟状぀かっおないのでマスク
;; (defun my/create-timestamped-org-file (path)
;;   (expand-file-name (format "%s.org" (format-time-string "%Y%m%d%H%M%S")) path))
 
(after! org
  (setq org-capture-templates
        (append
          '(("c" "☑ Planning" plain
             (file+headline
              (lambda ()
                (my/create-weekly-org-file my/weekly-private-dir))
              "Planning")
             "%?"
             :unnarrowed t
             :kill-buffer t)
            ("t" "🀔 Thought" entry
             (file+headline
              (lambda ()
                (my/create-weekly-org-file my/weekly-private-dir))
              "Thoughts")
             "* 🀔 %?\n%T"
             :empty-lines 1
             :unnarrowed t
             :kill-buffer t)
            ("T" "🀔+📃 Thought+Ref" entry
             (file+headline
              (lambda ()
                (my/create-weekly-org-file my/weekly-private-dir))
              "Thoughts")
             "* 🀔 %?\n%T from %a\n"
             :empty-lines 1
             :unnarrowed t
             :kill-buffer t)
            ("l" "🀔+🌐 Thought+Browser" entry
             (file+headline
              (lambda ()
                (my/create-weekly-org-file my/weekly-private-dir))
              "Thoughts")
             "* 🀔 %?\n%T from [[%:link][%:description]]\n"
             :empty-lines 1
             :unnarrowed t
             :kill-buffer t)
            ("p" "🍅 Pomodoro" entry
             (file+headline
              (lambda ()
                (my/create-weekly-org-file my/weekly-private-dir))
              "DeepWork")
             "* 🍅 %?\n%T"
             :empty-lines 1
             :unnarrowed t
             :kill-buffer t)
            ("r" "🧘 Recovery" entry
             (file+headline
              (lambda ()
                (my/create-weekly-org-file my/weekly-private-dir))
              "Recovery")
             "* 🧘 %?\n%T"
             :empty-lines 1
             :unnarrowed t
             :kill-buffer t)
            ("j" "🖊 Journal" plain
             (file
              (lambda ()
                (my/create-weekly-org-file my/weekly-private-dir)))
             "%?"
             :empty-lines 1
             :unnarrowed t
             :kill-buffer t)
            ("J" "🖊+📃 Journal+Ref" plain
             (file
              (lambda ()
                (my/create-weekly-org-file my/weekly-private-dir)))
             "%?\n%a"
             :empty-lines 1
             :unnarrowed t
             :kill-buffer t)
            ("L" "🖊+🌐 Journal+Browser" plain
             (file
              (lambda ()
                (my/create-weekly-org-file my/weekly-private-dir)))
             "%?\nSource: [[%:link][%:description]]\nCaptured On: %U\n"
             :empty-lines 1
             :unnrrowed t
             :kill-buffer t)) org-capture-templates)))

capture to project journal

(after! org
  (setq org-capture-templates
        (append
        '(("b" "🖊 bakuchi entry" entry
           (file+olp+datetree my/project-journal-bakuchi)
           "* %?\nCaptured On: %T\n"
           :unnarrowed t
           :empty-lines 1
           :tree-type week
           :klll-buffer t)
          ("B" "🖊+✍ bakuchi append" plain
           (file my/project-journal-bakuchi)
           "%?"
           :empty-lines 1
           :unnarrowed t
           :jump-to-captured t
           :kill-buffer t)
          ("d" "🖊 DeepWork entry" entry
           (file+olp+datetree my/project-journal-deepwork)
           "* %?\nCaptured On: %T\n"
           :unnarrowed t
           :empty-lines 1
           :tree-type week
           :klll-buffer t)) org-capture-templates)))

Google Chrome Extention: Org Capture

Google Chromeにを入れるこずでWeb Pageがorg-captureず連携(link).

ChromeでCtrl + Shift + Lで起動.

org-export(ox)

Org-modeのファむルを゚クスポヌトする機胜. ox package.

サブパッケヌゞが数倚くあるが, ここでは共通情報たずめ.

org-export-with-xxxずいう蚭定項目でいろいろ制埡できる.

Export Settings (The Org Manual)

しかし, 以䞋が自動的に倉換されおしたう この文字に察する制埡方法が芋぀からない 

  • >

  • < <
  • & &

どうもHTML tagずかHTML Entitiesず呌ばれおいる(ref. The Org Manual).

The HTML export back-end transforms ‘<’ and ‘>’ to ‘<’ and ‘>’.

ただox-html.elにはこういう蚭定がdefaultでされおいる. 他のexportぞの移怍が必芁.

(setq org-export-html-protect-char-alist
  '(("&" . "&amp;")
    ("<" . "&lt;")
    (">" . "&gt;"))

Advanced Export Configuration (The Org Manual)

おそらく, exportをかけたあずにhook関数によっお文字列倉換が必芁.

(after! ox
;; (setq org-export-async-init-file "/home/tsu-nera/.doom.d/async-init.el")
 
  (defun my/hugo-filter-html-amp (text backend info)
    (when (org-export-derived-backend-p backend 'hugo)
      (replace-regexp-in-string "&amp;" "&" text)))
  (defun my/hugo-filter-html-gt (text backend info)
    (when (org-export-derived-backend-p backend 'hugo)
      (replace-regexp-in-string "&gt;" ">" text)))
  (defun my/hugo-filter-html-lt (text backend info)
    (when (org-export-derived-backend-p backend 'hugo)
      (replace-regexp-in-string "&lt;" "<" text)))
  (add-to-list
   'org-export-filter-plain-text-functions 'my/hugo-filter-html-amp)
  (add-to-list
   'org-export-filter-plain-text-functions 'my/hugo-filter-html-gt)
  (add-to-list
   'org-export-filter-plain-text-functions 'my/hugo-filter-html-lt))

org-preview-html

今のEmacs, xwidget甚にコンパむルしおなかったな 

ewwでプレビュヌできる.

(use-package! org-preview-html)

ox-hugo

Org-modeで曞いたブログ蚘事をHugoにあったMarkdown圢匏に倉換する.

ブログFuturismoはOrg-modeで執筆しおこれを利甚しおMarkdownに倉換しおいる.

(use-package! ox-hugo
  :after ox
  :bind
  ;; org-roamのexportで倚様するのでC-c rのprefixを぀けおおく.
  ("C-c r e" . org-hugo-export-to-md)
  :config
 
  (setq org-hugo-auto-set-lastmod t)
  ;; なんか.dir-locals.elに曞いおも反映しおくれないな.
  (setq org-export-with-author nil)
  ;; org-hugo-get-idを䜿うように蚭定.
  (setq org-hugo-anchor-functions
        '(org-hugo-get-page-or-bundle-name
          org-hugo-get-custom-id
          org-hugo-get-id
          org-hugo-get-md5
          ;; 日本語に䞍向きな気がする
          ;; org-hugo-get-heading-slug
          ))
  ;; WebP画像の自動コピヌを有効化
  (add-to-list 'org-hugo-external-file-extensions-allowed-for-copying "webp"))

このox-hugoで出力されるMarkdownはどうもリスト衚瀺でスペヌスが4぀入っおしたう. GitHub Favorite Markdownのようにリストでのスペヌスであっお欲しいものの解決方法が芋぀からない.

ox-rst

Org-modeで曞いたWiki甚のペヌゞをSphinxで公開するためにreST圢匏に倉換する.

リンク圢匏がうたく倉換できないのでけっこう匷匕に倉換しおいる(もう少しうたく改善したい).

(use-package! ox-rst
  :after ox)
 
(after! ox
  (defun my/rst-to-sphinx-link-format (text backend info)
    (when (and (org-export-derived-backend-p backend 'rst)
               (not (search "<http" text)))
      (replace-regexp-in-string
       "$\\.org>`_$" ">`"
       (concat ":doc:" text) nil nil 1)))
 
  (add-to-list 'org-export-filter-link-functions
               'my/rst-to-sphinx-link-format))

ox-qmd

GitHub Flavored Markdown.

暙準のMarkdownの出力だず芋た目が悪い. Bufferに曞き出しおGitHubずかにコピペするずき甚にいれおおく.

ref. Org-modeからQiita準拠のMarkdownをexportするパッケヌゞを䜜っおみたした - Qiita

(use-package! ox-qmd)

ox-gfmは2017からメンテされおないのでやめずくか(ref).

org-babel(ob)

Org-modeのなかでLiterature Programming.

基本操䜜:

  • C-c C-, コヌドブロックの挿入テンプレヌト呌び出し(org-insert-structure-tempate)
  • C-c C-c コヌド実行(org-babel-execute-src-block)
  • C-c C-o コヌド実行結果を開く(org-babel-open-src-block-result)
  • C-c ’ ゜ヌスコヌド線集(org-edit-src-code)
    • どうもEoom Emacsだず keybindingが倖れいおる.
    • C-c l ‘(org-edit-special)で開く.
  (after! org
    ;; https://stackoverflow.com/questions/53469017/org-mode-source-editing-indents-code-after-exiting-source-code-block-editor
    ;; むンデント. default 2になっおいるずぞんな隙間が先頭に入る.
    (setq org-edit-src-content-indentation 0)
    (setq org-src-preserve-indentation t)
    ;; TABの挙動
    (setq org-src-tab-acts-natively t)
 
    ;; org-babel の゜ヌスをキレむに衚瀺.
    (setq org-src-fontify-natively t)
    (setq org-fontify-whole-heading-line t)
 
    ;; 評䟡でいちいち質問されないように.
    (setq org-confirm-babel-evaluate nil)
 
    ;; org-babel で 実行した蚀語を曞く. デフォルトでは emacs-lisp だけ.
    (org-babel-do-load-languages
      'org-babel-load-languages
      '((lisp . t)
	(shell . t)
	(clojure . t)))
 
    ;; org-modeからclojure codeを評䟡.
    (define-key org-mode-map (kbd "C-c C-v e") 'cider-eval-last-sexp)
    ;; (org-defkey org-mode-map "\C-u\C-x\C-e" 'cider-eval-last-sexp)
 
    ;; Clojure Modeの特別察応. keybindingが䞊曞きされるので.
    ;; (define-key clojure-mode-map (kbd "C-c C-x k") 'org-edit-src-exit)
    ;; (define-key clojure-mode-map (kbd "C-c C-x q") 'org-edit-src-abort)
    )

refs:

ob-html

org-modeのコヌドブロックでHTMLを「実行」する | Misohena Blog

(use-package! ob-html
  :after org
  :config
  ;; C-c C-o でブラりザで開く.
  (org-babel-html-enable-open-src-block-result-temporary))

org-superstar

org-superstar-mode(+pretty option)関連.

bulletをおしゃれにかえる. ただそれず匕き換えにパフォヌマンスはちょっず萜ちるかも.

(after! org
;;; Titles and Sections
;; hide #+TITLE:
;; (setq org-hidden-keywords '(title))
;; set basic title font
;; (set-face-attribute 'org-level-8 nil :weight 'bold :inherit 'default)
;; Low levels are unimportant => no scaling
;; (set-face-attribute 'org-level-7 nil :inherit 'org-level-8)
;; (set-face-attribute 'org-level-6 nil :inherit 'org-level-8)
;; (set-face-attribute 'org-level-5 nil :inherit 'org-level-8)
;; (set-face-attribute 'org-level-4 nil :inherit 'org-level-8)
;; Top ones get scaled the same as in LaTeX (\large, \Large, \LARGE)
;; (set-face-attribute 'org-level-3 nil :inherit 'org-level-8 :height 1.2) ;\large
;; (set-face-attribute 'org-level-2 nil :inherit 'org-level-8 :height 1.44) ;\Large
;; (set-face-attribute 'org-level-1 nil :inherit 'org-level-8 :height 1.728) ;\LARGE
;; Only use the first 4 styles and do not cycle.
(setq org-cycle-level-faces nil)
 
;; orgの階局の色分けレベル.
;; (setq org-n-level-faces 8)
 
;; Document Title, (\huge)
;; (set-face-attribute 'org-document-title nil
;;                    :height 2.074
;;                    :foreground 'unspecified
;;                    :inherit 'org-level-8)
 
;; (with-eval-after-load 'org-superstar
;;  (set-face-attribute 'org-superstar-item nil :height 1.2)
;;  (set-face-attribute 'org-superstar-header-bullet nil :height 1.2)
;;  (set-face-attribute 'org-superstar-leading nil :height 1.3))
;; Set different bullets, with one getting a terminal fallback.
(setq org-superstar-headline-bullets-list '("■" "◆" "●" "▷"))
;; (setq org-superstar-special-todo-items t)
 
;; Stop cycling bullets to emphasize hierarchy of headlines.
(setq org-superstar-cycle-headline-bullets nil)
;; Hide away leading stars on terminal.
;; (setq org-superstar-leading-fallback ?\s)
(setq inhibit-compacting-font-caches t))

org-roam

Zettelkasten MethodのOrg-roam実装.

  ;; org-roam
  (setq org-roam-directory (file-truename "~/repo/keido/notes"))
  (setq org-roam-zk-dir (concat org-roam-directory "/zk"))
  (setq org-roam-db-location (file-truename "~/repo/keido/db/org-roam.db"))
 
  (use-package! org-roam
    :after org
    :init
    (setq org-roam-v2-ack t)
    (map!
          :leader
          :prefix ("r" . "org-roam")
          "f" #'org-roam-node-find
          "i" #'org-roam-node-insert
          "l" #'org-roam-buffer-toggle
          "t" #'org-roam-tag-add
          "T" #'org-roam-tag-remove
          "a" #'org-roam-alias-add
          "A" #'org-roam-alias-remove
          "r" #'org-roam-ref-add
          "R" #'org-roam-ref-remove
          "o" #'org-id-get-create
          "u" #'my/org-roam-update
          "D" #'org-roam-dailies-goto-today
          )
    :custom
    ;;ファむル名を ID にする.
    (org-roam-capture-templates
     '(("z" "🌱 Zettel" plain "%?"
        :target (file+head "zk/%<%Y%m%d%H%M%S>.org"
                           "\n#+date: %T\n#+title:🌱${title}\n#+filetags: :ZETTEL:\n")
        :unnarrowed t)
       ("w" "📝 Wiki" plain "%?"
        :target (file+head "zk/%<%Y%m%d%H%M%S>.org"
                           "#+title:📝${title}\n#+filetags: :WIKI:\n")
        :unnarrowed t)
       ("t" "🔖 Tag" plain "%?"
        :target (file+head "zk/%<%Y%m%d%H%M%S>.org"
                           "#+title:🔖${title}\n#+filetags: :TAG:\n")
        :unnarrowed t)
       ("h" "👚 Person" plain "%?"
        :target (file+head
                 "zk/%<%Y%m%d%H%M%S>.org"
                 "#+title:👚${title}\n#+filetags: :PERSON:\n")
        :unnarrowed t)
       ("f" "📂 Type" plain "%?"
        :target (file+head "zk/%<%Y%m%d%H%M%S>.org"
                           "#+title:📂${title}\n#+filetags: :TYPE:\n")
        :unnarrowed t)
       ("m" "🌳 MOC" plain "%?"
        :target (file+head "zk/%<%Y%m%d%H%M%S>.org"
                           "#+title:🌳${title}\n#+filetags: :MOC:\n")
        :unnarrowed t)
       ("i" "✅ Issue" plain "%?"
        :target (file+head "zk/%<%Y%m%d%H%M%S>.org"
                          "#+title:✅${title}\n#+filetags: :ISSUE:\n")
        :unnarrowed t)
       ("d" "💡 Idea" plain "%?"
        :target (file+head "zk/%<%Y%m%d%H%M%S>.org"
                           "#+title:💡${title}\n#+filetags: :IDEA:\n")
        :unnarrowed t)
       ("c" "📑 Concept" plain "%?"
        :target (file+head
                 "zk/%<%Y%m%d%H%M%S>.org"
                 "#+title:🎓${title}\n#+filetags: :CONCEPT:\n")
        :unnarrowed t)
       ("k" "🊊 Darkfox" plain "%?"
        :target (file+head
                 "zk/%<%Y%m%d%H%M%S>.org"
                 "#+title:🊊${title}\n#+filetags: :DARKFOX:\n")
        :unnarrowed t)
       ("b" "📚 Book" plain
        "%?
 
  - title: %^{title}
  - authors: %^{author}
  - date: %^{date}
  - publisher: %^{publisher}
  - url: http://www.amazon.co.jp/dp/%^{isbn}
  "
        :target (file+head "zk/%<%Y%m%d%H%M%S>.org"
                           "#+title:📚${title} - ${author}(${date})\n#+filetags: :BOOK:SOURCE:\n")
        :unnarrowed t)
       ("s" "🎙‍ Talk" plain
        "%?
 
  - title: %^{title}
  - url: %^{url}
  "
        :target (file+head "zk/%<%Y%m%d%H%M%S>.org"
                           "#+title:🎙 ${title} - ${editor}(${date})\n#+filetags: :TALK:SOURCE:\n")
        :unnarrowed t)
       ("o" "💻 Online" plain
        "%?
 
  - title: %^{title}
  - authors: %^{author}
  - url: %^{url}
  "
        :target (file+head "zk/%<%Y%m%d%H%M%S>.org"
                           "#+title:💻${title}\n#+filetags: :ONLINE:SOURCE:\n")
        :unnarrowed t)))
    (org-roam-extract-new-file-path "%<%Y%m%d%H%M%S>.org")
    ;;        :map org-mode-map
    ;;        ("C-M-i"    . completion-at-point)
    :config
    (defun my/org-roam-update ()
      (interactive)
      (org-id-update-id-locations)
      (org-roam-db-sync)
      (org-roam-update-org-id-locations))
 
    (setq org-roam-mode-sections
          '((org-roam-backlinks-section :unique t)))
 
    (setq org-roam-db-gc-threshold most-positive-fixnum)
 
    ;; for speed up
    ;; (setq org-roam-node-default-sort 'file-mtime)
 
    (setq +org-roam-open-buffer-on-find-file nil)
    ;; (org-roam-db-autosync-mode)
    (org-roam-db-autosync-enable)
 
    ;; (setq org-roam-node-display-template (concat "${title:*} " (propertize "${tags:10}" 'face 'org-tag)))
 
    ;; for emacs 29~
    ;; (when (>= emacs-major-version 29)
    ;; (setq org-roam-database-connector 'sqlite-builtin))
  )
(setq org-roam-db-node-include-function
      (lambda ()
        (not (member "" (org-get-tags)))))

consult-org-roam(Org-roam怜玢匷化)

ref. https://github.com/jgru/consult-org-roam

以䞋の機胜を提䟛.ファむル名は今は日付にしおいるからいらないかな.党文怜玢は動かない.バックリンク怜玢だけ䜿えそう.

  • ファむル名怜玢
  • バックリンク怜玢
  • 党文怜玢
(use-package! consult-org-roam
   :init
   (require 'consult-org-roam)
   ;; Activate the minor-mode
   (consult-org-roam-mode 1)
   :custom
   (consult-org-roam-grep-func #'consult-ripgrep)
   :config
   ;; Eventually suppress previewing for certain functions
   (consult-customize
    consult-org-roam-forward-links
    :preview-key (kbd "M-."))
   :bind
   ("C-c r F" . consult-org-roam-file-find)
   ("C-c r b" . consult-org-roam-backlinks)
   ("C-c r S" . consult-org-roam-search))

Org-roam管理䞋のノヌトの党文怜玢

Using consult-ripgrep with org-roam for searching notes - How To - Org-roam

consult-ripgrepを deft の代わりに䜿う. より高速.

怜玢察象が倚すぎるずハングするので改善したい.

(defun my/org-roam-rg-search ()
  "Search org-roam directory using consult-ripgrep. With live-preview."
  (interactive)
  (consult-ripgrep org-roam-directory))
(global-set-key (kbd "C-c r s") 'my/org-roam-rg-search)

org-publish(Org-roamのノヌトをサむトぞ公開)

hugo甹. 珟状exit abnormally で動かないので調べる.

(setq org-publish-project-alist
      (list
       (list "keido-hugo"
             :recursive nil
             :base-directory org-roam-zk-dir
             :publishing-directory "~/repo/keido-hugo/content"
             :exclude ".*gitignore|.*/private/.*"
             :publishing-function 'org-hugo-export-wim-to-md
             :with-author nil           ;; 䜜成者陀倖
             :with-creator nil          ;; EmacsずOrg version衚蚘陀倖
             :with-toc nil                ;; Table of Contents出力
             :section-numbers nil       ;; ナンバリング犁止
             :time-stamp-file nil       ;; タむムスタンプを陀倖
             )))
 
;; (require 'org-roam-export)

html甹.

(setq org-publish-project-alist
      (list
       (list "keido-org"
             :recursive nil
             :base-directory org-roam-zk-dir
             :publishing-directory "~/repo/keido-org/public/notes"
             :exclude ".*gitignore|.*/private/.*"
             ;; :auto-sitemap t
             ;; :sitemap-function 'roam-sitemap
             ;; :sitemap-title "Keido notes"
             :publishing-function 'org-html-publish-to-html
             :with-author nil           ;; 䜜成者陀倖
             :with-creator nil          ;; EmacsずOrg version衚蚘陀倖
             :with-toc t                ;; Table of Contents出力
             :section-numbers nil       ;; ナンバリング犁止
             :time-stamp-file nil       ;; タむムスタンプを陀倖
             )))
 
(defun my/setup-org-theme (backend)
  (goto-char (point-max))
  (insert "\n#+SETUPFILE: https://fniessen.github.io/org-html-themes/org/theme-readtheorg.setup\n")
  (insert "\n#+HTML_HEAD: <style>pre.src{background:#343131;color:white;} </style>\n"))
 
(defun my/collect-backlinks-string (backend)
  "Insert backlinks into the end of the org file before parsing it."
  (when (org-roam-node-at-point)
    (goto-char (point-max))
    ;; Add a new header for the references
    (insert "\n\n* 🔗Backlinks\n")
    (let* ((backlinks (org-roam-backlinks-get (org-roam-node-at-point))))
      (dolist (backlink backlinks)
        (let* ((source-node (org-roam-backlink-source-node backlink))
               (node-file (org-roam-node-file source-node))
               (file-name (file-name-nondirectory node-file))
               (title (org-roam-node-title source-node)))
          (insert
           (format "- [[./%s][%s]]\n" file-name title)))))))
 
(add-hook 'org-export-before-parsing-functions 'my/setup-org-theme)
(add-hook 'org-export-before-processing-functions 'my/collect-backlinks-string)
 
;; (require 'org-roam-export)

org-roam-dailies

Org-roamに組み蟌たれた劣化版org-journal. 珟状䜿甚するのをやめた.

org-roam-dialiesよりもorg-journalを利甚する(org-agendaの郜合).

ref. Org-journal vs org-roam-dailies - Troubleshooting - Org-roam

週単䜍で日蚘のようなペヌゞを倖郚公開甚に䜿う.

ツむッタヌのようなマむクロブログの利甚を想定しおいる.

(after! org-roam
  (setq org-roam-dailies-directory "zk")
 
  (setq org-roam-dailies-capture-templates
        '(("d" "default" entry "** %?" :if-new
           (file+head+olp "%<%G-w%V>.org" "#+title: 📓%<%G-w%V>\n"
                          ("🖊Journals"))))))
(after! org-capture
  (add-to-list 'org-capture-templates
        '("w" "💭 Thought(weekly)" entry
          (file+headline (lambda ()
                     (my/create-weekly-org-file my/weekly-journal-dir))
                         "🖊Journals")
              "* 💭%?\n%T\n\n"
              :empty-lines 1
              :unnarrowed nil ;; ほかの゚ントリは芋えないように.
              :klll-buffer t)))

org-roam-ui(disabled)

Web UI.

(use-package! websocket
    :after org-roam)
(use-package! org-roam-ui
    :after org-roam ;; or :after org
;;         normally we'd recommend hooking orui after org-roam, but since org-roam does not have
;;         a hookable mode anymore, you're advised to pick something yourself
;;         if you don't care about startup time, use
    ;; :hook (after-init . org-roam-ui-mode)
    :config
    (setq org-roam-ui-sync-theme t
          org-roam-ui-follow t
          org-roam-ui-update-on-save t
          org-roam-ui-open-on-start t))
 
 

org-roam-timestamps(disabled)

org-roam-uiで぀かうメタ情報を付䞎するこずが目的だが珟状䜿っおいないのでいったん封印.

(use-package! org-roam-timestamps
   :after org-roam
   :config
   (org-roam-timestamps-mode)
   (setq org-roam-timestamps-remember-timestamps nil)
   (setq org-roam-timestamps-remember-timestamps nil))

org-roamのslowdownを回避するTip

https://www.reddit.com/r/orgmode/comments/s8xv5j/orgroam_slows_down_as_nodes_increase_solution/

;; 2. Memoize the function that costs the most.
(load-file "~/.doom.d/private/memoize.el")
(require 'memoize)
 
(memoize 'org-roam-node-read--completions "10 minute")
 
(defun memoize-force-update (func &optional timeout)
  (when (get func :memoize-original-function)
    (progn (memoize-restore func)
           (memoize func timeout))))
(defun my/force-update-org-roam-node-read-if-memoized (&optional timeout)
  (interactive)
  (memoize-force-update 'org-roam-node-read--completions
                        (if timeout timeout memoize-default-timeout)))
(run-with-idle-timer 60 t #'my/force-update-org-roam-node-read-if-memoized)
;; Note: it might be better to hack org-roam to make it use
;; hash-tables instead of lists. Have a way to quickly detect
;; which node is to be updated.

org-toggl

org-modeをTogglず連携させる. https://github.com/mbork/org-toggl

(use-package! org-toggl
  :after org
  :config
  (setq org-toggl-inherit-toggl-properties t)
  (toggl-get-projects)
  (setq toggl-default-project "GTD")
  (org-toggl-integration-mode))

org-journal

https://github.com/bastibe/org-journal

(use-package! org-journal
  :after org
  :bind
  ;; org-roamず揃えたいので C-c rたでをprefixにする.
  ("C-c r d n" . org-journal-new-entry)
  ("C-c r d d" . org-journal-open-current-journal-file)
  :config
  (setq org-journal-date-prefix "#+TITLE: ✍")
  ;; (setq org-journal-file-type `daily)
  ;; (setq org-journal-file-format "%Y-%m-%d.org")
  ;; (setq org-journal-date-format "%Y-%m-%d")
  ;; これはorg-journalの倉数ではない.
  (setq org-journal-file-format "%Y-w%W.org")
  (setq org-journal-date-format "%Y-w%W")
  (setq org-journal-file-type `weekly)
  (setq org-journal-dir my/weekly-private-dir)
  ;; (setq org-journal-enable-agenda-integration t)
)

org-ref(bibtex)

文献管理. Zoteroず連携しお論文ずいうよりは曞籍やYoutube動画やWeb蚘事のメモに利甚.

  • org-ref
  • ivy-bibtex
    • ivyのactionは ivy-bibtexでC-SPCで遞択-> C-M-oでaction遞択候補を出しpずかeずか抌す.
  • org-roam-bibtex

なんかzoteroからデヌタ゚クスポヌトできなくなっお動かなくなった.

なんかorg-mode開くたびにreloadが走るのでmaskした.

(use-package! org-ref
  :config
  (setq bibtex-completion-bibliography (list (file-truename "~/repo/keido/references/zotLib.bib")))
 
  (setq bibtex-completion-additional-search-fields '(keywords))
  (setq bibtex-completion-display-formats
    '((online       . "${=has-pdf=:1}${=has-note=:1} ${=type=:6} ${year:4} ${author:24} ${title:*}")
      (book         . "${=has-pdf=:1}${=has-note=:1} ${=type=:6} ${year:4} ${author:24} ${title:*}")
      (video        . "${=has-pdf=:1}${=has-note=:1} ${=type=:6} ${year:4} ${editor:24} ${title:*}")
      (paper        . "${=has-pdf=:1}${=has-note=:1} ${=type=:6} ${year:4} ${author:24} ${title:*}")
      (t            . "${=has-pdf=:1}${=has-note=:1} ${=type=:6} ${year:4} ${author:24} ${title:*}")))
  (setq bibtex-completion-pdf-symbol "📓")
  (setq bibtex-completion-notes-symbol "📝")
 
  (setq bibtex-completion-pdf-field "file")
  ;; (setq bibtex-completion-pdf-open-function
  ;;	(lambda (fpath)
  ;;	  (call-process "open" nil 0 nil fpath)))
 
  ;; Create fields for Film type
  (add-to-list 'bibtex-biblatex-field-alist
               '(("video" "Video or Audio(like YouTube)")))
 
  (add-to-list 'bibtex-biblatex-entry-alist
               '("video" "A Video"
                 ("video", "title" "editor" "date" "url" "urldate" "abstract" "editortype")
                 nil
                 "keywords"))
  (bibtex-set-dialect 'biblatex))
 
(use-package! ivy-bibtex
  :after org-ref
  :init
  (map!
   :leader
   :prefix ("b" . "org-ref")
     "b" #'org-ref-bibtex-hydra/body
     "v" #'ivy-bibtex
     "c" #'org-ref-insert-cite-link
     "a" #'orb-note-actions
     "i" #'orb-insert-link)
  :config
  (setq ivy-re-builders-alist
        '((ivy-bibtex . ivy--regex-ignore-order)
          (t . ivy--regex-plus)))
  (setq ivy-bibtex-default-action #'ivy-bibtex-open-url-or-doi)
  (ivy-set-actions
   'ivy-bibtex
   '(("p" ivy-bibtex-open-any "Open PDF, URL, or DOI" ivy-bibtex-open-any)
     ("e" ivy-bibtex-edit-notes "Edit notes" ivy-bibtex-edit-notes)))
  )
 
(use-package! org-roam-protocol
  :after org-protocol)

぀かっおないので゚ラヌたのでいったんマスク.

(use-package! org-roam-bibtex
  :after org-roam ivy-bibtex
  :hook (org-mode . org-roam-bibtex-mode)
  :custom
  (orb-insert-interface 'ivy-bibtex)
  :config
    (setq orb-preformat-keywords '("author" "date" "url" "title" "isbn" "publisher" "urldate" "editor" "file"))
    (setq orb-process-file-keyword t)
    (setq orb-attached-file-extensions '("pdf")))

org-anki

Org-modeずAnkiを぀なぐ.

https://github.com/eyeinsky/org-anki

今たでanki-editorを利甚しおいたもののその蚘法ずwikiの盞性が悪かった冗長. これならorg-modeのheadlineがそのたた぀かえるのでよさそう.

(use-package! org-anki
  :after org
  :custom
  ;; one big deckの原則に埓う.
  ;; ref: http://augmentingcognition.com/ltm.html
  (org-anki-default-deck "Default")
  :config
  (define-key org-mode-map (kbd "C-c n A s") #'org-anki-sync-entry)
  (define-key org-mode-map (kbd "C-c n A u") #'org-anki-update-all)
  (define-key org-mode-map (kbd "C-c n A d") #'org-anki-delete-entry))

URLの挿入はorg-link圢匏でできる. これは䟿利.

org-bars(deprecated)

今どきのアりトラむナヌ的な線を出す.

  • Terminal Mode では぀かえない.
  • リストの折返しでのむンデントは厩れる.
(require 'org-bars)
(add-hook! 'org-mode-hook #'org-bars-mode)

<2025-11-12 Wed 16:25> 衚瀺が気持ち悪くなったので無効化.

Org-noter(disabled)

PDFの泚釈を管理する. :link:weirdNox/org-noter

はじめの起動がどうやればいいのかワカラなかった. 特定のファむルに蚘録を残したい堎合はPDFのBufferではなく, 適圓なheading䜜成しおM-x org-noterを起動するずPDFを遞択できる.

M-x org-noter-create-skeltonずいう関数がダばい. 🔗Youtube動画(1:08) PDFからOutlineを抜き出しおOrg fileに生成しおあずはそのOrg-fileのBulletのカヌ゜ルを移動するずPDFのほうもシンクロしお移動できる.

凄すぎお笑った😂

(use-package! org-noter
  :after (:any org pdf-view)
  :config
  (setq
   ;; I want to see the whole file
   org-noter-hide-other nil
   ;; Everything is relative to the main notes file
   org-noter-notes-search-path (list (file-truename "~/repo/keido/notes/wiki"))))

org-trello(disabled)

Kanbanツヌル Trello連携.

叀いプロゞェクトだがメンテもされおいおスタヌも500以䞊぀いおいる.

ただし動かない native comp無効で行けるか. -> いけた. https://github.com/org-trello/org-trello/issues/418

(use-package! org-trello)

どうもDoom Emacsだず C-uが効かない. そしおそれによっおtrello->org-fileぞのdownloadがC-u C-c o sに頌っおいるので䞍䟿になる. (org-trello-sync-buffer t) を評䟡するずダりンロヌドが走るずいう仕様のためこれを関数にしお呌ぶこずによっお代替.

Synching from and to Trello does not work · Issue #409

(after! org-trello
  (defun my/org-trello-sync-from-trello ()
    (interactive)
    (org-trello-sync-buffer t)))

org-table

(setq org-table-export-default-format "orgtbl-to-csv")

org-sidebar

https://github.com/alphapapa/org-sidebar

org-sidebar-treeでサむドバヌにアりトラむンを衚瀺.

(use-package! org-sidebar
  :config
  ;; cider-modeに合わせお C-c C-zにbindしおみた.
  (define-key org-mode-map (kbd "C-c C-z") #'org-sidebar-tree-toggle))

Org timestamps

org-mode で timestamp のみを挿入するカスタム関数. Doom EmacsのせいでC-u C-c .が動䜜しないので.

(after! org
  (defun my/insert-timestamp ()
    (interactive)
    (org-insert-time-stamp (current-time) t))
  (defun my/insert-timestamp-inactive ()
    (interactive)
    (org-time-stamp-inactive (current-time)))
  (map! :map org-mode-map "C-u C-c C-." #'my/insert-timestamp-inactive)
  (map! :map org-mode-map "C-c C-." #'my/insert-timestamp))

空癜が保存時に削陀されるず bullet 衚瀺がおかしくなる. なお wl-bulter は doom emacs のデフォルトで組み蟌たれおいる.

(add-hook! 'org-mode-hook
  (when (fboundp 'ws-butler-mode)
    (ws-butler-mode -1)))

org-pomodoro

(use-package! org-pomodoro)

org-web-tools

ewwずorgを䟿利にするツヌル矀(https://github.com/alphapapa/org-web-tools).

(use-package! org-web-tools
  :bind
  ("C-c i l" . org-web-tools-insert-link-for-url))

org-ai

https://github.com/rksm/org-ai

openai-api-tokenの蚭定が必芁. private/config.elで定矩しおいる.

(use-package! org-ai
  :load-path (lambda () "~/.emacs.d/.local/straight/repos/org-ai")
  :commands (org-ai-mode)
  ;; :custom
  ;; (org-ai-openai-api-token "")
  :init
  (add-hook 'org-mode-hook #'org-ai-mode)
  :config
  ;; if you are using yasnippet and want `ai` snippets
  (org-ai-install-yasnippets))

Term

;; Term
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Tools

;; Tools
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

forge

magit拡匵, EmacsずGitHubを連携.

doom emacsだず (magit +forge) のオプションでむンストヌルできる.

ref: Forge User and Developer Manual

(after! magit
  (setq auth-sources '("~/.authinfo"))
  (setq magit-revision-show-gravatars '("^Author:     " . "^Commit:     "))
  ;; (setq magit-diff-refine-hunk 'all)
)

リポゞトリ名を倉曎した堎合はissueやPRの䜜成が倱敗する. これは .git/configの問題なのでロヌカルのファむルを修正する.

珟圚のバッファの䜍眮のGitHubのurlを取埗.

sshaw/git-link

(global-set-key (kbd "C-c s g") 'git-link)
(use-package! git-link
  :config
  ;; urlにbranchではなくcommit番号を぀かう.
  ;; org-journalぞの貌り付けを想定しおいるのでこの蚭定にしおおく.
  (setq git-link-use-commit t))

UI

みため呚りの蚭定.

Doom

;; UI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; どうもフォントが奇数だず org-table の衚瀺が厩れる.
;; Source Han Code JP だずそもそも org-table の衚瀺が厩れる.
;; terminal だず倧䞈倫な暡様.そもそも Terminal はこの蚭定ではなくお
;; Terminal Emulator の蚭定がきく.
 
;; Twitterで拟った蚭定だけど若干org-table衚瀺がマシになったので採甚.
;; (set-face-attribute 'fixed-pitch nil :font "Ricty Diminished" :height 160)
;; (setq doom-font (font-spec :family "Source Han Code JP" :size 15 ))
;; (setq doom-font (font-spec :family "Ricty Diminished" :size 16))
(when (wsl-p)
  (setq doom-font (font-spec :family "HackGen" :size 18)))
(when (not (wsl-p))
  (setq doom-font (font-spec :family "Source Han Code JP" :size 15 )))
;; doom-molokaiやdoom-monokai-classicだずewwの衚瀺がいたいち.
(setq doom-theme 'doom-molokai)
(doom-themes-org-config)
 
;; counselずdoom-modelineが盞性悪いようなので
;; workspace name衚瀺のためには远加で蚭定.
;; https://github.com/hlissner/doom-emacs/issues/314
;; (after! doom-modeline
;;  (setq doom-modeline-icon (display-graphic-p))
;;  (setq doom-modeline-major-mode-icon t))

https://github.com/seagle0128/doom-modeline

emojify

Emacsで絵文字を぀かう.

どうもemojifyの絵文字蟞曞はemojione-v2.2.6-22ずいうものでやや叀い. Twitterが奜きなのでTwitterのオヌプン゜ヌス蟞曞のtwemojiに倉曎.

https://github.com/iqbalansari/emacs-emojify/blob/master/data/emoji-sets.json

(after! emojify
;;   (setq emojify-emoji-set "openmoji-v13-0")
  ;; (setq emojify-emoji-set "emojione-v2.2.6.22")
)

ただ2022珟圚twemojiはv13なのでv2は叀いな..ずいうかでないや぀もおおい.

Emacsの機胜でemoji-searchがあるのでこれも蚭定しおおこう. こっちの蟞曞のほうが扱える文字か倚い.

;; doomだず C-c i eでemojify-insert-emoji
(global-set-key (kbd "C-c i E") 'emoji-search)

svg-tag-mode

TODOほかラベルを矎しく.

GitHub - rougier/svg-tag-mode

(use-package! svg-tag-mode
  :config
  (setq svg-tag-tags
        '(
          ;; :XXX:
          ("$:[A-Z]+:$" . ((lambda (tag)
                                 (svg-tag-make tag :beg 1 :end -1))))
          ;; :XXX|YYY:
          ("$:[A-Z]+$\|[a-zA-Z#0-9]+:" . ((lambda (tag)
                                                (svg-tag-make tag :beg 1 :inverse t
                                                              :margin 0 :crop-right t))))
          (":[A-Z]+$\|[a-zA-Z#0-9]+:$" . ((lambda (tag)
                                                (svg-tag-make tag :beg 1 :end -1
                                                              :margin 0 :crop-left t))))
          ;; :#TAG1:#TAG2:
:$
          ("$:#[A-Za-z0-9]+$" . ((lambda (tag)
                                       (svg-tag-make tag :beg 2))))
          ("$:#[A-Za-z0-9]+:$$" . ((lambda (tag)
                                       (svg-tag-make tag :beg 2 :end -1))))
          )))

Others

;; これがスクロヌルを遅くする可胜性があるので実隓的に抑止.
(setq display-line-numbers-type nil) ; 行番号衚瀺
 
;; less でのファむル閲芧に操䜜性を䌌せる mode.
;; view-mode は emacs 内蔵. C-x C-r で read-only-mode でファむルオヌプン
;; doom emacs だず C-c t r で read-only-mode が起動する.
(add-hook! view-mode
  (setq view-read-only t)
  (define-key ctl-x-map "\C-q" 'view-mode) ;; assinged C-x C-q.
 
  ;; less っがく.
  (define-key view-mode-map (kbd "p") 'view-scroll-line-backward)
  (define-key view-mode-map (kbd "n") 'view-scroll-line-forward)
  ;; default の e でもいいけどmule 時代に v に bind されおたので,
  ;; emacs でも v に bind しおおく.
  (define-key view-mode-map (kbd "v") 'read-only-mode))
 
;; EXWMの堎合suspend-frameでハングするのはたちが悪いので封印.
(use-package! frame
  :bind
  ("C-z" . nil))
 
;; 実隓, どうもマりス操䜜でEmacsの制埡が効かなくなるこずがあるので.
(setq make-pointer-invisible nil)
 
;; (general-def
;;  :keymaps 'override
;;   "C-u" 'universal-argument)

AI

いろいろあるので詊すが぀かうのは䞀぀にしたいずころ.

chatgpt

https://github.com/emacs-openai/chatgpt

chatgpt-shell

chatgpt-shell-openai-keyはconfig.elに蚘茉. ChatGPT以倖でもいける.

https://github.com/xenodium/chatgpt-shell

(use-package! chatgpt-shell
  :commands chatgpt-shell
  :init
  (bind-key "C-c z b" 'chatgpt-shell)
  :config
  (setq chatgpt-shell-chatgpt-streaming t))

Ellama

https://github.com/s-kostyaev/ellama/

(use-package! ellama
    :bind ("C-c e" . ellama-transient-main-menu)
    :init
    ;; setup key bindings
    ;; (setopt ellama-keymap-prefix "C-c e")
    ;; language you want ellama to translate to
    (setopt ellama-language "Japanese")
    ;; could be llm-openai for example
    (require 'llm-ollama)
    (setopt ellama-provider
	  (make-llm-ollama
	       ;; this model should be pulled to use it
	       ;; value should be the same as you print in terminal during pull
	       :chat-model "llama3.2:latest"
	       :embedding-model "nomic-embed-text"
	       :default-chat-non-standard-params '(("num_ctx" . 8192))))
    ;; (setopt ellama-summarization-provider
    ;;           (make-llm-ollama
    ;;            :chat-model "qwen2.5:3b"
    ;;            :embedding-model "nomic-embed-text"
    ;;            :default-chat-non-standard-params '(("num_ctx" . 32768))))
    ;; (setopt ellama-coding-provider
    ;;           (make-llm-ollama
    ;;            :chat-model "qwen2.5-coder:3b"
    ;;            :embedding-model "nomic-embed-text"
    ;;            :default-chat-non-standard-params '(("num_ctx" . 32768))))
    ;; Predefined llm providers for interactive switching.
    ;; You shouldn't add ollama providers here - it can be selected interactively
    ;; without it. It is just example.
    ;; ellamaで䜿えるプロバむダヌ。ellama-provider-select で遞択できる
    (setopt ellama-providers
	      '(("zephyr" . (make-llm-ollama
			     :chat-model "zephyr:7b-beta-q6_K"
			     :embedding-model "zephyr:7b-beta-q6_K"))
		("mistral" . (make-llm-ollama
			      :chat-model "mistral:7b-instruct-v0.2-q6_K"
			      :embedding-model "mistral:7b-instruct-v0.2-q6_K"))
		("mixtral" . (make-llm-ollama
			      :chat-model "mixtral:8x7b-instruct-v0.1-q3_K_M-4k"
			      :embedding-model "mixtral:8x7b-instruct-v0.1-q3_K_M-4k"))))
    ;; Naming new sessions with llm
    (setopt ellama-naming-provider
	      (make-llm-ollama
	       :chat-model "llama3.2:latest"
	       :embedding-model "nomic-embed-text"
	       :default-chat-non-standard-params '(("stop" . ("\n")))))
    (setopt ellama-naming-scheme 'ellama-generate-name-by-llm)
    ;; Translation llm provider, 翻蚳で利甚するプロバむダヌ
    (setopt ellama-translation-provider
	    (make-llm-ollama
	     :chat-model "elyza:jp8b"
	     :embedding-model "nomic-embed-text"
	     :default-chat-non-standard-params
	     '(("num_ctx" . 32768))))
    ;; customize display buffer behaviour
    ;; see ~(info "(elisp) Buffer Display Action Functions")~
    (setopt ellama-chat-display-action-function #'display-buffer-full-frame)
    (setopt ellama-instant-display-action-function #'display-buffer-at-bottom)
    :config
    ;; send last message in chat buffer with C-c C-c
    (add-hook 'org-ctrl-c-ctrl-c-hook #'ellama-chat-send-last-message))

Claude code IDE

https://github.com/manzaltu/claude-code-ide.el

(use-package! claude-code-ide
  :bind (("C-c z c" . claude-code-ide)
         ("C-c C-7" . claude-code-ide-menu)
         ("C-c C-r" . claude-code-ide-insert-at-mentioned))
  :config
  (setq claude-code-ide-window-side 'left)
  (claude-code-ide-emacs-tools-setup))