From 255db50995904231619848ac75d08233893ae50f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 16 Jul 2024 22:55:28 +0000 Subject: [PATCH] Deploy to GitHub pages --- .nojekyll | 0 index.html | 1443 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1443 insertions(+) create mode 100644 .nojekyll create mode 100644 index.html diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/index.html b/index.html new file mode 100644 index 0000000..86c60fe --- /dev/null +++ b/index.html @@ -0,0 +1,1443 @@ + + + + + + + +Spacemacs tangled user configuration + + + + + + + + + +
+

Spacemacs tangled user configuration

+
+

Table of Contents

+
+ +
+
+ +
+

1. Introduction

+
+

+This is a org file where its code snippets will be read by spacemacs for user-init and user-config. It is inspired by spacemacs.org. +

+
+
+
+

2. user-init

+
+

+All code snippets under this section will be added to dotspacemacs//user-init +function, which is +

+
+

+Initialization function for user code. +

+ +

+It is called immediately after +dotspacemacs/init, before layer configuration executes. This function is mostly +useful for variables that need to be set before packages are loaded. If you are +unsure, you should try in setting them in `dotspacemacs/user-config' first. +

+
+
+
+

2.1. Locale

+
+
+
(setq system-time-locale "C")
+
+
+
+
+
+

2.2. Theme

+
+
+
(setq-default dotspacemacs-themes '(
+                                    doom-monokai-pro
+                                    spacemacs-dark
+                                    doom-one
+                                    doom-zenburn))
+
+
+
+
+
+

2.3. ROS

+
+
+
(defun spacemacs/update-ros-envs ()
+  "Update all environment variables in `spacemacs-ignored-environment-variables'
+from their values currently sourced in the shell environment (e.g. .bashrc)"
+  (interactive)
+  (setq exec-path-from-shell-check-startup-files nil)
+  (exec-path-from-shell-copy-envs spacemacs-ignored-environment-variables)
+  (message "ROS environment copied successfully from shell"))
+
+
+;; Ignore any ROS environment variables since they might change depending
+;; on which catkin workspace is used. When a new catkin workspace is chosen
+;; call `spacemacs/update-ros-envs' to update theses envs accordingly
+(setq-default spacemacs-ignored-environment-variables '("ROS_IP"
+                                                        "PYTHONPATH"
+                                                        "CMAKE_PREFIX_PATH"
+                                                        "ROS_MASTER_URI"
+                                                        "ROS_PACKAGE_PATH"
+                                                        "ROSLISP_PACKAGE_DIRECTORIES"
+                                                        "PKG_CONFIG_PATH"
+                                                        "LD_LIBRARY_PATH"))
+
+
+
+
+
+

2.4. Shell

+
+

+Set shell to be bash explicitly because my default shell fish does not work along with spacemacs. +

+
+
(setq-default shell-file-name "/bin/bash")
+
+
+
+
+
+

2.5. Layers

+
+
+
+

2.5.1. groovy

+
+
+
(setq default-groovy-lsp-jar-path "~/.spacemacs.d/groovy-language-server-all.jar")
+(if (file-exists-p default-groovy-lsp-jar-path)
+    (setq groovy-lsp-jar-path default-groovy-lsp-jar-path)
+  (message (concat default-groovy-lsp-jar-path " does not exist")))
+
+
+
+
+
+
+

2.6. Workarounds

+
+
+
+

2.6.1. Workaround for unsigned packages

+
+
+
(setq gnutls-algorithm-priority "NORMAL:-VERS-TLS1.3")
+
+
+
+
+
+

2.6.2. Acknowledge org-roam-v2

+
+
+
(setq org-roam-v2-ack t)
+
+
+
+
+
+
+ +
+

3. user-config

+
+

+All code snippets under this section will be added to dotspacemacs//user-config +function, which is +

+
+

+Configuration function for user code. +

+ +

+This function is called at the very end of Spacemacs initialization after +layers configuration. You are free to put any user code. +

+
+
+
+

3.1. IDE config

+
+
+
+

3.1.1. Disable auto-indent in C/C++ mode after typing ::

+
+
+
;; Disable electric indentation in C and C++ modes
+(defun my-disable-electric-indent-mode ()
+  (setq-local c-electric-flag nil))
+
+;; Hook this function to C mode and C++ mode
+(add-hook 'c-mode-hook 'my-disable-electric-indent-mode)
+(add-hook 'c++-mode-hook 'my-disable-electric-indent-mode)
+
+
+
+
+
+

3.1.2. MacOS

+
+
+
; Use Command key as meta in emacs
+(setq mac-option-key-is-meta nil
+      mac-command-key-is-meta t
+      mac-command-modifier 'meta
+      mac-option-modifier 'none)
+
+
+
+
+
+

3.1.3. Prevent using UI dialogs for prompts

+
+
+
(setq use-dialog-box nil)
+
+
+
+
+
+

3.1.4. ccls

+
+
+
(with-eval-after-load 'ccls
+  (setq ccls-root-files (add-to-list 'ccls-root-files "build/compile_commands.json" t))
+  (setq ccls-sem-highlight-method 'font-lock)
+  (setq ccls-initialization-options
+        (list :cache (list :directory (file-truename (concat (file-name-as-directory spacemacs-cache-directory) ".ccls-cache")))
+              :compilationDatabaseDirectory "build"))
+  ;; Only set the specific ccls path if it exists
+  (when (file-exists-p "~/.spacemacs.d/ccls/Release/ccls")
+    (setq ccls-executable (file-truename "~/.spacemacs.d/ccls/Release/ccls"))))
+
+
+
+
+
+

3.1.5. cmake-ide

+
+
+
;; C++ build dir setting
+(put 'cmake-ide-dir 'safe-local-variable 'stringp)
+(put 'cmake-ide-make-command 'safe-local-variable 'stringp)
+(put 'cmake-ide-cmake-args 'safe-local-variable 'stringp)
+
+
+
+
+
+

3.1.6. company

+
+
+
(with-eval-after-load 'company
+  (define-key company-active-map (kbd "M-n") nil)
+  (define-key company-active-map (kbd "M-p") nil)
+  (define-key company-active-map (kbd "C-j") 'company-select-next)
+  (define-key company-active-map (kbd "C-k") 'company-select-previous))
+
+
+
+
+
+

3.1.7. lsp-ui

+
+
+
(with-eval-after-load 'lsp-ui
+  (define-key lsp-ui-peek-mode-map (kbd "C-j") 'lsp-ui-peek--select-next)
+  (define-key lsp-ui-peek-mode-map (kbd "j") 'lsp-ui-peek--select-next)
+  (define-key lsp-ui-peek-mode-map (kbd "C-k") 'lsp-ui-peek--select-prev)
+  (define-key lsp-ui-peek-mode-map (kbd "k") 'lsp-ui-peek--select-prev))
+
+
+
+
+
+

3.1.8. popup

+
+

+Use evil keybindings for selecting items in popup menus. +

+
+
(with-eval-after-load 'popup
+  (define-key popup-menu-keymap (kbd "C-j") 'popup-next)
+  (define-key popup-menu-keymap (kbd "C-k") 'popup-previous))
+
+
+
+
+
+

3.1.9. dap

+
+
+
(add-hook 'dap-stopped-hook
+          (lambda (arg) (call-interactively #'dap-hydra)))
+(add-hook 'dap-stopped-hook
+          (lambda (arg) (call-interactively #'dap-hydra)))
+
+
+
+
+
+

3.1.10. flycheck

+
+
+
(with-eval-after-load 'flycheck
+  (setq flycheck-check-syntax-automatically '(save
+                                              idle-buffer-switch
+                                              mode-enabled)))
+
+
+
+
+
+

3.1.11. Indentation for web development

+
+
+
(defun setup-web-dev-indent (n)
+  ;; web development
+  (setq coffee-tab-width n) ; coffeescript
+  (setq javascript-indent-level n) ; javascript-mode
+  (setq js-indent-level n) ; js-mode
+  (setq js2-basic-offset n) ; js2-mode, in latest js2-mode, it's alias of js-indent-level
+  (setq web-mode-markup-indent-offset n) ; web-mode, html tag in html file
+  (setq web-mode-css-indent-offset n) ; web-mode, css in html file
+  (setq web-mode-code-indent-offset n) ; web-mode, js code in html file
+  (setq css-indent-offset n) ; css-mode
+  )
+(setup-web-dev-indent 2)
+
+
+
+
+
+

3.1.12. groovy (Jenkinsfile)

+
+
+
(setq groovy-indent-offset 2)
+
+
+
+
+
+

3.1.13. plantuml

+
+
+
(when (fboundp 'plantuml-mode)
+  (require 'org-src)
+  ;; Enable plantuml-mode for all *.pu files by default
+  (add-to-list 'auto-mode-alist '("\\.pu\\'" . plantuml-mode))
+  (setq org-plantuml-jar-path plantuml-jar-path)
+  (add-to-list 'org-src-lang-modes '("plantuml" . plantuml))
+  (org-babel-do-load-languages 'org-babel-load-languages '((plantuml . t)))
+  )
+
+
+
+
+
+

3.1.14. nvm

+
+
+
;; TODO: use the default version instead of hard-coding the specific version
+(condition-case err
+    (nvm-use "20")
+  (error (message "Could not initialize nvm for emacs. %s" (error-message-string err))))
+
+
+
+
+
+

3.1.15. conf-mode

+
+
+
(add-to-list 'auto-mode-alist '("\\.eds\\'" . conf-mode))
+(add-to-list 'auto-mode-alist '("\\.dcf\\'" . conf-mode))
+
+
+
+
+ +
+

3.1.16. ROS

+
+
+
+
3.1.16.1. helm-ros
+
+
+
;; ROS shortcut
+(spacemacs/set-leader-keys "ye" 'spacemacs/update-ros-envs)
+(spacemacs/declare-prefix "y" "ROS")
+(spacemacs/set-leader-keys "yy" 'helm-ros)
+
+(spacemacs/declare-prefix "yt" "ROS topics")
+(spacemacs/set-leader-keys "ytt" 'helm-ros-topics)
+(spacemacs/set-leader-keys "ytz" 'helm-ros-rostopic-hz)
+(spacemacs/set-leader-keys "yti" 'helm-ros-rostopic-info)
+
+(spacemacs/declare-prefix "yn" "ROS nodes")
+(spacemacs/set-leader-keys "yni" 'helm-ros-rosnode-info)
+(spacemacs/set-leader-keys "ynn" 'helm-ros-rosnode-list)
+(spacemacs/set-leader-keys "ynd" 'helm-ros-kill-node)
+(spacemacs/set-leader-keys "ynr" 'helm-ros-run-node)
+
+(spacemacs/set-leader-keys "ym" 'helm-ros-set-master-uri)
+
+
+
+
+
+
3.1.16.2. roslaunch-jump
+
+
+
;; TODO: load package lazily
+(use-package roslaunch-jump
+  :defer 1
+  :load-path "~/.spacemacs.d/private/roslaunch-jump")
+
+
+
+
+
+
3.1.16.3. company-roslaunch
+
+

+Autocompletion config for launch files. +

+
+
;; TODO: load package lazily
+(use-package company-roslaunch
+  :load-path "~/.spacemacs.d/private/company-roslaunch")
+
+
+
+
+
+
3.1.16.4. catkin-make
+
+
+
(use-package catkin-make
+  :load-path "~/.spacemacs.d/private/catkin-make"
+  :config (catkin-make-keybinding-setup))
+
+
+
+
+
+
+

3.1.17. Style for linux kernel development

+
+
+
;; Linux kernel development
+(defun c-lineup-arglist-tabs-only (ignored)
+  "Line up argument lists by tabs, not spaces"
+  (let* ((anchor (c-langelem-pos c-syntactic-element))
+         (column (c-langelem-2nd-pos c-syntactic-element))
+         (offset (- (1+ column) anchor))
+         (steps (floor offset c-basic-offset)))
+    (* (max steps 1)
+       c-basic-offset)))
+
+(add-hook 'c-mode-common-hook
+          (lambda ()
+            ;; Add kernel style
+            (c-add-style
+             "linux-tabs-only"
+             '("linux" (c-offsets-alist
+                        (arglist-cont-nonempty
+                         c-lineup-gcc-asm-reg
+                         c-lineup-arglist-tabs-only))))))
+(add-hook 'c-mode-hook
+          (lambda ()
+            (let ((filename (buffer-file-name)))
+              ;; Enable kernel mode for the appropriate files
+              (when (and filename
+                         ;; TODO: avoid the harded coded path
+                         (string-match (expand-file-name "~/Dev/kernels")
+                                       filename))
+                (setq indent-tabs-mode t)
+                (setq show-trailing-whitespace t)
+                (c-set-style "linux-tabs-only")))))
+
+
+
+
+
+ +
+

3.1.18. copilot

+
+
+
(setq copilot-node-executable (executable-find "node"))
+
+(with-eval-after-load 'company
+  ;; disable inline previews
+  (delq 'company-preview-if-just-one-frontend company-frontends))
+
+;; Keybindings
+(with-eval-after-load 'copilot
+  (define-key copilot-completion-map (kbd "<tab>") 'copilot-accept-completion)
+  (define-key copilot-completion-map (kbd "TAB") 'copilot-accept-completion)
+  (define-key copilot-completion-map (kbd "C-TAB") 'copilot-accept-completion-by-word)
+  (define-key copilot-completion-map (kbd "C-<tab>") 'copilot-accept-completion-by-word))
+
+;; Enable copilot mode in programming modes, markdown-mode and org-mode
+(add-hook 'prog-mode-hook 'copilot-mode)
+(add-hook 'markdown-mode-hook 'copilot-mode)
+(add-hook 'org-mode-hook 'copilot-mode)
+
+;; Disable the warning message
+(add-hook 'copilot-mode-hook (lambda ()
+                               (setq-local copilot--indent-warning-printed-p t)))
+
+
+
+
+
+

3.1.19. tramp + clang-format

+
+

+clang-format does not work properly when editing a file on a remote host or in a docker container with tramp. +See the issue here: https://github.com/kljohann/clang-format.el/issues/5 +

+ +

+Here upon clang-format-region call, we first check if the file is on a remote host or in a docker container. +

+
    +
  • If not, we call clang-format-region as usual.
  • +
  • If yes, we first check if a file with the same path exists on the local disk. +
      +
    • If yes, we assume it as the input file name for clang-format-region.
    • +
    • If not, we assume the input file is under the $HOME directory.
    • +
  • +
+ +

+Depending on where the input file is assumed to be, clang-format will find the .clang-format file for +the formatting in a dominant parent directory of the assumed input file path. +

+
+
(defun tramp-aware-clang-format (orig-fun start end &optional style assume-file-name)
+  (unless assume-file-name
+    (setq assume-file-name
+          (if (file-remote-p buffer-file-name)
+              (let ((maybe-existing-local-buffer-file-name (replace-regexp-in-string "/docker:[^:]+:" "" buffer-file-name)))
+                ;; If file `maybe-existing-local-buffer-file-name' exists on local disk, use it.
+                (if (file-exists-p maybe-existing-local-buffer-file-name)
+                    maybe-existing-local-buffer-file-name
+                  ;; Otherwise, use `buffer-file-name' as if it is under the $HOME directory.
+                  (concat (getenv "HOME") "/" (file-name-nondirectory buffer-file-name))))
+            buffer-file-name)))
+  (message "assume-file-name: %s" assume-file-name)
+  (apply orig-fun (list start end style assume-file-name)))
+
+(advice-add 'clang-format-region :around #'tramp-aware-clang-format)
+
+
+
+
+
+

3.1.20. Get current branch name in magit

+
+
+
(defun magit-add-current-branch-name-to-kill-ring ()
+  "Show the current branch in the echo-area and add it to the `kill-ring'."
+  (interactive)
+  (let ((branch (magit-get-current-branch)))
+    (if branch
+        (progn (kill-new branch)
+               (message "%s" branch))
+      (user-error "There is not current branch"))))
+
+; TODO: Move this keybinding from "Checkout" to "Do" section
+(with-eval-after-load 'magit
+  (transient-insert-suffix 'magit-branch "b"
+    '("k" "copy branch name" magit-add-current-branch-name-to-kill-ring)))
+
+
+
+
+
+
+

3.2. Miscellaneous

+
+
+
+

3.2.1. No title bar

+
+
+
(add-to-list 'default-frame-alist '(undecorated-round . t))
+
+
+
+
+
+

3.2.2. cursor

+
+
+
; Display Emacs cursor in terminal as it would be in GUI
+;; (global-term-cursor-mode)
+
+
+
+
+ +
+

3.2.3. ripgrep

+
+
+
(custom-set-variables
+ '(helm-ag-base-command "rg --no-heading")
+ `(helm-ag-success-exit-status '(0 2)))
+
+
+
+
+
+

3.2.4. C-a for increasing number, C-x for descreasing number

+
+
+
(evil-define-key 'normal global-map (kbd "C-a") 'evil-numbers/inc-at-pt)
+(evil-define-key 'normal global-map (kbd "C-x") 'evil-numbers/dec-at-pt)
+
+
+
+
+
+

3.2.5. Default python interpreter

+
+
+
(setq python-shell-interpreter (executable-find "python3"))
+
+
+
+
+
+

3.2.6. Disable spacemacs buffer warnings

+
+
+
(setq spacemacs-buffer--warnings nil)
+
+
+
+
+
+

3.2.7. Find this file

+
+

+Create binding to spacemacs.org file +

+
+
(defun spacemacs/find-config-file ()
+  (interactive)
+  (find-file (concat dotspacemacs-directory "/spacemacs.org")))
+
+(spacemacs/set-leader-keys "fec" 'spacemacs/find-config-file)
+
+
+
+
+
+

3.2.8. - for going to the first non-blank position of the previous line

+
+
+
(evil-define-key 'normal global-map (kbd "-") 'evil-previous-line-first-non-blank)
+
+
+
+
+
+

3.2.9. helm-swoop

+
+
+
(setq helm-swoop-use-fuzzy-match t)
+(setq helm-swoop-use-line-number-face t)
+
+
+
+
+
+

3.2.10. Keybinding for Zoom in / out

+
+
+
(define-key (current-global-map) (kbd "C-+") 'spacemacs/zoom-frm-in)
+(define-key (current-global-map) (kbd "C--") 'spacemacs/zoom-frm-out)
+
+
+
+
+
+

3.2.11. Kill frame when pressing SPC q q

+
+

+The reason for this is that I mainly use emacs as a daemon and I don't want to close the daemon by accident. +

+
+
(spacemacs/set-leader-keys "qq" 'spacemacs/frame-killer)
+
+
+
+
+
+

3.2.12. Make w in vim mode move to end of the word (not stopped by _)

+
+
+
(with-eval-after-load 'evil
+  (defalias #'forward-evil-word #'forward-evil-symbol))
+
+
+
+
+
+

3.2.13. Smooth scrolling

+
+
+
;; Scroll one line at a time (less "jumpy" than defaults)
+(when (display-graphic-p)
+  (setq mouse-wheel-scroll-amount '(1 ((shift) . 1))
+        mouse-wheel-progressive-speed nil))
+(setq scroll-step 1
+      scroll-margin 0
+      scroll-conservatively 100000)
+
+
+
+
+
+

3.2.14. Transparency settings

+
+
+
(spacemacs/set-leader-keys "tt" 'spacemacs/toggle-transparency)
+(add-hook 'after-make-frame-functions 'spacemacs/enable-transparency)
+
+
+
+
+
+

3.2.15. Turn on xclip-mode

+
+
+
(use-package xclip
+  :config (xclip-mode t))
+
+
+
+
+
+

3.2.16. Use windows key as meta key

+
+

+It is meant to avoid conflicts with i3wm, where I use alt as the meta key. +

+
+
(setq x-super-keysym 'meta)
+
+
+
+
+
+

3.2.17. Visiting a file uses its truename as the visited-file name

+
+

+E.g. when visiting a soft/hard link. +

+
+
(setq find-file-visit-truename t)
+
+
+
+
+
+

3.2.18. Do not autosave undo history

+
+
+
(setq undo-tree-auto-save-history nil)
+
+
+
+
+
+

3.2.19. Native compilation

+
+
+
(when (and (fboundp 'native-comp-available-p)
+           (native-comp-available-p))
+  (message "Native compilation is available")
+  (setq native-comp-async-report-warnings-errors nil))
+
+
+
+
+
+
+

3.3. org-mode

+
+
+
+

3.3.1. Export code blocks with current theme

+
+
+
(defun my/org-inline-css-hook (exporter)
+  "Insert custom inline css to automatically set the
+background of code to whatever theme I'm using's background"
+  (when (eq exporter 'html)
+    (let* ((my-pre-bg (face-background 'default))
+           (my-pre-fg (face-foreground 'default)))
+      (setq
+       org-html-head-extra
+       (concat
+        org-html-head-extra
+        (format "<style type=\"text/css\">\n pre.src {background-color: %s; color: %s;}</style>\n"
+                my-pre-bg my-pre-fg))))))
+
+(add-hook 'org-export-before-processing-hook 'my/org-inline-css-hook)
+
+
+
+
+
+

3.3.2. org-ai

+
+
+
(use-package org-ai
+  :ensure t
+  :commands (org-ai-mode
+             org-ai-global-mode)
+  :custom (org-ai-openai-api-token (auth-source-pick-first-password :host "api.openai.com"))
+  :init
+  (add-hook 'org-mode-hook #'org-ai-mode) ; enable org-ai in org-mode
+  (org-ai-global-mode) ; installs global keybindings on C-c M-a
+  :config
+  (setq org-ai-default-chat-model "gpt-4") ; if you are on the gpt-4 beta:
+  (org-ai-install-yasnippets)) ; if you are using yasnippet and want `ai` snippets  (require 'org-ai-talk)
+
+
+
+
+ +
+

3.3.3. org-pomodora

+
+
+
;; Lower the volume of the sounds
+(setq org-pomodoro-audio-player "play")
+(setq org-pomodoro-finished-sound-args "-v 0.01")
+(setq org-pomodoro-long-break-sound-args "-v 0.01")
+(setq org-pomodoro-short-break-sound-args "-v 0.01")
+
+
+
+
+ +
+

3.3.4. org-agenda

+
+
+
(defun scan-new-agenda-files ()
+  (interactive)
+  (message "Scanning new agenda files...")
+  (setq org-agenda-files (directory-files-recursively "~/org/" "\.org$" nil nil t)))
+
+(with-eval-after-load 'org-agenda
+  (scan-new-agenda-files)
+  (define-key org-agenda-mode-map "m" 'org-agenda-month-view)
+  (define-key org-agenda-mode-map "y" 'org-agenda-year-view))
+
+(spacemacs/set-leader-keys "aou" 'scan-new-agenda-files)
+
+
+
+
+
+

3.3.5. org-cv

+
+
+
(use-package ox-awesomecv
+  :load-path "~/.spacemacs.d/private/org-cv"
+  :init (require 'ox-awesomecv))
+
+
+
+
+
+

3.3.6. org-babel

+
+
+
(with-eval-after-load 'org
+  (org-babel-do-load-languages
+   'org-babel-load-languages
+   '((C . t)
+     (python . t)
+     (shell . t))))
+
+
+
+
+
+

3.3.7. org-journal

+
+
+
(with-eval-after-load 'org-journal
+  (setq org-journal-dir "~/org/home/roam/journal/")
+  (setq org-journal-file-type 'monthly)
+  (setq org-journal-file-format "%Y%m%d.org"))
+
+(spacemacs/set-leader-keys
+  "aojj" (lambda () (interactive)
+           (org-journal-new-entry nil)))
+(spacemacs/declare-prefix "aojj" "journal-home")
+
+
+
+
+
+

3.3.8. org-table

+
+
+
(with-eval-after-load 'org-mode
+  (define-key org-mode-map (kbd "C-<tab>") 'org-table-previous-field))
+
+
+
+
+
+

3.3.9. org-todo

+
+
+
(with-eval-after-load 'org
+  (let ((capture-template  "* TODO %?\n%U\n%i\n%a"))
+    (progn
+      (setq org-todo-keywords
+            '((sequence "TODO(t)" "IN_PROGRESS" "UNDER_REVEW" "|" "DONE(d)")
+              (sequence "REPORT(r)" "BUG(b)" "KNOWNCAUSE(k)" "|" "FIXED(f)")
+              (sequence "|" "INACTIVE(i)" "INCOMPLETE(n)" "CANCELED(c)" "REPORTED(R)")))
+      (setq org-capture-templates
+            '(("h" "Home" entry (file+headline "~/org/home/tasks.org" "Tasks")
+               "* TODO %?\n%U\n%i\n%a")
+              ("w" "Work" entry (file+headline "~/org/work/tasks.org" "Tasks")
+               "* TODO %?\n%U\n%i\n%a")))
+      (setq org-project-capture-capture-template capture-template))))
+(spacemacs/set-leader-keys
+  "aoh" (lambda () (interactive) (find-file "~/org/home/tasks.org"))
+  "aow" (lambda () (interactive) (find-file "~/org/work/tasks.org")))
+(spacemacs/declare-prefix "aoh" "Home tasks")
+(spacemacs/declare-prefix "aow" "Work tasks")
+
+
+
+
+
+

3.3.10. org-hugo

+
+
+
(spacemacs/set-leader-keys-for-major-mode 'org-mode "Th" 'org-hugo-auto-export-mode)
+
+
+
+
+
+

3.3.11. org-roam

+
+
+
+
3.3.11.1. Automatically sync the database
+
+
+
(org-roam-db-autosync-mode)
+
+
+
+
+
+
3.3.11.2. Migrate the current buffer from org-roam v1 to v2
+
+
+
(defun org-roam-migrate-current-buffer-v1-to-v2 ()
+  (interactive)
+  (org-roam-migrate-v1-to-v2))
+
+
+
+
+
+
+

3.3.12. org-clock

+
+
+
+
3.3.12.1. Save the clock history across Emacs sessions
+
+
+
(setq org-clock-persist 'history)
+(org-clock-persistence-insinuate)
+
+
+
+
+
+
+

3.3.13. Replace selected markdown region to org format

+
+
+
(defun replace-markdown-region-with-org (beginning end)
+  "Replace the selected markdown region with its corresponding org-mode format."
+  (interactive "r")
+  (if (use-region-p)
+      (let ((tmp-buffer "Markdown To Org Tmp"))
+        (pcase (shell-command-on-region (region-beginning) (region-end)
+                                        "pandoc -f markdown -t org" tmp-buffer t)
+          (0 (message "Successfully converted to org-mode format."))
+          (127 (message "pandoc not found. Install it with 'sudo apt install pandoc'."))
+          (_ (message "Failed to convert the selected region to org-mode format."))
+          )
+        )
+    (message "No active region is found.")))
+(spacemacs/set-leader-keys-for-major-mode 'org-mode "RR" 'replace-markdown-region-with-org)
+
+
+
+
+
+

3.3.14. ob-lean4

+
+
+
(use-package ob-lean4
+  :load-path "~/.spacemacs.d/private/ob-lean4")
+(add-to-list 'org-babel-load-languages '(lean4 . t))
+
+
+
+
+ +
+

3.3.15. ob-cmake

+
+
+
(use-package ob-cmake
+  :load-path "~/.spacemacs.d/private/ob-cmake")
+(add-to-list 'org-babel-load-languages '(cmake . t))
+
+
+
+
+
+ +
+

3.4. Utility

+
+
+
+

3.4.1. beacon mode

+
+
+
(beacon-mode 1)
+
+
+
+
+
+

3.4.2. Toggle clang-format on save

+
+
+
(defun c-c++-toggle-clang-format-on-save ()
+  (interactive)
+  (cond
+   (c-c++-enable-clang-format-on-save
+    (message "[c-c++] disable clang-format on save")
+    (setq c-c++-enable-clang-format-on-save nil))
+   ((not c-c++-enable-clang-format-on-save)
+    (message "[c-c++] enable clang-format on save")
+    (setq c-c++-enable-clang-format-on-save t))
+   ))
+
+(spacemacs/set-leader-keys-for-major-mode 'c-mode "Tf" 'c-c++-toggle-clang-format-on-save)
+(spacemacs/set-leader-keys-for-major-mode 'c++-mode "Tf" 'c-c++-toggle-clang-format-on-save)
+(spacemacs/declare-prefix-for-mode 'c-mode "Tf" "toggle-clang-format-on-save")
+(spacemacs/declare-prefix-for-mode 'c++-mode "Tf" "toggle-clang-format-on-save")
+
+
+
+
+
+

3.4.3. auto-indent

+
+
+
;; I want to disable pasting with formatting on C/C++ buffers
+(add-to-list 'spacemacs-indent-sensitive-modes 'c-mode)
+(add-to-list 'spacemacs-indent-sensitive-modes 'c++-mode)
+
+
+
+
+
+

3.4.4. format-all

+
+
+
(add-hook 'sh-mode-hook #'format-all-mode)
+(add-hook 'fish-mode-hook #'format-all-mode)
+(add-hook 'cmake-mode-hook #'format-all-mode)
+
+
+
+
+
+

3.4.5. glow, the markdown viewer

+
+
+
;; Configure glow viewer
+(defun start-glow-viewer ()
+  (interactive)
+  (start-process "glow-markdown-viewer" nil
+                 "/usr/bin/x-terminal-emulator"
+                 (file-truename "~/.spacemacs.d/scripts/glow_mk_viewer.sh")
+                 (buffer-file-name nil)))
+
+
+
+
+
+

3.4.6. google-search

+
+
+
;; Set google as default search engine and open links with xdg-open or open depending on the OS
+(spacemacs/set-leader-keys "ag" 'engine/search-google)
+(setq browse-url-browser-function 'browse-url-generic
+      engine/browser-function 'browse-url-generic
+      browse-url-generic-program (cond ((string-equal system-type "darwin") "open")
+                                        ((string-equal system-type "gnu/linux") "xdg-open")))
+
+
+
+
+
+

3.4.7. Kill all buffers

+
+
+
(defun nuke-all-buffers ()
+  (interactive)
+  (mapcar 'kill-buffer (buffer-list))
+  (delete-other-windows))
+(global-set-key (kbd "C-x K") 'nuke-all-buffers)
+
+
+
+
+
+

3.4.8. ranger

+
+
+
(with-eval-after-load 'ranger
+  (define-key ranger-mode-map (kbd "M-h") 'ranger-prev-tab)
+  (define-key ranger-mode-map (kbd "M-l") 'ranger-next-tab)
+  (define-key ranger-mode-map (kbd "M-n") 'ranger-new-tab))
+(spacemacs/set-leader-keys "ar" 'ranger)
+
+
+
+
+
+

3.4.9. cheat.sh

+
+

+The one and only one cheatsheet. +

+
+
(spacemacs/declare-prefix "aa" "cheat-sh")
+
+;; Prompt to select a topic to show its cheatsheet
+(spacemacs/set-leader-keys "aaa" 'cheat-sh)
+
+;; Show the help page of cheat.sh
+(spacemacs/set-leader-keys "aah" 'cheat-sh-help)
+
+;; Get the cheatsheet for the marked region
+(spacemacs/set-leader-keys "aar" 'cheat-sh-region)
+
+;; Get a random page of cheatsheet
+(spacemacs/set-leader-keys "aad"
+  (lambda ()
+    (interactive)
+    (cheat-sh ":random")))
+(spacemacs/declare-prefix "aad" "cheat.sh/:random")
+
+
+
+
+
+

3.4.10. Disable persistent undo-tree

+
+
+
(require 'undo-tree)
+(setq undo-tree-auto-save-history nil)
+
+
+
+
+
+

3.4.11. chatgpt-shell

+
+
+
(use-package chatgpt-shell
+  :load-path "~/.spacemacs.d/private/chatgpt-shell")
+(setq chatgpt-shell-openai-key
+      (auth-source-pick-first-password :host "api.openai.com"))
+
+
+
+
+
+
+

3.5. Workarounds

+
+
+
+

3.5.1. Workaround to suppress a yas related warning

+
+
+
(defvaralias 'helm-c-yas-space-match-any-greedy 'helm-yas-space-match-any-greedy
+  "Temporary alias for Emacs27")
+
+
+
+
+
+

3.5.2. Workaround for the bug where keybinding of the projectile-find-other-file is shadowed.

+
+
+
;; (with-eval-after-load 'lsp-mode (define-key lsp-command-map-prefix "ga" 'projectile-find-other-file))
+
+
+
+
+
+

3.5.3. Workaround for the bug where fuzzy matching is not used in recent files

+
+
+
(setq completion-styles `(basic partial-completion emacs22 initials
+                                ,(if (version<= emacs-version "27.0") 'helm-flex 'flex)))
+
+
+
+
+
+

3.5.4. Workaround for the bug where company-mode and evil-mode are conflicting

+
+
+
(evil-declare-change-repeat 'company-complete)
+
+
+
+
+ +
+

3.5.5. Workaround for the bug where evil search breaks spacemacs.

+
+
+
(defun kill-minibuffer ()
+  (interactive)
+  (when (windowp (active-minibuffer-window))
+    (evil-ex-search-exit)))
+(add-hook 'mouse-leave-buffer-hook #'kill-minibuffer)
+
+
+
+
+ +
+

3.5.6. Setting part of a word to be bold, italics, underline, and strikethrough.

+
+

+The visualization in org-mode can be wrong, which needs a fix. +

+
+
;; This commented out because it messed up with org highlight
+;; (setcar org-emphasis-regexp-components " \t('\"{[:alpha:]")
+;; (setcar (nthcdr 1 org-emphasis-regexp-components) "[:alpha:]- \t.,:!?;'\")}\\")
+;; (org-set-emph-re 'org-emphasis-regexp-components org-emphasis-regexp-components)
+
+
+
+
+ +
+

3.5.7. Enable doom-modeline-icons in gui and disable them in terminal

+
+
+
;; Enable doom-modeline-icons in gui and disable them in terminal
+;; TODO: check if this is still working
+(defun enable-doom-modeline-icons()
+  (setq doom-modeline-icon (display-graphic-p)))
+(defun enable-doom-modeline-icons-weird (_frame)
+  ;; TODO: Don't know why this "not" is needed...
+  (setq doom-modeline-icon (not (display-graphic-p))))
+(add-hook 'focus-in-hook
+          #'enable-doom-modeline-icons)
+(add-hook 'after-make-frame-functions
+          #'enable-doom-modeline-icons-weird)
+
+
+
+
+
+
+
+
+

Created: 2024-07-16 Tue 22:54

+

Validate

+
+ +