Skip to content

Instantly share code, notes, and snippets.

@sujayvadlakonda
Last active October 6, 2020 17:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sujayvadlakonda/8c6687aa8478daf05a143409bbb83180 to your computer and use it in GitHub Desktop.
Save sujayvadlakonda/8c6687aa8478daf05a143409bbb83180 to your computer and use it in GitHub Desktop.
My Emacs Init File
;; 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