;;; .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 flycheck)) ;; use (package-install-selected-packages) to install the ones above ;; show matching parentheses (and other characters) (show-paren-mode t) ;; 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\\*\\'")) (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) ;; flycheck (require 'flycheck) (global-flycheck-mode) ;; 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))) (defun get-base-dir (path needle) "Get base directory for PATH using NEEDLE to cut." (let ((parts (split-string path "/" t))) (let ((index (cl-position needle parts :from-end t :test 'equal))) (if index (concat "/" (mapconcat 'identity (seq-take parts (+ index 1)) "/")) path)))) (make-variable-buffer-local 'flycheck-clang-definitions) (make-variable-buffer-local 'flycheck-clang-include-path) (make-variable-buffer-local 'flycheck-clang-language-standard) (make-variable-buffer-local 'flycheck-clang-warnings) (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++") (when (and buffer-file-name (string-match "/source/monmon/" buffer-file-name)) (setq flycheck-clang-include-path '("../src" "../build" "/usr/include/cairo" "/usr/include/pango-1.0" "/usr/include/pixman-1" "/usr/include/freetype2" "/usr/include/libpng16" "/usr/include/harfbuzz" "/usr/include/glib-2.0" "/usr/lib/glib-2.0/include" "/usr/lib/icecream/include"))) (when (and buffer-file-name (string-match "/source/sawmill-0.5/" buffer-file-name)) (setq flycheck-clang-include-path '("../src" "../build" "/usr/include/librsvg-2.0" "/usr/include/gdk-pixbuf-2.0" "/usr/include/cairo" "/usr/include/pixman-1" "/usr/include/freetype2" "/usr/include/libpng16" "/usr/include/harfbuzz" "/usr/include/glib-2.0" "/usr/lib/glib-2.0/include" "../subprojects/googletest-release-1.8.0/googletest/include" "../subprojects/googletest-release-1.8.0/googlemock/include" ))) ;; Chromium hook (when (and buffer-file-name (string-match "/chromium/src/" buffer-file-name)) (let ((base (get-base-dir (file-name-directory buffer-file-name) "src"))) (make-local-variable 'flycheck-clang-language-standard) (make-local-variable 'flycheck-clang-include-path) (setq flycheck-clang-language-standard "c++14" flycheck-clang-definitions (list "OS_ANDROID") flycheck-clang-warnings (list "no-unused-parameter") flycheck-clang-include-path (list base (concat base "/out_gradle/BetaArm7Debug/gen") (concat base "/out_gradle/BetaArm7Release/gen")))) (require 'google-c-style) (c-add-style "Google" google-c-style t)) ;; ofa hook (when (and buffer-file-name (string-match "/mobile/mobile/" buffer-file-name)) (let ((base (get-base-dir (file-name-directory buffer-file-name) "mobile"))) (make-local-variable 'flycheck-clang-language-standard) (make-local-variable 'flycheck-clang-definitions) (make-local-variable 'flycheck-clang-include-path) (setq flycheck-clang-language-standard "c++14" flycheck-clang-definitions (list "OS_ANDROID") flycheck-clang-warnings (list "no-unused-parameter") flycheck-clang-include-path (list base (concat base "/../../chromium/src") (concat base "/../../chromium/src/third_party/re2/src") (concat base "/../../chromium/src/out_gradle/BetaArm7Debug/gen") (concat base "/../../chromium/src/out_gradle/BetaArm7Release/gen")))) (require 'google-c-style) (c-add-style "Google" google-c-style t)))) ;; 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-8.0-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" flycheck-android-java-variant "devArm7Debug" flycheck-android-java-skip-gen t) (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)))) ;;;