tuong.thoidangthang a79f4cf642 - commit today
2025-08-27 16:09:56 +07:00

163 lines
6.1 KiB
EmacsLisp

;;; -*- lexical-binding: t -*-
(custom-set-variables
;; custom-set-variables was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(package-selected-packages
'(anki-editor docker docker-compose-mode docker-tramp ejc-sql fcitx))
'(sql-connection-alist
'(("postgres" (sql-product 'postgres) (sql-user "myuser")
(sql-database "mydatabase") (sql-server "localhost") (sql-port 5433)))))
(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
)
(use-package docker
:ensure t
:bind ("C-c d" . docker))
;;(setq sql-postgres-login-params (append sql-postgres-login-params '(port)))
(setq org-roam-directory (file-truename "~/org-roam/"))
(setq org-roam-node-display-template
(concat "${title:*} " (propertize "${tags:10}" 'face 'org-tag)))
(org-roam-db-autosync-mode)
(setq org-roam-complete-everywhere t)
(map! :map org-mode-map
:leader
(:prefix ("n r" . "roam")
:desc "Completion at point" "c" #'completion-at-point))
(defun insert-org-link-with-prompt ()
"Prompt for description and link, then insert Org-mode style [[link][description]]"
(interactive)
(let ((link (read-string "Link (first []): "))
(desc (read-string "Description (second []): ")))
(insert (format "[[%s][%s]]" link desc))))
(map! :leader
:desc "Insert Org link with prompt"
"i l" #'insert-org-link-with-prompt)
(use-package anki-editor
:after org
:bind (:map org-mode-map
("<f12>" . anki-editor-cloze-region-auto-incr)
("<f11>" . anki-editor-cloze-region-dont-incr)
("<f10>" . anki-editor-reset-cloze-number)
("<f9>" . anki-editor-push-tree))
:hook (org-capture-after-finalize . anki-editor-reset-cloze-number) ; Reset cloze-number after each capture.
:config
(setq anki-editor-create-decks t ;; Allow anki-editor to create a new deck if it doesn't exist
anki-editor-org-tags-as-anki-tags t)
(defun anki-editor-cloze-region-auto-incr (&optional arg)
"Cloze region without hint and increase card number."
(interactive)
(anki-editor-cloze-region my-anki-editor-cloze-number "")
(setq my-anki-editor-cloze-number (1+ my-anki-editor-cloze-number))
(forward-sexp))
(defun anki-editor-cloze-region-dont-incr (&optional arg)
"Cloze region without hint using the previous card number."
(interactive)
(anki-editor-cloze-region (1- my-anki-editor-cloze-number) "")
(forward-sexp))
(defun anki-editor-reset-cloze-number (&optional arg)
"Reset cloze number to ARG or 1"
(interactive)
(setq my-anki-editor-cloze-number (or arg 1)))
(defun anki-editor-push-tree ()
"Push all notes under a tree."
(interactive)
(anki-editor-push-notes '(4))
(anki-editor-reset-cloze-number))
;; Initialize
(anki-editor-reset-cloze-number)
)
(map! :map magit-mode-map
:leader
(:prefix ("g c a" . "file-checkout")
:desc "file checkout from branch" "c" #'magit-file-checkout))
(defun my/fcitx5-disable ()
"Disable fcitx5 input method."
(interactive)
(call-process "fcitx5-remote" nil nil nil "-c"))
(defun my/fcitx5-enable ()
"Enable fcitx5 input method."
(interactive)
(call-process "fcitx5-remote" nil nil nil "-o"))
(global-set-key (kbd "<f12>") 'my/fcitx5-disable)
(global-set-key (kbd "<f11>") 'my/fcitx5-enable)
(defun my/org-in-src-block-p ()
"Return t if point is inside an Org src block."
(when (derived-mode-p 'org-mode)
(let ((element (org-element-at-point)))
(and (eq (car element) 'src-block)
(<= (org-element-property :begin element) (point))
(< (point) (org-element-property :end element))))))
(defun my/update-fcitx5-based-on-context ()
"Enable or disable Fcitx5 based on whether point is in org-mode and not in a src block."
(when (and (bound-and-true-p evil-insert-state-minor-mode)
(derived-mode-p 'org-mode))
(if (my/org-in-src-block-p)
(call-process "fcitx5-remote" nil nil nil "-c") ; Disable
(call-process "fcitx5-remote" nil nil nil "-o")))) ; Enable
(defun my/disable-fcitx5-on-esc ()
"Always disable Fcitx5 on exiting insert state."
(call-process "fcitx5-remote" nil nil nil "-c"))
(defun my/start-fcitx5-monitor ()
"Start monitoring cursor movement during insert state in org-mode."
(add-hook 'post-command-hook #'my/update-fcitx5-based-on-context nil t))
(defun my/stop-fcitx5-monitor ()
"Stop monitoring when leaving insert state."
(remove-hook 'post-command-hook #'my/update-fcitx5-based-on-context t))
(add-hook 'evil-insert-state-entry-hook #'my/start-fcitx5-monitor)
(add-hook 'evil-insert-state-exit-hook #'my/stop-fcitx5-monitor)
(add-hook 'evil-insert-state-exit-hook #'my/disable-fcitx5-on-esc)
(setq org-hide-emphasis-markers t)
(with-eval-after-load 'org (global-org-modern-mode))
;; Minimal UI
(package-initialize)
(menu-bar-mode -1)
(tool-bar-mode -1)
(scroll-bar-mode -1)
(modus-themes-load-operandi)
;; Choose some fonts
;; (set-face-attribute 'default nil :family "Iosevka")
;; (set-face-attribute 'variable-pitch nil :family "Iosevka Aile")
;; (set-face-attribute 'org-modern-symbol nil :family "Iosevka")
;; Add frame borders and window dividers
(modify-all-frames-parameters
'((right-divider-width . 40)
(internal-border-width . 40)))
(dolist (face '(window-divider
window-divider-first-pixel
window-divider-last-pixel))
(face-spec-reset-face face)
(set-face-foreground face (face-attribute 'default :background)))
(set-face-background 'fringe (face-attribute 'default :background))
(setq
;; Edit settings
org-auto-align-tags nil
org-tags-column 0
org-catch-invisible-edits 'show-and-error
org-special-ctrl-a/e t
org-insert-heading-respect-content t
;; Org styling, hide markup etc.
org-hide-emphasis-markers t
org-pretty-entities t
org-agenda-tags-column 0
org-ellipsis "")
(global-org-modern-mode)