Created
April 30, 2022 13:04
-
-
Save sunng87/7b37c78f19f6f7b964a7a2203236e1f5 to your computer and use it in GitHub Desktop.
My emacs configuration
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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://[email protected]/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