;;; -*- 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 ("" . anki-editor-cloze-region-auto-incr) ("" . anki-editor-cloze-region-dont-incr) ("" . anki-editor-reset-cloze-number) ("" . 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 "") 'my/fcitx5-disable) (global-set-key (kbd "") '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)