Last active
October 6, 2020 17:10
-
-
Save sujayvadlakonda/8c6687aa8478daf05a143409bbb83180 to your computer and use it in GitHub Desktop.
My Emacs Init File
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;; Elisp Extensions | |
(defun rnth (list) | |
"Returns the nth to last item in a list. Short for reverse nth" | |
(interactive) | |
(nth (- (safe-length list) n) list)) | |
(defun file-name-only () | |
"Returns the file name without any of the folders" | |
(interactive) | |
(rnth (split-string buffer-file-name "/") 1)) | |
(defun folder-name-only () | |
"Returns the immediate containing folder name only" | |
(interactive) | |
(rnth (split-string buffer-file-name "/") 2)) | |
;; Emacs Settings | |
;; General | |
(global-linum-mode t) | |
(electric-pair-mode 1) | |
(setq echo-keystrokes 0.35) | |
(fset 'yes-or-no-p 'y-or-n-p) | |
;; Backup settings ripped from Sacha Chua | |
(setq backup-directory-alist '(("." . "~/.emacs.d/backups"))) | |
(setq delete-old-versions -1) | |
(setq version-control t) | |
(setq vc-make-backup-files t) | |
(setq auto-save-file-name-transforms '((".*" "~/.emacs.d/auto-save-list/" t))) | |
;; Default Buffer Settings | |
;; Set initial buffer | |
(setq initial-buffer-choice "~/.emacs.d/init.el") | |
;; Delete Messages Buffer | |
(setq message-log-max nil) | |
(if (get-buffer "*Messages*") | |
(kill-buffer "*Messages*")) | |
;; Delete Scratch Buffer | |
(defun kill-scratch-buffer () | |
(interactive) | |
(if (get-buffer "*scratch*") | |
(kill-buffer "*scratch*"))) | |
(add-hook 'after-change-major-mode-hook 'kill-scratch-buffer) | |
;; Mode Line Settings | |
;; Displaying battery | |
(setq battery-mode-line-format " %b%p%% ") | |
(display-battery-mode 1) | |
;; Displaying the time | |
(setq display-time-default-load-average nil) | |
(setq display-time-24hr-format t) | |
(display-time-mode t) | |
;; Formatting the mode line | |
(defun set-mode-line-format () | |
(interactive) | |
(setq mode-line-format '("%b " mode-name mode-line-misc-info))) | |
(set-mode-line-format) | |
(add-hook 'after-change-major-mode-hook 'set-mode-line-format) | |
;; Global Keybindings | |
;; Kill buffers | |
(global-set-key (kbd "C-k") 'kill-buffer) | |
;; Map Escape to C-g in minibuffer | |
(global-set-key (kbd "<escape>") 'abort-recursive-edit) | |
;; Package Managment Keybindings (C-p) | |
(define-prefix-command 'package-management) | |
(global-set-key (kbd "C-p") 'package-management) | |
(define-key package-management "r" 'package-refresh-contents) | |
(define-key package-management "i" 'package-install) | |
(define-key package-management "d" 'package-delete) | |
;; Package Management | |
;; Allow Packages to be downloaded from the Internet | |
(package-initialize) | |
(require 'package) | |
(push '("melpa" . "http://melpa.org/packages/") package-archives) | |
(push '("org" . "http://orgmode.org/elpa/") package-archives) | |
(push '("melpa-stable" . "https://stable.melpa.org/packages/") package-archives) | |
;;Easy package handling | |
(require 'use-package) | |
;; Enable Vim Emulation | |
(use-package evil | |
:ensure t | |
:config | |
(evil-mode 1) | |
(setq evil-want-C-i-jump nil) | |
(setq evil-regexp-search nil) | |
;; Make jkl; movement keys & h replace repeat-find-char | |
;; Works better with typing position | |
(evil-global-set-key 'motion "j" 'evil-backward-char) | |
(evil-global-set-key 'motion "k" 'evil-next-line) | |
(evil-global-set-key 'motion "l" 'evil-previous-line) | |
(evil-global-set-key 'motion ";" 'evil-forward-char) | |
(evil-global-set-key 'motion "h" 'evil-repeat-find-char) | |
;; Add ^ functionality to # | |
;; Makes more sense to me and easier to reach | |
(evil-global-set-key 'motion "#" 'evil-first-non-blank) | |
;; Custom RET key in normal mode | |
;; Inserts new line underneath | |
(defun evil-insert-line-below (&optional count) | |
"Inserts new line below in normal mode" | |
(interactive "p") ;; Gets universal argument as count | |
(evil-append-line 1);; Shift + A | |
(dotimes (i count) | |
(newline)) | |
(evil-normal-state nil)) | |
(evil-global-set-key 'normal (kbd "<return>") 'evil-insert-line-below) | |
;; Enables the evil number functions | |
(use-package evil-numbers | |
:ensure t | |
:config | |
(evil-global-set-key 'normal (kbd "C-a") 'evil-numbers/inc-at-pt) | |
(evil-global-set-key 'normal (kbd "C-S-a") 'evil-numbers/dec-at-pt)) | |
;; Alternate keys to change active buffer | |
(evil-global-set-key 'motion (kbd "C-;") 'next-buffer) | |
(evil-global-set-key 'insert (kbd "C-;") 'next-buffer) | |
(evil-global-set-key 'motion (kbd "C-j") 'previous-buffer) | |
(evil-global-set-key 'insert (kbd "C-j") 'previous-buffer) | |
;; Unbinding keys. Allows them to be used by emacs global bindings. | |
(evil-global-set-key 'normal (kbd "C-p") 'nil)) | |
;; Enable completion | |
(use-package company | |
:ensure t | |
:config | |
(global-company-mode 1) | |
;; Company Settings | |
(setq company-idle-delay 0.03) | |
(setq company-minimum-prefix-length 1) | |
(setq company-show-numbers 1) | |
(setq company-dabbrev-char-regexp "[A-z:-]") | |
;; Binds keys to allow picking a completion option from dropdown list | |
(define-key company-active-map "1" (lambda () (interactive) (company-complete-number 1))) | |
(define-key company-active-map "2" (lambda () (interactive) (company-complete-number 2))) | |
(define-key company-active-map "3" (lambda () (interactive) (company-complete-number 3))) | |
(define-key company-active-map "4" (lambda () (interactive) (company-complete-number 4))) | |
(define-key company-active-map "5" (lambda () (interactive) (company-complete-number 5))) | |
(define-key company-active-map "6" (lambda () (interactive) (company-complete-number 6))) | |
(define-key company-active-map "7" (lambda () (interactive) (company-complete-number 7))) | |
(define-key company-active-map "8" (lambda () (interactive) (company-complete-number 8))) | |
(define-key company-active-map "9" (lambda () (interactive) (company-complete-number 9))) | |
(define-key company-active-map "0" (lambda () (interactive) (company-complete-number 0))) | |
;; Adds a company backend for web development | |
(use-package company-web | |
:hook (web-mode . (lambda () (setq company-backends '(company-web-html)))))) | |
;; Enable minibuffer vertical completion | |
(use-package ivy | |
:ensure t | |
:config | |
(ivy-mode 1)) | |
;; Org Mode | |
(use-package org | |
:config | |
(define-key org-mode-map (kbd "C-k") 'kill-buffer) | |
add-hook 'org-mode-hook (lambda () (company-mode -1))) | |
(add-hook 'org-mode-hook (lambda () (linum-mode -1)))) | |
;; Dired Mode | |
(use-package dired | |
:config | |
(defun auto-kill-dired-buffers () | |
"Kills previous dired buffer after file selection unless opening a file" | |
(interactive) | |
(dired-find-file) | |
(if (eq major-mode 'dired-mode) | |
(progn | |
(previous-buffer) | |
(kill-buffer)))) | |
;; q in Dired Buffer Kills It | |
(define-key dired-mode-map (kbd "q") | |
(lambda () | |
(interactive) | |
(quit-window 1)));;; arg 1 kills the window | |
;; Keybindings | |
(define-key dired-mode-map (kbd "<return>") 'auto-kill-dired-buffers) | |
(define-key dired-mode-map (kbd "t") 'dired-do-flagged-delete) | |
(define-key dired-mode-map (kbd "G") 'nil)) | |
;; C++ Major Mode | |
(use-package cc-mode | |
;; C++ specific word completion | |
:hook (c++-mode . (lambda () (setq company-backends '(company-clang)))) | |
;; Open .h files in C++ mode | |
:mode ("\\.h$" . c++-mode) | |
:config | |
(defun switch-file () | |
"Switch between .h and .cpp files" | |
(interactive) | |
(if (string= (file-name-extension buffer-file-name) "cpp") | |
(find-file (concat (file-name-sans-extension buffer-file-name) ".h")) | |
(find-file (concat (file-name-sans-extension buffer-file-name) ".cpp")))) | |
(evil-define-key 'normal c++-mode-map (kbd "s") 'switch-file) | |
(defun c++-new-header-file (classname) | |
"Creates a new header file with default text" | |
;; Prompt for any string | |
(interactive "MClass Name: ") | |
(let* ((filename (concat classname ".h")) | |
(oldfile (file-exists-p filename))) | |
(find-file filename) | |
(unless oldfile | |
(progn | |
(insert-cs2337-comments) | |
(insert-header-guard) | |
(insert-class-text))))) | |
(define-key c++-mode-map (kbd "C-x h") 'c++-new-header-file) | |
(defun insert-cs2337-comments () | |
"Inserts the necessary header comments for CS2337" | |
(interactive) | |
(insert "// Sujay Vadlakonda\n") | |
(insert "// svv190001\n") | |
(insert "// " (folder-name-only) "\n")) | |
(defun insert-header-guard () | |
"Inserts a header guard" | |
(interactive) | |
(let ((guard (concat (upcase (file-name-sans-extension (file-name-only))) "_H"))) | |
(insert "#ifndef " guard "\n") | |
(insert "#define " guard "\n\n") | |
(insert "#endif//" guard) | |
(evil-previous-line) | |
(insert "\n"))) | |
(defun insert-class-text () | |
"Inserts the text to begin creating a class" | |
(interactive) | |
(insert "class " (file-name-sans-extension (file-name-only)) " {\n") | |
(insert "private:\n") | |
(insert "public:\n") | |
(insert "};\n") | |
(evil-previous-line) | |
(evil-previous-line) | |
(evil-previous-line))) | |
(use-package enh-ruby-mode | |
:mode ("\\.rb$" . enh-ruby-mode)) | |
;;;; C-x 1 Kills Other Window | |
;;(defun kill-other-window () | |
;; "Kills other window and deletes the buffer" | |
;; (interactive) | |
;; (other-window 1) | |
;; (quit-window 1)) | |
;; | |
;;(global-set-key (kbd "C-x 1") 'kill-other-window) | |
;; | |
;;;; q in Help Buffer Kills It | |
;;(define-key help-mode-map (kbd "q") | |
;; (lambda () | |
;; (interactive) | |
;; (quit-window 1)));;; arg 1 kills the window | |
;; | |
;;;; q in Apropos Buffer Kills It | |
;;(require 'apropos) | |
;;(define-key apropos-mode-map (kbd "q") | |
;; (lambda () | |
;; (interactive) | |
;; (quit-window 1)));;; arg 1 kills the window | |
;; | |
;;;; Emacs Customizations | |
;; | |
;; | |
;; | |
;;;; Colors | |
;;;;(set-background-color "black") | |
;;;;(set-frame-font "JetBrains Mono 26" nil t) | |
;;(set-face-attribute 'default nil :foreground "white") | |
;;(set-face-attribute 'font-lock-comment-delimiter-face nil :foreground "orange2") | |
;;(set-face-attribute 'font-lock-comment-face nil :foreground "orange2") | |
;;(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. | |
;; '(display-battery-mode t) | |
;; '(display-time-mode t) | |
;; '(line-number-mode nil) | |
;; '(mode-line-format '("%b " mode-name mode-line-misc-info)) | |
;; '(package-selected-packages | |
;; '(exec-path-from-shell yafolding hideshow-org lua-mode company-web company-web-html web-mode emmet-mode markdown-mode enh-ruby-mode use-package js2-mode ivy evil-numbers evil company))) | |
;;(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. | |
;; '(enh-ruby-op-face ((t (:foreground "white")))) | |
;; '(enh-ruby-string-delimiter-face ((t (:foreground "light blue")))) | |
;; '(eshell-prompt ((t (:foreground "green" :weight bold))))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment