Skip to content

Instantly share code, notes, and snippets.

@sunng87
Created April 30, 2022 13:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sunng87/7b37c78f19f6f7b964a7a2203236e1f5 to your computer and use it in GitHub Desktop.
Save sunng87/7b37c78f19f6f7b964a7a2203236e1f5 to your computer and use it in GitHub Desktop.
My emacs configuration
(require 'package)
;; (dolist (source '(("marmalade" . "http://marmalade-repo.org/packages/")
;; ("elpa" . "http://tromey.com/elpa/")
;; ("melpa" . "http://melpa.milkbox.net/packages/")
;; ("org" . "http://orgmode.org/elpa/")))
;; (add-to-list 'package-archives source t))
;;
;; ("marmalade" . "http://elpa.emacs-china.org/marmalade/")
;; ("org" . "http://elpa.emacs-china.org/org/")
;; ("elpa" . "http://elpa.emacs-china.org/gnu/")
;; ("melpa" . "http://elpa.emacs-china.org/melpa/")
(dolist (source '(
("melpa" . "https://melpa.org/packages/")
))
(add-to-list 'package-archives source t))
(package-initialize)
(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.
'(custom-enabled-themes (quote (nord)))
'(custom-safe-themes
(quote
("37768a79b479684b0756dec7c0fc7652082910c37d8863c35b702db3f16000f8" "06bf0822aa77ea498bbd6038b59ad96fca43b272b49b18ab024218881ba134d1" "7f6d4aebcc44c264a64e714c3d9d1e903284305fd7e319e7cb73345a9994f5ef" "fb77c6c439141762967dc6161fce316d14eb821eb50a45994ae5ea219d3daa5c" "d6c5b8dc6049f2e9dabdfcafa9ef2079352640e80dffe3e6cc07c0f89cbf9748" default)))
'(package-selected-packages
(quote
(yaml-mode epresent graphviz-dot-mode project handlebars-mode company-org-roam org-roam kotlin-mode pianobar restclient all-the-icons dashboard meghanada powerline smartparens deadgrep company use-package cargo cider clojure-mode counsel counsel-projectile eglot magit web-mode rust-mode better-defaults org nord-theme))))
(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.
)
(eval-when-compile
(require 'use-package))
(use-package better-defaults)
(use-package powerline
:config (powerline-default-theme))
(use-package counsel
:bind
(("M-x" . counsel-M-x)
("C-s" . swiper)
("C-x C-f" . counsel-find-file)
("C-x b" . counsel-ibuffer)
("C-x C-b" . switch-to-buffer)))
(use-package ivy-prescient)
(use-package ivy
:init (ivy-mode)
:config (ivy-prescient-mode))
(use-package company
:config (global-company-mode)
:bind (("M-/" . company-complete)))
(use-package magit
:bind (("C-x g" . magit-status)))
(use-package projectile
:config
(projectile-mode +1)
(define-key projectile-mode-map (kbd "C-c p") 'projectile-command-map))
(use-package cargo
:ensure t
:config (progn
(setq cargo-process--command-build "build --all-features")
(setq cargo-process--command-check "check --all-features")
(setq cargo-process--command-test "test --all-features"))
:hook (rust-mode . cargo-minor-mode))
(use-package smartparens
:ensure t
:init
(smartparens-global-mode 1)
:bind (("M-s" . sp-splice-sexp)
("C-M-k" . sp-kill-hybrid-sexp))
:config
(require 'smartparens-config)
(sp-pair "(" ")" :wrap "M-(")
(sp-pair "\"" "\"" :wrap "M-\""))
(use-package clojure-mode
:hook (clojure-mode . turn-on-auto-fill)
(clojure-mode . (lambda () (set (make-local-variable 'comment-auto-fill-only-comments) t))))
(use-package cider
;; :config (setq cider-enrich-classpath t)
:init (add-hook 'before-save-hook #'cider-format-buffer t t)
:hook
(clojure-mode . cider-mode))
;; (use-package meghanada
;; :hook (java-mode . meghanada-mode))
(use-package rust-mode
:config
(setq rust-format-on-save t)
:hook
(rust-mode . turn-on-auto-fill)
(rust-mode . (lambda () (set (make-local-variable 'comment-auto-fill-only-comments) t))))
(use-package all-the-icons)
(use-package dashboard
:ensure t
:config
(dashboard-setup-startup-hook)
(setq dashboard-items '((projects . 5)
(recents . 5)
(bookmarks . 5)))
;;(agenda . 5)))
(setq dashboard-set-heading-icons t)
(setq dashboard-set-file-icons t))
(use-package vulpea
:config
(progn
(defun vulpea-project-p ()
"Return non-nil if current buffer has any todo entry.
TODO entries marked as done are ignored, meaning the this
function returns nil if current buffer contains only completed
tasks."
(seq-find ; (3)
(lambda (type)
(eq type 'todo))
(org-element-map ; (2)
(org-element-parse-buffer 'headline) ; (1)
'headline
(lambda (h)
(org-element-property :todo-type h)))))
(defun vulpea-project-update-tag ()
"Update PROJECT tag in the current buffer."
(when (and (not (active-minibuffer-window))
(vulpea-buffer-p))
(save-excursion
(goto-char (point-min))
(let* ((tags (vulpea-buffer-tags-get))
(original-tags tags))
(if (vulpea-project-p)
(setq tags (cons "project" tags))
(setq tags (remove "project" tags)))
;; cleanup duplicates
(setq tags (seq-uniq tags))
;; update tags if changed
(when (or (seq-difference tags original-tags)
(seq-difference original-tags tags))
(apply #'vulpea-buffer-tags-set tags))))))
(defun vulpea-buffer-p ()
"Return non-nil if the currently visited buffer is a note."
(and buffer-file-name
(string-prefix-p
(expand-file-name (file-name-as-directory org-roam-directory))
(file-name-directory buffer-file-name))))
(defun vulpea-project-files ()
"Return a list of note files containing 'project' tag." ;
(seq-uniq
(seq-map
#'car
(org-roam-db-query
[:select [nodes:file]
:from tags
:left-join nodes
:on (= tags:node-id nodes:id)
:where (like tag (quote "%\"project\"%"))]))))
(defun vulpea-agenda-files-update (&rest _)
"Update the value of `org-agenda-files'."
(setq org-agenda-files (vulpea-project-files))))
:hook ((find-file . vulpea-project-update-tag)
(before-save . vulpea-project-update-tag)))
(use-package org
:after (vulpea)
:config (progn
(org-babel-do-load-languages
'org-babel-load-languages
'((dot . t)
(plantuml . t)))
(setq org-agenda-files (vulpea-project-files))
(setq org-plantuml-jar-path "/usr/share/java/plantuml/plantuml.jar")
(advice-add 'org-agenda :before #'vulpea-agenda-files-update)
(advice-add 'org-todo-list :before #'vulpea-agenda-files-update))
:bind (("M-." . org-open-at-point)
("M-," . org-mark-ring-goto))
:hook ((org-mode . turn-on-auto-fill)
(org-mode . flyspell-mode)))
(use-package org-modern
:hook (org-mode . org-modern-mode))
(use-package org-download)
(use-package org-roam
:ensure t
:custom
(org-roam-directory (expand-file-name "~/orgroam"))
(org-roam-db-location (expand-file-name "~/.cache/orgroam/orgroam.db"))
:bind (("C-c n l" . org-roam-buffer-toggle)
("C-c n f" . org-roam-node-find)
("C-c n g" . org-roam-graph)
("C-c n i" . org-roam-node-insert)
("C-c n c" . org-roam-capture)
;; Dailies
("C-c n j" . org-roam-dailies-goto-today))
:config
(org-roam-setup))
;; disable for now
;; (use-package org-caldav
;; :after (vulpea)
;; :ensure t
;; :config (progn
;; (setq org-caldav-url "https://nsun@nc.sunng.info/remote.php/dav/calendars/nsun")
;; (setq org-caldav-calendar-id "personal")
;; (setq org-icalendar-timezone "Asia/Shanghai")
;; (setq org-caldav-inbox "~/.cache/org-caldav-inbox.org")
;; (setq org-caldav-files (vulpea-project-files))))
(use-package treemacs
:ensure t
:defer t
:config
(progn
(setq treemacs-collapse-dirs (if treemacs-python-executable 3 0)
treemacs-deferred-git-apply-delay 0.5
treemacs-directory-name-transformer #'identity
treemacs-display-in-side-window t
treemacs-eldoc-display t
treemacs-file-event-delay 5000
treemacs-file-extension-regex treemacs-last-period-regex-value
treemacs-file-follow-delay 0.2
treemacs-file-name-transformer #'identity
treemacs-follow-after-init t
treemacs-git-command-pipe ""
treemacs-goto-tag-strategy 'refetch-index
treemacs-indentation 2
treemacs-indentation-string " "
treemacs-is-never-other-window nil
treemacs-max-git-entries 5000
treemacs-missing-project-action 'ask
treemacs-move-forward-on-expand nil
treemacs-no-png-images nil
treemacs-no-delete-other-windows t
treemacs-project-follow-cleanup nil
treemacs-persist-file (expand-file-name ".cache/treemacs-persist" user-emacs-directory)
treemacs-position 'left
treemacs-recenter-distance 0.1
treemacs-recenter-after-file-follow nil
treemacs-recenter-after-tag-follow nil
treemacs-recenter-after-project-jump 'always
treemacs-recenter-after-project-expand 'on-distance
treemacs-show-cursor nil
treemacs-show-hidden-files t
treemacs-silent-filewatch nil
treemacs-silent-refresh nil
treemacs-sorting 'alphabetic-asc
treemacs-space-between-root-nodes t
treemacs-tag-follow-cleanup t
treemacs-tag-follow-delay 1.5
treemacs-user-mode-line-format nil
treemacs-user-header-line-format nil
treemacs-width 35
treemacs-workspace-switch-cleanup nil)
;; The default width and height of the icons is 22 pixels. If you are
;; using a Hi-DPI display, uncomment this to double the icon size.
;;(treemacs-resize-icons 44)
(treemacs-follow-mode t)
(treemacs-filewatch-mode t)
(treemacs-fringe-indicator-mode t)
(pcase (cons (not (null (executable-find "git")))
(not (null treemacs-python-executable)))
(`(t . t)
(treemacs-git-mode 'deferred))
(`(t . _)
(treemacs-git-mode 'simple))))
:bind
(:map global-map
("C-x t 1" . treemacs-delete-other-windows)
("C-x t t" . treemacs)
("C-x t B" . treemacs-bookmark)
("C-x t C-t" . treemacs-find-file)
("C-x t M-t" . treemacs-find-tag)))
(use-package treemacs-projectile
:after treemacs projectile
:ensure t)
(use-package treemacs-magit
:after treemacs magit
:ensure t)
(use-package eglot
:hook ((rust-mode . eglot-ensure)
(java-mode . eglot-ensure))
:config (progn
(add-to-list 'eglot-server-programs `(java-mode . ("jdtls")))
(add-to-list 'eglot-server-programs `(rust-mode . ("rust-analyzer"))))
:ensure t)
;; ;; set prefix for lsp-command-keymap (few alternatives - "C-l", "C-c l")
;; (setq lsp-keymap-prefix "C-c l")
;; (use-package lsp-mode
;; :hook (;; replace XXX-mode with concrete major-mode(e. g. python-mode)
;; (rust-mode . lsp)
;; (java-mode . lsp)
;; (python-mode . lsp)
;; (typescript-mode . lsp)
;; )
;; :config (progn
;; (setq lsp-enable-snippet nil))
;; :bind (:map lsp-mode-map (
;; ("M-." . xref-find-definitions)
;; ("M-," . xref-pop-marker-stack))
;; )
;; :commands lsp)
;; ;; optionally
;; (use-package lsp-ui :commands lsp-ui-mode)
;; ;; if you are ivy user
;; (use-package lsp-ivy :commands lsp-ivy-workspace-symbol)
;; (use-package lsp-treemacs :commands lsp-treemacs-errors-list)
;; (use-package lsp-java
;; :config (progn
;; ;; (setq lsp-java-server-install-dir "/usr/share/java/jdtls")
;; ;; (setq lsp-java-server-install-dir "/home/sunng/.local/share/jdtls")
;; (setq lsp-java-jdt-download-url "https://download.eclipse.org/jdtls/milestones/1.7.0/jdt-language-server-1.7.0-202112161541.tar.gz")
;; (setq lsp-java-vmargs `("-Xmx512M" "-XX:+UseStringDeduplication"))
;; ))
;; ;; (use-package lsp-java)
;; ;; optionally if you want to use debugger
;; (use-package dap-mode)
;; ;; (use-package dap-LANGUAGE) to load the dap adapter for your language
(use-package tide
:ensure t
:after (typescript-mode company flycheck)
:hook ((typescript-mode . tide-setup)
(typescript-mode . tide-hl-identifier-mode)
(before-save . tide-format-before-save)))
(use-package crux
:bind
(("C-k" . crux-smart-kill-line)
("C-c D" . crux-delete-file-and-buffer)
("C-c M-d" . crux-duplicate-and-comment-current-line-or-region)
("C-c r" . crux-rename-file-and-buffer)
("C-c I" . crux-find-user-init-file)
))
(use-package all-the-icons-ivy-rich
:ensure t
:init (all-the-icons-ivy-rich-mode 1))
(use-package ivy-rich
:ensure t
:init (ivy-rich-mode 1))
;; (use-package selectrum
;; :init
;; (selectrum-mode +1)
;; :config
;; (selectrum-prescient-mode +1)
;; (prescient-persist-mode +1))
(use-package dtrt-indent
:init (dtrt-indent-global-mode 1))
;; (use-package pyim
;; :init (use-package pyim-basedict)
;; :config (progn
;; (pyim-basedict-enable)
;; (pyim-default-scheme 'quanpin)
;; (setq pyim-page-length 5)
;; (setq default-input-method "pyim"))
;; :bind (("s-SPC" . toggle-input-method)))
(use-package auth-source
:config (progn
(setq auth-sources '("~/.authinfo"))
(setq auth-source-debug 'trivia)))
(use-package restclient
:mode ("\\.http\\'" . restclient-mode))
(use-package devdocs
:config (global-set-key (kbd "C-h D") 'devdocs-lookup))
(add-hook 'prog-mode-hook 'linum-mode)
(add-hook 'text-mode-hook 'linum-mode)
(add-hook 'text-mode-hook 'turn-on-auto-fill)
(add-hook 'before-save-hook 'delete-trailing-whitespace)
(set-face-attribute 'default nil
:font "InputMono Light"
:height 120)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment