* Bloxie's Emacs Configuration ** By Curt Spark / Bloxiebird. * Introduction Welcome to my Emacs configuration! * Config ** Appearance *** Remove Tool Bar #+BEGIN_SRC emacs-lisp (tool-bar-mode -1) #+END_SRC *** Remove Menu Bar #+BEGIN_SRC emacs-lisp (menu-bar-mode -1) #+END_SRC *** Remove Scroll Bar #+BEGIN_SRC emacs-lisp (scroll-bar-mode -1) #+END_SRC *** Modern Fringes #+BEGIN_SRC emacs-lisp (use-package modern-fringes :ensure t :init (modern-fringes-invert-arrows)) #+END_SRC *** Theming #+BEGIN_SRC emacs-lisp (use-package dracula-theme :ensure t :init (load-theme 'dracula t)) #+END_SRC *** All The Icons #+BEGIN_SRC emacs-lisp (use-package all-the-icons :ensure t) #+END_SRC All The Icons for Ivy/Counsel #+BEGIN_SRC emacs-lisp (use-package all-the-icons-ivy :ensure t :init (all-the-icons-ivy-setup)) #+END_SRC *** Mode Line **** Spaceline #+BEGIN_SRC emacs-lisp (use-package spaceline :ensure t :config (require 'spaceline-config) (setq powerline-default-separator (quote arrow)) (spaceline-spacemacs-theme)) #+END_SRC Display the time on the Mode Line, this is more useful for EXWM. #+BEGIN_SRC emacs-lisp (setq display-time-default-load-average nil) (display-time-mode t) #+END_SRC **** Diminish With Diminish you can optionally remove some of the names of the modes in the Mode Line. #+BEGIN_SRC emacs-lisp (use-package diminish :ensure t) #+END_SRC *** Emacs Dashboard Install the Emacs Dashboard : #+BEGIN_SRC emacs-lisp (use-package dashboard :ensure t :config (dashboard-setup-startup-hook)) (setq initial-buffer-choice (lambda () (get-buffer "*dashboard*"))) #+END_SRC Emacs Dashboard Config : #+BEGIN_SRC emacs-lisp ;; Set the title (setq dashboard-banner-logo-title "Welcome to Bloxie's Emacs!") ;; Set the banner (setq dashboard-startup-banner 'logo) ;; Value can be ;; 'official which displays the official emacs logo ;; 'logo which displays an alternative emacs logo ;; 1, 2 or 3 which displays one of the text banners ;; "path/to/your/image.png" which displays whatever image you would prefer ;; Content is not centered by default. To center, set (setq dashboard-center-content t) ;; To disable shortcut "jump" indicators for each section, set (setq dashboard-show-shortcuts nil) ;;To customize which widgets are displayed, you can use the following snippet (setq dashboard-items '((recents . 5) (bookmarks . 5) (projects . 5) (agenda . 5) (registers . 5))) ;; To show agenda for the upcoming seven days set the variable show-week-agenda-p to t. ;; (setq show-week-agenda-p t) ;; Note that setting list-size for the agenda list is intentionally ignored; all agenda items for the current day will be displayed. ;; To customize which categories from the agenda items should be visible in the dashboard set the dashboard-org-agenda-categories to the list of categories you need. ;; (setq dashboard-org-agenda-categories '("Tasks" "Appointments")) ;; To add icons to the widget headings and their items: (setq dashboard-set-heading-icons t) (setq dashboard-set-file-icons t) ;; To show navigator below the banner: (setq dashboard-set-navigator t) ;; To customize the buttons of the navigator like this: ;; Format: "(icon title help action face prefix suffix)" (setq dashboard-navigator-buttons `(;; line1 ((,(all-the-icons-octicon "mark-github" :height 1.1 :v-adjust 0.0) "Homepage" "Browse homepage" (lambda (&rest _) (browse-url "https://gitlab.com/bloxiebird/linux-emacs-configuration"))) ("★" "Star" "Show stars" (lambda (&rest _) (show-stars)) warning) ("?" "" "?/h" #'show-help nil "<" ">")) )) #+END_SRC ** EXWM Emacs X Window Manager +BEGIN_SRC emacs-lisp (use-package exwm :ensure t :config (require 'exwm-config) (exwm-config-default)) +END_SRC EXWM System Tray +BEGIN_SRC emacs-lisp (require 'exwm-systemtray) (exwm-systemtray-enable) +END_SRC If not using EXWM, it will ask to replace the Window Manager with EXWM, I do not like this prompt when using Emacs on other Window Managers. +BEGIN_SRC emacs-lisp (setq exwm-replace 'nil) +END_SRC Ido gets automatically enabled in the default EXWM configuration, as we're using Ivy. Let's disable it. #+BEGIN_SRC emacs-lisp (ido-mode -1) #+END_SRC Set Number of Workspaces initially created. +BEGIN_SRC emacs-lisp (setq exwm-workspace-number 10) +END_SRC EXWM Specific Keybindings +BEGIN_SRC emacs-lisp ; Set whether workspaces wrap around or not. (defvar exwm-workspace-switch-wrap t) (defun exwm/exwm-workspace-next () "Switch to next exwm-workspace (to the right)." (interactive) (let* ((only-workspace? (equal exwm-workspace-number 1)) (overflow? (= exwm-workspace-current-index (1- exwm-workspace-number)))) (cond (only-workspace? nil) (overflow? (when exwm-workspace-switch-wrap (exwm-workspace-switch 0))) (t (exwm-workspace-switch (1+ exwm-workspace-current-index)))))) (defun exwm/exwm-workspace-prev () "Switch to next exwm-workspace (to the left)." (interactive) (let* ((only-workspace? (equal exwm-workspace-number 1)) (overflow? (= exwm-workspace-current-index 0))) (cond (only-workspace? nil) (overflow? (when exwm-workspace-switch-wrap (exwm-workspace-switch (1- exwm-workspace-number)))) (t (exwm-workspace-switch (1- exwm-workspace-current-index)))))) (global-set-key (kbd "") 'exwm/exwm-workspace-next) (global-set-key (kbd "") 'exwm/exwm-workspace-prev) (global-set-key (kbd "s-e") 'evil-quit-all) (global-set-key (kbd "s-k") 'exwm-workspace-move) (global-set-key (kbd "s-w") 'exwm-workspace-swap) +END_SRC ** Dynamic Window Tiling *** Edwina Edwina is a dynamic window manager for Emacs. It automatically arranges your Emacs panes (called “windows” in Emacs parlance) into predefined layouts, dwm-style. +BEGIN_SRC emacs-lisp (use-package edwina :ensure t :config (setq display-buffer-base-action '(display-buffer-below-selected)) (edwina-setup-dwm-keys) (edwina-mode 1)) +END_SRC *** Golden Ratio +BEGIN_SRC emacs-lisp (use-package golden-ratio :ensure t :init (golden-ratio-mode 1)) +END_SRC ** Custom *** Resizing Buffers #+BEGIN_SRC emacs-lisp (global-set-key (kbd "") 'shrink-window) (global-set-key (kbd "") 'enlarge-window) (global-set-key (kbd "") 'shrink-window-horizontally) (global-set-key (kbd "") 'enlarge-window-horizontally) #+END_SRC *** Fullscreen Function #+BEGIN_SRC emacs-lisp (defun fullscreen (&optional f) (interactive) (x-send-client-message nil 0 nil "_NET_WM_STATE" 32 '(2 "_NET_WM_STATE_MAXIMIZED_VERT" 0)) (x-send-client-message nil 0 nil "_NET_WM_STATE" 32 '(2 "_NET_WM_STATE_MAXIMIZED_HORZ" 0))) #+END_SRC Call Function on Startup #+BEGIN_SRC emacs-lisp (fullscreen) #+END_SRC ** Symon A system resource viewer Add hashtag before + to enable +BEGIN_SRC emacs-lisp (use-package symon :ensure t :init (symon-mode 1)) +END_SRC ** DMenu A recreation of the iconic Suckless Dynamic Menu. #+BEGIN_SRC emacs-lisp (use-package dmenu :ensure t :bind ("s-d" . 'dmenu)) #+END_SRC ** Evil Mode #+BEGIN_SRC emacs-lisp (use-package evil :ensure t :init (evil-mode 1)) #+END_SRC ** Org Mode *** Org Bullets #+BEGIN_SRC emacs-lisp (use-package org-bullets :ensure t :config (add-hook 'org-mode-hook (lambda () (org-bullets-mode)))) #+END_SRC *** Enable Indent Mode #+BEGIN_SRC emacs-lisp (add-hook 'org-mode-hook 'org-indent-mode) #+END_SRC *** Enable Beamer Support #+BEGIN_SRC emacs-lisp (add-hook 'org-mode-hook 'org-beamer-mode) #+END_SRC ** Agenda Set Agenda Directory : #+BEGIN_SRC emacs-lisp (setq org-agenda-files (quote("~/.emacs.d/agenda.org"))) #+END_SRC Calendar/Diary integration : #+BEGIN_SRC emacs-lisp (setq org-agenda-include-diary t) #+END_SRC ** Projectile Install Projectile: #+BEGIN_SRC emacs-lisp (use-package projectile :ensure t :init (projectile-mode)) #+END_SRC ** Auto Completion *** Ivy #+BEGIN_SRC emacs-lisp (use-package ivy :ensure t :init (ivy-mode 1) :bind ("C-s" . swiper)) #+END_SRC Ivy Configuration : #+BEGIN_SRC emacs-lisp (setq ivy-use-virtual-buffers t) (setq enable-recursive-minibuffers t) #+END_SRC *** Counsel #+BEGIN_SRC emacs-lisp (use-package counsel :ensure t) #+END_SRC Counsel for Projectile #+BEGIN_SRC emacs-lisp (use-package counsel-projectile :ensure t :init (counsel-projectile-mode)) (define-key projectile-mode-map (kbd "C-c p") 'projectile-command-map) #+END_SRC *** Company **** Company Base #+BEGIN_SRC emacs-lisp (use-package company :ensure t :init (add-hook 'prog-mode-hook 'company-mode)) #+END_SRC Configuration : #+BEGIN_SRC emacs-lisp ; No delay in showing suggestions. (setq company-idle-delay 0) ; Show suggestions after entering one character. (setq company-minimum-prefix-length 1) ; Wrap around when suggestions reach bottom. (setq company-selection-wrap-around t) ; Use tab key to cycle through suggestions. ; ('tng' means 'tab and go') (company-tng-configure-default) #+END_SRC **** Company Quickhelp #+BEGIN_SRC emacs-lisp (use-package company-quickhelp :ensure t :init (company-quickhelp-mode)) #+END_SRC **** Company + Yasnippet +BEGIN_SRC emacs-lisp (use-package yasnippet :ensure t :config (use-package yasnippet-snippets :ensure t) (yas-reload-all)) (add-hook 'prog-mode-hook 'yas-minor-mode) (add-to-list 'company-backends 'company-yasnippet) +END_SRC **** Company-Jedi Python #+BEGIN_SRC emacs-lisp (use-package company-jedi :ensure t) #+END_SRC Set Company-Jedi to run on Python buffers. : #+BEGIN_SRC emacs-lisp (require 'company-jedi) (autoload 'jedi:setup "jedi" nil t) (add-hook 'python-mode-hook 'jedi:setup) (add-to-list 'company-backends 'company-jedi) #+END_SRC *** Which Key #+BEGIN_SRC emacs-lisp (use-package which-key :ensure t :init (which-key-mode)) #+END_SRC ** Spell Correction *** Flyspell Correct Ivy #+BEGIN_SRC emacs-lisp (use-package flyspell-correct-ivy :ensure t :bind ("C-M-;" . flyspell-correct-wrapper) :init (setq flyspell-correct-interface #'flyspell-correct-ivy)) #+END_SRC ** Multiple Cursors #+BEGIN_SRC emacs-lisp (use-package multiple-cursors :ensure t :bind ("C-c m" . 'mc/mark-next-like-this) :bind ("C-c C-m" . 'mc/mark-all-like-this)) #+END_SRC ** Expand Region Auto selects a region of text/code. #+BEGIN_SRC emacs-lisp (use-package expand-region :ensure t :bind ("C-c e" . 'er/expand-region)) #+END_SRC ** Rainbow Delimiters This Minor Mode will mark pairs of brackets with colours. #+BEGIN_SRC emacs-lisp (use-package rainbow-delimiters :ensure t) #+END_SRC Set Minor Mode as Global : #+BEGIN_SRC emacs-lisp (define-globalized-minor-mode global-rainbow-delimiters-mode rainbow-delimiters-mode (lambda () (rainbow-delimiters-mode 1))) (global-rainbow-delimiters-mode 1) #+END_SRC ** Rainbow Mode This Minor Mode will highlight RGB/HEX values with their respective colours. #+BEGIN_SRC emacs-lisp (use-package rainbow-mode :ensure t) #+END_SRC Set Minor Mode as Global : #+BEGIN_SRC emacs-lisp (define-globalized-minor-mode global-rainbow-mode rainbow-mode (lambda () (rainbow-mode 1))) (global-rainbow-mode 1) #+END_SRC