From fd229ecd768ea39f4c8ddafd869d979ded343f1e Mon Sep 17 00:00:00 2001 From: materus Date: Fri, 2 May 2025 19:12:00 +0200 Subject: [PATCH] Update Emacs Config --- .../host/materusPC/home/materus/default.nix | 2 +- .../profile/home/editor/emacs/default.nix | 217 +--- .../config/emacs/EMACS-CONFIG.org | 1089 ++++++++++++----- extraFiles/config/emacs/early-init.el | 39 +- .../config/emacs/emacs-materus-config.org | 608 --------- .../config/emacs/etc/materus/emacs-config.el | 362 ------ extraFiles/config/emacs/init.el | 562 ++++++++- 7 files changed, 1382 insertions(+), 1497 deletions(-) rename EMACS-CONFIG.org => extraFiles/config/emacs/EMACS-CONFIG.org (50%) delete mode 100644 extraFiles/config/emacs/emacs-materus-config.org delete mode 100644 extraFiles/config/emacs/etc/materus/emacs-config.el diff --git a/configurations/host/materusPC/home/materus/default.nix b/configurations/host/materusPC/home/materus/default.nix index 821b62a..1462705 100644 --- a/configurations/host/materusPC/home/materus/default.nix +++ b/configurations/host/materusPC/home/materus/default.nix @@ -17,7 +17,7 @@ enableTerminal = lib.mkDefault true; enableTerminalExtra = lib.mkDefault true; enableNixDevel = lib.mkDefault true; - editor.emacs.enable = false; + editor.emacs.enable = true; editor.code.fhs.enable = true; editor.code.fhs.packages = (ps: with ps; let llvmpkgs = llvmPackages_18; in [ llvmpkgs.clang diff --git a/configurations/profile/home/editor/emacs/default.nix b/configurations/profile/home/editor/emacs/default.nix index c487090..e7916cb 100644 --- a/configurations/profile/home/editor/emacs/default.nix +++ b/configurations/profile/home/editor/emacs/default.nix @@ -3,30 +3,48 @@ lib, pkgs, materusArg, - materusCfg, ... -}: -let +}: let emacs-pkg = pkgs.emacs; - materus-config = - e: + materus-nix = e: e.trivialBuild { - pname = "materus-config"; - src = pkgs.writeText "materus-config.el" '' + pname = "materus-nix"; + src = pkgs.writeText "materus-nix.el" '' (when (file-exists-p "${config.programs.emacs.package}/opt/emacs/buildtime") (setq emacs-build-time (decode-time (seconds-to-time (string-to-number (with-temp-buffer (insert-file-contents "${config.programs.emacs.package}/opt/emacs/buildtime") (buffer-string))))))) - (provide 'materus-config) + + + + + (defvar lsp-java-configuration-runtimes nil) + (setq dap-lldb-debug-program '("${pkgs.llvmPackages.lldb}/bin/lldb-vscode")) + (setq lsp-java-configuration-runtimes '[(:name "JavaSE-1.8" + :path "${pkgs.jdk8}/lib/openjdk/") + (:name "JavaSE-17" + :path "${pkgs.jdk17}/lib/openjdk/") + (:name "JavaSE-21" + :path "${pkgs.jdk21}/lib/openjdk/" + :default t)]) + + (setq lsp-nix-nixd-nixos-options-expr (concat "(builtins.getFlake \"/etc/nixos\").nixosConfigurations." (system-name) ".options")) + (setenv "JAVA_HOME" "${pkgs.jdk21}/lib/openjdk") + (setenv "PATH" (concat "${emacsEnv}/bin:" (getenv "PATH"))) + (setq exec-path (append '("${emacsEnv}/bin") exec-path)) + + + (call-process-shell-command "${pkgs.xorg.xmodmap}/bin/xmodmap -e \"keycode 148 = Hyper_L\" -e \"remove Mod4 = Hyper_L\" -e \"add Mod3 = Hyper_L\" &" nil 0) + (call-process-shell-command "${pkgs.xorg.xmodmap}/bin/xmodmap -e \"keycode 66 = Hyper_L\" -e \"remove Mod4 = Hyper_L\" -e \"add Mod3 = Hyper_L\" &" nil 0) + + (provide 'materus-nix) ''; version = "1.0.0"; }; - configPath = "${materusArg.cfg.path}" + "/extraFiles/config/emacs/"; - packages = - epkgs: with epkgs; [ - (materus-config epkgs) + packages = epkgs: + with epkgs; [ treesit-grammars.with-all-grammars use-package elcord @@ -150,12 +168,18 @@ let emacsEnv = pkgs.buildEnv { name = "emacs-env"; paths = with pkgs; [ + jdk21 + luaformatter pandoc - (luajit.withPackages (p: [p.fennel p.lua-lsp])) + (luajit.withPackages (p: [ + p.fennel + p.lua-lsp + ])) fennel-ls fnlfmt - + sbcl + silver-searcher guile plantuml mermaid-cli @@ -176,7 +200,6 @@ let gdb materusArg.unstable.nixd jdt-language-server - jdk gradle fpc nodejs @@ -186,50 +209,12 @@ let }; cfg = config.materus.profile.editor.emacs; - - setNixInit = '' - (defvar lsp-java-configuration-runtimes nil) - (setq dap-lldb-debug-program '("${pkgs.llvmPackages.lldb}/bin/lldb-vscode")) - (setq lsp-java-configuration-runtimes '[(:name "JavaSE-1.8" - :path "${pkgs.jdk8}/lib/openjdk/") - (:name "JavaSE-17" - :path "${pkgs.jdk17}/lib/openjdk/") - (:name "JavaSE-21" - :path "${pkgs.jdk21}/lib/openjdk/" - :default t)]) - (setq lsp-nix-nixd-nixos-options-expr (concat "(builtins.getFlake \"/etc/nixos\").nixosConfigurations." (system-name) ".options")) - (setenv "PATH" (concat (getenv "PATH") ":${emacsEnv}/bin")) - (setq exec-path (append exec-path '("${emacsEnv}/bin"))) - (call-process-shell-command "${pkgs.xorg.xmodmap}/bin/xmodmap -e \"keycode 148 = Hyper_L\" -e \"remove Mod4 = Hyper_L\" -e \"add Mod3 = Hyper_L\" &" nil 0) - (call-process-shell-command "${pkgs.xorg.xmodmap}/bin/xmodmap -e \"keycode 66 = Hyper_L\" -e \"remove Mod4 = Hyper_L\" -e \"add Mod3 = Hyper_L\" &" nil 0) - ''; -in -{ - options.materus.profile.editor.emacs.enable = materusArg.pkgs.lib.mkBoolOpt false "Enable emacs with materus cfg"; +in { + options.materus.profile.editor.emacs.enable = + materusArg.pkgs.lib.mkBoolOpt false "Enable emacs with materus cfg"; config = lib.mkIf cfg.enable { - home.activation.emacsSetup = lib.hm.dag.entryAfter [ "linkGeneration" ] '' - mkdir -p ${config.xdg.configHome}/emacs/var/recovery - mkdir -p ${config.xdg.configHome}/emacs/etc/materus - mkdir -p ${config.xdg.configHome}/emacs/var/backups - ${pkgs.rsync}/bin/rsync -zr --no-times --chmod=744 "${configPath}" "${config.xdg.configHome}/emacs" - - - run ${config.programs.emacs.finalPackage}/bin/emacs -Q --batch \ - --eval '(setq warning-minimum-log-level :error)' \ - --eval '(setq package-user-dir (concat user-emacs-directory "var/elpa/" emacs-version "/" ))' \ - --eval '(setq package-gnupghome-dir (concat user-emacs-directory "var/elpa/gnupg/" ))' \ - --eval '(package-initialize)' \ - --eval '(byte-recompile-directory (concat user-emacs-directory "etc/materus/extra") 0 t)' \ - --eval '(byte-compile-file "${config.xdg.configHome}/emacs/early-init.el")' \ - --eval '(byte-compile-file "${config.xdg.configHome}/emacs/init.el")' \ - --eval '(byte-compile-file "${config.xdg.configHome}/emacs/etc/materus/nix-init.el")' \ - --eval '(byte-compile-file "${config.xdg.configHome}/emacs/etc/materus/emacs-config.el")' - ''; - - xdg.configFile = { - "emacs/etc/materus/nix-init.el".text = setNixInit; - }; + home.activation.emacsSetup = lib.hm.dag.entryAfter ["linkGeneration"] ''''; #Emacsclient with COLORTERM env variable, without it display in "-nw" client is broken xdg.desktopEntries.emacs = { @@ -274,6 +259,7 @@ in programs.emacs = { enable = true; + extraPackages = epkgs: [(materus-nix epkgs) epkgs.vterm epkgs.treesit-grammars.with-all-grammars]; package = lib.mkDefault ( (emacs-pkg.override { withSQLite3 = true; @@ -282,111 +268,24 @@ in #withXwidgets = true; withGTK3 = true; withAlsaLib = true; + #withGconf = true; withImageMagick = true; - }).overrideAttrs - ( - f: p: { - #Remove .desktop files, will use my own. Add file with buildtime in case of using elpaca - postInstall = - p.postInstall - + '' - rm -fr $out/share/applications/* - mkdir -p $out/opt/emacs - date +%s | tr -d '\n' > $out/opt/emacs/buildtime - ''; - } - ) + }) + .overrideAttrs + ( + f: p: { + #Remove .desktop files, will use my own. Add file with buildtime in case of using elpaca + postInstall = + p.postInstall + + '' + rm -fr $out/share/applications/* + mkdir -p $out/opt/emacs + date +%s | tr -d '\n' > $out/opt/emacs/buildtime + ''; + } + ) ); - extraPackages = - epkgs: - (packages ( - epkgs.overrideScope ( - ff: pp: { - #Build lsp-mode with plist support, need to set this in emacs too - - lsp-mode = ( - pp.lsp-mode.overrideAttrs ( - f: p: { - patches = [ ./lsp-mode.patch ]; - buildPhase = - '' - export LSP_USE_PLISTS=true - '' - + p.buildPhase; - } - ) - ); - lsp-java = ( - pp.lsp-java.overrideAttrs ( - f: p: { - buildPhase = - '' - export LSP_USE_PLISTS=true - '' - + p.buildPhase; - } - ) - ); - lsp-jedi = ( - pp.lsp-jedi.overrideAttrs ( - f: p: { - buildPhase = - '' - export LSP_USE_PLISTS=true - '' - + p.buildPhase; - } - ) - ); - lsp-haskell = ( - pp.lsp-haskell.overrideAttrs ( - f: p: { - buildPhase = - '' - export LSP_USE_PLISTS=true - '' - + p.buildPhase; - } - ) - ); - lsp-ui = ( - pp.lsp-ui.overrideAttrs ( - f: p: { - buildPhase = - '' - export LSP_USE_PLISTS=true - '' - + p.buildPhase; - } - ) - ); - lsp-treemacs = ( - pp.lsp-treemacs.overrideAttrs ( - f: p: { - buildPhase = - '' - export LSP_USE_PLISTS=true - '' - + p.buildPhase; - } - ) - ); - dap-mode = ( - pp.dap-mode.overrideAttrs ( - f: p: { - buildPhase = - '' - export LSP_USE_PLISTS=true - '' - + p.buildPhase; - } - ) - ); - } - ) - )); }; - }; } diff --git a/EMACS-CONFIG.org b/extraFiles/config/emacs/EMACS-CONFIG.org similarity index 50% rename from EMACS-CONFIG.org rename to extraFiles/config/emacs/EMACS-CONFIG.org index cba178a..2f36303 100644 --- a/EMACS-CONFIG.org +++ b/extraFiles/config/emacs/EMACS-CONFIG.org @@ -2,12 +2,76 @@ #+AUTHOR: materus #+DESCRIPTION: materus emacs configuration #+STARTUP: overview -#+PROPERTY: header-args :tangle (expand-file-name "init.el" user-emacs-directory) +#+PROPERTY: header-args :tangle no :noweb yes #+OPTIONS: \n:t #+auto_tangle: t +* Table of Contents :noexport:TOC_3: +- [[#early-init][Early Init]] +- [[#init-core][Init Core]] + - [[#prepare][Prepare]] + - [[#elpaca][Elpaca]] + - [[#functions][Functions]] + - [[#custom-file][Custom File]] + - [[#font--text][Font & Text]] + - [[#frame][Frame]] + - [[#mouse][Mouse]] +- [[#packages--settings][Packages & Settings]] + - [[#visual][Visual]] + - [[#theme][Theme]] + - [[#rainbow-mode][Rainbow mode]] + - [[#delimiters][Delimiters]] + - [[#modeline][Modeline]] + - [[#dashboard][Dashboard]] + - [[#highlight-indent-guides][Highlight Indent Guides]] + - [[#terminal][Terminal]] + - [[#eat][Eat]] + - [[#vterm][Vterm]] + - [[#navigation-and-completion][Navigation and Completion]] + - [[#helm][HELM]] + - [[#comapny][Comapny]] + - [[#dirvish][Dirvish]] + - [[#treemacs][Treemacs]] + - [[#programming][Programming]] + - [[#general][General]] + - [[#snippets][Snippets]] + - [[#cc][C/C++]] + - [[#java][Java]] + - [[#python][Python]] + - [[#nix][Nix]] + - [[#lisp--scheme][Lisp / Scheme]] + - [[#shell][Shell]] + - [[#version-control][Version Control]] + - [[#diff-highlight][Diff Highlight]] + - [[#magit][Magit]] + - [[#git-timemachine][Git Timemachine]] + - [[#notes--organization][Notes & Organization]] + - [[#org-mode][Org Mode]] + - [[#other--misc][Other & Misc]] + - [[#undo-tree][Undo-tree]] + - [[#which-key][which-key]] + - [[#projectile][projectile]] + - [[#perspective][Perspective]] + - [[#elcord][Elcord]] + - [[#drag-stuff][drag-stuff]] + - [[#popper][popper]] + - [[#visual-fill-column][visual-fill-column]] + - [[#so-long][so-long]] + - [[#vlf][vlf]] + - [[#crux][crux]] + - [[#no-littering][No Littering]] + - [[#libraries][Libraries]] + - [[#nerd-icons][Nerd Icons]] + - [[#svg-lib][SVG Lib]] + - [[#transient][Transient]] +- [[#keybindings][Keybindings]] +- [[#final-code][Final Code]] +- [[#links][Links]] +- [[#archive][Archive]] + - [[#minibuffer-orderless-vertico-marginalia-consult][minibuffer (orderless, vertico, marginalia, consult)]] + - [[#code-completion-cape-corfu][Code completion (Cape, corfu)]] * Early Init -#+begin_src emacs-lisp :tangle (expand-file-name "early-init.el" user-emacs-directory) +#+begin_src emacs-lisp :tangle (expand-file-name "early-init.el" user-emacs-directory) :noweb-ref early-init ;;; -*- lexical-binding: t; -*- ;;; VARIABLES @@ -100,18 +164,25 @@ #+end_src * Init Core -** TMP -#+begin_src emacs-lisp - ;;; -*- lexical-binding: t; -*- - +:PROPERTIES: +:header-args: :tangle no +:END: +** Prepare +#+begin_src emacs-lisp :noweb-ref init +;; Prepare + (require 'materus-nix nil t) + (require 'elec-pair) (when (not emacs-build-time) (print "WARN: emacs-build-time not set up, using current time") (setq emacs-build-time (decode-time (current-time)))) - (add-to-list 'load-path (concat user-emacs-directory "etc/materus/extra")) ; Extra load path for packages - (defvar electric-pair-inhibit-predicate nil) - + (add-to-list 'load-path (concat user-emacs-directory "etc/pkgs/")) ; Extra load path for packages + (setq read-process-output-max (* 1024 1024 3)) +#+END_src +** Elpaca +#+begin_src emacs-lisp :noweb-ref init-elpaca + ;; Elpaca Init (defvar elpaca-installer-version 0.11) (defvar elpaca-directory (expand-file-name "var/elpaca/" user-emacs-directory)) (defvar elpaca-builds-directory (expand-file-name (concat "builds/" emacs-version "/") elpaca-directory)) @@ -130,7 +201,7 @@ (when (<= emacs-major-version 28) (require 'subr-x)) (condition-case-unless-debug err (if-let* ((buffer (pop-to-buffer-same-window "*elpaca-bootstrap*")) - ((zerop (apply #'call-process `("git" nil ,buffer t "clone" + ((zerop (apply #'call-process `("git" nil ,buffer t "clone" ,@(when-let* ((depth (plist-get order :depth))) (list (format "--depth=%d" depth) "--no-single-branch")) ,(plist-get order :repo) ,repo)))) @@ -155,19 +226,485 @@ (elpaca-use-package-mode) (setq elpaca-use-package-by-default t)) +#+END_src +** Functions +#+begin_src emacs-lisp :noweb-ref init-functions + ;; Use package preffering built-in / nix packages + (defmacro materus/use-package (package &rest body) + (if (locate-library (symbol-name `,package)) + `(progn + (cl-pushnew (quote ,package) elpaca-ignored-dependencies) + (use-package ,package :ensure nil ,@body)) + `(use-package ,package ,@body))) + +#+END_src + +** Custom File +#+begin_src emacs-lisp :noweb-ref init-custom-file + ;; Custom File + (add-hook 'elpaca-after-init-hook (lambda () (load custom-file 'noerror))) +#+end_src + +** Font & Text +#+begin_src emacs-lisp :noweb-ref init-extra + ;; Font & Text init + (when (display-graphic-p) + (set-frame-font "Hack Nerd Font" nil t)) + (setq-default cursor-type '(bar . 2)) + (setq truncate-string-ellipsis "…") + (setq text-mode-ispell-word-completion nil) ; Disable ispell + (global-completion-preview-mode 1) + (electric-pair-mode 1) + (electric-indent-mode -1) +#+end_src - (use-package no-littering +** Frame +#+begin_src emacs-lisp :noweb-ref init-extra + ;; Frame Init + (when (daemonp) + (add-hook 'after-make-frame-functions + (lambda (frame) (when (= (length (frame-list)) 2) + (set-frame-parameter frame 'fullscreen 'maximized)) + (select-frame-set-input-focus frame) ))) + (global-tab-line-mode 1) + (setq window-divider-default-bottom-width 1) + (setq window-divider-default-right-width 1) + (window-divider-mode 1) + (tool-bar-mode -1) + (setq-default display-line-numbers-width 3) + (setq-default display-line-numbers-widen t) + + (defun startup-screen-advice (orig-fun &rest args) + (when (= (seq-count #'buffer-file-name (buffer-list)) 0) + (apply orig-fun args))) + (advice-add 'display-startup-screen :around #'startup-screen-advice) ; Hide startup screen if started with file +#+end_src +** Mouse +Setting up mouse +#+begin_src emacs-lisp :noweb-ref init-extra + ;; Mouse Init + (context-menu-mode 1) + (setq mouse-wheel-follow-mouse 't) + (setq scroll-step 1) + (setq mouse-drag-and-drop-region t) + (xterm-mouse-mode 1) + (pixel-scroll-precision-mode 1) + (setq-default pixel-scroll-precision-large-scroll-height 10.0) +#+end_src +* Packages & Settings +:PROPERTIES: +:header-args: :tangle no :noweb-ref packages +:END: +** Visual +*** Theme +#+begin_src emacs-lisp + (use-package dracula-theme :config + (if (daemonp) + (add-hook 'after-make-frame-functions + (lambda (frame) + (with-selected-frame frame (load-theme 'dracula t)))) + (load-theme 'dracula t))) + +#+end_src +*** Rainbow mode +#+begin_src emacs-lisp + (use-package rainbow-mode + :hook + ((org-mode . rainbow-mode) + (prog-mode . rainbow-mode))) +#+end_src +*** Delimiters +#+begin_src emacs-lisp + (use-package rainbow-delimiters + :hook + (prog-mode . rainbow-delimiters-mode) :config - (require 'recentf) - (setq package-quickstart-file - (concat user-emacs-directory "var/quickstart/package-quickstart-" emacs-version ".el" )) - (add-to-list 'recentf-exclude - (recentf-expand-file-name no-littering-var-directory)) - (add-to-list 'recentf-exclude - (recentf-expand-file-name no-littering-etc-directory))) - (use-package org + (set-face-attribute 'rainbow-delimiters-depth-1-face nil :foreground "#FFFFFF") + (set-face-attribute 'rainbow-delimiters-depth-2-face nil :foreground "#FFFF00") + (set-face-attribute 'rainbow-delimiters-depth-5-face nil :foreground "#6A5ACD") + (set-face-attribute 'rainbow-delimiters-unmatched-face nil :foreground "#FF0000")) + +#+end_src +*** Modeline +#+begin_src emacs-lisp + ;; (use-package doom-modeline + ;; :init (setq doom-modeline-support-imenu t) + ;; :hook (elpaca-after-init . doom-modeline-mode) + ;; :config + ;; (setq doom-modeline-icon t) + ;; (setq doom-modeline-project-detection 'auto) + ;; (setq doom-modeline-height 20) + ;; (setq doom-modeline-enable-word-count t) + ;; (setq doom-modeline-minor-modes t) + ;; (setq display-time-24hr-format t) + ;; (display-time-mode 1) + ;; (column-number-mode 1) + ;; (line-number-mode 1)) + + (use-package minions + :hook (elpaca-after-init . minions-mode)) +#+end_src +*** Dashboard +#+begin_src emacs-lisp + (use-package dashboard + :after (nerd-icons projectile) + :config + (setq dashboard-center-content t) + (setq dashboard-display-icons-p t) + (setq dashboard-icon-type 'nerd-icons) + (setq dashboard-projects-backend 'projectile) + (setq dashboard-items '((recents . 5) + (bookmarks . 5) + (projects . 5) + (agenda . 5) + (registers . 5))) + (when (or (daemonp) (< (length command-line-args) 2)) + (add-hook 'elpaca-after-init-hook #'dashboard-insert-startupify-lists) + (add-hook 'elpaca-after-init-hook #'dashboard-initialize) + (dashboard-setup-startup-hook))) + (when (daemonp) + (setq initial-buffer-choice (lambda () (get-buffer "*dashboard*")))) ; Show dashboard when emacs is running as daemon) + #+end_src +#+begin_src emacs-lisp :tangle no :noweb-ref keybindings + ;; Dashboard + (define-key dashboard-mode-map (kbd "C-r") #'dashboard-refresh-buffer) +#+end_src +*** Highlight Indent Guides +[[https://github.com/DarthFennec/highlight-indent-guides][highlight-indent-guides]] +#+begin_src emacs-lisp + (use-package highlight-indent-guides + :hook ((prog-mode . highlight-indent-guides-mode))) +#+end_src +** Terminal +*** Eat +#+begin_src emacs-lisp + (use-package eat) + +#+end_src +#+begin_src emacs-lisp :tangle no :noweb-ref keybindings + ;; Eat + (defvar cua--eat-semi-char-keymap (copy-keymap cua--cua-keys-keymap) "EAT semi-char mode CUA keymap") + (defvar cua--eat-char-keymap (copy-keymap cua--cua-keys-keymap) "EAT char mode CUA keymap") + + + (define-key cua--eat-semi-char-keymap (kbd "C-v") #'eat-yank) + (define-key cua--eat-char-keymap (kbd "C-S-v") #'eat-yank) + (define-key cua--eat-semi-char-keymap (kbd "C-c") #'copy-region-as-kill) + (define-key cua--eat-char-keymap (kbd "C-S-c") #'copy-region-as-kill) + (define-key eat-mode-map (kbd "C-") #'eat-self-input) + (define-key eat-mode-map (kbd "C-") #'eat-self-input) + + + (defun cua--eat-semi-char-override-keymap () + (setq-local cua--keymap-alist (copy-tree cua--keymap-alist)) + (setf (alist-get 'cua--ena-cua-keys-keymap cua--keymap-alist) cua--eat-semi-char-keymap)) + (defun cua--eat-char-override-keymap () + (setq-local cua--keymap-alist (copy-tree cua--keymap-alist)) + (setf (alist-get 'cua--ena-cua-keys-keymap cua--keymap-alist) cua--eat-char-keymap)) + + (advice-add 'eat-semi-char-mode :after #'cua--eat-semi-char-override-keymap) + (advice-add 'eat-char-mode :after #'cua--eat-char-override-keymap) + (add-hook 'eat-char-mode-hook #'cua--eat-char-override-keymap) + +#+end_src +*** Vterm +#+begin_src emacs-lisp +(materus/use-package vterm) +#+end_src +** Navigation and Completion +*** HELM +#+begin_src emacs-lisp + (use-package helm + :config + (setq helm-x-icons-provider 'nerd-icons) + (setq helm-move-to-line-cycle-in-source nil) + (helm-mode 1) + ) + (use-package helm-projectile + :after (helm projectile)) + (use-package helm-ag + :after (helm)) + (use-package helm-rg + :after (helm)) + (use-package helm-ls-git + :after (helm)) +#+end_src +#+begin_src emacs-lisp :tangle no :noweb-ref keybindings + ;; Helm + (global-set-key (kbd "M-x") 'helm-M-x) + (global-set-key (kbd "C-x r b") #'helm-filtered-bookmarks) + (global-set-key (kbd "C-x C-f") #'helm-find-files) + (global-set-key (kbd "C-x b") #'helm-mini) +#+end_src +*** Comapny +#+begin_src emacs-lisp + (use-package company + :hook + ((prog-mode . company-mode))) + (use-package slime-company + :if (executable-find "sbcl") + :after (company slime)) + +#+end_src +*** Dirvish +#+begin_src emacs-lisp + (use-package dirvish + :after (nerd-icons) + :config + (setq dired-mouse-drag-files t) + (dirvish-override-dired-mode 1) + (setq dirvish-attributes + '(vc-state + subtree-state + nerd-icons + collapse + git-msg + file-time + file-size))) + +#+end_src +*** Treemacs +#+begin_src emacs-lisp + (use-package treemacs) + (use-package treemacs-projectile + :after (projectile treemacs)) + (use-package treemacs-nerd-icons + :after (nerd-icons treemacs)) + (use-package treemacs-perspective + :after (treemacs)) + (use-package treemacs-mouse-interface + :after (treemacs) + :ensure nil) +#+end_src +#+begin_src emacs-lisp :tangle no :noweb-ref keybindings + ;; Treemacs + (define-key global-map (kbd "C-H-t") 'treemacs) +#+end_src +** Programming +*** General +**** Settings +#+begin_src emacs-lisp :noweb-ref init-extra + (add-to-list 'c-default-style '(awk-mode . "awk")) + (add-to-list 'c-default-style '(other . "bsd")) + + (setq-default tab-width 4) + (setq-default indent-tabs-mode nil) + (setq-default c-basic-offset 4) + (setq-default c-indent-level 4) + + (setq-default c-ts-mode-indent-offset 4) + (setq-default c-ts-mode-indent-style 'bsd) + + (setq-default c-hungry-delete-key t) + + + + (add-hook 'prog-mode-hook 'display-line-numbers-mode) + (add-hook 'prog-mode-hook 'electric-indent-local-mode) +#+end_src +**** LSP +#+begin_src emacs-lisp + (use-package lsp-ui + :after (lsp-mode)) + (use-package lsp-mode + ;; :custom + ;; (lsp-completion-provider :none) ;; we use Corfu! + :config + (setq lsp-keep-workspace-alive nil) + + + (defun lsp-booster--advice-json-parse (old-fn &rest args) + "Try to parse bytecode instead of json." + (or + (when (equal (following-char) ?#) + (let ((bytecode (read (current-buffer)))) + (when (byte-code-function-p bytecode) + (funcall bytecode)))) + (apply old-fn args))) + (advice-add (if (progn (require 'json) + (fboundp 'json-parse-buffer)) + 'json-parse-buffer + 'json-read) + :around + #'lsp-booster--advice-json-parse) + + (defun lsp-booster--advice-final-command (old-fn cmd &optional test?) + "Prepend emacs-lsp-booster command to lsp CMD." + (let ((orig-result (funcall old-fn cmd test?))) + (if (and (not test?) ; for check lsp-server-present? + (not (file-remote-p default-directory)) ; see lsp-resolve-final-command, it would add extra shell wrapper + lsp-use-plists + (not (functionp 'json-rpc-connection)) ; native json-rpc + (executable-find "emacs-lsp-booster")) + (progn + (when-let* ((command-from-exec-path (executable-find (car orig-result)))) ; resolve command from exec-path (in case not found in $PATH) + (setcar orig-result command-from-exec-path)) + (message "Using emacs-lsp-booster for %s!" orig-result) + (cons "emacs-lsp-booster" orig-result)) + orig-result))) + (advice-add 'lsp-resolve-final-command :around #'lsp-booster--advice-final-command)) + (use-package lsp-treemacs + :after (lsp-mode treemacs) + :config + (lsp-treemacs-sync-mode 1)) + + +#+end_src +**** Debug +#+begin_src emacs-lisp + (use-package dap-mode + :after (lsp-mode) + :config + (require 'dap-lldb) + (require 'dap-gdb-lldb) + (require 'dap-cpptools) + (setq dap-gdb-lldb-extension-version "0.27.0") + (dap-auto-configure-mode 1)) + +#+end_src +*** Snippets +#+begin_src emacs-lisp + (use-package yasnippet + :config + (yas-global-mode 1)) +#+end_src + +*** C/C++ +#+begin_src emacs-lisp + (use-package lsp-clangd + :ensure nil + :after (lsp-mode) + :config + (setq lsp-clients-clangd-args '("--fallback-style=microsoft")) + + (add-hook 'c-mode-hook 'lsp-deferred) + (add-hook 'c-mode-hook 'display-line-numbers-mode) + (add-hook 'c-ts-mode-hook 'lsp-deferred) + (add-hook 'c-ts-mode-hook 'display-line-numbers-mode) + + (add-hook 'c++-mode-hook 'lsp-deferred) + (add-hook 'c++-mode-hook 'display-line-numbers-mode) + (add-hook 'c++-ts-mode-hook 'lsp-deferred) + (add-hook 'c++-ts-mode-hook 'display-line-numbers-mode) + ;(when (treesit-language-available-p 'c) (push '(c-mode . c-ts-mode) major-mode-remap-alist)) + ;(when (treesit-language-available-p 'cpp) (push '(c++-mode . c++-ts-mode) major-mode-remap-alist)) + + (add-to-list 'c-default-style '(c-mode . "bsd")) + (add-to-list 'c-default-style '(c++-mode . "bsd")) + (add-to-list 'c-default-style '(c-ts-mode . "bsd")) + (add-to-list 'c-default-style '(c++-ts-mode . "bsd"))) + +#+end_src +*** Java +#+begin_src emacs-lisp + (use-package lsp-java + :after (lsp-mode) + :config + (setq lsp-java-vmargs '("-XX:+UseParallelGC" "-XX:GCTimeRatio=4" "-XX:AdaptiveSizePolicyWeight=90" "-Dsun.zip.disableMemoryMapping=true" "-Xmx4G" "-Xms512m")) + ;;(add-hook 'java-mode-hook (lambda () (when (getenv "JDTLS_PATH") (setq lsp-java-server-install-dir (getenv "JDTLS_PATH"))))) + (add-hook 'java-mode-hook 'lsp-deferred) + (add-hook 'java-mode-hook 'display-line-numbers-mode) + + ;;(add-hook 'java-ts-mode-hook (lambda () (when (getenv "JDTLS_PATH") (setq lsp-java-server-install-dir (getenv "JDTLS_PATH"))))) + (add-hook 'java-ts-mode-hook 'lsp-deferred) + (add-hook 'java-ts-mode-hook 'display-line-numbers-mode) + + (when (treesit-language-available-p 'java) (push '(java-mode . java-ts-mode) major-mode-remap-alist)) + + (add-to-list 'c-default-style '(java-mode . "java")) + (add-to-list 'c-default-style '(java-ts-mode . "java"))) +#+end_src +*** Python +#+begin_src emacs-lisp + (use-package lsp-pyright + :after (lsp-mode) + :if (executable-find "python") + :config + (setq lsp-pyright-langserver-command "pyright") + (add-hook 'python-mode-hook 'lsp-deferred) + (add-hook 'python-ts-mode-hook 'lsp-deferred) + (when (treesit-language-available-p 'python) (push '(python-mode . python-ts-mode) major-mode-remap-alist))) +#+end_src +*** Nix +#+begin_src emacs-lisp + (use-package nix-mode) + (use-package nix-ts-mode) + (use-package lsp-nix + :after (lsp-mode nix-mode nix-ts-mode) + :ensure nil + :config + (add-to-list 'lsp-disabled-clients '(nix-mode . nix-nil)) + (setq lsp-nix-nixd-server-path "nixd") + (when (executable-find "nixfmt") + (setq lsp-nix-nixd-formatting-command [ "nixfmt" ]) ) + + + (unless lsp-nix-nixd-nixos-options-expr + (setq lsp-nix-nixd-nixos-options-expr (concat "(builtins.getFlake \"/etc/nixos\").nixosConfigurations." (system-name) ".options"))) + (unless lsp-nix-nixd-nixpkgs-expr + (setq lsp-nix-nixd-nixpkgs-expr (concat "(builtins.getFlake \"/etc/nixos\").nixosConfigurations." (system-name) ".pkgs"))) + (add-hook 'nix-mode-hook 'lsp-deferred) + (add-hook 'nix-mode-hook 'display-line-numbers-mode) + + (add-hook 'nix-ts-mode-hook 'lsp-deferred) + (add-hook 'nix-ts-mode-hook 'display-line-numbers-mode) + + (when (treesit-language-available-p 'nix) (push '(nix-mode . nix-ts-mode) major-mode-remap-alist))) +#+end_src +*** Lisp / Scheme +#+begin_src emacs-lisp +(use-package paredit) +#+end_src +**** Emacs Lisp +#+begin_src emacs-lisp + +#+end_src +**** Common Lisp +#+begin_src emacs-lisp + (use-package slime + :if (executable-find "sbcl") + :config + (setq inferior-lisp-program "sbcl") + (slime-setup '(slime-fancy slime-company))) +#+end_src +*** Shell +**** Bash +[[https://github.com/szermatt/emacs-bash-completion][Bash-completion]] +#+begin_src emacs-lisp + (use-package bash-completion) +#+end_src + +** Version Control +*** Diff Highlight +[[https://github.com/dgutov/diff-hl][diff-hl]] +#+begin_src emacs-lisp + (use-package diff-hl + :config + (setq diff-hl-side 'right) + (global-diff-hl-mode 1) + (diff-hl-margin-mode 1) + (diff-hl-flydiff-mode 1) + (global-diff-hl-show-hunk-mouse-mode 1)) +#+end_src +*** Magit +[[https://magit.vc][Magit]] +#+begin_src emacs-lisp + + (use-package magit + :after (transient)) + +#+end_src +*** Git Timemachine +#+begin_src emacs-lisp +(use-package git-timemachine + :defer t) +#+end_src +** Notes & Organization +*** Org Mode +#+begin_src emacs-lisp + (use-package org :mode (("\\.org$" . org-mode)) :hook ((org-mode . org-indent-mode) @@ -195,77 +732,9 @@ `(lambda (c) (if (char-equal c ?<) t (,electric-pair-inhibit-predicate c))))))) - (elpaca-wait) - - - - ;;(load custom-file t) - - #+end_src -** Lexical Binding - #+begin_src emacs-lisp - ;;; -*- lexical-binding: t; -*- -#+end_src -** Font & Text -#+begin_src emacs-lisp - (when (display-graphic-p) - (set-frame-font "Hack Nerd Font" nil t)) - (setq-default cursor-type '(bar . 2)) - (setq truncate-string-ellipsis "…") - - - (setq text-mode-ispell-word-completion nil) ; Disable ispell - (global-completion-preview-mode 1) -#+end_src - -** Frame -#+begin_src emacs-lisp - (when (daemonp) - (add-hook 'after-make-frame-functions - (lambda (frame) (when (= (length (frame-list)) 2) - (set-frame-parameter frame 'fullscreen 'maximized)) - (select-frame-set-input-focus frame) ))) - (global-tab-line-mode 1) - (setq window-divider-default-bottom-width 1) - (setq window-divider-default-right-width 1) - (window-divider-mode 1) - (tool-bar-mode -1) - (setq-default display-line-numbers-width 3) - (setq-default display-line-numbers-widen t) - - (defun startup-screen-advice (orig-fun &rest args) - (when (= (seq-count #'buffer-file-name (buffer-list)) 0) - (apply orig-fun args))) - (advice-add 'display-startup-screen :around #'startup-screen-advice) ; Hide startup screen if started with file -#+end_src -** Mouse -Setting up mouse -#+begin_src emacs-lisp - (context-menu-mode 1) - (setq mouse-wheel-follow-mouse 't) - (setq scroll-step 1) - (setq mouse-drag-and-drop-region t) - (xterm-mouse-mode 1) - (pixel-scroll-precision-mode 1) - (setq-default pixel-scroll-precision-large-scroll-height 10.0) -#+end_src -* Packages -** Theme -#+begin_src emacs-lisp - (use-package dracula-theme :config - (if (daemonp) - (add-hook 'after-make-frame-functions - (lambda (frame) - (with-selected-frame frame (load-theme 'dracula t)))) - (load-theme 'dracula t))) - -#+end_src -** org -#+begin_src emacs-lisp - (use-package org-modern :after (org) :hook @@ -273,46 +742,36 @@ Setting up mouse (org-agenda-finalize . org-modern-agenda) :config (setq org-modern-block-name '("▼ " . "▲ "))) +#+end_src + +#+begin_src emacs-lisp (use-package org-auto-tangle :after (org) :hook (org-mode . org-auto-tangle-mode) ) +#+end_src + +#+begin_src emacs-lisp (use-package toc-org :after (org) :hook ((org-mode . toc-org-mode ) (markdown-mode . toc-org-mode))) - #+end_src -** rainbow-mode + #+begin_src emacs-lisp - (use-package rainbow-mode - :hook - ((org-mode . rainbow-mode) - (prog-mode . rainbow-mode))) + (use-package org-transclusion + :after (org)) #+end_src -** delimiters + #+begin_src emacs-lisp - (use-package rainbow-delimiters - :hook - (prog-mode . rainbow-delimiters-mode) - :config - (set-face-attribute 'rainbow-delimiters-depth-1-face nil :foreground "#FFFFFF") - (set-face-attribute 'rainbow-delimiters-depth-2-face nil :foreground "#FFFF00") - (set-face-attribute 'rainbow-delimiters-depth-5-face nil :foreground "#6A5ACD") - (set-face-attribute 'rainbow-delimiters-unmatched-face nil :foreground "#FF0000")) - -#+end_src -** eat -#+begin_src emacs-lisp - (use-package eat - :config - (defvar cua--eat-semi-char-keymap (copy-keymap cua--cua-keys-keymap) "EAT semi-char mode CUA keymap") - (defvar cua--eat-char-keymap (copy-keymap cua--cua-keys-keymap) "EAT char mode CUA keymap")) + (use-package org-roam + :after (org)) #+end_src -** Undo-tree +** Other & Misc +*** Undo-tree #+begin_src emacs-lisp (use-package undo-tree :config @@ -326,153 +785,19 @@ Setting up mouse #+end_src -** Dirvish +*** which-key #+begin_src emacs-lisp - (use-package dirvish - :after (nerd-icons) - :config - (setq dired-mouse-drag-files t) - (dirvish-override-dired-mode 1) - (setq dirvish-attributes - '(vc-state - subtree-state - nerd-icons - collapse - git-msg - file-time - file-size))) - -#+end_src -** orderless -#+begin_src emacs-lisp - (use-package orderless - :init - ;; Tune the global completion style settings to your liking! - ;; This affects the minibuffer and non-lsp completion at point. - (setq completion-styles '(basic partial-completion orderless) - completion-category-defaults nil - completion-category-overrides nil)) -#+end_src -** minibuffer -#+begin_src emacs-lisp - (use-package consult) - (use-package marginalia) - (use-package which-key - :config - (which-key-mode 1)) - - (use-package vertico - :after (consult marginalia) - :config - (setq completion-in-region-function - (lambda (&rest args) - (apply (if vertico-mode - #'consult-completion-in-region - #'completion--in-region) - args))) - (vertico-mode 1) - (marginalia-mode 1)) - (use-package vertico-mouse - :config - (vertico-mouse-mode 1) - :ensure nil - :after (vertico)) + :config + (which-key-mode 1)) #+end_src -** nerd-icons -#+begin_src emacs-lisp - (use-package nerd-icons) - (use-package nerd-icons-completion - :after (marginalia) - :config - (nerd-icons-completion-mode 1) - (add-hook 'marginalia-mode-hook #'nerd-icons-completion-marginalia-setup)) - -#+end_src -** diff-hl -#+begin_src emacs-lisp - (use-package diff-hl - :config - (setq diff-hl-side 'right) - (global-diff-hl-mode 1) - (diff-hl-margin-mode 1) - (diff-hl-flydiff-mode 1) - (global-diff-hl-show-hunk-mouse-mode 1)) - -#+end_src - -** modelinne -#+begin_src emacs-lisp - ;; (use-package doom-modeline - ;; :init (setq doom-modeline-support-imenu t) - ;; :hook (elpaca-after-init . doom-modeline-mode) - ;; :config - ;; (setq doom-modeline-icon t) - ;; (setq doom-modeline-project-detection 'auto) - ;; (setq doom-modeline-height 20) - ;; (setq doom-modeline-enable-word-count t) - ;; (setq doom-modeline-minor-modes t) - ;; (setq display-time-24hr-format t) - ;; (display-time-mode 1) - ;; (column-number-mode 1) - ;; (line-number-mode 1)) - - (use-package minions - :hook (elpaca-after-init . minions-mode)) -#+end_src - -** dashboard -#+begin_src emacs-lisp - (use-package dashboard - :after (nerd-icons projectile) - :config - (setq dashboard-center-content t) - (setq dashboard-display-icons-p t) - (setq dashboard-icon-type 'nerd-icons) - (setq dashboard-projects-backend 'projectile) - (setq dashboard-items '((recents . 5) - (bookmarks . 5) - (projects . 5) - (agenda . 5) - (registers . 5))) - (when (or (daemonp) (< (length command-line-args) 2)) - (add-hook 'elpaca-after-init-hook #'dashboard-insert-startupify-lists) - (add-hook 'elpaca-after-init-hook #'dashboard-initialize) - (dashboard-setup-startup-hook))) - (when (daemonp) - (setq initial-buffer-choice (lambda () (get-buffer "*dashboard*")))) ; Show dashboard when emacs is running as daemon) - - #+end_src -** treemacs -#+begin_src emacs-lisp - (use-package treemacs) - (use-package treemacs-projectile - :after (projectile treemacs)) - (use-package treemacs-nerd-icons - :after (nerd-icons treemacs)) - (use-package treemacs-perspective - :after (treemacs)) - (use-package treemacs-mouse-interface - :after (treemacs) - :ensure nil) - -#+end_src - -** magit - -#+begin_src emacs-lisp - (use-package transient) - (use-package magit - :after (transient)) - -#+end_src -** projectile +*** projectile #+begin_src emacs-lisp (use-package projectile :config (projectile-mode 1)) #+end_src -** Perspective +*** Perspective #+begin_src emacs-lisp (use-package perspective :config @@ -495,26 +820,180 @@ Setting up mouse (add-hook 'after-delete-frame-functions 'materus/elcord-toggle) (add-hook 'server-after-make-frame-hook 'materus/elcord-toggle)) #+end_src -** yasnippet -#+begin_src emacs-lisp - (use-package yasnippet - :config - (yas-global-mode 1)) -#+end_src -** Code completion -#+begin_src emacs-lisp +*** drag-stuff +#+begin_src emacs-lisp + (use-package drag-stuff) +#+end_src +*** popper +#+begin_src emacs-lisp + (use-package popper) +#+end_src + +*** visual-fill-column +#+begin_src emacs-lisp + (use-package visual-fill-column) +#+end_src +*** so-long +#+begin_src emacs-lisp + (use-package so-long + :defer t) +#+end_src +*** vlf +#+begin_src emacs-lisp + (use-package vlf + :defer t) +#+end_src + +*** crux +#+begin_src emacs-lisp +(use-package crux) + +#+end_src +*** No Littering +#+begin_src emacs-lisp :noweb-ref package-no-littering + (use-package no-littering + :ensure (:wait t) + :config + (require 'recentf) + (setq package-quickstart-file + (concat user-emacs-directory "var/quickstart/package-quickstart-" emacs-version ".el" )) + (add-to-list 'recentf-exclude + (recentf-expand-file-name no-littering-var-directory)) + (add-to-list 'recentf-exclude + (recentf-expand-file-name no-littering-etc-directory))) + +#+END_src +** Libraries +*** Nerd Icons +#+begin_src emacs-lisp + (use-package nerd-icons) +#+end_src +*** SVG Lib +#+begin_src emacs-lisp + (use-package svg-lib) +#+end_src +*** Transient +#+begin_src emacs-lisp + (use-package transient) +#+end_src +* Keybindings +#+begin_src emacs-lisp :noweb-ref keys + ;; Keybindings + (defun materus/keybind-set () + (require 'cua-base) + + ;; CUA-like global + (define-key global-map (kbd "C-s") 'save-buffer) + (define-key global-map (kbd "C-r") 'query-replace) + (define-key global-map (kbd "C-S-r") 'replace-string) + (define-key global-map (kbd "M-r") 'query-replace-regexp) + (define-key global-map (kbd "M-S-r") 'replace-regexp) + (define-key global-map (kbd "C-a") 'mark-whole-buffer) + (define-key global-map (kbd "C-f") 'isearch-forward) + (define-key global-map (kbd "C-S-f") 'isearch-backward) + (define-key isearch-mode-map (kbd "C-f") 'isearch-repeat-forward) + (define-key isearch-mode-map (kbd "C-S-f") 'isearch-repeat-backward) + + ;; CUA + (define-key cua--cua-keys-keymap (kbd "C-z") 'undo-tree-undo) + (define-key cua--cua-keys-keymap (kbd "C-y") 'undo-tree-redo) + (define-key cua-global-keymap (kbd "C-SPC") 'completion-at-point) + (define-key cua-global-keymap (kbd "C-M-SPC") 'cua-set-mark) + (cua-mode 1) + ;; TAB + (define-key global-map (kbd "C-") #'indent-rigidly-left) + (define-key global-map (kbd "C-") #'indent-rigidly-right) + + ;; Hyper + (define-key key-translation-map (kbd "") 'event-apply-hyper-modifier ) + (define-key key-translation-map (kbd "") 'event-apply-hyper-modifier ) + (define-key key-translation-map (kbd "∇") 'event-apply-hyper-modifier ) + + + ;; Unbind + (define-key isearch-mode-map (kbd "C-s") nil) + (define-key isearch-mode-map (kbd "C-r") nil) + + + <>) + + + (add-hook 'elpaca-after-init-hook #'materus/keybind-set ) +#+end_src + + +* Final Code +#+begin_src emacs-lisp :tangle (expand-file-name "init.el" user-emacs-directory) :noweb-ref final + ;;; -*- lexical-binding: t; -*- + <> + <> + <> + <> + <> + <> + <> + <> +#+end_src +Make copy in this repository +#+begin_src emacs-lisp :tangle ./early-init.el + <> +#+end_src +#+begin_src emacs-lisp :tangle ./init.el + <> +#+end_src +* Links +[[https://github.com/emacs-tw/awesome-emacs][awesome-emacs]] +* Archive +:PROPERTIES: +:header-args: :tangle no +:END: +** minibuffer (orderless, vertico, marginalia, consult) +#+begin_src emacs-lisp + (use-package orderless + :init + ;; Tune the global completion style settings to your liking! + ;; This affects the minibuffer and non-lsp completion at point. + (setq completion-styles '(basic partial-completion orderless) + completion-category-defaults nil + completion-category-overrides nil)) + (use-package consult) + (use-package marginalia) + + + + (use-package vertico + :after (consult marginalia) + :config + (setq completion-in-region-function + (lambda (&rest args) + (apply (if vertico-mode + #'consult-completion-in-region + #'completion--in-region) + args))) + (vertico-mode 1) + (marginalia-mode 1)) + (use-package vertico-mouse + :config + (vertico-mouse-mode 1) + :ensure nil + :after (vertico)) +#+end_src + +** Code completion (Cape, corfu) +#+begin_src emacs-lisp (use-package cape) (use-package corfu + :after (lsp-mode cape) ;; Optional customizations :custom - (corfu-cycle nil) ;; Enable cycling for `corfu-next/previous' - (corfu-auto t) ;; Enable auto completion + (corfu-cycle nil) ;; Enable cycling for `corfu-next/previous' + (corfu-auto t) ;; Enable auto completion (global-corfu-minibuffer nil) ;; (corfu-quit-at-boundary nil) ;; Never quit at completion boundary ;; (corfu-quit-no-match nil) ;; Never quit, even if there is no match - (corfu-preview-current nil) ;; Disable current candidate preview + (corfu-preview-current nil) ;; Disable current candidate preview ;; (corfu-preselect 'prompt) ;; Preselect the prompt ;; (corfu-on-exact-match nil) ;; Configure handling of exact matches @@ -529,7 +1008,22 @@ Setting up mouse :init (global-corfu-mode 1) (corfu-popupinfo-mode 1) - (corfu-history-mode 1)) + (corfu-history-mode 1) + + (defun materus/orderless-dispatch-flex-first (_pattern index _total) + (and (eq index 0) 'orderless-flex)) + + (defun materus/lsp-mode-setup-completion () + (setf (alist-get 'styles (alist-get 'lsp-capf completion-category-defaults)) + '(orderless)) + ;; Optionally configure the first word as flex filtered. + (add-hook 'orderless-style-dispatchers #'materus/orderless-dispatch-flex-first nil 'local) + ;; Optionally configure the cape-capf-buster. + (setq-local completion-at-point-functions (list (cape-capf-buster #'lsp-completion-at-point)))) + + :hook + (lsp-completion-mode . materus/lsp-mode-setup-completion)) + (use-package corfu-terminal @@ -540,7 +1034,8 @@ Setting up mouse ;; (use-package corfu-mouse ;; :after (corfu) - ;; :config + ;; :config + ;; :ensure nil ;; (corfu-mouse-mode) ;; (keymap-set corfu--mouse-ignore-map "" 'ignore) ;; (keymap-set corfu-map "" 'ignore)) @@ -553,71 +1048,3 @@ Setting up mouse #+end_src -* keys -#+begin_src emacs-lisp - (require 'cua-base) - - ;;; Keybinds - ;; Eat Term - ;(define-key cua--eat-semi-char-keymap (kbd "C-v") #'eat-yank) - ;(define-key cua--eat-char-keymap (kbd "C-S-v") #'eat-yank) - ;(define-key cua--eat-semi-char-keymap (kbd "C-c") #'copy-region-as-kill) - ;(define-key cua--eat-char-keymap (kbd "C-S-c") #'copy-region-as-kill) - ;(define-key eat-mode-map (kbd "C-") #'eat-self-input) - ;(define-key eat-mode-map (kbd "C-") #'eat-self-input) - ;; perspective - (define-key global-map (kbd "C-x C-b") #'persp-list-buffers) - (define-key global-map (kbd "C-x C-B") #'list-buffers) - (define-key global-map (kbd "C-x b") #'persp-switch-to-buffer*) - (define-key global-map (kbd "C-x B") #'consult-buffer) - ;; CUA-like global - (define-key global-map (kbd "C-s") 'save-buffer) - (define-key global-map (kbd "C-r") 'query-replace) - (define-key global-map (kbd "C-S-r") 'replace-string) - (define-key global-map (kbd "M-r") 'query-replace-regexp) - (define-key global-map (kbd "M-S-r") 'replace-regexp) - (define-key global-map (kbd "C-a") 'mark-whole-buffer) - (define-key global-map (kbd "C-f") 'isearch-forward) - (define-key global-map (kbd "C-S-f") 'isearch-backward) - (define-key isearch-mode-map (kbd "C-f") 'isearch-repeat-forward) - (define-key isearch-mode-map (kbd "C-S-f") 'isearch-repeat-backward) - (define-key global-map (kbd "M-f") 'consult-ripgrep) - (define-key global-map (kbd "C-M-f") 'consult-find) - ;; CUA - (define-key cua--cua-keys-keymap (kbd "C-z") 'undo-tree-undo) - (define-key cua--cua-keys-keymap (kbd "C-y") 'undo-tree-redo) - (define-key cua-global-keymap (kbd "C-SPC") 'completion-at-point) - (define-key cua-global-keymap (kbd "C-M-SPC") 'cua-set-mark) - (cua-mode 1) - ;; TAB - (define-key global-map (kbd "C-") #'indent-rigidly-left) - (define-key global-map (kbd "C-") #'indent-rigidly-right) - ;; Dashboard - ;(define-key dashboard-mode-map (kbd "C-r") #'dashboard-refresh-buffer) - - ;; Hyper - (define-key key-translation-map (kbd "") 'event-apply-hyper-modifier ) - (define-key key-translation-map (kbd "") 'event-apply-hyper-modifier ) - (define-key key-translation-map (kbd "∇") 'event-apply-hyper-modifier ) - ;; Treemacs - (define-key global-map (kbd "C-H-t") 'treemacs) - - ;; Unbind - (define-key isearch-mode-map (kbd "C-s") nil) - (define-key isearch-mode-map (kbd "C-r") nil) -#+end_src - -** CUA Overrides - -#+begin_src emacs-lisp - ;; (defun cua--eat-semi-char-override-keymap () - ;; (setq-local cua--keymap-alist (copy-tree cua--keymap-alist)) - ;; (setf (alist-get 'cua--ena-cua-keys-keymap cua--keymap-alist) cua--eat-semi-char-keymap)) - ;; (defun cua--eat-char-override-keymap () - ;; (setq-local cua--keymap-alist (copy-tree cua--keymap-alist)) - ;; (setf (alist-get 'cua--ena-cua-keys-keymap cua--keymap-alist) cua--eat-char-keymap)) - - ;; (advice-add 'eat-semi-char-mode :after #'cua--eat-semi-char-override-keymap) - ;; (advice-add 'eat-char-mode :after #'cua--eat-char-override-keymap) - ;(add-hook 'eat-char-mode-hook #'cua--eat-char-override-keymap) -#+end_src diff --git a/extraFiles/config/emacs/early-init.el b/extraFiles/config/emacs/early-init.el index 5e8a868..3fdaff4 100644 --- a/extraFiles/config/emacs/early-init.el +++ b/extraFiles/config/emacs/early-init.el @@ -1,12 +1,10 @@ ;;; -*- lexical-binding: t; -*- + +;;; VARIABLES -;; [[file:emacs-materus-config.org::*Early Init Variables][Early Init Variables:1]] -(defvar materus/init-early t - "Is emacs using materus early init") ; Var to ensure early-init loaded, not used anymore but keeping it anyway -(setq materus/init-early t) ; Probably useless (setenv "LSP_USE_PLISTS" "true") ; Make lsp-mode use plists -;; + (setq c-default-style nil) ; Clear default styles for languages, will set them up later (setq default-input-method nil) ; Disable default input method, I'm not using them anyway so far (setq initial-major-mode 'fundamental-mode) ; Use fundamental mode in scratch buffer, speed up loading, not really important when emacs used as daemon @@ -18,14 +16,16 @@ (setq auto-save-list-file-prefix (concat user-emacs-directory "var/auto-save/sessions/")) ; Set auto-save-list location (setq load-prefer-newer t) ; Prefer newer files to load -;; Packages -(setq package-enable-at-startup t) ; Ensure packages are enable since I'm either using built in package manager or nix -(setq package-quickstart nil) ; Disable package quickstart, it's annoying if forget to update it and doesn't speed up much -;; + +(setq package-enable-at-startup nil) +(setq package-quickstart nil) ; Disable package quickstart + +(setq inhibit-startup-screen t) (setq inhibit-compacting-font-caches t) ; Don't compact fonts (set-language-environment "UTF-8") ; Use UTF-8 +(setq-default buffer-file-coding-system 'utf-8-unix) (setq custom-file (concat user-emacs-directory "etc/custom.el")) ; Set custom file location, don't want clutter in main directory (setq custom-theme-directory @@ -34,19 +34,22 @@ (setq ring-bell-function 'ignore) ; Disable bell -(defvar materus-emacs-gc-cons-threshold (* 64 1024 1024) +(defvar materus/emacs-gc-cons-threshold (* 64 1024 1024) "The value of `gc-cons-threshold' after Emacs startup.") ; Define after init garbage collector threshold -;; Early Init Variables:1 ends here -;; [[file:emacs-materus-config.org::*Garbage Collector][Garbage Collector:1]] + +;;; GARBAGE COLLECTOR (setq gc-cons-threshold most-positive-fixnum) ; Set `gc-cons-threshold' so it won't collectect during initialization (add-hook 'emacs-startup-hook (lambda () - (setq gc-cons-threshold materus-emacs-gc-cons-threshold))) ; Set `gc-cons-threshold' to desired value after startup -;; Garbage Collector:1 ends here + (setq gc-cons-threshold materus/emacs-gc-cons-threshold))) ; Set `gc-cons-threshold' to desired value after startup + + + + +;;; FRAMES -;; [[file:emacs-materus-config.org::*Early Frame Settings][Early Frame Settings:1]] (setq frame-inhibit-implied-resize t) (setq frame-resize-pixelwise t) (setq window-resize-pixelwise t) ; Allow pixelwise resizing of window and frame @@ -64,9 +67,10 @@ (advice-remove #'tty-run-terminal-initialization #'ignore) (tty-run-terminal-initialization (selected-frame) nil t) ))) -;; Early Frame Settings:1 ends here -;; [[file:emacs-materus-config.org::*Native compilation][Native compilation:1]] + +;;; NATIVE COMPILATION + (setq native-comp-async-report-warnings-errors nil) ; Silence warnings (setq native-comp-speed 3) ; Set native-comp speed @@ -83,4 +87,3 @@ (startup-redirect-eln-cache (convert-standard-filename (concat user-emacs-directory "var/eln-cache/")))) -;; Native compilation:1 ends here diff --git a/extraFiles/config/emacs/emacs-materus-config.org b/extraFiles/config/emacs/emacs-materus-config.org deleted file mode 100644 index de4a813..0000000 --- a/extraFiles/config/emacs/emacs-materus-config.org +++ /dev/null @@ -1,608 +0,0 @@ -#+TITLE: Materus Emacs Cfg -#+AUTHOR: materus -#+DESCRIPTION: materus emacs configuration -#+STARTUP: overview -#+PROPERTY: EMACS-DIR: ./ -#+PROPERTY: header-args :tangle (concat (org-entry-get nil "EMACS-DIR" t) "etc/materus/emacs-config.el") :comments link -#+OPTIONS: \n:t -#+auto_tangle: t - -My emacs config, tangled file is [[file:etc/materus/emacs-config.el][there]] - -* Table of Contents :noexport:TOC_3: -- [[#init-files][Init Files]] - - [[#early-init][Early Init]] - - [[#early-init-variables][Early Init Variables]] - - [[#garbage-collector][Garbage Collector]] - - [[#early-frame-settings][Early Frame Settings]] - - [[#native-compilation][Native compilation]] - - [[#init][Init]] - - [[#compile-time][Compile Time]] -- [[#packages][Packages]] - - [[#init-package-manager-config][Init package manager config]] - - [[#packages-list--function][Packages list & function]] -- [[#configuration][Configuration]] - - [[#no-littering][No Littering]] - - [[#graphical][Graphical]] - - [[#mouse][Mouse]] - - [[#misc][Misc]] - - [[#dashboard][Dashboard]] - - [[#modeline][Modeline]] - - [[#diff-hl][Diff-hl]] - - [[#org-mode][Org-mode]] - - [[#completions][Completions]] - - [[#style][Style]] - - [[#minibuffer][Minibuffer]] - - [[#miscellaneous][Miscellaneous]] -- [[#programming][Programming]] - - [[#lsp][LSP]] - - [[#dap][DAP]] - - [[#nix][Nix]] - - [[#emacs-lisp][Emacs Lisp]] - - [[#cc][C/C++]] - - [[#python][Python]] - - [[#java][Java]] - - [[#other][Other]] -- [[#keybindings][Keybindings]] - - [[#keys][Keys]] -- [[#snippets][Snippets]] - - [[#yasnippet-init][Yasnippet init]] -- [[#other-1][Other]] - - [[#update-config-script][Update config script]] - - [[#byte-compile][Byte compile]] -- [[#test][Test]] - -* Init Files -** Early Init -:PROPERTIES: -:header-args: :tangle (concat (org-entry-get nil "EMACS-DIR" t) "early-init.el") :comments link -:END: -Early init file, setting for GC and some paths. -Tangled file is [[./early-init.el][there]] -#+begin_src emacs-lisp :comments no - ;;; -*- lexical-binding: t; -*- -#+end_src -*** Early Init Variables -Setting early init variables -#+begin_src emacs-lisp - (defvar materus/init-early t - "Is emacs using materus early init") ; Var to ensure early-init loaded, not used anymore but keeping it anyway - (setq materus/init-early t) ; Probably useless - - (setenv "LSP_USE_PLISTS" "true") ; Make lsp-mode use plists - ;; - (setq c-default-style nil) ; Clear default styles for languages, will set them up later - (setq default-input-method nil) ; Disable default input method, I'm not using them anyway so far - (setq initial-major-mode 'fundamental-mode) ; Use fundamental mode in scratch buffer, speed up loading, not really important when emacs used as daemon - (setq auto-save-default nil) ; TODO: configure auto saves, disable for now - (setq backup-directory-alist - `((".*" . ,(concat user-emacs-directory "var/backups/")))) ; Set backup location - (setq auto-save-file-name-transforms - `((".*" ,(concat user-emacs-directory "var/recovery/") t))) ; Set auto-save location - (setq auto-save-list-file-prefix (concat user-emacs-directory "var/auto-save/sessions/")) ; Set auto-save-list location - (setq load-prefer-newer t) ; Prefer newer files to load - - ;; Packages - (setq package-enable-at-startup t) ; Ensure packages are enable since I'm either using built in package manager or nix - (setq package-quickstart nil) ; Disable package quickstart, it's annoying if forget to update it and doesn't speed up much - ;; - - (setq inhibit-compacting-font-caches t) ; Don't compact fonts - - (set-language-environment "UTF-8") ; Use UTF-8 - - (setq custom-file (concat user-emacs-directory "etc/custom.el")) ; Set custom file location, don't want clutter in main directory - (setq custom-theme-directory - (concat user-emacs-directory "/etc/materus/themes" )) ; Set custom themes location - - (setq ring-bell-function 'ignore) ; Disable bell - - - (defvar materus-emacs-gc-cons-threshold (* 64 1024 1024) - "The value of `gc-cons-threshold' after Emacs startup.") ; Define after init garbage collector threshold -#+end_src -*** Garbage Collector -Settings for garbage collector -#+begin_src emacs-lisp - (setq gc-cons-threshold most-positive-fixnum) ; Set `gc-cons-threshold' so it won't collectect during initialization - - (add-hook 'emacs-startup-hook - (lambda () - (setq gc-cons-threshold materus-emacs-gc-cons-threshold))) ; Set `gc-cons-threshold' to desired value after startup -#+end_src -*** Early Frame Settings -Early frame settings, maybe some could be move to normal init -#+begin_src emacs-lisp - (setq frame-inhibit-implied-resize t) - (setq frame-resize-pixelwise t) - (setq window-resize-pixelwise t) ; Allow pixelwise resizing of window and frame - - (unless (daemonp) - (add-to-list 'initial-frame-alist '(fullscreen . maximized))) ; Start first frame maximized if not running as daemon, daemon frame are set up later in config - (setq default-frame-alist ; Set default size for frames - '((width . 130) - (height . 40))) - - (advice-add #'tty-run-terminal-initialization :override #'ignore) - (add-hook 'window-setup-hook - (lambda () - (unless (display-graphic-p) - (advice-remove #'tty-run-terminal-initialization #'ignore) - (tty-run-terminal-initialization (selected-frame) nil t) - ))) -#+end_src -*** Native compilation -#+begin_src emacs-lisp - (setq native-comp-async-report-warnings-errors nil) ; Silence warnings - (setq native-comp-speed 3) ; Set native-comp speed - - (setq native-comp-jit-compilation t - ;;native-comp-deferred-compilation t - package-native-compile t) - - - ;; Setting up native-comp cache location - - (when (and (fboundp 'startup-redirect-eln-cache) - (fboundp 'native-comp-available-p) - (native-comp-available-p)) - (startup-redirect-eln-cache - (convert-standard-filename - (concat user-emacs-directory "var/eln-cache/")))) -#+end_src - -** Init -:PROPERTIES: -:header-args: :tangle (concat (org-entry-get nil "EMACS-DIR" t) "init.el") :comments link -:END: -Init File, tangled [[./init.el][there]] -Checking if using emacs from my nix config, loads config and custom.el -Sets up package.el -#+begin_src emacs-lisp :comments no - ;;; -*- lexical-binding: t; -*- -#+end_src - -#+begin_src emacs-lisp - (setq-default materus/use-nix-packages (require 'materus-config nil 'noerror)) - (require 'cl-lib) - (require 'package) - - (add-to-list 'load-path (concat user-emacs-directory "etc/materus/extra")) ; Extra load path for packages - (setq package-user-dir (concat user-emacs-directory "var/elpa/" emacs-version "/" )) ; Set elpa path for this emacs version, should use nix packages anyway so keeping just in case - (setq package-gnupghome-dir (concat user-emacs-directory "var/elpa/gnupg/" )) ; Set path to gnupg for elpa - (add-to-list 'package-archives - '("nongnu-devel" . "https://elpa.nongnu.org/nongnu-devel/")) ; Add nongnu-devel repo to package manager - (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t) ; Add melpa repo to package manager - (customize-set-variable 'package-archive-priorities '(("gnu" . 99) - ("nongnu" . 80) - ("nongnu-devel" . 70) - ("melpa" . 0))) ; Repository priority - - (load (concat user-emacs-directory "etc/materus/nix-init") t) - (load (concat user-emacs-directory "etc/materus/emacs-config")) - (load custom-file t) -#+end_src -** Compile Time -Some defvar so native-compile wont complain -#+begin_src emacs-lisp :comments no - ;;; -*- lexical-binding: t; -*- -#+end_src -#+begin_src emacs-lisp - (eval-when-compile - (defvar doom-modeline-support-imenu nil) - (defvar display-time-24hr-format nil) - (defvar lsp-nix-nixd-formatting-command nil) - (defvar cua--cua-keys-keymap nil) - (declare-function lsp-stdio-connection "lsp-mode" (COMMAND &optional TEST-COMMAND)) - (declare-function make-lsp-client "lsp-mode") - (declare-function lsp-register-client "lsp-mode" ( CLIENT )) - ) -#+end_src -* Packages -Package manager config if not using nix. -After some testing default package manager works best for me. -** Init package manager config - -#+begin_src emacs-lisp - -#+end_src - -** Packages list & function -Packages to install -#+begin_src emacs-lisp - (defvar materus/packages - '( - use-package - elcord - dashboard - magit - git-timemachine - avy - vterm - direnv - projectile - clipetty - which-key - iedit - hideshowvis - evil - perspective - treemacs-evil - treemacs - treemacs-nerd-icons - treemacs-perspective - treemacs-icons-dired - treemacs-magit - treemacs-projectile - tree-edit - nerd-icons - nerd-icons-completion - minions - rainbow-delimiters - rainbow-mode - cmake-mode - lsp-mode - lsp-java - lsp-jedi - lsp-haskell - lsp-ui - lsp-treemacs - flycheck - gradle-mode - groovy-mode - kotlin-mode - dap-mode - d-mode - lua-mode - multiple-cursors - org - org-contrib - org-ql - org-rainbow-tags - org-roam - org-roam-ui - org-review - org-present - org-superstar - org-auto-tangle - visual-fill-column - csharp-mode - markdown-mode - json-mode - nix-mode - nixfmt - no-littering - right-click-context - dracula-theme - doom-themes - doom-modeline - popper - undo-tree - bash-completion - eldoc-box - yasnippet - async - request - nix-ts-mode - markdown-ts-mode - llvm-ts-mode - treesit-fold - treesit-auto - tree-sitter-langs - eat - vlf - edit-indirect - zones - sudo-edit - toc-org - empv - volatile-highlights - highlight - elfeed - elfeed-goodies - drag-stuff - dirvish - rg - shfmt - ;; Completions & Minibuffer - corfu - company - company-quickhelp - cape - embark - embark-consult - orderless - vertico - marginalia - ) - "A list of packages to ensure are installed at launch.") - - (defun materus/packages-installed-p () - (cl-loop for p in materus/packages - when (not (package-installed-p p)) do (cl-return nil) - finally (cl-return t))) - - (defun materus/install-packages () - (unless (materus/packages-installed-p) - (package-refresh-contents) - (dolist (p materus/packages) - (when (not (package-installed-p p)) - (package-install p))))) - (unless materus/use-nix-packages - (materus/install-packages)) -#+end_src - -* Configuration -General configurations of packages modes etc. -** No Littering -Set up no littering - -** Graphical -Graphical related settings. -*** Mouse - -*** Misc -#+begin_src emacs-lisp - - ;; Rainbow mode - - -#+end_src -*** Dashboard - -*** Modeline - -*** Diff-hl - -** Org-mode -Org mode settings - -#+begin_SRC emacs-lisp - - -#+end_SRC -** Completions -*** Style - -*** Minibuffer - - - -** Miscellaneous - - - - - - -* Programming -** LSP -#+begin_src emacs-lisp - (use-package lsp-mode - :custom - (lsp-completion-provider :none) ;; we use Corfu! - :config - (setq lsp-keep-workspace-alive nil) - (require 'lsp-ui) - :init - (defun materus/orderless-dispatch-flex-first (_pattern index _total) - (and (eq index 0) 'orderless-flex)) - - (defun materus/lsp-mode-setup-completion () - (setf (alist-get 'styles (alist-get 'lsp-capf completion-category-defaults)) - '(orderless)) - ;; Optionally configure the first word as flex filtered. - (add-hook 'orderless-style-dispatchers #'materus/orderless-dispatch-flex-first nil 'local) - ;; Optionally configure the cape-capf-buster. - (setq-local completion-at-point-functions (list (cape-capf-buster #'lsp-completion-at-point)))) - - :hook - (lsp-completion-mode . materus/lsp-mode-setup-completion)) - - - - - (setq read-process-output-max (* 1024 1024 3)) - - (defun lsp-booster--advice-json-parse (old-fn &rest args) - "Try to parse bytecode instead of json." - (or - (when (equal (following-char) ?#) - (let ((bytecode (read (current-buffer)))) - (when (byte-code-function-p bytecode) - (funcall bytecode)))) - (apply old-fn args))) - (advice-add (if (progn (require 'json) - (fboundp 'json-parse-buffer)) - 'json-parse-buffer - 'json-read) - :around - #'lsp-booster--advice-json-parse) - - (defun lsp-booster--advice-final-command (old-fn cmd &optional test?) - "Prepend emacs-lsp-booster command to lsp CMD." - (let ((orig-result (funcall old-fn cmd test?))) - (if (and (not test?) ; for check lsp-server-present? - (not (file-remote-p default-directory)) ; see lsp-resolve-final-command, it would add extra shell wrapper - lsp-use-plists - (not (functionp 'json-rpc-connection)) ; native json-rpc - (executable-find "emacs-lsp-booster")) - (progn - (when-let* ((command-from-exec-path (executable-find (car orig-result)))) ; resolve command from exec-path (in case not found in $PATH) - (setcar orig-result command-from-exec-path)) - (message "Using emacs-lsp-booster for %s!" orig-result) - (cons "emacs-lsp-booster" orig-result)) - orig-result))) - (advice-add 'lsp-resolve-final-command :around #'lsp-booster--advice-final-command) -#+end_src -** DAP -#+begin_src emacs-lisp - (use-package dap-mode - :config - (require 'dap-lldb) - (require 'dap-gdb-lldb) - (require 'dap-cpptools) - (setq dap-gdb-lldb-extension-version "0.27.0") - (dap-auto-configure-mode 1) - ) - -#+end_src -** Nix -#+begin_src emacs-lisp - (use-package nix-mode) - (use-package nix-ts-mode) - (use-package nixfmt) - (use-package lsp-nix) - (with-eval-after-load 'lsp-mode - (add-to-list 'lsp-disabled-clients '(nix-mode . nix-nil)) - (setq lsp-nix-nixd-server-path "nixd" - lsp-nix-nixd-formatting-command [ "nixfmt" ] - lsp-nix-nixd-nixpkgs-expr "import { }")) - - (setq lsp-nix-nixd-formatting-command "nixfmt") - (add-hook 'nix-mode-hook 'lsp-deferred) - (add-hook 'nix-mode-hook 'display-line-numbers-mode) - - (add-hook 'nix-ts-mode-hook 'lsp-deferred) - (add-hook 'nix-ts-mode-hook 'display-line-numbers-mode) - - (when (treesit-language-available-p 'nix) (push '(nix-mode . nix-ts-mode) major-mode-remap-alist)) -#+end_src -** Emacs Lisp -#+begin_src emacs-lisp - (add-hook 'emacs-lisp-mode-hook 'display-line-numbers-mode) -#+end_src -** C/C++ -#+begin_src emacs-lisp - (use-package lsp-clangd) - (setq lsp-clients-clangd-args '("--fallback-style=microsoft")) - - (add-hook 'c-mode-hook 'lsp-deferred) - (add-hook 'c-mode-hook 'display-line-numbers-mode) - (add-hook 'c-ts-mode-hook 'lsp-deferred) - (add-hook 'c-ts-mode-hook 'display-line-numbers-mode) - - (add-hook 'c++-mode-hook 'lsp-deferred) - (add-hook 'c++-mode-hook 'display-line-numbers-mode) - (add-hook 'c++-ts-mode-hook 'lsp-deferred) - (add-hook 'c++-ts-mode-hook 'display-line-numbers-mode) - (when (treesit-language-available-p 'c) (push '(c-mode . c-ts-mode) major-mode-remap-alist)) - (when (treesit-language-available-p 'cpp) (push '(c++-mode . c++-ts-mode) major-mode-remap-alist)) - - (add-to-list 'c-default-style '(c-mode . "bsd")) - (add-to-list 'c-default-style '(c++-mode . "bsd")) - (add-to-list 'c-default-style '(c-ts-mode . "bsd")) - (add-to-list 'c-default-style '(c++-ts-mode . "bsd")) -#+end_src -** Python -#+begin_src emacs-lisp - (use-package lsp-pyright) - (setq lsp-pyright-langserver-command "pyright") - (add-hook 'python-mode-hook 'lsp-deferred) - (add-hook 'python-ts-mode-hook 'lsp-deferred) - (when (treesit-language-available-p 'python) (push '(python-mode . python-ts-mode) major-mode-remap-alist)) -#+end_src -** Java -#+begin_src emacs-lisp - (use-package lsp-java) - (setq lsp-java-vmargs '("-XX:+UseParallelGC" "-XX:GCTimeRatio=4" "-XX:AdaptiveSizePolicyWeight=90" "-Dsun.zip.disableMemoryMapping=true" "-Xmx2G" "-Xms100m")) - (add-hook 'java-mode-hook (lambda () (when (getenv "JDTLS_PATH") (setq lsp-java-server-install-dir (getenv "JDTLS_PATH"))))) - (add-hook 'java-mode-hook 'lsp-deferred) - (add-hook 'java-mode-hook 'display-line-numbers-mode) - - (add-hook 'java-ts-mode-hook (lambda () (when (getenv "JDTLS_PATH") (setq lsp-java-server-install-dir (getenv "JDTLS_PATH"))))) - (add-hook 'java-ts-mode-hook 'lsp-deferred) - (add-hook 'java-ts-mode-hook 'display-line-numbers-mode) - - (when (treesit-language-available-p 'java) (push '(java-mode . java-ts-mode) major-mode-remap-alist)) - - (add-to-list 'c-default-style '(java-mode . "java")) - (add-to-list 'c-default-style '(java-ts-mode . "java")) -#+end_src - -** Other -#+begin_src emacs-lisp - (add-to-list 'c-default-style '(awk-mode . "awk")) - (add-to-list 'c-default-style '(other . "bsd")) - - - - - (setq-default c-basic-offset 4) - (setq-default c-indent-level 4) - - (setq-default c-ts-mode-indent-offset 4) - (setq-default c-ts-mode-indent-style 'bsd) - - (setq-default c-hungry-delete-key t) - - (electric-pair-mode 1) - (electric-indent-mode -1) - (setq-default tab-width 4) - (setq-default indent-tabs-mode nil) - - (add-hook 'prog-mode-hook 'display-line-numbers-mode) - (add-hook 'prog-mode-hook 'electric-indent-local-mode) -#+end_src -* Keybindings -** Keys - - - -* Snippets -** Yasnippet init - - - -* Other -** Update config script -#+begin_src emacs-lisp - (defun materus/sync-config () - "Function to sync config from MATERUS_CONFIG_DIR to emacs folder" - (if (getenv "MATERUS_CONFIG_DIR") - (progn (copy-directory (concat (getenv "MATERUS_CONFIG_DIR") "extraFiles/config/emacs/") - user-emacs-directory t t t) t) - (progn (message "Can't use if MATERUS_CONFIG_DIR is not set!") nil))) - (defun materus/compare-file-time (file1 file2) - "Returns t when file1 is newer than file2" - (time-less-p - (nth 5 (file-attributes file2)) - (nth 5 (file-attributes file1)) - )) - (defun materus/compile-if-needed (file) - (unless (and (file-exists-p (concat user-emacs-directory file "c")) - (materus/compare-file-time (concat user-emacs-directory file "c") - (concat user-emacs-directory file))) - (byte-compile-file (concat user-emacs-directory file))) - ) - (defun materus/compile-config-if-needed () - (materus/compile-if-needed "early-init.el") - (materus/compile-if-needed "init.el") - (materus/compile-if-needed "etc/materus/emacs-config.el")) - (defun materus/update-config () - "Will sync and compile config" - (interactive) - (when (materus/sync-config) (materus/compile-config-if-needed) (byte-recompile-directory (concat user-emacs-directory "etc/materus/extra") 0 t))) -#+end_src - -** Byte compile -Byte compile files. -#+begin_src emacs-lisp - (materus/compile-config-if-needed) -#+end_src -* Test -Just for testing some code -#+begin_src emacs-lisp - ;;; (global-set-key (kbd "C-∇") (kbd "C-H")) - ;;; (global-set-key (kbd "H-∇") (lambda () (interactive) (insert-char #x2207))) - ;;; (buffer-text-pixel-size) - ;;; (set-window-vscroll nil 960 t t) - - ;;; (set-window-margins (selected-window) 0 0) - - ;;; (buffer-local-value 'var (get-buffer "your-buffer-name")) - - ;;; (setq completion-styles '(orderless basic) - ;;; completion-category-defaults nil - ;;; completion-category-overrides '((file (styles partial-completion)))) -#+end_src diff --git a/extraFiles/config/emacs/etc/materus/emacs-config.el b/extraFiles/config/emacs/etc/materus/emacs-config.el deleted file mode 100644 index f0e1c6b..0000000 --- a/extraFiles/config/emacs/etc/materus/emacs-config.el +++ /dev/null @@ -1,362 +0,0 @@ -;;; -*- lexical-binding: t; -*- - -;; [[file:../../emacs-materus-config.org::*Compile Time][Compile Time:2]] -(eval-when-compile - (defvar doom-modeline-support-imenu nil) - (defvar display-time-24hr-format nil) - (defvar lsp-nix-nixd-formatting-command nil) - (defvar cua--cua-keys-keymap nil) - (declare-function lsp-stdio-connection "lsp-mode" (COMMAND &optional TEST-COMMAND)) - (declare-function make-lsp-client "lsp-mode") - (declare-function lsp-register-client "lsp-mode" ( CLIENT )) - ) -;; Compile Time:2 ends here - -;; [[file:../../emacs-materus-config.org::*Init package manager config][Init package manager config:1]] - -;; Init package manager config:1 ends here - -;; [[file:../../emacs-materus-config.org::*Packages list & function][Packages list & function:1]] -(defvar materus/packages - '( - use-package - elcord - dashboard - magit - git-timemachine - avy - vterm - direnv - projectile - clipetty - which-key - iedit - hideshowvis - evil - perspective - treemacs-evil - treemacs - treemacs-nerd-icons - treemacs-perspective - treemacs-icons-dired - treemacs-magit - treemacs-projectile - tree-edit - nerd-icons - nerd-icons-completion - minions - rainbow-delimiters - rainbow-mode - cmake-mode - lsp-mode - lsp-java - lsp-jedi - lsp-haskell - lsp-ui - lsp-treemacs - flycheck - gradle-mode - groovy-mode - kotlin-mode - dap-mode - d-mode - lua-mode - multiple-cursors - org - org-contrib - org-ql - org-rainbow-tags - org-roam - org-roam-ui - org-review - org-present - org-superstar - org-auto-tangle - visual-fill-column - csharp-mode - markdown-mode - json-mode - nix-mode - nixfmt - no-littering - right-click-context - dracula-theme - doom-themes - doom-modeline - popper - undo-tree - bash-completion - eldoc-box - yasnippet - async - request - nix-ts-mode - markdown-ts-mode - llvm-ts-mode - treesit-fold - treesit-auto - tree-sitter-langs - eat - vlf - edit-indirect - zones - sudo-edit - toc-org - empv - volatile-highlights - highlight - elfeed - elfeed-goodies - drag-stuff - dirvish - rg - shfmt - ;; Completions & Minibuffer - corfu - company - company-quickhelp - cape - embark - embark-consult - orderless - vertico - marginalia - ) - "A list of packages to ensure are installed at launch.") - -(defun materus/packages-installed-p () - (cl-loop for p in materus/packages - when (not (package-installed-p p)) do (cl-return nil) - finally (cl-return t))) - -(defun materus/install-packages () - (unless (materus/packages-installed-p) - (package-refresh-contents) - (dolist (p materus/packages) - (when (not (package-installed-p p)) - (package-install p))))) -(unless materus/use-nix-packages - (materus/install-packages)) -;; Packages list & function:1 ends here - -;; [[file:../../emacs-materus-config.org::*Misc][Misc:1]] -;; Rainbow mode -;; Misc:1 ends here - -;; [[file:../../emacs-materus-config.org::*Org-mode][Org-mode:1]] - -;; Org-mode:1 ends here - -;; [[file:../../emacs-materus-config.org::*LSP][LSP:1]] -(use-package lsp-mode - :custom - (lsp-completion-provider :none) ;; we use Corfu! - :config - (setq lsp-keep-workspace-alive nil) - (require 'lsp-ui) - :init - (defun materus/orderless-dispatch-flex-first (_pattern index _total) - (and (eq index 0) 'orderless-flex)) - - (defun materus/lsp-mode-setup-completion () - (setf (alist-get 'styles (alist-get 'lsp-capf completion-category-defaults)) - '(orderless)) - ;; Optionally configure the first word as flex filtered. - (add-hook 'orderless-style-dispatchers #'materus/orderless-dispatch-flex-first nil 'local) - ;; Optionally configure the cape-capf-buster. - (setq-local completion-at-point-functions (list (cape-capf-buster #'lsp-completion-at-point)))) - - :hook - (lsp-completion-mode . materus/lsp-mode-setup-completion)) - - - - - (setq read-process-output-max (* 1024 1024 3)) - - (defun lsp-booster--advice-json-parse (old-fn &rest args) - "Try to parse bytecode instead of json." - (or - (when (equal (following-char) ?#) - (let ((bytecode (read (current-buffer)))) - (when (byte-code-function-p bytecode) - (funcall bytecode)))) - (apply old-fn args))) - (advice-add (if (progn (require 'json) - (fboundp 'json-parse-buffer)) - 'json-parse-buffer - 'json-read) - :around - #'lsp-booster--advice-json-parse) - - (defun lsp-booster--advice-final-command (old-fn cmd &optional test?) - "Prepend emacs-lsp-booster command to lsp CMD." - (let ((orig-result (funcall old-fn cmd test?))) - (if (and (not test?) ; for check lsp-server-present? - (not (file-remote-p default-directory)) ; see lsp-resolve-final-command, it would add extra shell wrapper - lsp-use-plists - (not (functionp 'json-rpc-connection)) ; native json-rpc - (executable-find "emacs-lsp-booster")) - (progn - (when-let* ((command-from-exec-path (executable-find (car orig-result)))) ; resolve command from exec-path (in case not found in $PATH) - (setcar orig-result command-from-exec-path)) - (message "Using emacs-lsp-booster for %s!" orig-result) - (cons "emacs-lsp-booster" orig-result)) - orig-result))) - (advice-add 'lsp-resolve-final-command :around #'lsp-booster--advice-final-command) -;; LSP:1 ends here - -;; [[file:../../emacs-materus-config.org::*DAP][DAP:1]] -(use-package dap-mode - :config - (require 'dap-lldb) - (require 'dap-gdb-lldb) - (require 'dap-cpptools) - (setq dap-gdb-lldb-extension-version "0.27.0") - (dap-auto-configure-mode 1) - ) -;; DAP:1 ends here - -;; [[file:../../emacs-materus-config.org::*Nix][Nix:1]] -(use-package nix-mode) -(use-package nix-ts-mode) -(use-package nixfmt) -(use-package lsp-nix) -(with-eval-after-load 'lsp-mode - (add-to-list 'lsp-disabled-clients '(nix-mode . nix-nil)) - (setq lsp-nix-nixd-server-path "nixd" - lsp-nix-nixd-formatting-command [ "nixfmt" ] - lsp-nix-nixd-nixpkgs-expr "import { }")) - -(setq lsp-nix-nixd-formatting-command "nixfmt") -(add-hook 'nix-mode-hook 'lsp-deferred) -(add-hook 'nix-mode-hook 'display-line-numbers-mode) - -(add-hook 'nix-ts-mode-hook 'lsp-deferred) -(add-hook 'nix-ts-mode-hook 'display-line-numbers-mode) - -(when (treesit-language-available-p 'nix) (push '(nix-mode . nix-ts-mode) major-mode-remap-alist)) -;; Nix:1 ends here - -;; [[file:../../emacs-materus-config.org::*Emacs Lisp][Emacs Lisp:1]] -(add-hook 'emacs-lisp-mode-hook 'display-line-numbers-mode) -;; Emacs Lisp:1 ends here - -;; [[file:../../emacs-materus-config.org::*C/C++][C/C++:1]] -(use-package lsp-clangd) -(setq lsp-clients-clangd-args '("--fallback-style=microsoft")) - -(add-hook 'c-mode-hook 'lsp-deferred) -(add-hook 'c-mode-hook 'display-line-numbers-mode) -(add-hook 'c-ts-mode-hook 'lsp-deferred) -(add-hook 'c-ts-mode-hook 'display-line-numbers-mode) - -(add-hook 'c++-mode-hook 'lsp-deferred) -(add-hook 'c++-mode-hook 'display-line-numbers-mode) -(add-hook 'c++-ts-mode-hook 'lsp-deferred) -(add-hook 'c++-ts-mode-hook 'display-line-numbers-mode) -(when (treesit-language-available-p 'c) (push '(c-mode . c-ts-mode) major-mode-remap-alist)) -(when (treesit-language-available-p 'cpp) (push '(c++-mode . c++-ts-mode) major-mode-remap-alist)) - -(add-to-list 'c-default-style '(c-mode . "bsd")) -(add-to-list 'c-default-style '(c++-mode . "bsd")) -(add-to-list 'c-default-style '(c-ts-mode . "bsd")) -(add-to-list 'c-default-style '(c++-ts-mode . "bsd")) -;; C/C++:1 ends here - -;; [[file:../../emacs-materus-config.org::*Python][Python:1]] -(use-package lsp-pyright) -(setq lsp-pyright-langserver-command "pyright") -(add-hook 'python-mode-hook 'lsp-deferred) -(add-hook 'python-ts-mode-hook 'lsp-deferred) -(when (treesit-language-available-p 'python) (push '(python-mode . python-ts-mode) major-mode-remap-alist)) -;; Python:1 ends here - -;; [[file:../../emacs-materus-config.org::*Java][Java:1]] -(use-package lsp-java) -(setq lsp-java-vmargs '("-XX:+UseParallelGC" "-XX:GCTimeRatio=4" "-XX:AdaptiveSizePolicyWeight=90" "-Dsun.zip.disableMemoryMapping=true" "-Xmx2G" "-Xms100m")) -(add-hook 'java-mode-hook (lambda () (when (getenv "JDTLS_PATH") (setq lsp-java-server-install-dir (getenv "JDTLS_PATH"))))) -(add-hook 'java-mode-hook 'lsp-deferred) -(add-hook 'java-mode-hook 'display-line-numbers-mode) - -(add-hook 'java-ts-mode-hook (lambda () (when (getenv "JDTLS_PATH") (setq lsp-java-server-install-dir (getenv "JDTLS_PATH"))))) -(add-hook 'java-ts-mode-hook 'lsp-deferred) -(add-hook 'java-ts-mode-hook 'display-line-numbers-mode) - -(when (treesit-language-available-p 'java) (push '(java-mode . java-ts-mode) major-mode-remap-alist)) - -(add-to-list 'c-default-style '(java-mode . "java")) -(add-to-list 'c-default-style '(java-ts-mode . "java")) -;; Java:1 ends here - -;; [[file:../../emacs-materus-config.org::*Other][Other:1]] -(add-to-list 'c-default-style '(awk-mode . "awk")) -(add-to-list 'c-default-style '(other . "bsd")) - - - - -(setq-default c-basic-offset 4) -(setq-default c-indent-level 4) - -(setq-default c-ts-mode-indent-offset 4) -(setq-default c-ts-mode-indent-style 'bsd) - -(setq-default c-hungry-delete-key t) - -(electric-pair-mode 1) -(electric-indent-mode -1) -(setq-default tab-width 4) -(setq-default indent-tabs-mode nil) - -(add-hook 'prog-mode-hook 'display-line-numbers-mode) -(add-hook 'prog-mode-hook 'electric-indent-local-mode) -;; Other:1 ends here - -;; [[file:../../emacs-materus-config.org::*Update config script][Update config script:1]] -(defun materus/sync-config () - "Function to sync config from MATERUS_CONFIG_DIR to emacs folder" - (if (getenv "MATERUS_CONFIG_DIR") - (progn (copy-directory (concat (getenv "MATERUS_CONFIG_DIR") "extraFiles/config/emacs/") - user-emacs-directory t t t) t) - (progn (message "Can't use if MATERUS_CONFIG_DIR is not set!") nil))) -(defun materus/compare-file-time (file1 file2) - "Returns t when file1 is newer than file2" - (time-less-p - (nth 5 (file-attributes file2)) - (nth 5 (file-attributes file1)) - )) -(defun materus/compile-if-needed (file) - (unless (and (file-exists-p (concat user-emacs-directory file "c")) - (materus/compare-file-time (concat user-emacs-directory file "c") - (concat user-emacs-directory file))) - (byte-compile-file (concat user-emacs-directory file))) - ) -(defun materus/compile-config-if-needed () - (materus/compile-if-needed "early-init.el") - (materus/compile-if-needed "init.el") - (materus/compile-if-needed "etc/materus/emacs-config.el")) -(defun materus/update-config () - "Will sync and compile config" - (interactive) - (when (materus/sync-config) (materus/compile-config-if-needed) (byte-recompile-directory (concat user-emacs-directory "etc/materus/extra") 0 t))) -;; Update config script:1 ends here - -;; [[file:../../emacs-materus-config.org::*Byte compile][Byte compile:1]] -(materus/compile-config-if-needed) -;; Byte compile:1 ends here - -;; [[file:../../emacs-materus-config.org::*Test][Test:1]] -;;; (global-set-key (kbd "C-∇") (kbd "C-H")) -;;; (global-set-key (kbd "H-∇") (lambda () (interactive) (insert-char #x2207))) -;;; (buffer-text-pixel-size) -;;; (set-window-vscroll nil 960 t t) - -;;; (set-window-margins (selected-window) 0 0) - -;;; (buffer-local-value 'var (get-buffer "your-buffer-name")) - -;;; (setq completion-styles '(orderless basic) -;;; completion-category-defaults nil -;;; completion-category-overrides '((file (styles partial-completion)))) -;; Test:1 ends here diff --git a/extraFiles/config/emacs/init.el b/extraFiles/config/emacs/init.el index 75ca2e3..d2a2483 100644 --- a/extraFiles/config/emacs/init.el +++ b/extraFiles/config/emacs/init.el @@ -1,22 +1,548 @@ ;;; -*- lexical-binding: t; -*- +;; Prepare + (require 'materus-nix nil t) + (require 'elec-pair) + (when (not emacs-build-time) + (print "WARN: emacs-build-time not set up, using current time") + (setq emacs-build-time (decode-time (current-time)))) + (add-to-list 'load-path (concat user-emacs-directory "etc/pkgs/")) ; Extra load path for packages -;; [[file:emacs-materus-config.org::*Init][Init:2]] -(setq-default materus/use-nix-packages (require 'materus-config nil 'noerror)) -(require 'cl-lib) -(require 'package) + (setq read-process-output-max (* 1024 1024 3)) -(add-to-list 'load-path (concat user-emacs-directory "etc/materus/extra")) ; Extra load path for packages -(setq package-user-dir (concat user-emacs-directory "var/elpa/" emacs-version "/" )) ; Set elpa path for this emacs version, should use nix packages anyway so keeping just in case -(setq package-gnupghome-dir (concat user-emacs-directory "var/elpa/gnupg/" )) ; Set path to gnupg for elpa -(add-to-list 'package-archives - '("nongnu-devel" . "https://elpa.nongnu.org/nongnu-devel/")) ; Add nongnu-devel repo to package manager -(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t) ; Add melpa repo to package manager -(customize-set-variable 'package-archive-priorities '(("gnu" . 99) - ("nongnu" . 80) - ("nongnu-devel" . 70) - ("melpa" . 0))) ; Repository priority +;; Elpaca Init +(defvar elpaca-installer-version 0.11) +(defvar elpaca-directory (expand-file-name "var/elpaca/" user-emacs-directory)) +(defvar elpaca-builds-directory (expand-file-name (concat "builds/" emacs-version "/") elpaca-directory)) +(defvar elpaca-repos-directory (expand-file-name "repos/" elpaca-directory)) +(defvar elpaca-order '(elpaca :repo "https://github.com/progfolio/elpaca.git" + :ref nil :depth 1 :inherit ignore + :files (:defaults "elpaca-test.el" (:exclude "extensions")) + :build (:not elpaca--activate-package))) +(let* ((repo (expand-file-name "elpaca/" elpaca-repos-directory)) + (build (expand-file-name "elpaca/" elpaca-builds-directory)) + (order (cdr elpaca-order)) + (default-directory repo)) + (add-to-list 'load-path (if (file-exists-p build) build repo)) + (unless (file-exists-p repo) + (make-directory repo t) + (when (<= emacs-major-version 28) (require 'subr-x)) + (condition-case-unless-debug err + (if-let* ((buffer (pop-to-buffer-same-window "*elpaca-bootstrap*")) + ((zerop (apply #'call-process `("git" nil ,buffer t "clone" + ,@(when-let* ((depth (plist-get order :depth))) + (list (format "--depth=%d" depth) "--no-single-branch")) + ,(plist-get order :repo) ,repo)))) + ((zerop (call-process "git" nil buffer t "checkout" + (or (plist-get order :ref) "--")))) + (emacs (concat invocation-directory invocation-name)) + ((zerop (call-process emacs nil buffer nil "-Q" "-L" "." "--batch" + "--eval" "(byte-recompile-directory \".\" 0 'force)"))) + ((require 'elpaca)) + ((elpaca-generate-autoloads "elpaca" repo))) + (progn (message "%s" (buffer-string)) (kill-buffer buffer)) + (error "%s" (with-current-buffer buffer (buffer-string)))) + ((error) (warn "%s" err) (delete-directory repo 'recursive)))) + (unless (require 'elpaca-autoloads nil t) + (require 'elpaca) + (elpaca-generate-autoloads "elpaca" repo) + (let ((load-source-file-function nil)) (load "./elpaca-autoloads")))) +(add-hook 'after-init-hook #'elpaca-process-queues) +(elpaca `(,@elpaca-order)) -(load (concat user-emacs-directory "etc/materus/nix-init") t) -(load (concat user-emacs-directory "etc/materus/emacs-config")) -(load custom-file t) -;; Init:2 ends here +(elpaca elpaca-use-package + (elpaca-use-package-mode) + (setq elpaca-use-package-by-default t)) + +;; Use package preffering built-in / nix packages +(defmacro materus/use-package (package &rest body) + (if (locate-library (symbol-name `,package)) + `(progn + (cl-pushnew (quote ,package) elpaca-ignored-dependencies) + (use-package ,package :ensure nil ,@body)) + `(use-package ,package ,@body))) + +(use-package no-littering + :ensure (:wait t) + :config + (require 'recentf) + (setq package-quickstart-file + (concat user-emacs-directory "var/quickstart/package-quickstart-" emacs-version ".el" )) + (add-to-list 'recentf-exclude + (recentf-expand-file-name no-littering-var-directory)) + (add-to-list 'recentf-exclude + (recentf-expand-file-name no-littering-etc-directory))) + +;; Font & Text init +(when (display-graphic-p) + (set-frame-font "Hack Nerd Font" nil t)) +(setq-default cursor-type '(bar . 2)) +(setq truncate-string-ellipsis "…") + + +(setq text-mode-ispell-word-completion nil) ; Disable ispell +(global-completion-preview-mode 1) +(electric-pair-mode 1) +(electric-indent-mode -1) +;; Frame Init +(when (daemonp) + (add-hook 'after-make-frame-functions + (lambda (frame) (when (= (length (frame-list)) 2) + (set-frame-parameter frame 'fullscreen 'maximized)) + (select-frame-set-input-focus frame) ))) +(global-tab-line-mode 1) +(setq window-divider-default-bottom-width 1) +(setq window-divider-default-right-width 1) +(window-divider-mode 1) +(tool-bar-mode -1) +(setq-default display-line-numbers-width 3) +(setq-default display-line-numbers-widen t) + + (defun startup-screen-advice (orig-fun &rest args) + (when (= (seq-count #'buffer-file-name (buffer-list)) 0) + (apply orig-fun args))) +(advice-add 'display-startup-screen :around #'startup-screen-advice) ; Hide startup screen if started with file +;; Mouse Init +(context-menu-mode 1) +(setq mouse-wheel-follow-mouse 't) +(setq scroll-step 1) +(setq mouse-drag-and-drop-region t) +(xterm-mouse-mode 1) +(pixel-scroll-precision-mode 1) +(setq-default pixel-scroll-precision-large-scroll-height 10.0) +(add-to-list 'c-default-style '(awk-mode . "awk")) +(add-to-list 'c-default-style '(other . "bsd")) + +(setq-default tab-width 4) +(setq-default indent-tabs-mode nil) +(setq-default c-basic-offset 4) +(setq-default c-indent-level 4) + +(setq-default c-ts-mode-indent-offset 4) +(setq-default c-ts-mode-indent-style 'bsd) + +(setq-default c-hungry-delete-key t) + + + +(add-hook 'prog-mode-hook 'display-line-numbers-mode) +(add-hook 'prog-mode-hook 'electric-indent-local-mode) +(use-package dracula-theme :config + (if (daemonp) + (add-hook 'after-make-frame-functions + (lambda (frame) + (with-selected-frame frame (load-theme 'dracula t)))) + (load-theme 'dracula t))) + +(use-package rainbow-mode + :hook + ((org-mode . rainbow-mode) + (prog-mode . rainbow-mode))) +(use-package rainbow-delimiters + :hook + (prog-mode . rainbow-delimiters-mode) + :config + (set-face-attribute 'rainbow-delimiters-depth-1-face nil :foreground "#FFFFFF") + (set-face-attribute 'rainbow-delimiters-depth-2-face nil :foreground "#FFFF00") + (set-face-attribute 'rainbow-delimiters-depth-5-face nil :foreground "#6A5ACD") + (set-face-attribute 'rainbow-delimiters-unmatched-face nil :foreground "#FF0000")) + +;; (use-package doom-modeline +;; :init (setq doom-modeline-support-imenu t) +;; :hook (elpaca-after-init . doom-modeline-mode) +;; :config +;; (setq doom-modeline-icon t) +;; (setq doom-modeline-project-detection 'auto) +;; (setq doom-modeline-height 20) +;; (setq doom-modeline-enable-word-count t) +;; (setq doom-modeline-minor-modes t) +;; (setq display-time-24hr-format t) +;; (display-time-mode 1) +;; (column-number-mode 1) +;; (line-number-mode 1)) + +(use-package minions + :hook (elpaca-after-init . minions-mode)) +(use-package dashboard + :after (nerd-icons projectile) + :config + (setq dashboard-center-content t) + (setq dashboard-display-icons-p t) + (setq dashboard-icon-type 'nerd-icons) + (setq dashboard-projects-backend 'projectile) + (setq dashboard-items '((recents . 5) + (bookmarks . 5) + (projects . 5) + (agenda . 5) + (registers . 5))) + (when (or (daemonp) (< (length command-line-args) 2)) + (add-hook 'elpaca-after-init-hook #'dashboard-insert-startupify-lists) + (add-hook 'elpaca-after-init-hook #'dashboard-initialize) + (dashboard-setup-startup-hook))) +(when (daemonp) + (setq initial-buffer-choice (lambda () (get-buffer "*dashboard*")))) ; Show dashboard when emacs is running as daemon) +(use-package highlight-indent-guides + :hook ((prog-mode . highlight-indent-guides-mode))) +(use-package eat) + +(materus/use-package vterm) +(use-package helm + :config + (setq helm-x-icons-provider 'nerd-icons) + (setq helm-move-to-line-cycle-in-source nil) + (helm-mode 1) + ) +(use-package helm-projectile + :after (helm projectile)) +(use-package helm-ag + :after (helm)) +(use-package helm-rg + :after (helm)) +(use-package helm-ls-git + :after (helm)) +(use-package company + :hook + ((prog-mode . company-mode))) +(use-package slime-company + :if (executable-find "sbcl") + :after (company slime)) + +(use-package dirvish + :after (nerd-icons) + :config + (setq dired-mouse-drag-files t) + (dirvish-override-dired-mode 1) + (setq dirvish-attributes + '(vc-state + subtree-state + nerd-icons + collapse + git-msg + file-time + file-size))) + +(use-package treemacs) +(use-package treemacs-projectile + :after (projectile treemacs)) +(use-package treemacs-nerd-icons + :after (nerd-icons treemacs)) +(use-package treemacs-perspective + :after (treemacs)) +(use-package treemacs-mouse-interface + :after (treemacs) + :ensure nil) +(use-package lsp-ui + :after (lsp-mode)) +(use-package lsp-mode + ;; :custom + ;; (lsp-completion-provider :none) ;; we use Corfu! + :config + (setq lsp-keep-workspace-alive nil) + + + (defun lsp-booster--advice-json-parse (old-fn &rest args) + "Try to parse bytecode instead of json." + (or + (when (equal (following-char) ?#) + (let ((bytecode (read (current-buffer)))) + (when (byte-code-function-p bytecode) + (funcall bytecode)))) + (apply old-fn args))) + (advice-add (if (progn (require 'json) + (fboundp 'json-parse-buffer)) + 'json-parse-buffer + 'json-read) + :around + #'lsp-booster--advice-json-parse) + + (defun lsp-booster--advice-final-command (old-fn cmd &optional test?) + "Prepend emacs-lsp-booster command to lsp CMD." + (let ((orig-result (funcall old-fn cmd test?))) + (if (and (not test?) ; for check lsp-server-present? + (not (file-remote-p default-directory)) ; see lsp-resolve-final-command, it would add extra shell wrapper + lsp-use-plists + (not (functionp 'json-rpc-connection)) ; native json-rpc + (executable-find "emacs-lsp-booster")) + (progn + (when-let* ((command-from-exec-path (executable-find (car orig-result)))) ; resolve command from exec-path (in case not found in $PATH) + (setcar orig-result command-from-exec-path)) + (message "Using emacs-lsp-booster for %s!" orig-result) + (cons "emacs-lsp-booster" orig-result)) + orig-result))) + (advice-add 'lsp-resolve-final-command :around #'lsp-booster--advice-final-command)) +(use-package lsp-treemacs + :after (lsp-mode treemacs) + :config + (lsp-treemacs-sync-mode 1)) + + +(use-package dap-mode + :after (lsp-mode) + :config + (require 'dap-lldb) + (require 'dap-gdb-lldb) + (require 'dap-cpptools) + (setq dap-gdb-lldb-extension-version "0.27.0") + (dap-auto-configure-mode 1)) + +(use-package yasnippet + :config + (yas-global-mode 1)) +(use-package lsp-clangd + :ensure nil + :after (lsp-mode) + :config + (setq lsp-clients-clangd-args '("--fallback-style=microsoft")) + + (add-hook 'c-mode-hook 'lsp-deferred) + (add-hook 'c-mode-hook 'display-line-numbers-mode) + (add-hook 'c-ts-mode-hook 'lsp-deferred) + (add-hook 'c-ts-mode-hook 'display-line-numbers-mode) + + (add-hook 'c++-mode-hook 'lsp-deferred) + (add-hook 'c++-mode-hook 'display-line-numbers-mode) + (add-hook 'c++-ts-mode-hook 'lsp-deferred) + (add-hook 'c++-ts-mode-hook 'display-line-numbers-mode) + ;(when (treesit-language-available-p 'c) (push '(c-mode . c-ts-mode) major-mode-remap-alist)) + ;(when (treesit-language-available-p 'cpp) (push '(c++-mode . c++-ts-mode) major-mode-remap-alist)) + + (add-to-list 'c-default-style '(c-mode . "bsd")) + (add-to-list 'c-default-style '(c++-mode . "bsd")) + (add-to-list 'c-default-style '(c-ts-mode . "bsd")) + (add-to-list 'c-default-style '(c++-ts-mode . "bsd"))) + +(use-package lsp-java + :after (lsp-mode) + :config + (setq lsp-java-vmargs '("-XX:+UseParallelGC" "-XX:GCTimeRatio=4" "-XX:AdaptiveSizePolicyWeight=90" "-Dsun.zip.disableMemoryMapping=true" "-Xmx4G" "-Xms512m")) + ;;(add-hook 'java-mode-hook (lambda () (when (getenv "JDTLS_PATH") (setq lsp-java-server-install-dir (getenv "JDTLS_PATH"))))) + (add-hook 'java-mode-hook 'lsp-deferred) + (add-hook 'java-mode-hook 'display-line-numbers-mode) + + ;;(add-hook 'java-ts-mode-hook (lambda () (when (getenv "JDTLS_PATH") (setq lsp-java-server-install-dir (getenv "JDTLS_PATH"))))) + (add-hook 'java-ts-mode-hook 'lsp-deferred) + (add-hook 'java-ts-mode-hook 'display-line-numbers-mode) + + (when (treesit-language-available-p 'java) (push '(java-mode . java-ts-mode) major-mode-remap-alist)) + + (add-to-list 'c-default-style '(java-mode . "java")) + (add-to-list 'c-default-style '(java-ts-mode . "java"))) +(use-package lsp-pyright + :after (lsp-mode) + :if (executable-find "python") + :config + (setq lsp-pyright-langserver-command "pyright") + (add-hook 'python-mode-hook 'lsp-deferred) + (add-hook 'python-ts-mode-hook 'lsp-deferred) + (when (treesit-language-available-p 'python) (push '(python-mode . python-ts-mode) major-mode-remap-alist))) +(use-package nix-mode) +(use-package nix-ts-mode) +(use-package lsp-nix + :after (lsp-mode nix-mode nix-ts-mode) + :ensure nil + :config + (add-to-list 'lsp-disabled-clients '(nix-mode . nix-nil)) + (setq lsp-nix-nixd-server-path "nixd") + (when (executable-find "nixfmt") + (setq lsp-nix-nixd-formatting-command [ "nixfmt" ]) ) + + + (unless lsp-nix-nixd-nixos-options-expr + (setq lsp-nix-nixd-nixos-options-expr (concat "(builtins.getFlake \"/etc/nixos\").nixosConfigurations." (system-name) ".options"))) + (unless lsp-nix-nixd-nixpkgs-expr + (setq lsp-nix-nixd-nixpkgs-expr (concat "(builtins.getFlake \"/etc/nixos\").nixosConfigurations." (system-name) ".pkgs"))) + (add-hook 'nix-mode-hook 'lsp-deferred) + (add-hook 'nix-mode-hook 'display-line-numbers-mode) + + (add-hook 'nix-ts-mode-hook 'lsp-deferred) + (add-hook 'nix-ts-mode-hook 'display-line-numbers-mode) + + (when (treesit-language-available-p 'nix) (push '(nix-mode . nix-ts-mode) major-mode-remap-alist))) +(use-package paredit) + +(use-package slime + :if (executable-find "sbcl") + :config + (setq inferior-lisp-program "sbcl") + (slime-setup '(slime-fancy slime-company))) +(use-package bash-completion) +(use-package diff-hl + :config + (setq diff-hl-side 'right) + (global-diff-hl-mode 1) + (diff-hl-margin-mode 1) + (diff-hl-flydiff-mode 1) + (global-diff-hl-show-hunk-mouse-mode 1)) + +(use-package magit + :after (transient)) + +(use-package git-timemachine + :defer t) +(use-package org +:mode (("\\.org$" . org-mode)) +:hook +((org-mode . org-indent-mode) + (org-mode . display-line-numbers-mode) + ) +:config +(require 'org-mouse) +(require 'org-tempo) +(setq org-src-window-setup 'current-window) +(setq org-latex-pdf-process '("latexmk -xelatex -quiet -shell-escape -f -output-directory=%o %f")) +(org-babel-do-load-languages + 'org-babel-load-languages + '((latex . t) + (emacs-lisp . t) + (shell . t) + (css . t) + (C . t) + (calc . t) + (awk . t) + (sql . t) + (sqlite . t))) +(add-hook 'org-mode-hook (lambda () + (setq-local + electric-pair-inhibit-predicate + `(lambda (c) + (if + (char-equal c ?<) t (,electric-pair-inhibit-predicate c))))))) +(use-package org-modern + :after (org) + :hook + (org-indent-mode . org-modern-mode) + (org-agenda-finalize . org-modern-agenda) + :config + (setq org-modern-block-name '("▼ " . "▲ "))) +(use-package org-auto-tangle + :after (org) + :hook (org-mode . org-auto-tangle-mode) + ) +(use-package toc-org + :after (org) + :hook + ((org-mode . toc-org-mode ) + (markdown-mode . toc-org-mode))) +(use-package org-transclusion + :after (org)) +(use-package org-roam + :after (org)) + +(use-package undo-tree + :config + (global-undo-tree-mode 1) + (defvar materus/undo-tree-dir (concat user-emacs-directory "var/undo-tree/")) + (unless (file-exists-p materus/undo-tree-dir) + (make-directory materus/undo-tree-dir t)) + (setq undo-tree-visualizer-diff t) + (setq undo-tree-history-directory-alist `(("." . ,materus/undo-tree-dir ))) + (setq undo-tree-visualizer-timestamps t)) + +(use-package which-key + :config + (which-key-mode 1)) +(use-package projectile + :config (projectile-mode 1)) +(use-package perspective + :config + (setq persp-mode-prefix-key (kbd "C-c M-p")) + (setq persp-modestring-short t) + (persp-mode 1) + ) +(defun materus/elcord-toggle (&optional _frame) + "Toggle elcord based on visible frames" + (if (> (length (frame-list)) 1) + (elcord-mode 1) + (elcord-mode -1)) + ) +(use-package elcord + :config + (unless (daemonp) (elcord-mode 1)) + (add-hook 'after-delete-frame-functions 'materus/elcord-toggle) + (add-hook 'server-after-make-frame-hook 'materus/elcord-toggle)) +(use-package drag-stuff) +(use-package popper) +(use-package visual-fill-column) +(use-package so-long + :defer t) +(use-package vlf + :defer t) +(use-package crux) + +(use-package nerd-icons) +(use-package svg-lib) +(use-package transient) +;; Keybindings +(defun materus/keybind-set () + (require 'cua-base) + + ;; CUA-like global + (define-key global-map (kbd "C-s") 'save-buffer) + (define-key global-map (kbd "C-r") 'query-replace) + (define-key global-map (kbd "C-S-r") 'replace-string) + (define-key global-map (kbd "M-r") 'query-replace-regexp) + (define-key global-map (kbd "M-S-r") 'replace-regexp) + (define-key global-map (kbd "C-a") 'mark-whole-buffer) + (define-key global-map (kbd "C-f") 'isearch-forward) + (define-key global-map (kbd "C-S-f") 'isearch-backward) + (define-key isearch-mode-map (kbd "C-f") 'isearch-repeat-forward) + (define-key isearch-mode-map (kbd "C-S-f") 'isearch-repeat-backward) + + ;; CUA + (define-key cua--cua-keys-keymap (kbd "C-z") 'undo-tree-undo) + (define-key cua--cua-keys-keymap (kbd "C-y") 'undo-tree-redo) + (define-key cua-global-keymap (kbd "C-SPC") 'completion-at-point) + (define-key cua-global-keymap (kbd "C-M-SPC") 'cua-set-mark) + (cua-mode 1) + ;; TAB + (define-key global-map (kbd "C-") #'indent-rigidly-left) + (define-key global-map (kbd "C-") #'indent-rigidly-right) + + ;; Hyper + (define-key key-translation-map (kbd "") 'event-apply-hyper-modifier ) + (define-key key-translation-map (kbd "") 'event-apply-hyper-modifier ) + (define-key key-translation-map (kbd "∇") 'event-apply-hyper-modifier ) + + + ;; Unbind + (define-key isearch-mode-map (kbd "C-s") nil) + (define-key isearch-mode-map (kbd "C-r") nil) + + + ;; Dashboard + (define-key dashboard-mode-map (kbd "C-r") #'dashboard-refresh-buffer) + ;; Eat + (defvar cua--eat-semi-char-keymap (copy-keymap cua--cua-keys-keymap) "EAT semi-char mode CUA keymap") + (defvar cua--eat-char-keymap (copy-keymap cua--cua-keys-keymap) "EAT char mode CUA keymap") + + + (define-key cua--eat-semi-char-keymap (kbd "C-v") #'eat-yank) + (define-key cua--eat-char-keymap (kbd "C-S-v") #'eat-yank) + (define-key cua--eat-semi-char-keymap (kbd "C-c") #'copy-region-as-kill) + (define-key cua--eat-char-keymap (kbd "C-S-c") #'copy-region-as-kill) + (define-key eat-mode-map (kbd "C-") #'eat-self-input) + (define-key eat-mode-map (kbd "C-") #'eat-self-input) + + + (defun cua--eat-semi-char-override-keymap () + (setq-local cua--keymap-alist (copy-tree cua--keymap-alist)) + (setf (alist-get 'cua--ena-cua-keys-keymap cua--keymap-alist) cua--eat-semi-char-keymap)) + (defun cua--eat-char-override-keymap () + (setq-local cua--keymap-alist (copy-tree cua--keymap-alist)) + (setf (alist-get 'cua--ena-cua-keys-keymap cua--keymap-alist) cua--eat-char-keymap)) + + (advice-add 'eat-semi-char-mode :after #'cua--eat-semi-char-override-keymap) + (advice-add 'eat-char-mode :after #'cua--eat-char-override-keymap) + (add-hook 'eat-char-mode-hook #'cua--eat-char-override-keymap) + + ;; Helm + (global-set-key (kbd "M-x") 'helm-M-x) + (global-set-key (kbd "C-x r b") #'helm-filtered-bookmarks) + (global-set-key (kbd "C-x C-f") #'helm-find-files) + (global-set-key (kbd "C-x b") #'helm-mini) + ;; Treemacs + (define-key global-map (kbd "C-H-t") 'treemacs)) + + +(add-hook 'elpaca-after-init-hook #'materus/keybind-set ) +;; Custom File +(add-hook 'elpaca-after-init-hook (lambda () (load custom-file 'noerror)))