;;; .emacs --- Config ;;; Commentary: ;;; Code: ;; support local packages (add-to-list 'load-path "~/.emacs.d/site-lisp/") (require 'package) (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/")) (package-initialize) (setq package-selected-packages '(meson-mode groovy-mode gradle-mode flycheck-ycmd company-ycmd ido-vertical-mode rg)) ;; use (package-install-selected-packages) to install the ones above ;; show matching parentheses (and other characters) (show-paren-mode t) ;; hide toolbar (tool-bar-mode -1) ;; hide tooltips (tooltip-mode -1) (setq ;; skip startup message inhibit-startup-message t ;; show line and column number in mode-line line-number-mode t column-number-mode t ;; increase undo undo-limit 200000 undo-strong-limit 300000 ;; enable visible bell visible-bell t ;; enable font lockmode global-font-lock-mode t font-lock-mode t font-lock-maximum-decoration t) ;; Force more unique buffer names (require 'uniquify) (setq uniquify-buffer-name-style 'post-forward-angle-brackets) ;; Clean the buffer list at midnight (require 'midnight) ;; Set clean-buffer-list delay to 1 day (setq clean-buffer-list-delay-general 1) (if (not (boundp 'clean-buffer-list-kill-regexps)) (setq clean-buffer-list-kill-regexps '())) ;; Add preprocessed buffers to the list (add-to-list 'clean-buffer-list-kill-regexps '("\\`\\*.*-preprocessed\\*\\'")) ;; load rg (require 'rg) (setq ;; create backups make-backup-files t ;; don't ask to delete backup versions delete-old-versions t ;; use version control version-control t) ;; put all backup files in their own directory (let ((backup-dir "~/.emacs.d/backups/")) (make-directory backup-dir :parents) (setq backup-directory-alist `((".*" . ,backup-dir)))) ;; show buffer in frame title (setq frame-title-format "%b %* emacs") ;; frame parameters ;; frame size (add-to-list 'default-frame-alist '(width . 80)) (add-to-list 'default-frame-alist '(height . 36)) ;; tell WM that we really want those sizes (add-to-list 'default-frame-alist '(user-size . t)) ;; frame font and color (add-to-list 'default-frame-alist '(font . "-*-inconsolata-*-*-*-*-*-120-*-*-*-*-*")) (add-to-list 'default-frame-alist '(cursor-color . "green")) (add-to-list 'default-frame-alist '(foreground-color . "grey")) (add-to-list 'default-frame-alist '(background-color . "black")) (add-to-list 'default-frame-alist '(background-mode . "dark")) ;; Make man open in full frame instead of always creating half a frame (set-variable 'Man-notify-method (quote pushy)) ;; Toggle frame width (defun toggle-frame-width (frame) "Toggle FRAME width between 100 and 80." (when window-system (let ((width (frame-width frame))) (cond ((eq width 80) (set-frame-width frame 100)) (t (set-frame-width frame 80)))))) (defun toggle-selected-frame-width () "Toggle selected frame width between 100 and 80." (interactive) (toggle-frame-width (selected-frame))) ;; default styles (setq-default ;; no tabs in indentation indent-tabs-mode nil ;; tab-width 4 tab-width 4 ;; c-basic-offset c-basic-offset 4 ;; show trailing whitespace show-trailing-whitespace t) ;; enable c warnings (global-cwarn-mode t) ;; auto inserts (eval-after-load 'autoinsert '(define-auto-insert '("\\.\\(hh\\|hxx\\|hpp\\)\\'" . "C++ header") '((upcase (mapconcat 'identity (split-string (file-name-nondirectory buffer-file-name) "[^a-zA-Z0-9]+") "_")) "#ifndef " str \n "#define " str \n \n _ \n \n "#endif // " str \n))) (eval-after-load 'autoinsert '(define-auto-insert '("\\.\\(CC?\\|cc\\|cxx\\|cpp\\|c++\\)\\'" . "C++ source") '(nil "#include \"common.hh\"" \n \n (let ((base (file-name-sans-extension buffer-file-name))) (cond ((file-exists-p (concat base ".hh")) (concat "#include \"" (file-name-nondirectory (concat base ".hh")) "\"\n\n")))) > _ \n))) (eval-after-load 'autoinsert '(define-auto-insert '("\\.\\([Hh]\\)\\'" . "C header") '((upcase (mapconcat 'identity (split-string (file-name-nondirectory buffer-file-name) "[^a-zA-Z0-9]+") "_")) "#ifndef " str \n "#define " str \n \n _ \n \n "#endif /* " str " */" \n))) (eval-after-load 'autoinsert '(define-auto-insert '("\\.\\([Cc]\\)\\'" . "C source") '(nil "#include \"common.h\"" \n \n (let ((base (file-name-sans-extension buffer-file-name))) (cond ((file-exists-p (concat base ".h")) (concat "#include \"" (file-name-nondirectory (concat base ".h")) "\"\n\n")))) > _ \n))) (eval-after-load 'autoinsert '(define-auto-insert '("[Mm]akefile\\'" . "Makefile") '(nil ".PHONY: all clean" \n \n "all: " _ \n \n "clean:" \n \n))) (eval-after-load 'autoinsert '(define-auto-insert '("\\.\\(py\\)\\'" . "Python source") '(nil "#!/usr/bin/env python" \n \n _ \n))) (eval-after-load 'autoinsert '(define-auto-insert '("\\.\\(java\\)\\'" . "Java source") '((file-name-base buffer-file-name) "package " (mapconcat 'identity (member "com" (split-string (file-name-directory buffer-file-name) "/" t)) ".") ";" \n \n "class " str " {" \n _ \n str "() {" ?\n " " "}" ?\n ;; > should work here but it doesn't "}" \n))) (auto-insert-mode t) ;; don't ask before using auto-insert (setq-default auto-insert-query nil) ;; gpg (require 'epa-file) (epa-file-enable) ;; keys (global-set-key (kbd "C-c o") 'ff-find-other-file) (global-set-key [?\C-x ?\t] 'toggle-selected-frame-width) ;; stop grep from asking to save buffers (setq grep-save-buffers nil) ;; ido (require 'ido) (require 'ido-vertical-mode) (ido-mode) (ido-vertical-mode) (setq ido-vertical-define-keys 'C-n-C-p-up-and-down) ;; stop ido from switching to another frame where the same buffer is already open (setq ido-default-buffer-method 'selected-window) ;; flycheck (require 'flycheck) (global-flycheck-mode) ;; code completion ;; ycmd setup ;; # make sure to use python3 ;; # git clone https://github.com/Valloric/ycmd.git ;; # cd ycmd ;; # git submodule update --init --recursive ;; # ./build.py --system-libclang --clang-completer ;; # mkdir -p ~/.emacs.d/ycmd/third_party ;; # cp -r {ycmd,ycm_core.so,CORE_VERSION,cpp} ~/.emacs.d/ycmd/ ;; # cp -r third_party/{bottle,clang,frozendict,jedi_deps,python-future,requests_deps,waitress} ~/.emacs.d/ycmd/third_party/ (set-variable 'ycmd-server-command `("python3" ,(file-truename "~/.emacs.d/ycmd/ycmd/"))) (set-variable 'ycmd-extra-conf-whitelist '("~/source/*")) (require 'ycmd) (add-hook 'after-init-hook #'global-ycmd-mode) (require 'company-ycmd) (company-ycmd-setup) (add-hook 'after-init-hook 'global-company-mode) (require 'flycheck-ycmd) (flycheck-ycmd-setup) (add-hook 'python-mode-hook (lambda () (add-to-list 'flycheck-disabled-checkers 'ycmd))) (add-hook 'java-mode-hook (lambda () (add-to-list 'flycheck-disabled-checkers 'ycmd))) ;; disable flycheck indicatoion in terminal mode as it will conflict with ;; company (when (not (display-graphic-p)) (setq flycheck-indication-mode nil)) ;; replace ch alias fro grep with cchh alias, ie if starting with a ".h" file ;; you might still want to search in cc files (eval-after-load "grep" '(setf (cdr (assoc "ch" grep-files-aliases)) (cdr (assoc "cchh" grep-files-aliases)))) (c-add-style "common c" '("gnu" (c-basic-offset . 4) (c-offsets-alist . ((substatement-open . 0) (arglist-intro . ++) (innamespace . 0))))) (add-hook 'c-mode-common-hook (lambda() (c-set-style "common c"))) (c-add-style "default c++" '("common c" (c-basic-offset . 2))) (make-variable-buffer-local 'flycheck-clang-definitions) (make-variable-buffer-local 'flycheck-clang-include-path) (make-variable-buffer-local 'flycheck-clang-language-standard) (add-hook 'c++-mode-hook (lambda() (setq flycheck-clang-language-standard "c++14" flycheck-clang-definitions '("HAVE_CONFIG_H") flycheck-clang-include-path '("../src" "../build")) (c-set-style "default c++"))) ;; Opera Java hook (add-hook 'java-mode-hook (lambda() (when (and buffer-file-name (string-match "/opera/head" buffer-file-name)) (require 'flycheck-android-experimental) (setq flycheck-android-java-checkstyle-jar "../../chromium/src/third_party/checkstyle/checkstyle-6.5-all.jar" flycheck-android-java-checkstyle-path "tools/checkstyle" flycheck-android-java-checkstyle-config "checkstyle-config-android.xml" flycheck-android-java-checkstyle-properties "checkstyle.properties") (require 'google-c-style) (google-set-c-style) (setq c-file-style "Google") (c-set-offset 'arglist-intro '++) (c-set-offset 'arglist-cont nil) (c-set-offset 'arglist-cont-nonempty '++) (setq indent-tabs-mode nil) (setq c-basic-offset 4)))) ;;;