diff --git a/init.el b/init.el new file mode 100644 index 0000000..e7cf1c4 --- /dev/null +++ b/init.el @@ -0,0 +1,337 @@ +;;; Package configs +(require 'package) +(setq package-enable-at-startup nil) +(setq package-archives + '(("org" . "http://orgmode.org/elpa/") + ("gnu" . "http://elpa.gnu.org/packages/") + ("melpa" . "https://melpa.org/packages/"))) +(package-initialize) + +;; Bootstrap `use-package` +(unless (package-installed-p 'use-package) + (package-refresh-contents) + (package-install 'use-package)) +(require 'use-package) + +;; Some term enhancement +(defadvice term-sentinel (around my-advice-term-sentinel (proc msg)) + (if (memq (process-status proc) '(signal exit)) + (let ((buffer (process-buffer proc))) + ad-do-it + (kill-buffer buffer)) + ad-do-it)) +(ad-activate 'term-sentinel) + +(defadvice ansi-term (before force-bash) + (interactive (list "/usr/bin/fish"))) +(ad-activate 'ansi-term) + +;; Other configs +(setq make-backup-files nil) +(setq auto-save-default nil) + +;; Splash Screen +(setq inhibit-startup-screen t) +(setq initial-scratch-message ";; Happy Hacking") + +;; Show matching parens +(setq show-paren-delay 0) +(show-paren-mode 1) + +;; Paragraph movement +(global-set-key (kbd "s-j") 'forward-paragraph) +(global-set-key (kbd "s-k") 'backward-paragraph) + +;; Keybinding for term mode +(add-hook 'term-mode + (lambda () (global-set-key (kbd "s-v") 'term-paste))) + +;; OrgMode Configs +(setq org-html-validation-link nil) +(setq org-todo-keywords + '((sequence "TODO" "WORKING" "HOLD" "|" "DONE"))) +(setq org-todo-keyword-faces + '(("TODO" . "blue") + ("WORKING" . "yellow") + ("HOLD" . "red") + ("DONE" . "green"))) + +;; UI configurations +(if (display-graphic-p) + (progn + (tool-bar-mode -1) + (scroll-bar-mode -1) + ) + ) +(tooltip-mode -1) +(menu-bar-mode -1) +(global-linum-mode 1) + +(add-to-list 'default-frame-alist '(font . "Iosevka-11")) +(add-to-list 'default-frame-alist '(height . 24)) +(add-to-list 'default-frame-alist '(width . 80)) + +;; Vim mode +(use-package evil + :ensure t + :config + (evil-mode 1)) + +(use-package evil-escape + :ensure t + :init + (setq-default evil-escape-key-sequence "jk") + :config + (evil-escape-mode 1)) + +;; Anzu for search matching +(use-package anzu + :ensure t + :config + (global-anzu-mode 1) + (global-set-key [remap query-replace-regexp] + 'anzu-query-replace-regexp) + (global-set-key [remap query-replace] + 'anzu-query-replace)) + +;; Theme +(use-package doom-themes + :ensure t + :config + (load-theme 'doom-molokai t)) + +;; Helm +(use-package helm + :ensure t + :init + (setq helm-M-x-fuzzy-match t + helm-mode-fuzzy-match t + helm-buffers-fuzzy-matching t + helm-recentf-fuzzy-match t + helm-locate-fuzzy-match t + helm-semantic-fuzzy-match t + helm-imenu-fuzzy-match t + helm-completion-in-region-fuzzy-match t + helm-candidate-number-list 80 + helm-split-window-in-side-p t + helm-move-to-line-cycle-in-source t + helm-echo-input-in-header-line t + helm-autoresize-max-height 0 + helm-autoresize-min-height 20) + :config + (helm-mode 1)) + +;; RipGrep +(use-package helm-rg :ensure t) + +;; Projectile +(use-package projectile + :ensure t + :init + (setq projectile-require-project-root nil) + :config + (projectile-mode 1)) + +;; Helm Projectile +(use-package helm-projectile + :ensure t + :init + (setq helm-projectile-fuzzy-match t) + :config + (helm-projectile-on)) + +;; Helm Gtags +(use-package helm-gtags + :defer t + :ensure t + :init + (progn + (setq helm-gtags-ignore-case t + helm-gtags-auto-update t + helm-gtags-prefix-key "SPC-m" + helm-gtags-use-input-at-cursor t + helm-gtags-pulse-at-cursor t) + (add-hook 'c-mode-hook 'helm-gtags-mode))) + +;; All The Icons +(use-package all-the-icons :ensure t) + +;; NeoTree +(use-package neotree + :ensure t + :init + (setq neo-theme (if (display-graphic-p) 'icons 'arrow))) + +;; Which Key +(use-package which-key + :ensure t + :init + (setq which-key-separator " ") + (setq which-key-prefix-prefix "+") + :config + (which-key-mode)) + +;; Custom keybinding +(use-package general + :ensure t + :config (general-define-key + :states '(normal visual insert emacs) + :prefix "SPC" + :non-normal-prefix "M-SPC" + "/" '(helm-projectile-rg + :which-key "ripgrep") + "TAB" '(switch-to-prev-buffer + :which-key "previous buffer") + "SPC" '(helm-M-x :which-key "M-x") + "pf" '(helm-projectile-find-file + :which-key "find files") + "pp" '(helm-projectile-switch-project + :which-key "switch project") + "pb" '(helm-projectile-switch-to-buffer + :which-key "switch buffer") + "pr" '(helm-show-kill-ring + :which-key "show kill ring") + ;; Buffers + "bb" '(helm-mini :which-key "buffers list") + ;; Window + "wl" '(windmove-right :which-key "move right") + "wh" '(windmove-left :which-key "move left") + "wk" '(windmove-up :which-key "move up") + "wj" '(windmove-down :which-key "move bottom") + "w/" '(split-window-right :which-key "split right") + "w-" '(split-window-below :which-key "split bottom") + "wx" '(delete-window :which-key "delete window") + "qz" '(delete-frame :which-key "delete frame") + "qq" '(kill-emacs :which-key "quit") + ;; NeoTree + "ft" '(neotree-toggle :which-key "toggle neotree") + ;; Others + "at" '(ansi-term :which-key "open terminal") + ;; Gtags + "gc" '(helm-gtags-create-tags + :which-key "Create tag db") + "gd" '(helm-gtags-fing-tag + :which-key "Find definitions") + "gf" '(helm-gtags-select-path + :which-key "Jump to a file in tag db") + "gG" '(helm-gtags-dwim-other-window + :which-key "Jump to location based on context") + "gi" '(helm-gtags-tags-in-this-function + :which-key "Present tags in current function") + "gl" '(helm-gtags-parse-file + :which-key "Jump to definitions in file") + "gn" '(helm-gtags-next-history + :which-key "Jump to next location in context stack") + "gp" '(helm-gtags-previous-history + :which-key "Jump to previous location in context stack") + "gr" '(helm-gtags-find-rtag + :which-key "Find references") + "gR" '(helm-gtags-resume + :which-key "Resume previous helm-gtags session") + "gs" '(helm-gtags-select + :which-key "Select any tag in project retrieved by gtags") + "gS" '(helm-gtags-show-stack + :which-key "Show stack of visited locations") + "gu" '(helm-gtags-update-tags + :which-key "Create tag db") + )) + +;; Fancy titlebar for MacOS +(add-to-list 'default-frame-alist '(ns-transparent-titlebar . t)) +(add-to-list 'default-frame-alist '(ns-appearance . dark)) +(setq ns-use-proxy-icon nil) +(setq frame-title-format nil) + +;; Flycheck +(use-package flycheck + :ensure t + :init (global-flycheck-mode)) + +;; Company mode +(use-package company + :ensure t + :init + (setq company-minimum-prefix-length 3) + (setq company-auto-complete nil) + (setq company-idle-delay 0) + (setq company-require-match 'never) + (setq company-frontends + '(company-pseudo-tooltip-unless-just-one-frontend + company-preview-frontend company-echo-metadata-frontend)) + (setq tab-always-indent 'complete) + (defvar completion-at-point-functions-saved nil) + :config + (global-company-mode 1) + (define-key company-active-map (kbd "TAB") + 'company-complete-common-or-cycle) + (define-key company-active-map (kbd "") + 'company-complete-common-or-cycle) + (define-key company-active-map (kbd "S-TAB") + 'company-select-previous) + (define-key company-active-map (kbd "") + 'company-select-previous) + (define-key company-mode-map [remap indent-for-tab-command] + 'company-indent-for-tab-command) + (defun company-indent-for-tab-command (&optional arg) + (interactive "P") + (let ((completion-at-point-functions-saved completion-at-point-functions) + (completion-at-point-functions '(company-complete-common-wrapper))) + (indent-for-tab-command arg))) + +(defun company-complete-common-wrapper () + (let ((completion-at-point-functions completion-at-point-functions-saved)) + (company-complete-common)))) + +;; Powerline +(use-package spaceline + :ensure t + :init + (setq powerline-default-separator 'slant) + :config + (spaceline-emacs-theme) + (spaceline-toggle-minor-modes-off) + (spaceline-toggle-buffer-size-off) + (spaceline-toggle-evil-state-on)) + +;;;;;;;;;;;;;;;;;;;;;;; +;; Language Supports ;; +;;;;;;;;;;;;;;;;;;;;;;; + +;;; C +(defun c-lineup-arglist-tabs-only (ignored) + "Line up argument lists by tabs, not spaces" + (let* ((anchor (c-langelem-pos c-syntactic-element)) + (column (c-langelem-2nd-pos c-syntactic-element)) + (offset (- (1+ column) anchor)) + (steps (floor offset c-basic-offset))) + (* (max steps 1) + c-basic-offset))) + +(add-hook 'c-mode-common-hook + (lambda () + ;; Add kernel style + (c-add-style + "linux-tabs-only" + '("linux" (c-offsets-alist + (arglist-cont-nonempty + c-lineup-gcc-asm-reg + c-lineup-arglist-tabs-only)))))) + +(add-hook 'c-mode-hook + (lambda () + (let ((filename (buffer-file-name))) + ;; Enable kernel mode for the appropriate files + (when (and filename + (string-match (expand-file-name "~/ged4k/linux-xlnx") + filename)) + (setq indent-tabs-mode t) + (setq show-trailing-whitespace t) + (c-set-style "linux-tabs-only"))))) + +(defun helm-gtags-dwim-other-window () + "helm-gtags-dwim in the other window" + (interactive) + (let ((helm-gtags--use-otherwin t) + (split-height-threshold nil) + (split-width-threshold 140)) + (helm-gtags-dwim)))