(require 'package) ;; fixing broken emacsclient config: emacsclient --eval "(load "~/.emacs")" (add-to-list 'package-archives '("elpa" . "https://tromey.com/elpa/") t) (add-to-list 'package-archives '("gnu" . "https://elpa.gnu.org/packages/") t) (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t) (add-to-list 'package-archives '("xaldew" . "https://gustafwaldemarson.com/elpa/")) (add-to-list 'package-unsigned-archives "xaldew") (package-initialize) ;; emacs preferences (setq-default cursor-type 'bar) (global-hl-line-mode 1) (toggle-scroll-bar -1) (scroll-bar-mode -1) (menu-bar-mode -1) (tool-bar-mode -1) (column-number-mode t) (set-fringe-mode 5) (setq doc-view-scale-internally nil) (setq visible-bell t) (setq vc-handled-backends nil) (fset 'yes-or-no-p 'y-or-n-p) (show-paren-mode t) (setq show-paren-style 'expression) (save-place-mode t) (setq-default indent-tabs-mode nil tab-width 4) (set-language-environment "utf-8") (prefer-coding-system 'utf-8-unix) (set-locale-environment "en_US.UTF-8") (set-default-coding-systems 'utf-8-unix) (set-selection-coding-system 'utf-8-unix) (set-buffer-file-coding-system 'utf-8-unix) (set-clipboard-coding-system 'utf-8) (set-keyboard-coding-system 'utf-8) (set-terminal-coding-system 'utf-8) (setq coding-system-for-read 'utf-8) (setq coding-system-for-write 'utf-8) (defun remove-scratch-buffer () (if (get-buffer "*scratch*") (kill-buffer "*scratch*"))) (add-hook 'after-change-major-mode-hook 'remove-scratch-buffer) (setf epa-pinentry-mode 'loopback) ;; only show line numbers in programming mode (defun display-numbers-hook () (display-line-numbers-mode t)) (add-hook 'prog-mode-hook 'display-numbers-hook) (setq mouse-wheel-scroll-amount '(1 ((shift) . 1))) ;; one line at a time (setq mouse-wheel-progressive-speed nil) ;; don't accelerate scrolling (setq mouse-wheel-follow-mouse 't) ;; scroll window under mouse (setq scroll-step 1) ;; keyboard scroll one line at a time (setq custom-file (concat user-emacs-directory "custom.el")) (load custom-file 'noerror) (setq interprogram-cut-function nil) (setq backup-directory-alist '(("" . "~/.emacs.d/backup"))) (setq package-check-signature nil) (defun ensure-package-installed (&rest packages) "Assure every package is installed, ask for installation if it’s not. Return a list of installed packages or nil for every skipped package." (mapcar (lambda (package) ;; (package-installed-p 'evil) (if (package-installed-p package) nil (if (y-or-n-p (format "Package %s is missing. Install it? " package)) (package-install package) package))) packages)) ;; make sure to have downloaded archive description. ;; Or use package-archive-contents as suggested by Nicolas Dudebout (or (file-exists-p package-user-dir) (package-refresh-contents)) (ensure-package-installed 'use-package 'ivy 'magit 'centaur-tabs 'lsp-mode 'lsp-ui 'lsp-ivy 'dashboard 'flycheck 'which-key 'doom-themes 'rainbow-mode 'rainbow-delimiters 'all-the-icons 'rustic 'simpleclip 'hl-todo 'powerline 'format-all 'auctex 'counsel 'swiper 'projectile 'org-roam 'smex 'smartparens 'origami 'company-quickhelp 'org-mime 'verb 'telephone-line 'undo-fu 'neotree 'restart-emacs 'git-timemachine 'org-super-agenda 'pyvenv) ;; need this after installation - makes it possible to bootstrap (eval-when-compile (require 'use-package)) (use-package flycheck :hook (prog-mode . flycheck-mode) :config (setq flycheck-checker-error-threshold 1000)) (use-package company :custom (company-minimum-prefix-length 1) (company-idle-delay 0.0) (company-tooltip-align-annotations t) :config (global-company-mode) ) (use-package company-quickhelp :ensure t :init (company-quickhelp-mode)) (use-package lsp-mode :after company :commands lsp :config (flyspell-prog-mode) (setq gc-cons-threshold 100000000 read-process-output-max (* 1024 1024) lsp-completion-provider :capf lsp-keep-workspace-alive nil lsp-enable-xref t lsp-enable-indentation t lsp-signature-auto-activate t lsp-idle-delay 0.2 create-lockfiles nil lsp-enable-on-type-formatting t lsp-before-save-edits t lsp-enable-imenu nil lsp-completion-enable t lsp-enable-snippet nil lsp-eldoc-render-all t lsp-enable-file-watchers nil lsp-enable-folding nil lsp-modeline-diagnostics-enable nil lsp-headerline-breadcrumb-enable nil lsp-semantic-tokens-enable nil) :hook ((js-mode js-jsx-mode python-mode svelte-mode ) . lsp-deferred) ) (with-eval-after-load 'js (define-key js-mode-map (kbd "M-.") nil)) (use-package lsp-pyright :ensure t :hook (python-mode . (lambda () (require 'lsp-pyright) (lsp-deferred)))) (use-package yasnippet :defer nil :hook (lsp-mode . yas-minor-mode) :diminish yas-minor-mode :custom (yas-indent-line nil) (yas-inhibit-overlap-modification-protection t) :custom-face (yas-field-highlight-face ((t (:inherit region))))) (use-package lsp-ui :after flycheck :diminish :commands lsp-ui-mode :bind (:map lsp-ui-mode-map ("M-i" . lsp-ui-doc-focus-frame)) :custom (lsp-ui-flycheck-enable t) (lsp-ui-doc-header t) (lsp-ui-doc-show-with-cursor t) (lsp-ui-doc-include-signature t) (lsp-ui-sideline-show-code-actions t) (lsp-ui-doc-delay 0.2) (lsp-ui-peek-enable t) (lsp-ui-peek-show-directory nil) :hook (lsp-mode . lsp-ui-mode) ) (use-package pyvenv :defer t) (use-package neotree :config (global-set-key [f8] 'neotree-toggle) (setq neo-show-hidden-files t neo-theme 'icons neo-smart-open t)) (use-package undo-fu :config (global-unset-key (kbd "C-z")) (global-set-key (kbd "C-z") 'undo-fu-only-undo) (global-set-key (kbd "C-S-z") 'undo-fu-only-redo)) (use-package telephone-line :init (setq telephone-line-primary-left-separator 'telephone-line-cubed-left telephone-line-secondary-left-separator 'telephone-line-cubed-hollow-left telephone-line-primary-right-separator 'telephone-line-cubed-right telephone-line-secondary-right-separator 'telephone-line-cubed-hollow-right telephone-line-height 24) :config (telephone-line-mode 1)) (use-package magit :defer :ensure t) ;; (use-package bm ;; :ensure t ;; :demand t ;; :init ;; (setq bm-restore-repository-on-load t) ;; (setq bm-repository-file "~/.emacs.d/bm-repository") ;; ;; save bookmarks ;; (setq-default bm-buffer-persistence t) ;; :config ;; (add-hook 'after-init-hook 'bm-repository-load) ;; ;; Saving bookmarks ;; (add-hook 'kill-buffer-hook #'bm-buffer-save) ;; (add-hook 'kill-emacs-hook #'(lambda nil ;; (bm-buffer-save-all) ;; (bm-repository-save))) ;; (add-hook 'find-file-hook #'bm-buffer-restore) ;; :bind (("" . bm-next) ;; ("S-" . bm-previous) ;; ("C-" . bm-toggle))) ;; (global-set-key (kbd " ") 'bm-next-mouse) ;; (global-set-key (kbd " ") 'bm-previous-mouse) ;; (global-set-key (kbd " ") 'bm-toggle-mouse) (use-package origami :bind (:map origami-mode-map ("C-c C-" . origami-toggle-node))) (add-hook 'prog-mode-hook #'origami-mode) (use-package smartparens-config :bind (:map smartparens-mode-map ("C-M-a" . sp-beginning-of-sexp) ("C-M-e" . sp-end-of-sexp) ("C-" . sp-down-sexp) ("C-" . sp-up-sexp) ("M-" . sp-backward-down-sexp) ("M-" . sp-backward-up-sexp) ("C-M-f" . sp-forward-sexp) ("C-M-b" . sp-backward-sexp) ("C-M-n" . sp-next-sexp) ("C-M-p" . sp-previous-sexp) ("C-S-f" . sp-forward-symbol) ("C-S-b" . sp-backward-symbol) ("C-" . sp-forward-slurp-sexp) ("M-" . sp-forward-barf-sexp) ("C-" . sp-backward-slurp-sexp) ("M-" . sp-backward-barf-sexp) ("C-M-t" . sp-transpose-sexp) ("C-M-k" . sp-kill-sexp) ("C-k" . sp-kill-hybrid-sexp) ("M-k" . sp-backward-kill-sexp) ("C-M-w" . sp-copy-sexp) ("C-M-d" . delete-sexp) ("M-" . backward-kill-word) ("C-" . sp-backward-kill-word) ([remap sp-backward-kill-word] . backward-kill-word) ("M-[" . sp-backward-unwrap-sexp) ("M-]" . sp-unwrap-sexp) ("C-x C-t" . sp-transpose-hybrid-sexp) ("C-c (" . wrap-with-parens) ("C-c [" . wrap-with-brackets) ("C-c {" . wrap-with-braces) ("C-c '" . wrap-with-single-quotes) ("C-c \"" . wrap-with-double-quotes) ("C-c _" . wrap-with-underscores) ("C-c `" . wrap-with-back-quotes)) :config (add-hook 'prog-mode-hook #'smartparens-mode)) (use-package centaur-tabs :init (setq centaur-tabs-enable-key-bindings t centaur-tabs-set-icons t centaur-tabs-set-modified-marker t centaur-tabs-style "chamfer" centaur-tabs-gray-out-icons 'buffer) :config (centaur-tabs-group-by-projectile-project) (centaur-tabs-headline-match) (centaur-tabs-mode 1)) (add-hook 'after-init-hook #'global-flycheck-mode) (add-hook 'prog-mode-hook #'rainbow-delimiters-mode) (add-hook 'css-mode-hook #'rainbow-mode) (when (fboundp 'windmove-default-keybindings) (windmove-default-keybindings)) (use-package which-key :config (which-key-mode)) ;; (use-package multiple-cursors) ;; (global-set-key (kbd "C-S-c C-S-c") 'mc/edit-lines) ;; (global-set-key (kbd "C->") 'mc/mark-next-like-this) ;; (global-set-key (kbd "C-<") 'mc/mark-previous-like-this) ;; (global-set-key (kbd "C-c C-<") 'mc/mark-all-like-this) (use-package ivy :ensure t :diminish ivy-mode :config (ivy-mode 1) (setq ivy-height 13) (setq ivy-wrap t) (setq ivy-use-virtual-buffers t) (setq ivy-count-format "(%d/%d) ")) (use-package lsp-ivy :after lsp-mode ivy :commands lsp-ivy-workspace-symbol) (use-package counsel :ensure t :bind* (("M-x" . counsel-M-x) ("C-c d d" . counsel-descbinds) ("C-x C-f" . counsel-find-file) ("C-x r f" . counsel-recentf) ("C-c g g" . counsel-git) ("C-c g G" . counsel-git-grep) ("C-x l" . counsel-locate) ("C-c g s" . counsel-grep-or-swiper) ("C-M-y" . counsel-yank-pop) ("C-c C-r" . ivy-resume) ("C-c i m" . counsel-imenu) ("C-c i M" . ivy-imenu-anywhere) ("C-c d s" . describe-symbol))) (use-package swiper :bind* (("C-s" . swiper))) (setq search-default-mode #'char-fold-to-regexp) (use-package projectile :ensure t :init (projectile-mode +1) :config (setq projectile-sort-order 'recentf projectile-require-project-root t projectile-completion-system 'ivy projectile-switch-project-action 'neotree-projectile-action) :bind (:map projectile-mode-map ("s-p" . projectile-command-map) ("C-c p" . projectile-command-map))) (defun trigger-org-company-complete () "Begins company-complete in org-mode buffer after pressing #+ chars." (interactive) (if (string-equal "#" (string (preceding-char))) (progn (insert "+") (company-complete)) (insert "+"))) ;; org settings (use-package org :mode ("\\.org\\'" . org-mode) :bind (:map org-mode-map ("C-c C-r" . verb-command-map) ("+" . 'trigger-org-company-complete)) (:map global-map ("C-c a" . org-agenda) ("C-c l" . org-store-link)) :config (setq org-replace-disputed-keys t org-enforce-todo-dependencies t org-enforce-todo-checkbox-dependencies t org-log-done nil org-clock-idle-time 10 org-startup-with-inline-images t org-startup-folded t org-pretty-entities t org-hide-leading-stars t org-hide-emphasis-markers t org-fontify-whole-heading-line t org-fontify-done-headline t org-fontify-quote-and-verse-blocks t org-startup-with-latex-preview t org-src-tab-acts-natively t org-src-fontify-natively t org-confirm-elisp-link-function nil org-display-custom-times t org-time-stamp-custom-formats '("<%a %b %e %Y>" . "<%a %b %e %Y %H:%M>") org-tag-alist '(("bug" . ?b) ("feature" . ?f) ("polish" . ?p) ("optimization" . ?o) ("devops" . ?d) ("reading" . ?r) ("writing" . ?w)) org-agenda-custom-commands '(("p" "Projects" todo "TODO" ((org-agenda-files '("~/Documents/org-mode/projects.org")) (org-agenda-sorting-strategy '(priority-down))) )) org-agenda-skip-scheduled-if-done t org-agenda-skip-deadline-if-done t org-agenda-todo-ignore-deadlines t org-agenda-todo-ignore-with-date t org-agenda-todo-ignore-scheduled t org-agenda-start-on-weekday nil org-agenda-skip-additional-timestamps-same-entry nil org-agenda-compact-blocks t org-agenda-block-separator nil org-agenda-start-day "+0d") :hook (org-agenda-mode . origami-mode) ) (use-package org-super-agenda :after org :ensure t :config (setq org-super-agenda-groups '( (:auto-category t) ) ) ) (use-package dashboard :after org :init (setq dashboard-set-footer nil dashboard-org-agenda-categories '("Tasks" "appointments") dashboard-center-content t dashboard-set-heading-icons t dashboard-set-file-icons t initial-buffer-choice (lambda () (get-buffer "*dashboard*"))) :ensure t :config (dashboard-setup-startup-hook)) (use-package org-projectile :after org :bind ("C-c n p" . org-projectile-project-todo-completing-read) :config (progn (setq org-projectile-projects-file "~/Documents/org-mode/projects.org") ;;(setq org-agenda-files (append org-agenda-files (org-projectile-todo-files))) (push (org-projectile-project-todo-entry) org-capture-templates)) :ensure t) (add-hook 'text-mode-hook 'turn-on-visual-line-mode) (use-package org-alert :ensure t :config (org-alert-enable) (setq alert-default-style 'libnotify org-alert-notify-cutoff 300 )) (add-hook 'org-mode-hook 'flyspell-mode) (setq org-agenda-files (list "~/Documents/org-mode/school.org" "~/Documents/org-mode/personal.org" "~/Documents/org-mode/tweaking.org" "~/Documents/org-mode/projects.org" ) ) (use-package org-roam :ensure t :after org :init (setq org-roam-v2-ack t) :bind* (("C-c n l" . org-roam-buffer-toggle) ("C-c n f" . org-roam-node-find) ("C-c n c" . org-roam-dailies-capture-today)) :bind (:map org-mode-map ("C-c n i" . org-roam-node-insert)) :custom (org-roam-directory "~/Documents/slipbox") (org-roam-capture-templates '(("d" "default" plain "%?" :if-new (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n") :unnarrowed t) ("e" "encrypted" plain "%?" :target (file+head "${slug}.org.gpg" "#+title: ${title}\n") :unnarrowed t) ) ) (org-roam-completion-everywhere t) (org-roam-completion-system 'default) (org-roam-dailies-directory "daily/") :config (use-package org-roam-dailies) (org-roam-setup) (org-roam-db-autosync-mode)) (use-package rustic :config (setq rustic-cargo-clippy-trigger-fix 'on-compile)) ;;(push 'rustic-clippy flycheck-checkers) (use-package all-the-icons) (defun notify-send (title msg) (interactive) ;; only the first line of the message is returned ;; (subseq msg 0 (search msg "\n")) (shell-command (concat "notify-send '" title "' '" msg "'"))) (setq TeX-auto-save t) (setq TeX-parse-self t) (setq-default TeX-master nil) ;;(use-package org-notify) ;;(org-notify-start) ;;(org-notify-add 'appt ;; '(:time "15m" :period "5m" :duration "30s" :action (notify-send org-notify-action-message))) ;;(add-hook 'org-mode-hook 'flyspell-mode 1) ;;(setq appt-disp-window-function (function facade-notify-appt)) ;;(load-library ".emacs_home") ;;(cond ((file-exists-p "~/.emacs_home.el") (load "~/.emacs_home.el"))) ;;(cond ((file-exists-p "~/.emacs_work.el") (load "~/.emacs_work.el"))) ;;; .emacs ends here