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