mirror of
https://github.com/pestctrl/emacs-config.git
synced 2026-02-16 08:14:15 +00:00
13 KiB
13 KiB
- lsp
- Yasnippets
- c++
- Projectile
- Slime mode
- rust
- golang
- python
- web stuff
- line-numbers
- Comment keys
- Various common files
- Setup convenient headers
- Copilot?
- llvm-lib
- treesit
- lua
- 0x0
lsp
(use-package lsp-mode
:after corfu
:commands lsp
:config
(setq lsp-lens-enable nil)
(setq lsp-enable-dap-auto-configure nil)
(setq read-process-output-max (* 1024 1024))
(setq lsp-completion-provider :none)
;; (defun corfu-lsp-setup ()
;; (setq-local completion-styles '(orderless)
;; completion-category-defaults nil))
;; (add-hook 'lsp-mode-hook #'corfu-lsp-setup)
)
(use-package lsp-ui
:after lsp-mode
:bind (:map lsp-mode-map
("M-." . #'lsp-ui-peek-find-definitions)
("M-?" . #'lsp-ui-peek-find-references)
;;("M-p" . #'lsp-ui-peek-jump-forward)
)
:hook (lsp-mode . lsp-ui-mode)
:config
(setq lsp-ui-flycheck-enable t)
(setq lsp-ui-flycheck-live-reporting t)
(setq lsp-ui-doc-show-with-cursor t))
(use-package dap-mode
:hook ((java-mode . dap-mode)
(java-mode . dap-ui-mode))
:bind (:map dap-mode-map
("C-c h" . #'dap-hydra)
("C-c b" . #'dap-breakpoint-toggle)
("C-c d r" . #'dap-java-debug)
("C-c d m" . #'dap-java-debug-test-class)
("C-c r t" . #'mvn-test)))
Yasnippets
(let ((fetcher (if (or noninteractive my-ec/at-ti) "github" "github-ssh")))
(quelpa `(yasnippet :repo "pestctrl/yasnippet" :branch "quit-undo-tree" :fetcher ,fetcher)))
(use-package java-snippets)
(add-hook 'lsp-mode-hook 'yas-minor-mode)
c++
(use-package lsp-mode
:custom
(lsp-completion-provider :none) ;; we use Corfu!
:init
(defun my/lsp-mode-setup-completion ()
(setf (alist-get 'styles (alist-get 'lsp-capf completion-category-defaults))
'(flex))) ;; Configure flex
:hook
(lsp-completion-mode . my/lsp-mode-setup-completion)
:config
(require 'my-nprocs)
(with-eval-after-load 'lsp-clangd
(add-to-list 'lsp-clients-clangd-args
(format "-j=%d"
(nprocs))))
(setq lsp-clangd-binary-path
(executable-find "clangd"))
(add-hook 'lsp-mode-hook
(lambda ()
(auto-highlight-symbol-mode -1)))
;; (setq lsp-disabled-clients nil)
;; (add-to-list 'lsp-disabled-clients '(c++-mode . ccls))
;; (add-to-list 'lsp-disabled-clients '(c-mode . ccls))
;; (add-to-list 'lsp-disabled-clients '(objc-mode . ccls))
)
(use-package ccls
:after lsp-mode
:hook
((c-mode c++-mode objc-mode) .
#'my/cpp-auto-lsp)
:init
(setq lsp-enable-file-watchers nil)
(defun my/cpp-auto-lsp ()
(let ((project-root (projectile-project-p)))
(when (and project-root
(file-readable-p (expand-file-name "compile_commands.json"
project-root))
;; (or (lsp-workspaces)
;; (y-or-n-p "Should I start LSP? "))
)
(when (string-match-p "llvm-project" project-root)
(lls/ensure-initialized))
(lsp))))
:config
(setq ccls-sem-highlight-method 'font-lock-mode)
(setq ccls-initialization-options
'(:index (:trackDependency 1 :threads 60)))
(with-eval-after-load 'doom-modeline
(advice-add #'lsp--progress-status
:filter-return
#'(lambda (result)
(when result
(concat (string-replace "%%" "%%%%" result) " ")))))
(when my-ec/at-ti
(add-to-list 'exec-path
"/db/sds/packagse2/ccls-master")
(setq ccls-executable "/db/sds/packages2/ccls-master/ccls")))
(use-package tree-sitter)
(use-package tree-sitter-langs)
;; (when (and (boundp 'treesit-available-p)
;; (treesit-available-p))
;; (require 'treesit)
;; (when (treesit-ready-p 'cpp)
;; (require 'c-ts-mode)
;; (push '(c++-mode . c++-ts-mode) major-mode-remap-alist)))
Projectile
(use-package projectile
:init
(progn
(setq projectile-enable-caching t)
(setq projectile-git-submodule-command nil)
(setq projectile-completion-system 'default)
;; (setq counsel-projectile-switch-project-action 'projectile-vc)
(setq projectile-switch-project-action 'projectile-dired)
(setq projectile-require-project-root t)
(setq projectile-indexing-method 'hybrid)
(setq projectile-auto-update-cache nil)
(if (and (not (daemonp))
(null window-system))
(global-set-key (kbd "C-c M-[ emacs-C-.") 'projectile-command-map)
(global-set-key (kbd "C-c C-.") 'projectile-command-map)
(global-set-key (kbd "C-c M-[ emacs-C-.") 'projectile-command-map)))
:config
(projectile-mode)
(add-to-list 'projectile-globally-ignored-directories
".ccls")
(when (and (null window-system)
(not (daemonp)))
(with-eval-after-load 'cc-mode
(define-key c++-mode-map (kbd "C-c .") nil)
(define-key c++-mode-map (kbd "C-c . .") #'c-set-style)
(define-key org-mode-map (kbd "C-c .") nil)
(define-key org-mode-map (kbd "C-c . .") #'org-time-stamp)))
;; Provide my own projectile-compile-project which uses
;; cca/projectile-compilation-dir instead of projectile-compilation-dir.
(defvar cca/projectile-compilation-hash (make-hash-table :test 'equal)
"Has of project roots to compilation directories")
(defun cca/projectile-get-compilation-dir (key_dir)
"Get the compilation directory associated with the specified root directory"
(gethash key_dir cca/projectile-compilation-hash))
(defun cca/projectile-set-compilation-dir (key_dir value)
"Set the compilation directory for the specified root directory"
(puthash key_dir value cca/projectile-compilation-hash))
(defun cca/projectile-compilation-dir()
"Prompts the user for a directory relative to the project root
and returns the absolute path. It also stores the relative path
from the current project root into projectile-compilation-dir."
(let* ((root (projectile-project-root))
(base-compilation-dir (or (cca/projectile-get-compilation-dir root) root))
(full-compilation-dir (expand-file-name
(read-directory-name "Build directory: " base-compilation-dir))))
(setq projectile-project-compilation-dir (file-relative-name full-compilation-dir root))
(cca/projectile-set-compilation-dir root full-compilation-dir)))
(defun projectile-compile-project (arg)
"Run project compilation command.
Normally you'll be prompted for a compilation command, unless
variable `compilation-read-command'. You can force the prompt
with a prefix ARG."
(interactive "P")
(let ((command (projectile-compilation-command (cca/projectile-compilation-dir))))
(projectile--run-project-cmd command projectile-compilation-cmd-map
:show-prompt arg
:prompt-prefix "Compile command: "
:save-buffers t))))
Slime mode
(use-package slime
:commands slime slime-switch-lisps
:hook ((inferior-lisp-mode . inferior-slime-mode))
:config
(setq inferior-lisp-program (executable-find "sbcl"))
(defun slime-switch-lisps (lisp)
(interactive (list (completing-read "Which lisp? "
'("sbcl" "ecl" "cmucl" "clozure-cl"))))
(setq inferior-lisp-program lisp))
(let ((clhs-file "~/quicklisp/clhs-use-local.el"))
(if (file-exists-p clhs-file)
(load-file clhs-file)
(warn "clhs not installed. Please install")))
(define-key slime-prefix-map (kbd "C-l") #'slime-load-file)
(define-key slime-prefix-map (kbd "C-S-l") #'slime-load-system))
(use-package slime-company
:after slime company
:config
(slime-setup '(slime-fancy slime-asdf slime-company)))
rust
(use-package cargo)
(use-package rust-mode)
;; For some reason, rustic is causing weird dialogue issues on
;; puppet's computer.
(when (not my/puppet-p)
(use-package rustic)
(setq rustic-use-rust-save-some-buffers nil))
golang
(use-package go-mode
:hook (go-mode . (lambda ()
(add-hook 'before-save-hook 'gofmt-before-save nil t)
(setq indent-tabs-mode nil)))
:config
;; This is for lsp to work
(add-to-list 'exec-path "~/go/bin/"))
python
(use-package elpy)
;; (elpy-enable)
(use-package ein)
(add-to-list 'exec-path
"/home/benson/anaconda3/bin/" t)
web stuff
(use-package web-mode
:commands web-mode
:init
(add-to-list 'auto-mode-alist '("\\.phtml\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.tpl\\.php\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.[agj]sp\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.as[cp]x\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.erb\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.mustache\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.djhtml\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.cshtml\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.html?\\'" . web-mode))
:config
(setq web-mode-auto-close-style 2))
(use-package js2-mode
:commands js2-mode
:init
(add-to-list 'auto-mode-alist '("\\.js$" . js2-mode)))
line-numbers
(defun toggle-line-numbers ()
(interactive)
(if (not display-line-numbers-mode)
(display-line-numbers-mode 1)
(display-line-numbers-mode -1)
(setq display-line-numbers-type
(if (eq display-line-numbers-type t)
'relative
t))
(display-line-numbers-mode 1)))
Comment keys
(define-prefix-command '*comment-map*)
(require 'work-commentor)
(define-key *comment-map* (kbd "b") #'my/banner-comment)
(define-key *comment-map* (kbd "B") #'my/banner-select-style)
(define-key *comment-map* (kbd "/") #'comment-region)
(define-key *comment-map* (kbd "\\") #'uncomment-region)
(define-key *root-map* (kbd "/") '*comment-map*)
Various common files
(use-package csv-mode
:commands csv-mode
:init
(add-to-list 'auto-mode-alist
'("\\.csv$" . csv-mode)))
(use-package yaml-mode
:commands yaml-mode
:init
(add-to-list 'auto-mode-alist
'("\\.yaml$" . yaml-mode)
'("\\.yml$" . yaml-mode)))
Setup convenient headers
(setq auto-insert-alist
'(((emacs-lisp-mode . "Emacs lisp mode") nil
";;; " (file-name-nondirectory buffer-file-name) " --- " _ " -*- lexical-binding: t -*-\n\n"
";; Copyright (C) " (format-time-string "%Y") " Benson Chu\n\n"
";; Author: Benson Chu <bensonchu457@gmail.com>\n"
";; Created: " (format-time-string "[%Y-%m-%d %H:%M]") "\n\n"
";; This file is not part of GNU Emacs\n\n"
";; This program is free software: you can redistribute it and/or modify\n"
";; it under the terms of the GNU General Public License as published by\n"
";; the Free Software Foundation, either version 3 of the License, or\n"
";; (at your option) any later version.\n\n"
";; This program is distributed in the hope that it will be useful,\n"
";; but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
";; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
";; GNU General Public License for more details.\n\n"
";; You should have received a copy of the GNU General Public License\n"
";; along with this program. If not, see <https://www.gnu.org/licenses/>.\n\n"
";;; Commentary:\n\n"
";;; Code:\n\n"
"(provide '" (file-name-sans-extension (file-name-nondirectory buffer-file-name)) ")\n"
";;; " (file-name-nondirectory buffer-file-name) " ends here\n")
((lisp-mode . "Common Lisp") nil
"(defpackage :" (file-name-sans-extension (file-name-nondirectory buffer-file-name)) "\n"
" (:use :cl :alexandria)\n"
" (:export))\n\n"
"(in-package :" (file-name-sans-extension (file-name-nondirectory buffer-file-name)) ")")))
(auto-insert-mode)
Copilot?
(quelpa '(copilot :fetcher "github" :repo "zerolfx/copilot.el" :files ("dist" "*.el")))
;; Run copilot-login
(add-hook 'prog-mode-mook 'copilot-mode)
llvm-lib
(require 'llvm-lib)
(define-key *root-map* (kbd "C-w") '*llvm-map*)
treesit
;; (setq treesit-language-source-alist '())
(setq treesit-font-lock-level 5)
lua
(use-package lua-mode)
0x0
(use-package 0x0)