(add-to-list 'load-path "~/.config/emacs/scripts/") (require 'elpaca-setup) ;; The Elpaca Package Manager (require 'app-launchers) ;; Use emacs as a run launcher like dmenu (experimental) (require 'buffer-move) ;; Buffer-move for better window management (require 'eshell-prompt) ;; A fancy prompt for eshell (use-package all-the-icons :ensure t :if (display-graphic-p)) (use-package all-the-icons-dired :hook (dired-mode . (lambda () (all-the-icons-dired-mode t)))) (setq backup-directory-alist '((".*" . "~/.local/share/Trash/files"))) (use-package company :defer 2 :diminish :custom (company-begin-commands '(self-insert-command)) (company-idle-delay .1) (company-minimum-prefix-length 2) (company-show-numbers t) (company-tooltip-align-annotations 't) (global-company-mode t)) (use-package company-box :after company :diminish :hook (company-mode . company-box-mode)) (use-package dashboard :ensure t :init (setq initial-buffer-choice 'dashboard-open) (setq initial-scratch-message nil) (setq dashboard-set-heading-icons t) (setq dashboard-set-file-icons t) (setq dashboard-banner-logo-title "Emacs Is More Than A Text Editor!") ;;(setq dashboard-startup-banner 'logo) ;; use standard emacs logo as banner (setq dashboard-startup-banner "~/.config/emacs/images/dtmacs-logo.png") ;; use custom image as banner (setq dashboard-center-content nil) ;; set to 't' for centered content (setq dashboard-items '((recents . 5) (agenda . 5 ) (bookmarks . 3) (projects . 3))) :custom (dashboard-modify-heading-icons '((recents . "file-text") (bookmarks . "book"))) :config (dashboard-setup-startup-hook)) ;; IMPORTANT: This allows us to use our custom Emacs launchers ;; without getting the annoying second window created. ;; (setq display-buffer-alist ;; '(("^Dashboard$" ;; Only target the Dashboard buffer specifically ;; (display-buffer-no-window) ;; (allow-no-window . t)))) (use-package diminish) (use-package dired-open :config (setq dired-open-extensions '(("gif" . "sxiv") ("jpg" . "sxiv") ("png" . "sxiv") ("mkv" . "mpv") ("mp4" . "mpv")))) (use-package peep-dired :after dired :hook (evil-normalize-keymaps . peep-dired-hook) :config (evil-define-key 'normal dired-mode-map (kbd "h") 'dired-up-directory) (evil-define-key 'normal dired-mode-map (kbd "l") 'dired-open-file) ; use dired-find-file instead if not using dired-open package (evil-define-key 'normal peep-dired-mode-map (kbd "j") 'peep-dired-next-file) (evil-define-key 'normal peep-dired-mode-map (kbd "k") 'peep-dired-prev-file) ) (use-package drag-stuff :init (drag-stuff-global-mode 1) (drag-stuff-define-keys)) (setq ediff-split-window-function 'split-window-horizontally ediff-window-setup-function 'ediff-setup-windows-plain) (defun dt-ediff-hook () (ediff-setup-keymap) (define-key ediff-mode-map "j" 'ediff-next-difference) (define-key ediff-mode-map "k" 'ediff-previous-difference)) (add-hook 'ediff-mode-hook 'dt-ediff-hook) (use-package elfeed :config (setq elfeed-search-feed-face ":foreground #ffffff :weight bold" elfeed-feeds (quote (("https://www.reddit.com/r/linux.rss" reddit linux) ("https://www.reddit.com/r/commandline.rss" reddit commandline) ("https://www.reddit.com/r/distrotube.rss" reddit distrotube) ("https://www.reddit.com/r/emacs.rss" reddit emacs) ("https://www.gamingonlinux.com/article_rss.php" gaming linux) ("https://hackaday.com/blog/feed/" hackaday linux) ("https://opensource.com/feed" opensource linux) ("https://linux.softpedia.com/backend.xml" softpedia linux) ("https://itsfoss.com/feed/" itsfoss linux) ("https://www.zdnet.com/topic/linux/rss.xml" zdnet linux) ("https://www.phoronix.com/rss.php" phoronix linux) ("http://feeds.feedburner.com/d0od" omgubuntu linux) ("https://www.computerworld.com/index.rss" computerworld linux) ("https://www.networkworld.com/category/linux/index.rss" networkworld linux) ("https://www.techrepublic.com/rssfeeds/topic/open-source/" techrepublic linux) ("https://betanews.com/feed" betanews linux) ("http://lxer.com/module/newswire/headlines.rss" lxer linux) ("https://distrowatch.com/news/dwd.xml" distrowatch linux))))) (use-package elfeed-goodies :init (elfeed-goodies/setup) :config (setq elfeed-goodies/entry-pane-size 0.5)) (use-package ellama :init (setopt ellama-keymap-prefix "C-c e") ;; keymap for all ellama functions (setopt ellama-language "English") ;; language ellama should translate to (require 'llm-ollama) (setopt ellama-provider (make-llm-ollama ;; this model should be pulled to use it ;; value should be the same as you print in terminal during pull :chat-model "llama3.2" :embedding-model "nomic-embed-text" :default-chat-non-standard-params '(("num_ctx" . 8192)))) ;; Predefined llm providers for interactive switching. (setopt ellama-providers '(("zephyr" . (make-llm-ollama :chat-model "zephyr" :embedding-model "zephyr")) ("llama3.1" . (make-llm-ollama :chat-model "llama3.1" :embedding-model "llama3.1")) ("mixtral" . (make-llm-ollama :chat-model "mixtral" :embedding-model "mixtral")))) (setopt ellama-naming-scheme 'ellama-generate-name-by-llm) ;; Translation llm provider (setopt ellama-translation-provider (make-llm-ollama :chat-model "mixtral" :embedding-model "nomic-embed-text")) :config (setq ellama-sessions-directory "~/.config/emacs/ellama-sessions/" ellama-sessions-auto-save t)) (use-package eradio :init (setq eradio-player '("mpv" "--no-video" "--no-terminal")) :config (setq eradio-channels '(("Deep Space One" . "https://somafm.com/deepspaceone130.pls") ("GrooveSalad" . "https://somafm.com/groovesalad130.pls") ("Heavyweight Reggae" . "https://somafm.com/reggae130.pls") ("Left Coast 70s" . "https://somafm.com/seventies130.pls") ("SonicUniverse" . "https://somafm.com/sonicuniverse130.pls") ("ThistleRadio Celtic" . "https://somafm.com/thistle130.pls")))) ;; Expands to: (elpaca evil (use-package evil :demand t)) (use-package evil :init ;; tweak evil's configuration before loading it (setq evil-want-integration t ;; This is optional since it's already set to t by default. evil-want-keybinding nil evil-vsplit-window-right t evil-split-window-below t evil-undo-system 'undo-redo) ;; Adds vim-like C-r redo functionality (evil-mode)) (use-package evil-collection :after evil :config ;; Do not uncomment this unless you want to specify each and every mode ;; that evil-collection should works with. The following line is here ;; for documentation purposes in case you need it. ;; (setq evil-collection-mode-list '(calendar dashboard dired ediff info magit ibuffer)) (add-to-list 'evil-collection-mode-list 'help) ;; evilify help mode (evil-collection-init)) (use-package evil-tutor) ;; Using RETURN to follow links in Org/Evil ;; Unmap keys in 'evil-maps if not done, (setq org-return-follows-link t) will not work (with-eval-after-load 'evil-maps (define-key evil-motion-state-map (kbd "SPC") nil) (define-key evil-motion-state-map (kbd "RET") nil) (define-key evil-motion-state-map (kbd "TAB") nil)) ;; Setting RETURN key in org-mode to follow links (setq org-return-follows-link t) (use-package flycheck :ensure t :defer t :diminish :init (global-flycheck-mode)) (set-face-attribute 'default nil :font "JetBrains Mono" :height 110 :weight 'regular) (set-face-attribute 'variable-pitch nil :font "Ubuntu" :height 120 :weight 'regular) (set-face-attribute 'fixed-pitch nil :font "JetBrains Mono" :height 110 :weight 'regular) ;; Makes commented text and keywords italics. ;; This is working in emacsclient but not emacs. ;; Your font must have an italic face available. (set-face-attribute 'font-lock-comment-face nil :slant 'italic) (set-face-attribute 'font-lock-keyword-face nil :slant 'italic) ;; This sets the default font on all graphical frames created after restarting Emacs. ;; Does the same thing as 'set-face-attribute default' above, but emacsclient fonts ;; are not right unless I also add this method of setting the default font. (add-to-list 'default-frame-alist '(font . "JetBrains Mono-11")) ;; Uncomment the following line if line spacing needs adjusting. (setq-default line-spacing 0.12) (set-face-background 'mouse "#ffffff") (global-set-key (kbd "C-=") 'text-scale-increase) (global-set-key (kbd "C--") 'text-scale-decrease) (global-set-key (kbd "") 'text-scale-increase) (global-set-key (kbd "") 'text-scale-decrease) (use-package nerd-icons ;; :custom ;; The Nerd Font you want to use in GUI ;; "Symbols Nerd Font Mono" is the default and is recommended ;; but you can use any other Nerd Font if you want ;; (nerd-icons-font-family "Symbols Nerd Font Mono") ) (use-package general :config (general-evil-setup) ;; set up 'SPC' as the global leader key (general-create-definer dt/leader-keys :states '(normal insert visual emacs) :keymaps 'override :prefix "SPC" ;; set leader :global-prefix "M-SPC") ;; access leader in insert mode (dt/leader-keys "SPC" '(counsel-M-x :wk "Counsel M-x") "." '(find-file :wk "Find file") "=" '(perspective-map :wk "Perspective") ;; Lists all the perspective keybindings "TAB TAB" '(comment-line :wk "Comment lines") "u" '(universal-argument :wk "Universal argument")) (dt/leader-keys "a" '(:ignore t :wk "A.I.") "a a" '(ellama-ask-about :wk "Ask ellama about region") "a e" '(:ignore t :wk "Ellama enhance") "a e g" '(ellama-improve-grammar :wk "Ellama enhance wording") "a e w" '(ellama-improve-wording :wk "Ellama enhance grammar") "a i" '(ellama-chat :wk "Ask ellama") "a p" '(ellama-provider-select :wk "Ellama provider select") "a s" '(ellama-summarize :wk "Ellama summarize region") "a t" '(ellama-translate :wk "Ellama translate region")) (dt/leader-keys "b" '(:ignore t :wk "Bookmarks/Buffers") "b b" '(switch-to-buffer :wk "Switch to buffer") "b c" '(clone-indirect-buffer :wk "Create indirect buffer copy in a split") "b C" '(clone-indirect-buffer-other-window :wk "Clone indirect buffer in new window") "b d" '(bookmark-delete :wk "Delete bookmark") "b i" '(ibuffer :wk "Ibuffer") "b k" '(kill-current-buffer :wk "Kill current buffer") "b K" '(kill-some-buffers :wk "Kill multiple buffers") "b l" '(list-bookmarks :wk "List bookmarks") "b m" '(bookmark-set :wk "Set bookmark") "b n" '(next-buffer :wk "Next buffer") "b p" '(previous-buffer :wk "Previous buffer") "b r" '(revert-buffer :wk "Reload buffer") "b R" '(rename-buffer :wk "Rename buffer") "b s" '(basic-save-buffer :wk "Save buffer") "b S" '(save-some-buffers :wk "Save multiple buffers") "b w" '(bookmark-save :wk "Save current bookmarks to bookmark file")) (dt/leader-keys "d" '(:ignore t :wk "Dired") "d d" '(dired :wk "Open dired") "d f" '(wdired-finish-edit :wk "Writable dired finish edit") "d j" '(dired-jump :wk "Dired jump to current") "d n" '(neotree-dir :wk "Open directory in neotree") "d p" '(peep-dired :wk "Peep-dired") "d w" '(wdired-change-to-wdired-mode :wk "Writable dired")) (dt/leader-keys "e" '(:ignore t :wk "Ediff/Eshell/Eval/EWW") "e b" '(eval-buffer :wk "Evaluate elisp in buffer") "e d" '(eval-defun :wk "Evaluate defun containing or after point") "e e" '(eval-expression :wk "Evaluate and elisp expression") "e f" '(ediff-files :wk "Run ediff on a pair of files") "e F" '(ediff-files3 :wk "Run ediff on three files") "e h" '(counsel-esh-history :which-key "Eshell history") "e l" '(eval-last-sexp :wk "Evaluate elisp expression before point") "e n" '(eshell-new :wk "Create new eshell buffer") "e r" '(eval-region :wk "Evaluate elisp in region") "e R" '(eww-reload :which-key "Reload current page in EWW") "e s" '(eshell :which-key "Eshell") "e w" '(eww :which-key "EWW emacs web wowser")) (dt/leader-keys "f" '(:ignore t :wk "Files") "f c" '((lambda () (interactive) (find-file "~/.config/emacs/config.org")) :wk "Open emacs config.org") "f e" '((lambda () (interactive) (dired "~/.config/emacs/")) :wk "Open user-emacs-directory in dired") "f d" '(find-grep-dired :wk "Search for string in files in DIR") "f g" '(counsel-grep-or-swiper :wk "Search for string current file") "f i" '((lambda () (interactive) (find-file "~/.config/emacs/init.el")) :wk "Open emacs init.el") "f j" '(counsel-file-jump :wk "Jump to a file below current directory") "f l" '(counsel-locate :wk "Locate a file") "f r" '(counsel-recentf :wk "Find recent files") "f u" '(sudo-edit-find-file :wk "Sudo find file") "f U" '(sudo-edit :wk "Sudo edit file")) (dt/leader-keys "g" '(:ignore t :wk "Git") "g /" '(magit-dispatch :wk "Magit dispatch") "g ." '(magit-file-dispatch :wk "Magit file dispatch") "g b" '(magit-branch-checkout :wk "Switch branch") "g c" '(:ignore t :wk "Create") "g c b" '(magit-branch-and-checkout :wk "Create branch and checkout") "g c c" '(magit-commit-create :wk "Create commit") "g c f" '(magit-commit-fixup :wk "Create fixup commit") "g C" '(magit-clone :wk "Clone repo") "g f" '(:ignore t :wk "Find") "g f c" '(magit-show-commit :wk "Show commit") "g f f" '(magit-find-file :wk "Magit find file") "g f g" '(magit-find-git-config-file :wk "Find gitconfig file") "g F" '(magit-fetch :wk "Git fetch") "g g" '(magit-status :wk "Magit status") "g i" '(magit-init :wk "Initialize git repo") "g l" '(magit-log-buffer-file :wk "Magit buffer log") "g r" '(vc-revert :wk "Git revert file") "g s" '(magit-stage-file :wk "Git stage file") "g t" '(git-timemachine :wk "Git time machine") "g u" '(magit-stage-file :wk "Git unstage file")) (dt/leader-keys "h" '(:ignore t :wk "Help") "h a" '(counsel-apropos :wk "Apropos") "h b" '(describe-bindings :wk "Describe bindings") "h c" '(describe-char :wk "Describe character under cursor") "h d" '(:ignore t :wk "Emacs documentation") "h d a" '(about-emacs :wk "About Emacs") "h d d" '(view-emacs-debugging :wk "View Emacs debugging") "h d f" '(view-emacs-FAQ :wk "View Emacs FAQ") "h d m" '(info-emacs-manual :wk "The Emacs manual") "h d n" '(view-emacs-news :wk "View Emacs news") "h d o" '(describe-distribution :wk "How to obtain Emacs") "h d p" '(view-emacs-problems :wk "View Emacs problems") "h d t" '(view-emacs-todo :wk "View Emacs todo") "h d w" '(describe-no-warranty :wk "Describe no warranty") "h e" '(view-echo-area-messages :wk "View echo area messages") "h f" '(describe-function :wk "Describe function") "h F" '(describe-face :wk "Describe face") "h g" '(describe-gnu-project :wk "Describe GNU Project") "h i" '(info :wk "Info") "h I" '(describe-input-method :wk "Describe input method") "h k" '(describe-key :wk "Describe key") "h l" '(view-lossage :wk "Display recent keystrokes and the commands run") "h L" '(describe-language-environment :wk "Describe language environment") "h m" '(describe-mode :wk "Describe mode") "h r" '(:ignore t :wk "Reload") "h r r" '((lambda () (interactive) (load-file "~/.config/emacs/init.el") (ignore (elpaca-process-queues))) :wk "Reload emacs config") "h t" '(load-theme :wk "Load theme") "h v" '(describe-variable :wk "Describe variable") "h w" '(where-is :wk "Prints keybinding for command if set") "h x" '(describe-command :wk "Display full documentation for command")) (dt/leader-keys "m" '(:ignore t :wk "Org") "m a" '(org-agenda :wk "Org agenda") "m c" '(counsel-org-capture :wk "Org capture") "m e" '(org-export-dispatch :wk "Org export dispatch") "m i" '(org-toggle-item :wk "Org toggle item") "m p" '(org-priority :wk "Org priority") "m t" '(org-todo-list :wk "Org todo list") "m B" '(org-babel-tangle :wk "Org babel tangle") "m T" '(org-todo :wk "Org todo")) (dt/leader-keys "m b" '(:ignore t :wk "Tables") "m b -" '(org-table-insert-hline :wk "Insert hline in table")) (dt/leader-keys "m d" '(:ignore t :wk "Date/deadline") "m d t" '(org-time-stamp :wk "Org time stamp")) (dt/leader-keys "o" '(:ignore t :wk "Open") "o d" '(dashboard-open :wk "Dashboard") "o e" '(elfeed :wk "Elfeed RSS") "o f" '(make-frame :wk "Open buffer in new frame") "o F" '(select-frame-by-name :wk "Select frame by name") "o j" '((lambda () (interactive) (find-file (concat org-directory "journal.org"))) :wk "Journal") "o n" '((lambda () (interactive) (find-file org-default-notes-file)) :wk "Notes") "o t" '((lambda () (interactive) (find-file (concat org-directory "tasks.org"))) :wk "Tasks")) ;; projectile-command-map already has a ton of bindings ;; set for us, so no need to specify each individually. (dt/leader-keys "p" '(projectile-command-map :wk "Projectile")) (dt/leader-keys "r" '(:ignore t :wk "Radio") "r p" '(eradio-play :wk "Eradio play") "r s" '(eradio-stop :wk "Eradio stop") "r t" '(eradio-toggle :wk "Eradio toggle")) (dt/leader-keys "s" '(:ignore t :wk "Search") "s d" '(dictionary-search :wk "Search dictionary") "s m" '(man :wk "Man pages") "s o" '(pdf-occur :wk "Pdf search lines matching STRING") "s t" '(tldr :wk "Lookup TLDR docs for a command") "s w" '(woman :wk "Similar to man but doesn't require man")) (dt/leader-keys "t" '(:ignore t :wk "Toggle") "t e" '(eshell-toggle :wk "Toggle eshell") "t f" '(flycheck-mode :wk "Toggle flycheck") "t l" '(display-line-numbers-mode :wk "Toggle line numbers") "t n" '(neotree-toggle :wk "Toggle neotree file viewer") "t o" '(org-mode :wk "Toggle org mode") "t r" '(rainbow-mode :wk "Toggle rainbow mode") "t t" '(visual-line-mode :wk "Toggle truncated lines") "t v" '(vterm-toggle :wk "Toggle vterm")) (dt/leader-keys "w" '(:ignore t :wk "Windows/Words") ;; Window splits "w c" '(evil-window-delete :wk "Close window") "w n" '(evil-window-new :wk "New window") "w s" '(evil-window-split :wk "Horizontal split window") "w v" '(evil-window-vsplit :wk "Vertical split window") ;; Window motions "w h" '(evil-window-left :wk "Window left") "w j" '(evil-window-down :wk "Window down") "w k" '(evil-window-up :wk "Window up") "w l" '(evil-window-right :wk "Window right") "w w" '(evil-window-next :wk "Goto next window") ;; Move Windows "w H" '(buf-move-left :wk "Buffer move left") "w J" '(buf-move-down :wk "Buffer move down") "w K" '(buf-move-up :wk "Buffer move up") "w L" '(buf-move-right :wk "Buffer move right") ;; Words "w d" '(downcase-word :wk "Downcase word") "w u" '(upcase-word :wk "Upcase word") "w =" '(count-words :wk "Count words/lines for buffer")) ) (use-package git-timemachine :after git-timemachine :hook (evil-normalize-keymaps . git-timemachine-hook) :config (evil-define-key 'normal git-timemachine-mode-map (kbd "C-j") 'git-timemachine-show-previous-revision) (evil-define-key 'normal git-timemachine-mode-map (kbd "C-k") 'git-timemachine-show-next-revision) ) (use-package hl-todo :hook ((org-mode . hl-todo-mode) (prog-mode . hl-todo-mode)) :config (setq hl-todo-highlight-punctuation ":" hl-todo-keyword-faces `(("TODO" warning bold) ("FIXME" error bold) ("HACK" font-lock-constant-face bold) ("REVIEW" font-lock-keyword-face bold) ("NOTE" success bold) ("DEPRECATED" font-lock-doc-face bold)))) (use-package counsel :after ivy :diminish :config (counsel-mode) (setq ivy-initial-inputs-alist nil)) ;; removes starting ^ regex in M-x (use-package ivy :bind ;; ivy-resume resumes the last Ivy-based completion. (("C-c C-r" . ivy-resume) ("C-x B" . ivy-switch-buffer-other-window)) :diminish :custom (setq ivy-use-virtual-buffers t) (setq ivy-count-format "(%d/%d) ") (setq enable-recursive-minibuffers t) :config (ivy-mode)) (use-package all-the-icons-ivy-rich :ensure t :init (all-the-icons-ivy-rich-mode 1)) (use-package ivy-rich :after ivy :ensure t :init (ivy-rich-mode 1) ;; this gets us descriptions in M-x. :custom (ivy-virtual-abbreviate 'full ivy-rich-switch-buffer-align-virtual-buffer t ivy-rich-path-style 'abbrev) :config (ivy-set-display-transformer 'ivy-switch-buffer 'ivy-rich-switch-buffer-transformer)) (use-package dart-mode) (use-package haskell-mode) (use-package kdl-mode) (use-package lua-mode) (use-package php-mode) (use-package rust-mode) (global-set-key [escape] 'keyboard-escape-quit) (use-package doom-modeline :ensure t :init (doom-modeline-mode 1) :config (setq doom-modeline-height 35 ;; sets modeline height doom-modeline-bar-width 5 ;; sets right bar width doom-modeline-persp-name t ;; adds perspective name to modeline doom-modeline-persp-icon t)) ;; adds folder icon next to persp name (use-package neotree :config (setq neo-smart-open t neo-show-hidden-files t neo-window-width 55 neo-window-fixed-size nil inhibit-compacting-font-caches t projectile-switch-project-action 'neotree-projectile-action) ;; truncate long file names in neotree (add-hook 'neo-after-create-hook #'(lambda (_) (with-current-buffer (get-buffer neo-buffer-name) (setq truncate-lines t) (setq word-wrap nil) (make-local-variable 'auto-hscroll-mode) (setq auto-hscroll-mode nil))))) (setq org-directory "~/nc/Org/") ;; List files that org-agenda will use. (setq org-agenda-files (list (concat org-directory "tasks.org") (concat org-directory "notes.org") (concat org-directory "journal.org"))) ;; Defines the global fallback destination for all your Org notes. (setq org-default-notes-file (concat org-directory "notes.org")) ;; (Optional) Create custom templates ;; NOTE '%U' is an inactive timestamp meaning the item will not show ;; in org-agenda. Use '%^t' for active timestamps instead. ;; You can manually switch active/inactive with SHIFT-up/down. (setq org-capture-templates `( ;; Idea capture ("i" "idea" entry (file ,org-default-notes-file) "* %? :idea:\n%U\n") ;; Journal entry ("j" "journal" entry (file+olp+datetree ,(concat org-directory "journal.org")) "* %U\n%?\n") ;; Note with link to source ("n" "note" entry (file ,org-default-notes-file) "* %? :note:\n%^t\n%a\n") ;; Todo with context ("t" "task" entry (file+headline ,(concat org-directory "tasks.org") "Tasks") "* TODO %?\n%^t\n%a\n") )) (add-hook 'org-mode-hook 'org-indent-mode) (use-package org-bullets) (add-hook 'org-mode-hook (lambda () (org-bullets-mode 1))) (eval-after-load 'org-indent '(diminish 'org-indent-mode)) (custom-set-faces '(org-level-1 ((t (:inherit outline-1 :height 1.7)))) '(org-level-2 ((t (:inherit outline-2 :height 1.6)))) '(org-level-3 ((t (:inherit outline-3 :height 1.5)))) '(org-level-4 ((t (:inherit outline-4 :height 1.4)))) '(org-level-5 ((t (:inherit outline-5 :height 1.3)))) '(org-level-6 ((t (:inherit outline-5 :height 1.2)))) '(org-level-7 ((t (:inherit outline-5 :height 1.1))))) (require 'org-tempo) (setq org-src-preserve-indentation t) (use-package toc-org :commands toc-org-enable :init (add-hook 'org-mode-hook 'toc-org-enable)) (use-package ox-hugo :ensure t ;Auto-install the package from Melpa :after ox) (use-package pdf-tools :defer t :commands (pdf-loader-install) :mode "\\.pdf\\'" :bind (:map pdf-view-mode-map ("j" . pdf-view-next-line-or-next-page) ("k" . pdf-view-previous-line-or-previous-page) ("C-=" . pdf-view-enlarge) ("C--" . pdf-view-shrink)) :init (pdf-loader-install) :config (add-to-list 'revert-without-query ".pdf")) (add-hook 'pdf-view-mode-hook #'(lambda () (interactive) (display-line-numbers-mode -1) (blink-cursor-mode -1) (doom-modeline-mode -1))) (use-package perspective :custom ;; NOTE! I have also set 'SCP =' to open the perspective menu. ;; I'm only setting the additional binding because setting it ;; helps suppress an annoying warning message. (persp-mode-prefix-key (kbd "C-c M-p")) :init (persp-mode) :config ;; Sets a file to write to when we save states (setq persp-state-default-file "~/.config/emacs/sessions")) ;; This will group buffers by persp-name in ibuffer. (add-hook 'ibuffer-hook (lambda () (persp-ibuffer-set-filter-groups) (unless (eq ibuffer-sorting-mode 'alphabetic) (ibuffer-do-sort-by-alphabetic)))) ;; Automatically save perspective states to file when Emacs exits. (add-hook 'kill-emacs-hook #'persp-state-save) (use-package projectile :config (projectile-mode 1)) (use-package rainbow-delimiters :hook ((emacs-lisp-mode . rainbow-delimiters-mode) (clojure-mode . rainbow-delimiters-mode))) (use-package rainbow-mode :diminish :hook org-mode prog-mode) (delete-selection-mode 1) ;; You can select text and delete it by typing. (electric-indent-mode -1) ;; Turn off the weird indenting that Emacs does by default. (electric-pair-mode 1) ;; Turns on automatic parens pairing ;; The following prevents <> from auto-pairing when electric-pair-mode is on. ;; Otherwise, org-tempo is broken when you try to ") #'pcomplete-list))) ;; A function for easily creating multiple buffers of 'eshell'. ;; NOTE: `C-u M-x eshell` would also create new 'eshell' buffers. (defun eshell-new (name) "Create new eshell buffer named NAME." (interactive "sName: ") (setq name (concat "$" name)) (eshell) (rename-buffer name)) (use-package eshell-toggle :custom (eshell-toggle-size-fraction 3) (eshell-toggle-use-projectile-root t) (eshell-toggle-run-command nil) (eshell-toggle-init-function #'eshell-toggle-init-ansi-term)) (use-package eshell-syntax-highlighting :after esh-mode :config (eshell-syntax-highlighting-global-mode +1)) ;; eshell-syntax-highlighting -- adds fish/zsh-like syntax highlighting. ;; eshell-rc-script -- your profile for eshell; like a bashrc for eshell. ;; eshell-aliases-file -- sets an aliases file for the eshell. (setq eshell-rc-script (concat user-emacs-directory "eshell/profile") eshell-aliases-file (concat user-emacs-directory "eshell/aliases") eshell-history-size 5000 eshell-buffer-maximum-lines 5000 eshell-hist-ignoredups t eshell-scroll-to-bottom-on-input t eshell-destroy-buffer-when-process-dies t eshell-visual-commands'("bash" "fish" "htop" "ssh" "top" "zsh")) (use-package vterm :ensure t :config (setq shell-file-name "/bin/sh" vterm-max-scrollback 5000)) (use-package vterm-toggle :ensure t :after vterm :config ;; When running programs in Vterm and in 'normal' mode, make sure that ESC ;; kills the program as it would in most standard terminal programs. (evil-define-key 'normal vterm-mode-map (kbd "") 'vterm--self-insert) (setq vterm-toggle-fullscreen-p nil) (setq vterm-toggle-scope 'project) (add-to-list 'display-buffer-alist '((lambda (buffer-or-name _) (let ((buffer (get-buffer buffer-or-name))) (with-current-buffer buffer (or (equal major-mode 'vterm-mode) (string-prefix-p vterm-buffer-name (buffer-name buffer)))))) (display-buffer-reuse-window display-buffer-at-bottom) ;;(display-buffer-reuse-window display-buffer-in-direction) ;;display-buffer-in-direction/direction/dedicated is added in emacs27 ;;(direction . bottom) ;;(dedicated . t) ;dedicated is supported in emacs27 (reusable-frames . visible) (window-height . 0.4)))) (use-package sudo-edit) (add-to-list 'custom-theme-load-path "~/.config/emacs/themes/") (use-package doom-themes :config (setq doom-themes-enable-bold t ; if nil, bold is universally disabled doom-themes-enable-italic t) ; if nil, italics is universally disabled ;; Sets the default theme to load!!! (load-theme 'doom-one 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 tldr) (add-to-list 'default-frame-alist '(alpha-background . 100)) ; For all new frames henceforth (use-package which-key :init (which-key-mode 1) :diminish :config (setq which-key-side-window-location 'bottom which-key-sort-order #'which-key-key-order-alpha which-key-allow-imprecise-window-fit nil which-key-sort-uppercase-first nil which-key-add-column-padding 1 which-key-max-display-columns nil which-key-min-display-lines 6 which-key-side-window-slot -10 which-key-side-window-max-height 0.25 which-key-idle-delay 0.8 which-key-max-description-length 25 which-key-allow-imprecise-window-fit nil which-key-separator " → " )) (defun reader () (interactive) (let ((choices '(("First" . "Hi!") ("Second" . 'second-choice) ("Third" . 'third-choice)))) (alist-get (completing-read "Choose: " choices) choices nil nil 'message))) (defun github-code-search () "Search code on github for a given language." (interactive) (let ((language (completing-read "Language: " '("Emacs Lisp" "Python" "Clojure" "R"))) (code (read-string "Code: "))) (browse-url (concat "https://github.com/search?l=" language "&type=code&q=" code)))) (defun dm-search () "Search various search engines." (interactive) (let ((engine (completing-read "Search Engine: " '("Arch Wiki" "Bing" "Google" "Wikipedia"))) (query (read-string "Query: "))) (if (equal engine "Google") (browse-url (concat "https://www.google.com/search?q=" query))))) (defun dt/key-value-completing (choice) (interactive (list (let ((completions '(("1" "One") ("2" "Two") ("3" "Three")))) (cadr (assoc (completing-read "Choose: " completions) completions))))) (message "You choose `%s'" choice))