mirror of
https://gitlab.com/dwt1/dotfiles.git
synced 2026-04-11 19:17:19 +10:00
817 lines
31 KiB
EmacsLisp
817 lines
31 KiB
EmacsLisp
(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\\)$"
|
|
(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 'medium)
|
|
(set-face-attribute 'variable-pitch nil
|
|
:font "Ubuntu"
|
|
:height 120
|
|
:weight 'medium)
|
|
(set-face-attribute 'fixed-pitch nil
|
|
:font "JetBrains Mono"
|
|
:height 110
|
|
:weight 'medium)
|
|
;; 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 "<C-wheel-up>") 'text-scale-increase)
|
|
(global-set-key (kbd "<C-wheel-down>") '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 e" '(org-export-dispatch :wk "Org export dispatch")
|
|
"m i" '(org-toggle-item :wk "Org toggle item")
|
|
"m t" '(org-todo :wk "Org todo")
|
|
"m B" '(org-babel-tangle :wk "Org babel tangle")
|
|
"m T" '(org-todo-list :wk "Org todo list"))
|
|
|
|
(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"))
|
|
|
|
;; 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 lua-mode)
|
|
(use-package php-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-agenda-files '("~/.config/emacs/agenda.org"))
|
|
|
|
(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 <s TAB...
|
|
(add-hook 'org-mode-hook (lambda ()
|
|
(setq-local electric-pair-inhibit-predicate
|
|
`(lambda (c)
|
|
(if (char-equal c ?<) t (,electric-pair-inhibit-predicate c))))))
|
|
(global-auto-revert-mode t) ;; Automatically show changes if the file has changed
|
|
(global-display-line-numbers-mode 1) ;; Display line numbers
|
|
(global-visual-line-mode t) ;; Enable truncated lines
|
|
(menu-bar-mode -1) ;; Disable the menu bar
|
|
(scroll-bar-mode -1) ;; Disable the scroll bar
|
|
(tool-bar-mode -1) ;; Disable the tool bar
|
|
(setq org-edit-src-content-indentation 0) ;; Set src block automatic indent to 0 instead of 2.
|
|
(setq use-file-dialog nil) ;; No file dialog
|
|
(setq use-dialog-box nil) ;; No dialog box
|
|
(setq pop-up-windows nil) ;; No popup windows
|
|
|
|
;; Disabling company mode in eshell, because it's annoying.
|
|
(setq company-global-modes '(not eshell-mode))
|
|
|
|
;; Adding a keybinding for 'pcomplete-list' on F9 key.
|
|
(add-hook 'eshell-mode-hook
|
|
(lambda ()
|
|
(define-key eshell-mode-map (kbd "<f9>") #'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 "<escape>") '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))
|