515 lines
15 KiB
Plaintext
515 lines
15 KiB
Plaintext
(setq custom-file "~/.emacs.custom.el")
|
|
(package-initialize)
|
|
|
|
(add-to-list 'load-path "~/.emacs.local/")
|
|
|
|
(load "~/.emacs.rc/rc.el")
|
|
|
|
(load "~/.emacs.rc/misc-rc.el")
|
|
|
|
;;; Appearance
|
|
|
|
(add-to-list 'default-frame-alist `(font . "Iosevka-12"))
|
|
|
|
(tool-bar-mode 0)
|
|
(menu-bar-mode 0)
|
|
(scroll-bar-mode 0)
|
|
(column-number-mode 1)
|
|
(show-paren-mode 1)
|
|
|
|
(rc/require-theme 'gruber-darker)
|
|
;; (rc/require-theme 'zenburn)
|
|
;; (load-theme 'adwaita t)
|
|
|
|
(rc/require 'all-the-icons 'all-the-icons-dired)
|
|
|
|
|
|
(eval-after-load 'zenburn
|
|
(set-face-attribute 'line-number nil :inherit 'default))
|
|
|
|
(defun toggle-window-split ()
|
|
(interactive)
|
|
(if (= (count-windows) 2)
|
|
(let* ((this-win-buffer (window-buffer))
|
|
(next-win-buffer (window-buffer (next-window)))
|
|
(this-win-edges (window-edges (selected-window)))
|
|
(next-win-edges (window-edges (next-window)))
|
|
(this-win-2nd (not (and (<= (car this-win-edges)
|
|
(car next-win-edges))
|
|
(<= (cadr this-win-edges)
|
|
(cadr next-win-edges)))))
|
|
(splitter
|
|
(if (= (car this-win-edges)
|
|
(car (window-edges (next-window))))
|
|
'split-window-horizontally
|
|
'split-window-vertically)))
|
|
(delete-other-windows)
|
|
(let ((first-win (selected-window)))
|
|
(funcall splitter)
|
|
(if this-win-2nd (other-window 1))
|
|
(set-window-buffer (selected-window) this-win-buffer)
|
|
(set-window-buffer (next-window) next-win-buffer)
|
|
(select-window first-win)
|
|
(if this-win-2nd (other-window 1))))))
|
|
|
|
(global-set-key (kbd "C-t") 'toggle-window-split)
|
|
(global-set-key (kbd "C-<tab>") 'next-window-any-frame)
|
|
(global-set-key (kbd "C-<iso-lefttab>") 'previous-window-any-frame)
|
|
|
|
;;; ido
|
|
(rc/require 'smex 'ido-completing-read+)
|
|
|
|
(require 'ido-completing-read+)
|
|
|
|
(ido-mode 1)
|
|
(ido-everywhere 1)
|
|
(ido-ubiquitous-mode 1)
|
|
(setq ido-auto-merge-work-directories-length -1)
|
|
|
|
(global-set-key (kbd "M-x") 'smex)
|
|
(global-set-key (kbd "C-c C-c M-x") 'execute-extended-command)
|
|
|
|
(setq compile-command "")
|
|
|
|
;;; comment
|
|
|
|
(rc/require 'comment-dwim-2)
|
|
|
|
(global-set-key (kbd "C-;") 'comment-dwim-2)
|
|
|
|
;;; c-mode
|
|
(setq-default c-basic-offset 4
|
|
c-default-style '((java-mode . "java")
|
|
(awk-mode . "awk")
|
|
(other . "bsd")))
|
|
|
|
(add-hook 'c-mode-hook (lambda ()
|
|
(interactive)
|
|
(c-toggle-comment-style -1)))
|
|
|
|
;;; Paredit
|
|
(rc/require 'paredit)
|
|
|
|
(defun rc/turn-on-paredit ()
|
|
(interactive)
|
|
(paredit-mode 1))
|
|
|
|
(add-hook 'emacs-lisp-mode-hook 'rc/turn-on-paredit)
|
|
(add-hook 'clojure-mode-hook 'rc/turn-on-paredit)
|
|
(add-hook 'lisp-mode-hook 'rc/turn-on-paredit)
|
|
(add-hook 'common-lisp-mode-hook 'rc/turn-on-paredit)
|
|
(add-hook 'scheme-mode-hook 'rc/turn-on-paredit)
|
|
(add-hook 'racket-mode-hook 'rc/turn-on-paredit)
|
|
|
|
;;; Emacs lisp
|
|
(add-hook 'emacs-lisp-mode-hook
|
|
'(lambda ()
|
|
(local-set-key (kbd "C-c C-j")
|
|
(quote eval-print-last-sexp))))
|
|
(add-to-list 'auto-mode-alist '("Cask" . emacs-lisp-mode))
|
|
|
|
;;; uxntal-mode
|
|
|
|
(rc/require 'uxntal-mode)
|
|
|
|
;;; Haskell mode
|
|
(rc/require 'haskell-mode)
|
|
|
|
(setq haskell-process-type 'cabal-new-repl)
|
|
(setq haskell-process-log t)
|
|
|
|
(add-hook 'haskell-mode-hook 'haskell-indent-mode)
|
|
(add-hook 'haskell-mode-hook 'interactive-haskell-mode)
|
|
(add-hook 'haskell-mode-hook 'haskell-doc-mode)
|
|
|
|
(require 'fasm-mode)
|
|
(add-to-list 'auto-mode-alist '("\\.asm\\'" . fasm-mode))
|
|
|
|
(require 'llvm-mode)
|
|
(add-to-list 'auto-mode-alist '("\\.ll\\'" . llvm-mode))
|
|
|
|
(require 'simpc-mode)
|
|
;; (add-to-list 'auto-mode-alist '("\\.[hc]\\(pp\\)?\\'" . simpc-mode))
|
|
|
|
(setq path-to-ctags "/usr/bin/ctags")
|
|
(defun create-tags (dir-name)
|
|
"Create tags file."
|
|
(interactive "Directory: ")
|
|
(shell-command
|
|
(format "%s -f TAGS -e -R %s" path-to-ctags (directory-file-name dir-name)))
|
|
)
|
|
|
|
(global-set-key (kbd "M-;") 'xref-find-definitions)
|
|
|
|
(rc/require 'ess)
|
|
(rc/require 'polymode)
|
|
(rc/require 'poly-R)
|
|
|
|
;;; Whitespace mode
|
|
(defun rc/set-up-whitespace-handling ()
|
|
(interactive)
|
|
(whitespace-mode 0)
|
|
(add-to-list 'write-file-functions 'delete-trailing-whitespace))
|
|
|
|
(add-hook 'tuareg-mode-hook 'rc/set-up-whitespace-handling)
|
|
(add-hook 'c++-mode-hook 'rc/set-up-whitespace-handling)
|
|
(add-hook 'c-mode-hook 'rc/set-up-whitespace-handling)
|
|
(add-hook 'simpc-mode-hook 'rc/set-up-whitespace-handling)
|
|
(add-hook 'emacs-lisp-mode 'rc/set-up-whitespace-handling)
|
|
(add-hook 'java-mode-hook 'rc/set-up-whitespace-handling)
|
|
(add-hook 'lua-mode-hook 'rc/set-up-whitespace-handling)
|
|
(add-hook 'rust-mode-hook 'rc/set-up-whitespace-handling)
|
|
(add-hook 'scala-mode-hook 'rc/set-up-whitespace-handling)
|
|
(add-hook 'markdown-mode-hook 'rc/set-up-whitespace-handling)
|
|
(add-hook 'haskell-mode-hook 'rc/set-up-whitespace-handling)
|
|
(add-hook 'python-mode-hook 'rc/set-up-whitespace-handling)
|
|
(add-hook 'erlang-mode-hook 'rc/set-up-whitespace-handling)
|
|
(add-hook 'asm-mode-hook 'rc/set-up-whitespace-handling)
|
|
(add-hook 'fasm-mode-hook 'rc/set-up-whitespace-handling)
|
|
(add-hook 'go-mode-hook 'rc/set-up-whitespace-handling)
|
|
(add-hook 'nim-mode-hook 'rc/set-up-whitespace-handling)
|
|
(add-hook 'yaml-mode-hook 'rc/set-up-whitespace-handling)
|
|
(add-hook 'porth-mode-hook 'rc/set-up-whitespace-handling)
|
|
|
|
;;; display-line-numbers-mode
|
|
(when (version<= "26.0.50" emacs-version)
|
|
(global-display-line-numbers-mode))
|
|
(setq display-line-numbers-type 'relative)
|
|
|
|
;;; magit
|
|
;; magit requres this lib, but it is not installed automatically on
|
|
;; Windows.
|
|
(rc/require 'cl-lib)
|
|
(rc/require 'magit)
|
|
|
|
(setq magit-auto-revert-mode nil)
|
|
|
|
(global-set-key (kbd "C-c m s") 'magit-status)
|
|
(global-set-key (kbd "C-c m l") 'magit-log)
|
|
|
|
;;; multiple cursors
|
|
(rc/require 'multiple-cursors)
|
|
|
|
(global-set-key (kbd "C-S-c C-S-c") 'mc/edit-lines)
|
|
(global-set-key (kbd "C-S-n") 'mc/mark-next-like-this)
|
|
(global-set-key (kbd "C-S-p") 'mc/mark-previous-like-this)
|
|
(global-set-key (kbd "C-c C-<") 'mc/mark-all-like-this)
|
|
(global-set-key (kbd "C-!") 'mc/skip-to-next-like-this)
|
|
(global-set-key (kbd "C-:") 'mc/skip-to-previous-like-this)
|
|
|
|
;;; markdown
|
|
(rc/require 'markdown-mode 'impatient-mode 'simple-httpd)
|
|
(add-to-list 'auto-mode-alist '("\\.md\\'" . gfm-mode))
|
|
(setq markdown-command "pandoc -t html5")
|
|
|
|
(setq httpd-port 7070)
|
|
(setq httpd-host (system-name))
|
|
|
|
(defun github-markdown-filter (buffer)
|
|
(princ
|
|
(with-temp-buffer
|
|
(let ((tmp (buffer-name)))
|
|
(set-buffer buffer)
|
|
(set-buffer (markdown tmp))
|
|
(format "<!DOCTYPE html><html><title>Markdown preview</title><link rel=\"stylesheet\" href = \"https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/3.0.1/github-markdown.min.css\"/>
|
|
<body><article class=\"markdown-body\" style=\"box-sizing: border-box;min-width: 200px;max-width: 980px;margin: 0 auto;padding: 45px;\">%s</article></body></html>" (buffer-string))))
|
|
(current-buffer)))
|
|
|
|
(defun github-markdown-preview ()
|
|
"Preview markdown with github style"
|
|
(interactive)
|
|
(unless (process-status "httpd")
|
|
(httpd-start))
|
|
(impatient-mode)
|
|
(imp-set-user-filter 'github-markdown-filter)
|
|
(imp-visit-buffer))
|
|
|
|
;;; dired
|
|
(require 'dired-x)
|
|
(setq dired-omit-files
|
|
(concat dired-omit-files "\\|^\\..+$"))
|
|
(setq-default dired-dwim-target t)
|
|
(setq dired-listing-switches "-alh")
|
|
(setq dired-mouse-drag-files t)
|
|
|
|
(global-set-key (kbd "C-d") 'dired)
|
|
|
|
;;; helmn
|
|
(rc/require 'helm)
|
|
|
|
(global-set-key (kbd "C-c h t") 'helm-cmd-t)
|
|
|
|
;;; yasnippet
|
|
(rc/require 'yasnippet)
|
|
|
|
(require 'yasnippet)
|
|
|
|
(setq yas/triggers-in-field nil)
|
|
(setq yas-snippet-dirs '("~/.emacs.snippets/"))
|
|
|
|
(yas-global-mode 1)
|
|
|
|
;;; word-wrap
|
|
(defun rc/enable-word-wrap ()
|
|
(interactive)
|
|
(toggle-word-wrap 1))
|
|
|
|
(add-hook 'markdown-mode-hook 'rc/enable-word-wrap)
|
|
|
|
;;; nxml
|
|
(add-to-list 'auto-mode-alist '("\\.html\\'" . nxml-mode))
|
|
(add-to-list 'auto-mode-alist '("\\.xsd\\'" . nxml-mode))
|
|
(add-to-list 'auto-mode-alist '("\\.ant\\'" . nxml-mode))
|
|
|
|
;;; Makefile
|
|
(add-to-list 'auto-mode-alist '("\\make.config\\'" . makefile-mode))
|
|
|
|
;;; tramp
|
|
;;; http://stackoverflow.com/questions/13794433/how-to-disable-autosave-for-tramp-buffers-in-emacs
|
|
(setq tramp-auto-save-directory "/tmp")
|
|
|
|
;;; powershell
|
|
(rc/require 'powershell)
|
|
(add-to-list 'auto-mode-alist '("\\.ps1\\'" . powershell-mode))
|
|
(add-to-list 'auto-mode-alist '("\\.psm1\\'" . powershell-mode))
|
|
|
|
;;; eldoc mode
|
|
(defun rc/turn-on-eldoc-mode ()
|
|
(interactive)
|
|
(eldoc-mode 1))
|
|
|
|
(add-hook 'emacs-lisp-mode-hook 'rc/turn-on-eldoc-mode)
|
|
|
|
;;; Company
|
|
(rc/require 'company)
|
|
(require 'company)
|
|
|
|
(global-company-mode)
|
|
|
|
;; (add-hook 'tuareg-mode-hook
|
|
;; (lambda ()
|
|
;; (interactive)
|
|
;; (company-mode 0)))
|
|
|
|
;;; Typescript
|
|
(rc/require 'typescript-mode)
|
|
(add-to-list 'auto-mode-alist '("\\.ts\\'" . typescript-mode))
|
|
(add-to-list 'auto-mode-alist '("\\.tsx\\'" . tsx-ts-mode))
|
|
|
|
(use-package treesit
|
|
:mode (("\\.tsx\\'" . tsx-ts-mode)
|
|
("\\.js\\'" . typescript-ts-mode)
|
|
("\\.mjs\\'" . typescript-ts-mode)
|
|
("\\.mts\\'" . typescript-ts-mode)
|
|
("\\.cjs\\'" . typescript-ts-mode)
|
|
("\\.ts\\'" . typescript-ts-mode)
|
|
("\\.jsx\\'" . tsx-ts-mode)
|
|
("\\.json\\'" . json-ts-mode)
|
|
("\\.Dockerfile\\'" . dockerfile-ts-mode)
|
|
("\\.prisma\\'" . prisma-ts-mode)
|
|
;; More modes defined here...
|
|
)
|
|
:preface
|
|
(defun os/setup-install-grammars ()
|
|
"Install Tree-sitter grammars if they are absent."
|
|
(interactive)
|
|
(dolist (grammar
|
|
'((css . ("https://github.com/tree-sitter/tree-sitter-css" "v0.20.0"))
|
|
(bash "https://github.com/tree-sitter/tree-sitter-bash")
|
|
(html . ("https://github.com/tree-sitter/tree-sitter-html" "v0.20.1"))
|
|
(javascript . ("https://github.com/tree-sitter/tree-sitter-javascript" "v0.21.2" "src"))
|
|
(json . ("https://github.com/tree-sitter/tree-sitter-json" "v0.20.2"))
|
|
(python . ("https://github.com/tree-sitter/tree-sitter-python" "v0.20.4"))
|
|
(go "https://github.com/tree-sitter/tree-sitter-go" "v0.20.0")
|
|
(markdown "https://github.com/ikatyang/tree-sitter-markdown")
|
|
(make "https://github.com/alemuller/tree-sitter-make")
|
|
(elisp "https://github.com/Wilfred/tree-sitter-elisp")
|
|
(cmake "https://github.com/uyha/tree-sitter-cmake")
|
|
(toml "https://github.com/tree-sitter/tree-sitter-toml")
|
|
(tsx . ("https://github.com/tree-sitter/tree-sitter-typescript" "v0.20.3" "tsx/src"))
|
|
(typescript . ("https://github.com/tree-sitter/tree-sitter-typescript" "v0.20.3" "typescript/src"))
|
|
(yaml . ("https://github.com/ikatyang/tree-sitter-yaml" "v0.5.0"))
|
|
(prisma "https://github.com/victorhqc/tree-sitter-prisma")))
|
|
(add-to-list 'treesit-language-source-alist grammar)
|
|
;; Only install `grammar' if we don't already have it
|
|
;; installed. However, if you want to *update* a grammar then
|
|
;; this obviously prevents that from happening.
|
|
(unless (treesit-language-available-p (car grammar))
|
|
(treesit-install-language-grammar (car grammar)))))
|
|
|
|
;; Optional, but recommended. Tree-sitter enabled major modes are
|
|
;; distinct from their ordinary counterparts.
|
|
;;
|
|
;; You can remap major modes with `major-mode-remap-alist'. Note
|
|
;; that this does *not* extend to hooks! Make sure you migrate them
|
|
;; also
|
|
(dolist (mapping
|
|
'((css-mode . css-ts-mode)
|
|
(typescript-mode . typescript-ts-mode)
|
|
(js-mode . typescript-ts-mode)
|
|
(js2-mode . typescript-ts-mode)
|
|
(css-mode . css-ts-mode)
|
|
(json-mode . json-ts-mode)
|
|
(js-json-mode . json-ts-mode)))
|
|
(add-to-list 'major-mode-remap-alist mapping))
|
|
:config
|
|
(os/setup-install-grammars))
|
|
|
|
;;; Tide
|
|
(rc/require 'tide)
|
|
|
|
(defun rc/turn-on-tide-and-flycheck () ;Flycheck is a dependency of tide
|
|
(interactive)
|
|
(tide-setup)
|
|
(flycheck-mode 1))
|
|
|
|
(add-hook 'typescript-mode-hook 'rc/turn-on-tide-and-flycheck)
|
|
|
|
;;; Proof general
|
|
(rc/require 'proof-general)
|
|
(add-hook 'coq-mode-hook
|
|
'(lambda ()
|
|
(local-set-key (kbd "C-c C-q C-n")
|
|
(quote proof-assert-until-point-interactive))))
|
|
|
|
;;; LaTeX mode
|
|
(add-hook 'tex-mode-hook
|
|
(lambda ()
|
|
(interactive)
|
|
(add-to-list 'tex-verbatim-environments "code")))
|
|
|
|
(setq font-latex-fontify-sectioning 'color)
|
|
|
|
;;; Move Text
|
|
(rc/require 'move-text)
|
|
(global-set-key (kbd "M-p") 'move-text-up)
|
|
(global-set-key (kbd "M-n") 'move-text-down)
|
|
|
|
;;; Ebisp
|
|
(add-to-list 'auto-mode-alist '("\\.ebi\\'" . lisp-mode))
|
|
|
|
;;; Go
|
|
(rc/require 'go-mode)
|
|
;(add-to-list 'compilation-error-regexp-alist 'gotest)
|
|
;(add-to-list 'compilation-error-regexp-alist-alist '(gotest "^ \\(\\([^:\n]+\\):\\([0-9]+\\)\\)" 2 3 nil nil 1))
|
|
;(add-to-list 'compilation-error-regexp-alist 'gotraceback)
|
|
;(add-to-list 'compilation-error-regexp-alist-alist '(gotraceback "^\t\\(\\([^\n\t]+\\):\\([0-9]+\\)\\)\\( \\+0x[0-9a-f]+\\)?$" 2 3 nil (nil . 4) 1))
|
|
|
|
;;; OCaml
|
|
(rc/require 'tuareg)
|
|
|
|
;;; ASM
|
|
(defun my-asm-mode-hook ()
|
|
(local-unset-key (vector asm-comment-char))
|
|
(setq tab-always-indent (default-value 'tab-always-indent))
|
|
(setq comment-start "//"))
|
|
|
|
(add-hook 'asm-mode-hook #'my-asm-mode-hook)
|
|
|
|
;;; Clang format
|
|
(rc/require 'clang-format)
|
|
|
|
(global-set-key (kbd "C-o") 'clang-format-buffer)
|
|
|
|
;;; Lsp-mode
|
|
(rc/require 'lsp-mode
|
|
'lsp-treemacs
|
|
'helm-lsp
|
|
'projectile
|
|
'hydra
|
|
'flycheck
|
|
'company
|
|
'avy
|
|
'which-key
|
|
'helm-xref)
|
|
|
|
(which-key-mode)
|
|
(use-package lsp-mode
|
|
:ensure t
|
|
:hook ((c-mode
|
|
c++-mode
|
|
python-mode
|
|
tsx-ts-mode
|
|
typescript-ts-mode
|
|
))
|
|
:custom
|
|
(lsp-keymap-prefix "s-i")
|
|
(lsp-keep-workspace-alive nil)
|
|
(lsp-enable-xref t)
|
|
(lsp-enable-on-type-formatting nil)
|
|
)
|
|
|
|
;;; zoxide
|
|
(rc/require 'zoxide)
|
|
(add-hook 'dired-after-readin-hook 'zoxide-add)
|
|
|
|
(setq gc-cons-threshold (* 100 1024 1024)
|
|
read-process-output-max (* 1024 1024)
|
|
treemacs-space-between-root-nodes nil
|
|
company-idle-delay 0.5
|
|
company-minimum-prefix-length 1
|
|
lsp-idle-delay 0.1)
|
|
|
|
(with-eval-after-load 'lsp-mode
|
|
(add-hook 'lsp-mode-hook #'lsp-enable-which-key-integration)
|
|
(yas-global-mode))
|
|
|
|
;;; Packages that don't require configuration
|
|
(rc/require
|
|
'scala-mode
|
|
'd-mode
|
|
'yaml-mode
|
|
'glsl-mode
|
|
'lua-mode
|
|
'less-css-mode
|
|
'graphviz-dot-mode
|
|
'clojure-mode
|
|
'cmake-mode
|
|
'rust-mode
|
|
'csharp-mode
|
|
'nim-mode
|
|
'jinja2-mode
|
|
'purescript-mode
|
|
'nix-mode
|
|
'dockerfile-mode
|
|
'toml-mode
|
|
'nginx-mode
|
|
'kotlin-mode
|
|
'php-mode
|
|
'racket-mode
|
|
'qml-mode
|
|
'ag
|
|
'elpy
|
|
'typescript-mode
|
|
'rfc-mode
|
|
'sml-mode
|
|
)
|
|
|
|
(defun astyle-buffer (&optional justify)
|
|
(interactive)
|
|
(let ((saved-line-number (line-number-at-pos)))
|
|
(shell-command-on-region
|
|
(point-min)
|
|
(point-max)
|
|
"astyle --style=kr"
|
|
nil
|
|
t)
|
|
(goto-line saved-line-number)))
|
|
|
|
(add-hook 'simpc-mode-hook
|
|
(lambda ()
|
|
(interactive)
|
|
(setq-local fill-paragraph-function 'astyle-buffer)))
|
|
|
|
(require 'compile)
|
|
|
|
;; pascalik.pas(24,44) Error: Can't evaluate constant expression
|
|
|
|
compilation-error-regexp-alist-alist
|
|
|
|
(add-to-list 'compilation-error-regexp-alist
|
|
'("\\([a-zA-Z0-9\\.]+\\)(\\([0-9]+\\)\\(,\\([0-9]+\\)\\)?) \\(Warning:\\)?"
|
|
1 2 (4) (5)))
|
|
|
|
(load-file custom-file)
|