;;------------------------------------------------------------------------------ ;; ᚳᚻᚪᚱᛚᛖᛋ ᛣᚱᚪᛚᚪᛈᛈ ᛖᛗᚪᚳᛋ ᛋᛖᛏᛏᛁᛝᛋ ;; * Зонгор * ᛣᚩᛝᚩᚱ * ;;------------------------------------------------------------------------------ (require 'package) (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t) (add-to-list 'package-archives '("org" . "https://orgmode.org/elpa/") t) (package-initialize) (when (not package-archive-contents) (package-refresh-contents)) (unless (package-installed-p 'use-package) (package-install 'use-package)) ;; install packages automatically if not already present on your ;; system to be global for all packages (require 'use-package-ensure) (setq use-package-always-ensure t) (defvar bootstrap-version) (let ((bootstrap-file (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory)) (bootstrap-version 5)) (unless (file-exists-p bootstrap-file) (with-current-buffer (url-retrieve-synchronously "https://raw.githubusercontent.com/raxod502/straight.el/develop/install.el" 'silent 'inhibit-cookies) (goto-char (point-max)) (eval-print-last-sexp))) (load bootstrap-file nil 'nomessage)) (straight-use-package 'use-package) (setq straight-use-package-by-default t) (global-set-key [f11] 'toggle-frame-fullscreen) (global-set-key (kbd "C-s") 'ripgrep-regexp) (global-set-key (kbd "C-,") 'move-to-previous-window) (global-set-key (kbd "C-.") 'move-to-next-window) (global-set-key (kbd "M-i") 'xref-find-definitions) (global-set-key (kbd "C-M-i") 'xref-pop-marker-stack) ;; Auto-insert braces. Has some counter-intuitive behaviour, unfortunately. (electric-pair-mode 1) (setf electric-pair-skip-self nil) (set-frame-font "Fira Code 11") ;; setup fira code font ligatures (let ((alist '((33 . ".\\(?:\\(?:\\(?:!\\.\\|!\\)\\|\\(?:==\\|=\\)\\)\\)") ;; ! (35 . ".\\(?:\\(?:[!(:={]\\|\\(?:#\\(?:##\\|#\\)\\|#\\)\\|\\?\\|\\[\\|\\(?:_(\\|_\\)\\)\\)") ;; # (36 . ".\\(?:>\\)") ;; $ (37 . ".\\(?:%\\)") ;; % (38 . ".\\(?:&\\)") ;; & (42 . ".\\(?:\\(?:[/>]\\|\\(?:\\*\\*\\|\\*\\)\\)\\)") ;; * (43 . ".\\(?:\\(?:\\(?:\\+\\+\\|\\+\\)\\|>\\)\\)") ;; + (45 . ".\\(?:\\(?:[|~]\\|\\(?:-\\(?:-\\|>\\)\\|-\\)\\|\\(?:<<\\|<\\)\\|\\(?:>>\\|>\\)\\)\\)") ;; - (46 . ".\\(?:\\(?:-\\|\\(?:\\.\\(?:\\.\\|<\\)\\|\\.\\)\\|=\\|\\?\\)\\)") ;; . (47 . ".\\(?:\\(?:[>\\]\\|\\*\\|\\(?://\\|/\\)\\|\\(?:==\\|=\\)\\)\\)") ;; / (48 . ".\\(?:x[0-9A-Fa-f]\\)") ;; 0 (58 . ".\\(?:\\(?:[<->]\\|\\(?::[:=]\\|:\\)\\)\\)") ;; : (59 . ".\\(?:;\\)") ;; ; (60 . ".\\(?:\\(?:[:>]\\|!--\\|\\(?:\\$>\\|\\$\\)\\|\\(?:\\*>\\|\\*\\)\\|\\(?:\\+>\\|\\+\\)\\|\\(?:-\\(?:[<>|]\\|-\\)\\|-\\)\\|\\(?:/>\\|/\\)\\|\\(?:<\\(?:[<=]\\|-\\)\\|<\\)\\|\\(?:=\\(?:[<>|]\\|\\(?:=>\\|=\\)\\)\\|=\\)\\|\\(?:|\\(?:>\\|\\(?:||\\||\\)\\)\\||\\)\\|\\(?:~[>~]\\|~\\)\\)\\)") ;; < (61 . ".\\(?:\\(?:!=\\|/=\\|:=\\|<<\\|\\(?:=[=>]\\|=\\)\\|\\(?:>>\\|>\\)\\)\\)") ;; = (62 . ".\\(?:\\(?:\\(?:->\\|-\\)\\|:\\|\\(?:=>\\|=\\)\\|\\(?:>\\(?:[=>]\\|-\\)\\|>\\)\\)\\)") ;; > (63 . ".\\(?:\\(?:[:=]\\|\\.\\|\\?\\)\\)") ;; ? (70 . ".\\(?:l\\)") ;; F (84 . ".\\(?:l\\)") ;; T (91 . ".\\(?:\\(?::]\\||\\)\\)") ;; [ (92 . ".\\(?:/\\)") ;; \ (93 . ".\\(?:#\\)") ;; ] (94 . ".\\(?:=\\)") ;; ^ (95 . ".\\(?:\\(?:_\\||_\\)\\)") ;; _ (102 . ".\\(?:l\\)") ;; f (119 . ".\\(?:ww\\)") ;; w (123 . ".\\(?:|\\)") ;; { (124 . ".\\(?:\\(?:[>}]\\|\\(?:->\\|-\\)\\|\\(?:=>\\|=\\)\\|]\\|\\(?:|\\(?:[=>]\\|-\\||>\\)\\||\\)\\)\\)") ;; | (126 . ".\\(?:\\(?:[=>@]\\|-\\|\\(?:~>\\|~\\)\\)\\)")))) (dolist (char-regexp alist) (set-char-table-range composition-function-table (car char-regexp) `([,(cdr char-regexp) 0 font-shape-gstring])))) (scroll-bar-mode -1) (tool-bar-mode -1) (menu-bar-mode -1) (show-paren-mode 1) (blink-cursor-mode 0) (set-cursor-color "#ffffff") (defun move-to-previous-window () "Move to previous window." (interactive) (if (= (count-windows) 1) (other-frame 1) (select-window (previous-window)))) (defun move-to-next-window () "Move to next window." (interactive) (if (= (count-windows) 1) (other-frame 1) (select-window (next-window)))) (defun comment-eclipse () (interactive) (let ((start (line-beginning-position)) (end (line-end-position))) (when (or (not transient-mark-mode) (region-active-p)) (setq start (save-excursion (goto-char (region-beginning)) (beginning-of-line) (point)) end (save-excursion (goto-char (region-end)) (end-of-line) (point)))) (comment-or-uncomment-region start end))) (defun camel-case-to-spaces (string) "Convert a camel-cased STRING to a string with spaces between words and capitalize only the first word." (let* ((case-fold-search nil) ; Ensure case-sensitive matching (words (split-string (replace-regexp-in-string "\\([a-z]\\)\\([A-Z]\\)" "\\1 \\2" string) " ")) (first-word (car words)) (rest-words (mapcar 'downcase (cdr words))) (result (concat (capitalize first-word) " " (mapconcat 'identity rest-words " ")))) result)) (defun doc-comment () (interactive) "Insert a CPP documentation comment, at the beginning of the current line and position the cursor inside the comment. Additionally insert the word under the cursor since most of our comments are just the name of the function anyways." (princ "doc-comment") (let* ((bounds (bounds-of-thing-at-point 'word)) (word (buffer-substring-no-properties (car bounds) (cdr bounds)))) (beginning-of-line) (open-line 1) (indent-according-to-mode) (let* ((indentation (current-column))) (insert "/**\n") (indent-to indentation) (insert (concat " * " (camel-case-to-spaces word) ".\n")) (indent-to indentation) (insert " */") (end-of-line 0)))) (use-package evil :ensure t :init (setq evil-want-keybinding nil) (setq evil-want-integration t) ;; This is optional since it's already set to t by default. :config (evil-mode 1) ;; :q should kill the current buffer rather than quitting emacs entirely (evil-ex-define-cmd "q" 'kill-this-buffer) ;; Need to type out :quit to close emacs (evil-ex-define-cmd "quit" 'evil-quit) (define-key evil-normal-state-map (kbd "C-\\") 'comment-eclipse) (define-key evil-normal-state-map (kbd "u") 'undo-tree-undo) (define-key evil-normal-state-map (kbd "q") 'undo-tree-redo) (define-key evil-normal-state-map (kbd "w") 'evil-backward-word-begin) (define-key evil-normal-state-map (kbd "H") 'evil-first-non-blank) (define-key evil-normal-state-map (kbd "L") 'evil-end-of-line) (define-key evil-normal-state-map (kbd "K") 'backward-paragraph) (define-key evil-normal-state-map (kbd "J") 'forward-paragraph) (define-key evil-normal-state-map (kbd "C-x l") 'list-buffers) (define-key evil-normal-state-map (kbd "C-M-u") 'eval-buffer) (define-key evil-normal-state-map (kbd "C-M-p") 'compile) (define-key evil-normal-state-map (kbd "C-M-k") 'compile) (define-key evil-normal-state-map (kbd "M-/") 'dabbrev-expand) (define-key evil-normal-state-map (kbd "C-,") 'move-to-previous-window) (define-key evil-normal-state-map (kbd "C-.") 'move-to-next-window) (define-key evil-normal-state-map (kbd "C-M-\\") 'format-all-buffer) ;; (evil-define-key 'normal Buffer-menu-mode-map (kbd "RET") ) (evil-define-key 'normal neotree-mode-map (kbd "TAB") 'neotree-enter) (evil-define-key 'normal neotree-mode-map (kbd "SPC") 'neotree-quick-look) (evil-define-key 'normal neotree-mode-map (kbd "q") 'neotree-hide) (evil-define-key 'normal neotree-mode-map (kbd "RET") 'neotree-enter) (evil-define-key 'normal neotree-mode-map (kbd "g") 'neotree-refresh) (evil-define-key 'normal neotree-mode-map (kbd "n") 'neotree-next-line) (evil-define-key 'normal neotree-mode-map (kbd "p") 'neotree-previous-line) (evil-define-key 'normal neotree-mode-map (kbd "A") 'neotree-stretch-toggle) (evil-define-key 'normal neotree-mode-map (kbd "H") 'neotree-hidden-file-toggle)) (use-package evil-collection :after evil :ensure t :config (evil-collection-init)) (use-package dashboard :ensure t :config (dashboard-setup-startup-hook)) (use-package doom-themes :ensure t :config ;; Global settings (defaults) (setq doom-themes-enable-bold t ; if nil, bold is universally disabled doom-themes-enable-italic t) ; if nil, italics is universally disabled (load-theme 'doom-monokai-classic t) ;; Enable custom neotree theme (all-the-icons must be installed!) (doom-themes-neotree-config) ;; Corrects (and improves) org-mode's native fontification. (doom-themes-org-config)) (use-package solaire-mode :config (solaire-global-mode +1)) (use-package all-the-icons :if (display-graphic-p)) (use-package nerd-icons) (use-package doom-modeline :ensure t :init (doom-modeline-mode 1)) (use-package treemacs :ensure t :defer t :init (with-eval-after-load 'winum (define-key winum-keymap (kbd "M-0") #'treemacs-select-window)) :config (progn (setq treemacs-collapse-dirs (if treemacs-python-executable 3 0) treemacs-deferred-git-apply-delay 0.5 treemacs-directory-name-transformer #'identity treemacs-display-in-side-window t treemacs-eldoc-display 'simple treemacs-file-event-delay 2000 treemacs-file-extension-regex treemacs-last-period-regex-value treemacs-file-follow-delay 0.2 treemacs-file-name-transformer #'identity treemacs-follow-after-init t treemacs-expand-after-init t treemacs-find-workspace-method 'find-for-file-or-pick-first treemacs-git-command-pipe "" treemacs-goto-tag-strategy 'refetch-index treemacs-header-scroll-indicators '(nil . "^^^^^^") treemacs-hide-dot-git-directory t treemacs-indentation 2 treemacs-indentation-string " " treemacs-is-never-other-window nil treemacs-max-git-entries 5000 treemacs-missing-project-action 'ask treemacs-move-forward-on-expand nil treemacs-no-png-images nil treemacs-no-delete-other-windows t treemacs-project-follow-cleanup nil treemacs-persist-file (expand-file-name ".cache/treemacs-persist" user-emacs-directory) treemacs-position 'left treemacs-read-string-input 'from-child-frame treemacs-recenter-distance 0.1 treemacs-recenter-after-file-follow nil treemacs-recenter-after-tag-follow nil treemacs-recenter-after-project-jump 'always treemacs-recenter-after-project-expand 'on-distance treemacs-litter-directories '("/node_modules" "/.venv" "/.cask") treemacs-project-follow-into-home nil treemacs-show-cursor nil treemacs-show-hidden-files t treemacs-silent-filewatch nil treemacs-silent-refresh nil treemacs-sorting 'alphabetic-asc treemacs-select-when-already-in-treemacs 'move-back treemacs-space-between-root-nodes t treemacs-tag-follow-cleanup t treemacs-tag-follow-delay 1.5 treemacs-text-scale nil treemacs-user-mode-line-format nil treemacs-user-header-line-format nil treemacs-wide-toggle-width 70 treemacs-width 35 treemacs-width-increment 1 treemacs-width-is-initially-locked t treemacs-workspace-switch-cleanup nil) ;; The default width and height of the icons is 22 pixels. If you are ;; using a Hi-DPI display, uncomment this to double the icon size. ;;(treemacs-resize-icons 44) (treemacs-follow-mode nil) (treemacs-filewatch-mode t) (treemacs-fringe-indicator-mode 'always) (when treemacs-python-executable (treemacs-git-commit-diff-mode t)) (pcase (cons (not (null (executable-find "git"))) (not (null treemacs-python-executable))) (`(t . t) (treemacs-git-mode 'deferred)) (`(t . _) (treemacs-git-mode 'simple))) (treemacs-hide-gitignored-files-mode nil)) :bind (:map global-map ("M-0" . treemacs-select-window) ("C-x t 1" . treemacs-delete-other-windows) ("C-x t t" . treemacs) ("C-x t d" . treemacs-select-directory) ("C-x t B" . treemacs-bookmark) ("C-x t C-t" . treemacs-find-file) ("C-x t M-t" . treemacs-find-tag))) (use-package treemacs-evil :after (treemacs evil) :ensure t) (use-package treemacs-projectile :after (treemacs projectile) :ensure t) (use-package treemacs-icons-dired :hook (dired-mode . treemacs-icons-dired-enable-once) :ensure t) (use-package treemacs-magit :after (treemacs magit) :ensure t) (use-package treemacs-persp ;;treemacs-perspective if you use perspective.el vs. persp-mode :after (treemacs persp-mode) ;;or perspective vs. persp-mode :ensure t :config (treemacs-set-scope-type 'Perspectives)) (use-package treemacs-tab-bar ;;treemacs-tab-bar if you use tab-bar-mode :after (treemacs) :ensure t :config (treemacs-set-scope-type 'Tabs)) (use-package centaur-tabs :init (setq centaur-tabs-enable-key-bindings t) :config (setq centaur-tabs-style "bar" centaur-tabs-height 32 centaur-tabs-set-icons t centaur-tabs-show-new-tab-button t centaur-tabs-set-modified-marker t centaur-tabs-show-navigation-buttons t centaur-tabs-set-bar 'under centaur-tabs-show-count nil ;; centaur-tabs-label-fixed-length 15 ;; centaur-tabs-gray-out-icons 'buffer ;; centaur-tabs-plain-icons t x-underline-at-descent-line t centaur-tabs-left-edge-margin nil) (centaur-tabs-change-fonts (face-attribute 'default :font) 110) (centaur-tabs-headline-match) ;; (centaur-tabs-enable-buffer-alphabetical-reordering) ;; (setq centaur-tabs-adjust-buffer-order t) (centaur-tabs-mode t) (setq uniquify-separator "/") (setq uniquify-buffer-name-style 'forward) (defun centaur-tabs-buffer-groups () "`centaur-tabs-buffer-groups' control buffers' group rules. Group centaur-tabs with mode if buffer is derived from `eshell-mode' `emacs-lisp-mode' `dired-mode' `org-mode' `magit-mode'. All buffer name start with * will group to \"Emacs\". Other buffer group by `centaur-tabs-get-group-name' with project name." (list (cond ;; ((not (eq (file-remote-p (buffer-file-name)) nil)) ;; "Remote") ((or (string-equal "*" (substring (buffer-name) 0 1)) (memq major-mode '(magit-process-mode magit-status-mode magit-diff-mode magit-log-mode magit-file-mode magit-blob-mode magit-blame-mode ))) "Emacs") ((derived-mode-p 'prog-mode) "Editing") ((derived-mode-p 'dired-mode) "Dired") ((memq major-mode '(helpful-mode help-mode)) "Help") ((memq major-mode '(org-mode org-agenda-clockreport-mode org-src-mode org-agenda-mode org-beamer-mode org-indent-mode org-bullets-mode org-cdlatex-mode org-agenda-log-mode diary-mode)) "OrgMode") (t (centaur-tabs-get-group-name (current-buffer)))))) :hook (dashboard-mode . centaur-tabs-local-mode) (term-mode . centaur-tabs-local-mode) (calendar-mode . centaur-tabs-local-mode) (org-agenda-mode . centaur-tabs-local-mode) :bind ("C-" . centaur-tabs-backward) ("C-" . centaur-tabs-forward) ("C-S-" . centaur-tabs-move-current-tab-to-left) ("C-S-" . centaur-tabs-move-current-tab-to-right) (:map evil-normal-state-map ("g t" . centaur-tabs-forward) ("g T" . centaur-tabs-backward))) (use-package undo-tree :config (global-undo-tree-mode 1) :diminish undo-tree-mode) (use-package format-all :hook ((format-all-mode-hook . format-all-ensure-formatter))) (use-package rainbow-delimiters :hook ((prog-mode-hook . rainbow-delimiters-mode))) (use-package dumb-jump :hook ((xref-backend-functions . dumb-jump-xref-activate))) (use-package elfeed :config (global-set-key (kbd "C-x w") 'elfeed) (setq elfeed-feeds '(("https://programming.dev/feeds/c/rust.xml?sort=Active" programming) ("https://programming.dev/feeds/c/gamedev.xml?sort=Active" programming) ("https://hexbear.net/feeds/c/programming.xml?sort=Active" programming) ("https://programming.dev/feeds/c/golang.xml?sort=Active" programming) ("https://programming.dev/feeds/c/programming.xml?sort=Active" programming) ("https://xkcd.com/atom.xml" webcomic) ("https://www.existentialcomics.com/rss.xml" webcomic) ("https://hackaday.com/blog/feed/" hack) ("https://itsfoss.com/feed/" linux) ("https://lemmy.ml/feeds/c/linux.xml?sort=Active" linux os) ("https://lemmy.ml/feeds/c/raspberrypi.xml?sort=Active" os) ("http://git.9front.org/plan9front/plan9front/HEAD/feed.rss" os plan9) ("https://lemmy.ml/feeds/c/opensource.xml?sort=Active" os) ("https://lemmy.ml/feeds/c/linux_gaming.xml?sort=Active" games linux) ("https://steamcommunity.com/groups/GrabFreeGames/rss/" games) ("https://hexbear.net/feeds/c/news.xml?sort=Active" news) ("https://feeds.npr.org/1001/rss.xml" news) ("https://www.scmp.com/rss/91/feed" news) ("https://www.currentaffairs.org/feed" news) ("https://itsgoingdown.org/feed" news) ("http://feeds.ancientfaith.com/AmonSul" podcast) ("https://feeds.transistor.fm/the-magnificast" podcast) ("https://anchor.fm/s/c38df04/podcast/rss" podcast) ("https://yogpod.libsyn.com/rss" podcast) ("https://revolutionspodcast.libsyn.com/rss" podcast) ("https://feeds.acast.com/public/shows/5e7b777ba085cbe7192b0607" podcast) ("https://www.omnycontent.com/d/playlist/aaea4e69-af51-495e-afc9-a9760146922b/48da3539-5da0-41ed-a1c3-aac50170b88f/f7810480-e2d3-4be5-a559-aac50170b8a6/podcast.rss" podcast) ("https://feeds.soundcloud.com/users/soundcloud:users:672423809/sounds.rss" podcast) ("https://www.omnycontent.com/d/playlist/aaea4e69-af51-495e-afc9-a9760146922b/4a3ca742-9a68-4850-a727-ab790176c0e9/d04153b0-fc4c-4191-ab18-ab790179c563/podcast.rss" podcast) ("https://feeds.soundcloud.com/users/soundcloud:users:211911700/sounds.rss" podcast) ("https://access.acast.com/rss/5fd1001d81367d4cb41fe325/Q6BVQ6VF" podcast) ("https://feeds.npr.org/344098539/podcast.xml" podcast)))) (use-package projectile :ensure t :init (projectile-mode +1) :bind (:map projectile-mode-map ("s-p" . projectile-command-map) ("C-c p" . projectile-command-map))) (use-package ivy :init (ivy-mode 1)) (use-package org-modern :config (setq ;; Edit settings org-auto-align-tags nil org-tags-column 0 org-catch-invisible-edits 'show-and-error org-special-ctrl-a/e t org-insert-heading-respect-content t ;; Org styling, hide markup etc. org-hide-emphasis-markers t org-pretty-entities t org-ellipsis "…" ;; Agenda styling org-agenda-tags-column 0 org-agenda-block-separator ?─ org-agenda-time-grid '((daily today require-timed) (800 1000 1200 1400 1600 1800 2000) " ┄┄┄┄┄ " "┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄") org-agenda-current-time-string "◀── now ─────────────────────────────────────────────────") :init (add-hook 'org-mode-hook #'org-modern-mode) (add-hook 'org-mode-hook (lambda () (setq buffer-face-mode-face '(:family "Fira Code" :height 100)) (buffer-face-mode))) (add-hook 'org-agenda-finalize-hook #'org-modern-agenda)) (use-package restclient) (use-package markdown-mode :ensure t :mode ("README\\.md\\'" . gfm-mode) :init (setq markdown-command "multimarkdown")) (use-package docker :ensure t :bind ("C-c d" . docker)) (use-package docker-compose-mode) (use-package web-mode :config (add-to-list 'auto-mode-alist '("\\.jsx?$" . web-mode)) (setq web-mode-content-types-alist '(("jsx" . "\\.js[x]?\\'")))) (use-package typescript-mode) (use-package tide :ensure t :after (typescript-mode company flycheck) :hook ((typescript-mode . tide-setup) (typescript-mode . tide-hl-identifier-mode) (before-save . tide-format-before-save))) (use-package uxntal-mode) (use-package hy-mode) (use-package lua-mode) (use-package elm-mode) (use-package go-mode) (use-package rust-mode) (use-package cargo) (use-package ccls :ensure t :init (setq ccls-executable "/usr/bin/ccls") :hook ((c-mode c++-mode objc-mode cuda-mode) . (lambda () (require 'ccls) (lsp)))) (use-package lsp-mode :commands (lsp lsp-deferred) :init (setq lsp-keymap-prefix "C-c l") :hook ((go-mode) . lsp) ((rust-mode) . lsp)) (use-package lsp-ui :hook (lsp-mode . lsp-ui-mode) :config (setq lsp-ui-doc-enable t)) (use-package sly :ensure t :config (setq inferior-lisp-program "sbcl")) (use-package vterm :ensure t) (use-package dash) (use-package column-enforce-mode) (use-package desktop) (use-package magit) (use-package magit-lfs :ensure t :pin melpa) (use-package forge :after magit) (use-package ripgrep) (use-package git-gutter :ensure t :init (global-git-gutter-mode t)) (custom-set-variables ;; custom-set-variables was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. '(inhibit-startup-screen t) '(neo-theme 'icons)) (custom-set-faces ;; custom-set-faces was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. )