From 3abf958cc889c39eb21d00afb311de29238ceefa Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Mon, 11 Jun 2018 22:57:27 +0200 Subject: [PATCH 01/39] Add config.org + replace setup-editing/general.el --- config.org | 439 ++++++++++++++++++ custom/setup-editing.el | 134 ------ custom/setup-general.el | 62 --- img/dash_logo.png | Bin 0 -> 65349 bytes init.el | 141 +----- {snippets => plugins/yasnippet}/c-mode/fori | 3 +- {snippets => plugins/yasnippet}/c-mode/oncekl | 0 7 files changed, 454 insertions(+), 325 deletions(-) create mode 100644 config.org delete mode 100644 custom/setup-editing.el delete mode 100644 custom/setup-general.el create mode 100644 img/dash_logo.png rename {snippets => plugins/yasnippet}/c-mode/fori (61%) rename {snippets => plugins/yasnippet}/c-mode/oncekl (100%) diff --git a/config.org b/config.org new file mode 100644 index 0000000..a014f1a --- /dev/null +++ b/config.org @@ -0,0 +1,439 @@ +#+STARTUP: overview +#+TITLE: My Emacs +#+CREATOR: Laurens Miers +#+LANGUAGE: en +[[./img/dash_logo.png]] + +* Installation + +My personal emacs configuration + +(Heavily) Inspired by the following configs: + - https://github.com/tuhdo/emacs-c-ide-demo + - https://github.com/daedreth/UncleDavesEmacs + +This configuration requires the installation of : + + - the GNU =global= package (for gtags) + - =clang= (for ivory) + - =cmake= (for ivory) + - =llvm-libs= (for cmake, somehow not a dependency on Manjaro when installing cmake) + - Use python-pip to install =jedi=, =flake8=, =importmagic= and =autopep8= (for elpy) + - =ditaa= (for ascii to image generation in org-mode) + +When first checking out this config, run =irony-install-server= to make and install the irony-server. + +* General stuff +** Unsorted + +Collection of stuff that needs to be sorted...someday....maybe... +#+BEGIN_SRC emacs-lisp +(global-set-key (kbd "M-p") 'fill-paragraph) +#+END_SRC +** Macro's + +Rebind the macro keys to Fx keys to give them a decent purpose. + +#+BEGIN_SRC emacs-lisp +(global-set-key [f9] 'start-kbd-macro) +(global-set-key [f10] 'end-kbd-macro) +(global-set-key [f11] 'call-last-kbd-macro) +#+END_SRC + +** Goto-line + +Starting with Emacs 23.2, =M-g g= is bound to goto-line. +However, I find this too long. So rebind it: + +#+BEGIN_SRC emacs-lisp +(global-set-key (kbd "M-g") 'goto-line) +#+END_SRC + +** Rectangle + +Most rectangle functions are by default mapped to something like =C-x r (other-char)=. +I use =string-insert-rectangle= and =query-replace-regexp= quite a lot, +so rebind it to something easy to remember. + +#+BEGIN_SRC emacs-lisp +(global-set-key (kbd "C-x r i") 'string-insert-rectangle) +(global-set-key (kbd "C-x r r") 'query-replace-regexp) +#+END_SRC + +** Garbage collection (gc) + +I used to have the following enabled in my init to increase the gc threshold to speed-up emacs startup: +(stolen from [[http://bling.github.io/blog/2016/01/18/why-are-you-changing-gc-cons-threshold/]]) + +#+BEGIN_SRC +;; (setq gc-cons-threshold 100000000) +#+END_SRC + +But according to this: [[https://lists.gnu.org/archive/html/help-gnu-emacs/2007-06/msg00243.html ]], +it is no longer necessary. + +** Yes-or-no questions + +Because I'm lazy, important yes-or-no questions can be answered with y-or-n: + +#+BEGIN_SRC emacs-lisp +(defalias 'yes-or-no-p 'y-or-n-p) +#+END_SRC + +** Emacs fullscreen at startup + +#+BEGIN_SRC emacs-lisp +(add-to-list 'default-frame-alist '(fullscreen . maximized)) +#+END_SRC + +** Multi-frame rebindings + +Sometimes I have multiple emacs-frames open. +I prefer that the normal =C-x o= can deal with this. + +#+BEGIN_SRC emacs-lisp +;; Use C-x o to switch to other frame when using multi-monitor +(global-set-key (kbd "C-x o") 'next-multiframe-window) +#+END_SRC + +Now that =next-multiframe-window= is bound to =C-x o=, +Bind =C-x p= to =previous-multiframe-window=. + +#+BEGIN_SRC emacs-lisp +(global-set-key (kbd "\C-x p") 'previous-multiframe-window) +#+END_SRC + +** Enable disabled commands + +Some commands are disabled to protect the user. +Narrow-region/page is a really handy feature, enable it: + +#+BEGIN_SRC emacs-lisp +(put 'narrow-to-page 'disabled nil) +(put 'narrow-to-region 'disabled nil) +#+END_SRC + +** Buffers + +Why is this not built-in? + +#+BEGIN_SRC emacs-lisp +(defun kill-all-buffers () + "Kill all buffers without regard for their origin." + (interactive) + (mapc 'kill-buffer (buffer-list))) +#+END_SRC + +** Helping vim-users + +#+BEGIN_SRC emacs-lisp +(defconst wq "This is not vi! Use C-x C-c instead.") +(defconst w "This is not vi! Use C-x C-s instead.") +(defconst q! "This is EMACS not vi! Use C-x C-c instead.") +(defconst wq! "This is EMACS not vi! Use C-x C-c instead.") +#+END_SRC + +* Theme + +#+BEGIN_SRC emacs-lisp +(use-package monokai-theme + :ensure t + :init + (load-theme 'monokai t) + +) +#+END_SRC + +** Highlight line + +Highlight line will highlight the current line we are on. +Enable highlight-line globally and replace its background colour. + +#+BEGIN_SRC emacs-lisp +(global-hl-line-mode 1) +(set-face-background hl-line-face "dark slate grey") +#+END_SRC + +* Dashboard + +I use the dashboard as start screen. +Since I like it to give me a list of recent files, we need to enable =recentf-mode=. + +#+BEGIN_SRC emacs-lisp +(use-package dashboard + :ensure t + :init + (recentf-mode 1) + :config + (dashboard-setup-startup-hook) + (setq dashboard-startup-banner "~/.emacs.d/img/dash_logo.png") + (setq dashboard-items '((recents . 10) + (bookmarks . 5) + )) + (setq dashboard-banner-logo-title "") +) +#+END_SRC + +* Zygospore + +Revert =C-x 1= by pressing =C-x 1= again: +[[https://github.com/louiskottmann/zygospore.el]] + +FYI: At one point, used this together with sr-speedbar. They did not play well together... + +#+BEGIN_SRC emacs-lisp +(use-package zygospore + :ensure t + :config + (global-set-key (kbd "C-x 1") 'zygospore-toggle-delete-other-windows) +) +#+END_SRC + +* Mode-line + +[[https://github.com/Malabarba/smart-mode-line]] + +#+BEGIN_SRC emacs-lisp +(use-package smart-mode-line + :ensure t + :config + (setq sml/no-confirm-load-theme t) + (setq sml/theme 'powerline) + (sml/setup) +) +#+END_SRC + +* Editing settings + +** Kill-ring customization + +Setting =kill-whole-line= to non-nil means when we execute =C-k= at the beginning of a line +will the entire line including the following newline will be deleted. + +#+BEGIN_SRC emacs-lisp +(setq kill-ring-max 5000) ; increase kill-ring capacity +(setq kill-whole-line t) +#+END_SRC + +** Newline at end-of-file + +#+BEGIN_SRC emacs-lisp +(setq mode-require-final-newline t) ; add a newline to end of file +#+END_SRC + +** Enable column numbers + +#+BEGIN_SRC emacs-lisp +(setq column-number-mode 1) +#+END_SRC + +** Look-and-feel modifications + +Remove scroll-, tool- and menu-bar. I don't use them so free some space. + +#+BEGIN_SRC emacs-lisp +(scroll-bar-mode -1) +(tool-bar-mode -1) +(menu-bar-mode -1) +#+END_SRC + +** Tab-width + +Set the default tab width. +#+BEGIN_SRC emacs-lisp +(setq-default tab-width 4) +#+END_SRC + +** Automatic indent + +Automatically indent when pressing =RET=. +#+BEGIN_SRC emacs-lisp +(global-set-key (kbd "RET") 'newline-and-indent) +#+END_SRC + +** Delete trailing whitespace + +Automatically delete trailing whitespace when saving a file. + +#+BEGIN_SRC emacs-lisp +(add-hook 'before-save-hook 'delete-trailing-whitespace) +#+END_SRC + +* Undo-tree + +Undo with =C-/=. +#+BEGIN_SRC emacs-lisp +(use-package undo-tree + :ensure t + :config + (global-undo-tree-mode) +) +#+END_SRC + +* Volatile highlights + +Show/highlight changes when doing undo/yanks/kills/... + +https://github.com/k-talo/volatile-highlights.el + +#+BEGIN_SRC emacs-lisp +(use-package volatile-highlights + :ensure t + :config + (volatile-highlights-mode t) +) +#+END_SRC + +* iedit + +Highlight occurences of symbol and replace them simultanously. +Shortkey: =C-;= + +https://github.com/victorhge/iedit + +#+BEGIN_SRC emacs-lisp +(use-package iedit + :ensure t +) +#+END_SRC + +* Smartparens + +Smart minor-mode to deal with pairs. + +https://github.com/Fuco1/smartparens + +#+BEGIN_SRC emacs-lisp +(use-package smartparens + :ensure t + :config + (require 'smartparens-config) +) + +;; old config stuff +;; (setq sp-base-key-bindings 'paredit) +;; (setq sp-autoskip-closing-pair 'always) +;; (setq sp-hybrid-kill-entire-symbol nil) +;; (sp-use-paredit-bindings) +;; +;; (show-smartparens-global-mode +1) +;; (smartparens-global-mode 1) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; keybinding management smartparens ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; cl-package contains the loop macro +;; (require 'cl) +;; +;; (defmacro def-pairs (pairs) +;; `(progn +;; ,@(loop for (key . val) in pairs +;; collect +;; `(defun ,(read (concat +;; "wrap-with-" +;; (prin1-to-string key) +;; "s")) +;; (&optional arg) +;; (interactive "p") +;; (sp-wrap-with-pair ,val))))) +;; +;; (def-pairs ((paren . "(") +;; (bracket . "[") +;; (brace . "{") +;; (single-quote . "'") +;; (double-quote . "\"") +;; (underscore . "_") +;; (back-quote . "`"))) +;; +;; (define-key smartparens-mode-map (kbd "C-c (") 'wrap-with-parens) +;; (define-key smartparens-mode-map (kbd "C-c [") 'wrap-with-brackets) +;; (define-key smartparens-mode-map (kbd "C-c {") 'wrap-with-braces) +;; (define-key smartparens-mode-map (kbd "C-c '") 'wrap-with-single-quotes) +;; (define-key smartparens-mode-map (kbd "C-c \"") 'wrap-with-double-quotes) +;; (define-key smartparens-mode-map (kbd "C-c _") 'wrap-with-underscores) +;; (define-key smartparens-mode-map (kbd "C-c `") 'wrap-with-back-quotes) +;; +;; (define-key smartparens-mode-map (kbd "C-c s r") 'sp-rewrap-sexp) +;; (define-key smartparens-mode-map (kbd "C-c s u") 'sp-unwrap-sexp) +;; +;; (define-key smartparens-mode-map (kbd "C-M-f") 'sp-forward-sexp) +;; (define-key smartparens-mode-map (kbd "C-M-b") 'sp-backward-sexp) +;; +;; ;; TODO: in manjaro this selects keyboard-layout or something +;; ;;(define-key smartparens-mode-map (kbd "C-M-k") 'sp-kill-sexp) +;; (define-key smartparens-mode-map (kbd "C-M-w") 'sp-copy-sexp) +;; +;; (define-key smartparens-mode-map (kbd "C-M-n") 'sp-next-sexp) +;; (define-key smartparens-mode-map (kbd "C-M-p") 'sp-previous-sexp) +;; +;; ;; TODO: for some reason this does not work +;; (define-key smartparens-mode-map (kbd "C-M-a") 'sp-beginning-of-sexp) +;; (define-key smartparens-mode-map (kbd "C-M-e") 'sp-end-of-sexp) +;; +;; (define-key smartparens-mode-map (kbd "C-M-h") 'mark-defun) +;; +;; (smartparens-global-mode t) + +#+END_SRC + +* Comment-dwim-2 + +Replacement for built-in =comment-dwim=, more comment features. + +https://github.com/remyferre/comment-dwim-2 + +#+BEGIN_SRC emacs-lisp +(use-package comment-dwim-2 + :ensure t + :config + (global-set-key (kbd "M-;") 'comment-dwim-2) +) +#+END_SRC + +* Yasnippet + +Template system for Emacs. + +https://github.com/joaotavora/yasnippet + +#+BEGIN_SRC emacs-lisp +(use-package yasnippet + :ensure t + :config + (add-to-list 'load-path + "~/.emacs.d/plugins/yasnippet") + (yas-global-mode 1) +) +#+END_SRC + +* Old stuff, maybe usefull for lookup later + +#+BEGIN_SRC emacs-lisp +;; show whitespace in diff-mode +;; (add-hook 'diff-mode-hook (lambda () +;; (setq-local whitespace-style +;; '(face +;; tabs +;; tab-mark +;; spaces +;; space-mark +;; trailing +;; indentation::space +;; indentation::tab +;; newline +;; newline-mark)) +;; (whitespace-mode 1))) +#+END_SRC + + +* TODO + +stuff i need to look into: +- ibuffer +- switch-window +- split-and-follow-vertically/horizontally +- which-key +- symon +- spaceline +- async +- exwm diff --git a/custom/setup-editing.el b/custom/setup-editing.el deleted file mode 100644 index fbddaab..0000000 --- a/custom/setup-editing.el +++ /dev/null @@ -1,134 +0,0 @@ -(setq global-mark-ring-max 5000 ; increase mark ring to contains 5000 entries - mark-ring-max 5000 ; increase kill ring to contains 5000 entries - mode-require-final-newline t ; add a newline to end of file - ) - -(setq kill-ring-max 5000 ; increase kill-ring capacity - kill-whole-line t ; if NIL, kill whole line and move the next line up - ) - -;; show column numbers -(setq column-number-mode 1) - -;; Remove scroll-bar, tool-bar and menu-bar -(scroll-bar-mode -1) -(tool-bar-mode -1) -(menu-bar-mode -1) - -;; set appearance of a tab that is represented by 4 spaces -(setq-default tab-width 4) - -;; automatically indent when press RET -(global-set-key (kbd "RET") 'newline-and-indent) - -;; Map query-replace-regexp to an easier key -(global-set-key (kbd "C-x r r") 'query-replace-regexp) - -;; Map query-replace-regexp to an easier key -(global-set-key (kbd "M-p") 'fill-paragraph) - -;; Delete trailing whitespace when saving file -(add-hook 'before-save-hook 'delete-trailing-whitespace) - -;; show whitespace in diff-mode -(add-hook 'diff-mode-hook (lambda () - (setq-local whitespace-style - '(face - tabs - tab-mark - spaces - space-mark - trailing - indentation::space - indentation::tab - newline - newline-mark)) - (whitespace-mode 1))) - -;; Package: undo-tree -- saner, imo, undo with C-/ -(require 'undo-tree) -(global-undo-tree-mode) - -;; Package: volatile-highlights --- show changes by "undo/yanks/..." -(require 'volatile-highlights) -(volatile-highlights-mode t) - -;;; Package: iedit --- Replace occurences of symbol and highlight them -(require 'iedit) - -;; Package: smartparens --- smart way to handle (), {}, ... -(require 'smartparens-config) -(setq sp-base-key-bindings 'paredit) -(setq sp-autoskip-closing-pair 'always) -(setq sp-hybrid-kill-entire-symbol nil) -(sp-use-paredit-bindings) - -(show-smartparens-global-mode +1) -(smartparens-global-mode 1) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; keybinding management smartparens ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; cl-package contains the loop macro -(require 'cl) - -(defmacro def-pairs (pairs) - `(progn - ,@(loop for (key . val) in pairs - collect - `(defun ,(read (concat - "wrap-with-" - (prin1-to-string key) - "s")) - (&optional arg) - (interactive "p") - (sp-wrap-with-pair ,val))))) - -(def-pairs ((paren . "(") - (bracket . "[") - (brace . "{") - (single-quote . "'") - (double-quote . "\"") - (underscore . "_") - (back-quote . "`"))) - -(define-key smartparens-mode-map (kbd "C-c (") 'wrap-with-parens) -(define-key smartparens-mode-map (kbd "C-c [") 'wrap-with-brackets) -(define-key smartparens-mode-map (kbd "C-c {") 'wrap-with-braces) -(define-key smartparens-mode-map (kbd "C-c '") 'wrap-with-single-quotes) -(define-key smartparens-mode-map (kbd "C-c \"") 'wrap-with-double-quotes) -(define-key smartparens-mode-map (kbd "C-c _") 'wrap-with-underscores) -(define-key smartparens-mode-map (kbd "C-c `") 'wrap-with-back-quotes) - -(define-key smartparens-mode-map (kbd "C-c s r") 'sp-rewrap-sexp) -(define-key smartparens-mode-map (kbd "C-c s u") 'sp-unwrap-sexp) - -(define-key smartparens-mode-map (kbd "C-M-f") 'sp-forward-sexp) -(define-key smartparens-mode-map (kbd "C-M-b") 'sp-backward-sexp) - -;; TODO: in manjaro this selects keyboard-layout or something -;;(define-key smartparens-mode-map (kbd "C-M-k") 'sp-kill-sexp) -(define-key smartparens-mode-map (kbd "C-M-w") 'sp-copy-sexp) - -(define-key smartparens-mode-map (kbd "C-M-n") 'sp-next-sexp) -(define-key smartparens-mode-map (kbd "C-M-p") 'sp-previous-sexp) - -;; TODO: for some reason this does not work -(define-key smartparens-mode-map (kbd "C-M-a") 'sp-beginning-of-sexp) -(define-key smartparens-mode-map (kbd "C-M-e") 'sp-end-of-sexp) - -(define-key smartparens-mode-map (kbd "C-M-h") 'mark-defun) - -(smartparens-global-mode t) - - -;; Package: comment-dwim-2 --- replacement for built-in comment-dwim, more comment features -(require 'comment-dwim-2) -(global-set-key (kbd "M-;") 'comment-dwim-2) - - -;; Package: yasnippet --- code template system -(require 'yasnippet) -(yas-global-mode 1) - -(provide 'setup-editing) diff --git a/custom/setup-general.el b/custom/setup-general.el deleted file mode 100644 index 221252c..0000000 --- a/custom/setup-general.el +++ /dev/null @@ -1,62 +0,0 @@ -(global-set-key [f9] 'start-kbd-macro) -(global-set-key [f10] 'end-kbd-macro) -(global-set-key [f11] 'call-last-kbd-macro) - -;; Package zygospore --- revert C-x 1 by pressing C-x 1 again -;; TODO: Doesn't work with sr-speedbar -(global-set-key (kbd "C-x 1") 'zygospore-toggle-delete-other-windows) - -;; Set 'M-g' to 'goto-line', it's faster and what we usually want -(global-set-key (kbd "M-g") 'goto-line) - -;; Set 'C-x r i' to 'string-insert-rectangle' -;; Easier than using 'M-x' and searching for it. -(global-set-key (kbd "C-x r i") 'string-insert-rectangle) - -;; set garbage collection to higher value -;; see http://bling.github.io/blog/2016/01/18/why-are-you-changing-gc-cons-threshold/ -(setq gc-cons-threshold 100000000) - -;; important yes-or-no questions can be answered with y-or-n -(defalias 'yes-or-no-p 'y-or-n-p) - -;; maximize Emacs at startup -(add-to-list 'default-frame-alist '(fullscreen . maximized)) - -;; Move one window back command -(global-set-key (kbd "\C-x p") 'previous-multiframe-window) - -;; Use C-x o to switch to other frame when using multi-monitor -(global-set-key (kbd "C-x o") 'next-multiframe-window) - -;; set my theme -(load-theme 'wombat) - -;; highlight line (hl-line) -(global-hl-line-mode 1) -(set-face-background hl-line-face "dark slate grey") - -;; smart mode line -(setq sml/no-confirm-load-theme t) -(setq sml/theme 'powerline) -(sml/setup) - -;; enable disabled commands -(put 'narrow-to-page 'disabled nil) -(put 'narrow-to-region 'disabled nil) - -;; quick function to kill all other buffers -(defun kill-other-buffers () - "Kill all other buffers." - (interactive) - (mapc 'kill-buffer - (delq (current-buffer) - (remove-if-not 'buffer-file-name (buffer-list))))) - -;; screw with vi(m)-users -(defconst wq "This is not vi! Use C-x C-c instead.") -(defconst w "This is not vi! Use C-x C-s instead.") -(defconst q! "This is EMACS not vi! Use C-x C-c instead.") -(defconst wq! "This is EMACS not vi! Use C-x C-c instead.") - -(provide 'setup-general) diff --git a/img/dash_logo.png b/img/dash_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..bd8c88bef43e593c46d6a03337f85a3275c88d9b GIT binary patch literal 65349 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 Cam7mj literal 0 HcmV?d00001 diff --git a/init.el b/init.el index 876843e..7670945 100644 --- a/init.el +++ b/init.el @@ -1,152 +1,39 @@ - -;; add the custom dir to our load path -(add-to-list 'load-path "~/.emacs.d/custom") - -;; add melpa-stable to package-archives ;; IMPORTANT: add (require 'package), else package-archives is not declared (void-variable) (require 'package) + +(setq package-enable-at-startup nil) + +;; add melpa-stable to package-archives (add-to-list 'package-archives '("melpa-stable" . "https://stable.melpa.org/packages/") t) -(add-to-list 'package-archives - '("melpa" . "http://melpa.milkbox.net/packages/") t) - ;; MUST be called after package-archives is updated -;; Else the automated installation logic is not able to install missing packages (package-initialize) -;; my required packages -(defconst my-packages - '( - undo-tree - volatile-highlights - smartparens - iedit - zygospore - comment-dwim-2 - yasnippet - yasnippet-snippets - sr-speedbar - company - irony - irony-eldoc - company-irony - flycheck-irony - elpy - py-autopep8 - magit - org - smart-mode-line - smart-mode-line-powerline-theme - helm - helm-gtags - helm-swoop - helm-company - dashboard - multiple-cursors - expand-region - )) +;;; Bootstrapping use-package +(unless (package-installed-p 'use-package) + (package-refresh-contents) + (package-install 'use-package)) -;; function to install new packages -(defun install-packages () - "Install all required packages." - (interactive) - (unless package-archive-contents - (package-refresh-contents)) - (dolist (package my-packages) - (unless (package-installed-p package) - (package-install package)))) - -;; install packages if not yet installed -(install-packages) - -;; setup general -(require 'setup-general) - -;; setup general editing settings -(require 'setup-editing) - -;; setup org -(require 'setup-org) - -;; setup coding -(require 'setup-coding) - -;; setup helm -(require 'setup-helm) -(require 'setup-helm-gtags) - -;; setup speedbar -(require 'setup-speedbar) - -;; setup autocompletion -(require 'setup-autocompletion) - -;; setup Windows if our bootloader is Windows -(if (eq system-type 'windows-nt) - (require 'setup-windows) -) - -;; setup dashboard -(require 'setup-dashboard) - -;; setup gdb -(require 'setup-gdb) - -;; setup multiple cursors -(require 'setup-cursors) - -;; setup expand-region -(require 'setup-expand-region) - -;; start emacs server -(server-start) +;;; This is the actual config file. It is omitted if it doesn't exist so emacs won't refuse to launch. +(when (file-readable-p "~/.emacs.d/config.org") +(org-babel-load-file (expand-file-name "~/.emacs.d/config.org"))) +(provide 'init) (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. - '(ansi-color-faces-vector - [default default default italic underline success warning error]) - '(ansi-color-names-vector - ["#757575" "#CD5542" "#4A8F30" "#7D7C21" "#4170B3" "#9B55C3" "#68A5E9" "gray43"]) '(custom-safe-themes (quote - ("84d2f9eeb3f82d619ca4bfffe5f157282f4779732f48a5ac1484d94d5ff5b279" "c74e83f8aa4c78a121b52146eadb792c9facc5b1f02c917e3dbb454fca931223" "3c83b3676d796422704082049fc38b6966bcad960f896669dfc21a7a37a748fa" "938d8c186c4cb9ec4a8d8bc159285e0d0f07bad46edf20aa469a89d0d2a586ea" "6de7c03d614033c0403657409313d5f01202361e35490a3404e33e46663c2596" "ed317c0a3387be628a48c4bbdb316b4fa645a414838149069210b66dd521733f" "1db337246ebc9c083be0d728f8d20913a0f46edc0a00277746ba411c149d7fe5" default))) - '(fci-rule-color "#2e2e2e") - '(global-company-mode t) + ("5f27195e3f4b85ac50c1e2fac080f0dd6535440891c54fcfa62cdcefedf56b1b" default))) '(package-selected-packages (quote - (ample-zen-theme ample-theme magit irony-eldoc elpy irony helm-swoop helm))) - '(vc-annotate-background "#3b3b3b") - '(vc-annotate-color-map - (quote - ((20 . "#dd5542") - (40 . "#CC5542") - (60 . "#fb8512") - (80 . "#baba36") - (100 . "#bdbc61") - (120 . "#7d7c61") - (140 . "#6abd50") - (160 . "#6aaf50") - (180 . "#6aa350") - (200 . "#6a9550") - (220 . "#6a8550") - (240 . "#6a7550") - (260 . "#9b55c3") - (280 . "#6CA0A3") - (300 . "#528fd1") - (320 . "#5180b3") - (340 . "#6380b3") - (360 . "#DC8CC3")))) - '(vc-annotate-very-old-color "#DC8CC3")) + (zygospore yasnippet-snippets volatile-highlights use-package undo-tree sr-speedbar smartparens smart-mode-line-powerline-theme py-autopep8 multiple-cursors magit irony-eldoc iedit helm-swoop helm-gtags helm-company flycheck-irony expand-region elpy dashboard company-irony comment-dwim-2)))) (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. ) - -(provide 'init) -;;; init.el ends here diff --git a/snippets/c-mode/fori b/plugins/yasnippet/c-mode/fori similarity index 61% rename from snippets/c-mode/fori rename to plugins/yasnippet/c-mode/fori index acb5879..63e65b0 100644 --- a/snippets/c-mode/fori +++ b/plugins/yasnippet/c-mode/fori @@ -2,8 +2,7 @@ # name: for with loop variable # key: fori # -- -int i = 0; -for (${1:i = 0}; ${2:i < N}; ${3:++i}) { +for (${1:int i = 0}; ${2:i < N}; ${3:++i}) { $0 } diff --git a/snippets/c-mode/oncekl b/plugins/yasnippet/c-mode/oncekl similarity index 100% rename from snippets/c-mode/oncekl rename to plugins/yasnippet/c-mode/oncekl From 2ce4a6d6a9e4076b0c4eef96980a5756130155be Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Mon, 11 Jun 2018 23:10:24 +0200 Subject: [PATCH 02/39] Enable smartparens + some extra smartparens config --- config.org | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/config.org b/config.org index a014f1a..18162eb 100644 --- a/config.org +++ b/config.org @@ -300,6 +300,9 @@ https://github.com/victorhge/iedit * Smartparens Smart minor-mode to deal with pairs. +Extra options: + - =show-smartparens-global-mode= : highlight corresponding bracket/pair/... + - =smartparens-global-mode= : enable smartparens https://github.com/Fuco1/smartparens @@ -308,6 +311,8 @@ https://github.com/Fuco1/smartparens :ensure t :config (require 'smartparens-config) + (show-smartparens-global-mode t) + (smartparens-global-mode t) ) ;; old config stuff From 6e1fb2c76913dc3d1429237f34e81854dfbe3145 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Mon, 11 Jun 2018 23:13:16 +0200 Subject: [PATCH 03/39] Add backup-files config --- config.org | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/config.org b/config.org index 18162eb..ea4334f 100644 --- a/config.org +++ b/config.org @@ -133,6 +133,14 @@ Why is this not built-in? (defconst wq! "This is EMACS not vi! Use C-x C-c instead.") #+END_SRC +** Backup files + +Disable the generation of backup-files, I don't use them. + +#+BEGIN_SRC emacs-lisp +(setq make-backup-files nil) +#+END_SRC + * Theme #+BEGIN_SRC emacs-lisp From 8eec08cfd8ff55d6c2f4eba3d3a380038d80c518 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Mon, 11 Jun 2018 23:35:53 +0200 Subject: [PATCH 04/39] Add expand region to config.org + remove old file --- config.org | 18 ++++++++++++++++++ custom/setup-expand-region.el | 7 ------- 2 files changed, 18 insertions(+), 7 deletions(-) delete mode 100644 custom/setup-expand-region.el diff --git a/config.org b/config.org index ea4334f..e99ffea 100644 --- a/config.org +++ b/config.org @@ -419,6 +419,24 @@ https://github.com/joaotavora/yasnippet ) #+END_SRC +* Expand-region + +Expand region increases the selected region by semantic units. +I also enable =pending-delete-mode=, this means when we mark a region and start typing, +the text within the mark is deleted with the new typed text and the mark disappears. + +https://github.com/magnars/expand-region.el + +#+BEGIN_SRC emacs-lisp +(use-package expand-region + :ensure t + :init + (pending-delete-mode t) + :config + (global-set-key (kbd "C-=") 'er/expand-region) +) +#+END_SRC + * Old stuff, maybe usefull for lookup later #+BEGIN_SRC emacs-lisp diff --git a/custom/setup-expand-region.el b/custom/setup-expand-region.el deleted file mode 100644 index 1734ac0..0000000 --- a/custom/setup-expand-region.el +++ /dev/null @@ -1,7 +0,0 @@ -(require 'expand-region) - -(pending-delete-mode t) - -(global-set-key (kbd "C-=") 'er/expand-region) - -(provide 'setup-expand-region) From 150de7bd0af278bf83070d7475a4baf131188968 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Mon, 11 Jun 2018 23:36:42 +0200 Subject: [PATCH 05/39] Remove README.md --- README.md | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 README.md diff --git a/README.md b/README.md deleted file mode 100644 index 89897d5..0000000 --- a/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# emacs -My personal emacs configuration - -It is mostly based on tuhdo's emacs ide demo: https://github.com/tuhdo/emacs-c-ide-demo - -This configuration requires the installation of : - - the GNU global package (for gtags) - - clang (for ivory) - - cmake (for ivory) - - llvm-libs (for cmake, somehow not a dependency on Manjaro when installing cmake) - - Use python-pip to install jedi, flake8, importmagic and autopep8 (for elpy) - - ditaa (for ascii to image generation in org-mode) - -When first checking out this config, run irony-install-server to make and install the irony-server. From a2e0594ef11a781a993a9f5e74d769056e6de543 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 17:30:34 +0200 Subject: [PATCH 06/39] Remove custom-set-variables --- init.el | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/init.el b/init.el index 7670945..d614563 100644 --- a/init.el +++ b/init.el @@ -20,20 +20,3 @@ (org-babel-load-file (expand-file-name "~/.emacs.d/config.org"))) (provide 'init) -(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. - '(custom-safe-themes - (quote - ("5f27195e3f4b85ac50c1e2fac080f0dd6535440891c54fcfa62cdcefedf56b1b" default))) - '(package-selected-packages - (quote - (zygospore yasnippet-snippets volatile-highlights use-package undo-tree sr-speedbar smartparens smart-mode-line-powerline-theme py-autopep8 multiple-cursors magit irony-eldoc iedit helm-swoop helm-gtags helm-company flycheck-irony expand-region elpy dashboard company-irony comment-dwim-2)))) -(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. - ) From ce7bb16836eb5a7932642bd9841ea4c63e2af93d Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 17:32:48 +0200 Subject: [PATCH 07/39] Add Windooze section --- config.org | 31 +++++++++++++++++++++++++++++++ custom/setup-windows.el | 25 ------------------------- 2 files changed, 31 insertions(+), 25 deletions(-) delete mode 100644 custom/setup-windows.el diff --git a/config.org b/config.org index e99ffea..8f2d103 100644 --- a/config.org +++ b/config.org @@ -437,6 +437,37 @@ https://github.com/magnars/expand-region.el ) #+END_SRC +* Windooze + +When we use windows as our bootloader, we have to setup some things first: + +#+BEGIN_SRC emacs-lisp +;; Windows performance tweaks +;; +(when (boundp 'w32-pipe-read-delay) + (setq w32-pipe-read-delay 0)) +;; Set the buffer size to 64K on Windows (from the original 4K) +(when (boundp 'w32-pipe-buffer-size) + (setq irony-server-w32-pipe-buffer-size (* 64 1024))) + +;; Set pipe delay to 0 to reduce latency of irony +(setq w32-pipe-read-delay 0) + +;; From "setting up irony mode on Windows" : +;; Make sure the path to clang.dll is in emacs' exec_path and shell PATH. +(setenv "PATH" + (concat + "C:\\msys64\\usr\\bin" ";" + "C:\\msys64\\mingw64\\bin" ";" + (getenv "PATH") + ) +) +(setq exec-path (append '("c:/msys64/usr/bin" "c:/alt/msys64/mingw64/bin") + exec-path)) +#+END_SRC + +To be fair, I didn't test this in a while... + * Old stuff, maybe usefull for lookup later #+BEGIN_SRC emacs-lisp diff --git a/custom/setup-windows.el b/custom/setup-windows.el deleted file mode 100644 index 695b1de..0000000 --- a/custom/setup-windows.el +++ /dev/null @@ -1,25 +0,0 @@ -;; Windows performance tweaks -;; -(when (boundp 'w32-pipe-read-delay) - (setq w32-pipe-read-delay 0)) -;; Set the buffer size to 64K on Windows (from the original 4K) -(when (boundp 'w32-pipe-buffer-size) - (setq irony-server-w32-pipe-buffer-size (* 64 1024))) - -;; Set pipe delay to 0 to reduce latency of irony -(setq w32-pipe-read-delay 0) - -;; From "setting up irony mode on Windows" : -;; Make sure the path to clang.dll is in emacs' exec_path and shell PATH. -(setenv "PATH" - (concat - "C:\\msys64\\usr\\bin" ";" - "C:\\msys64\\mingw64\\bin" ";" - (getenv "PATH") - ) -) -(setq exec-path (append '("c:/msys64/usr/bin" "c:/alt/msys64/mingw64/bin") - exec-path)) - - -(provide 'setup-windows) From 436106e94de53379a448b8b64e8ffa7970ab9937 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 17:35:15 +0200 Subject: [PATCH 08/39] Add speedbar section --- config.org | 17 +++++++++++++++++ custom/setup-speedbar.el | 11 ----------- 2 files changed, 17 insertions(+), 11 deletions(-) delete mode 100644 custom/setup-speedbar.el diff --git a/config.org b/config.org index 8f2d103..610bab1 100644 --- a/config.org +++ b/config.org @@ -470,6 +470,8 @@ To be fair, I didn't test this in a while... * Old stuff, maybe usefull for lookup later +** Diff mode stuff + #+BEGIN_SRC emacs-lisp ;; show whitespace in diff-mode ;; (add-hook 'diff-mode-hook (lambda () @@ -487,6 +489,21 @@ To be fair, I didn't test this in a while... ;; (whitespace-mode 1))) #+END_SRC +** Speedbar + +#+BEGIN_SRC emacs-lisp +;; Package: sr-speedbar +;;(require 'sr-speedbar) +;; (add-hook 'emacs-startup-hook (lambda () ; Open sr speedbar on startup +;; (sr-speedbar-open) +;; )) +;; (setq speedbar-show-unknown-files t) ; Enable speedbar to show all files +;; (setq speedbar-use-images nil) ; use text for buttons +;; (setq sr-speedbar-right-side nil) ; put on left side +;; (setq sr-speedbar-width 40) +;; +;; (provide 'setup-speedbar) +#+END_SRC * TODO diff --git a/custom/setup-speedbar.el b/custom/setup-speedbar.el deleted file mode 100644 index e38ac8d..0000000 --- a/custom/setup-speedbar.el +++ /dev/null @@ -1,11 +0,0 @@ -;; Package: sr-speedbar -(require 'sr-speedbar) -;; (add-hook 'emacs-startup-hook (lambda () ; Open sr speedbar on startup -;; (sr-speedbar-open) -;; )) -(setq speedbar-show-unknown-files t) ; Enable speedbar to show all files -(setq speedbar-use-images nil) ; use text for buttons -(setq sr-speedbar-right-side nil) ; put on left side -(setq sr-speedbar-width 40) - -(provide 'setup-speedbar) From 0791b21aafe1d3987bff2c7b176be31ad51998e8 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 18:04:16 +0200 Subject: [PATCH 09/39] Add helm section --- config.org | 67 ++++++++++++++++++++++++++++++++++++++++++++ custom/setup-helm.el | 50 --------------------------------- 2 files changed, 67 insertions(+), 50 deletions(-) delete mode 100644 custom/setup-helm.el diff --git a/config.org b/config.org index 610bab1..c3f6a27 100644 --- a/config.org +++ b/config.org @@ -468,6 +468,72 @@ When we use windows as our bootloader, we have to setup some things first: To be fair, I didn't test this in a while... +* Helm + +#+BEGIN_SRC emacs-lisp +(use-package helm + :ensure t + :bind + ("M-x" . 'helm-M-x) + ("M-y" . 'helm-show-kill-ring) + ("C-x b" . 'helm-mini) + ("C-x C-b" . 'helm-mini) + ("C-x C-f" . 'helm-find-files) + :init + (helm-mode 1)) + :config + (setq helm-M-x-fuzzy-match t + helm-buffers-fuzzy-matching t + helm-recentf-fuzzy-match t + helm-semantic-fuzzy-match t + helm-imenu-fuzzy-match t + helm-split-window-inside-p nil ;; open helm buffer inside current window + helm-scroll-amount 8 ;; scroll 8 lines other window using M-/M- +;; helm-move-to-line-cycle-in-source nil ;; move to end or beginning of source when reaching to por bottom of source +;; helm-ff-search-library-in-sexp t ;; search for library in 'require' and 'declare-function' sexp +;; helm-echo-input-in-header-line t + ) + +(require 'helm-config) +;; (helm-autoresize-mode 1) +;; (define-key helm-find-files-map (kbd "C-b") 'helm-find-files-up-one-level) +;; (define-key helm-find-files-map (kbd "C-f") 'helm-execute-persistent-action) + +;; replace vanilla isearch with helm-swoop +(use-package helm-swoop + :ensure t + :bind + ("C-s" . 'helm-swoop') + :config + (define-key helm-swoop-map (kbd "C-s") 'helm-multi-swoop-all-from-helm-swoop) +) + +;; rebind tab to do persistent action +;; we use helm-execute-persistent-action more than helm-select-action (default for ) +;; (define-key helm-map (kbd "") 'helm-execute-persistent-action) +;; make TAB work in terminal +;; (define-key helm-map (kbd "C-i") 'helm-execute-persistent-action) +;; remap helm-select-action: lists actions +;; (define-key helm-map (kbd "C-z") 'helm-select-action) + +;; remap calculator +;; (global-set-key (kbd "C-c C-c") 'helm-calcul-expression) + +;; TODO: experiment with mark ring (breadcrumbs something?) +;; TODO: experiment with helm-regexp (build and test regexes) +;; TODO: remember helm-top (helm interface for top program) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Next 2 lines make sure when using helm-swoop only the current window/buffer is affected ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; If this value is t, split window inside the current window +;; (setq helm-swoop-split-with-multiple-windows t) + +;; Split direcion. 'split-window-vertically or 'split-window-horizontally +;; (setq helm-swoop-split-direction 'split-window-vertically) + +#+END_SRC + * Old stuff, maybe usefull for lookup later ** Diff mode stuff @@ -516,3 +582,4 @@ stuff i need to look into: - spaceline - async - exwm +- helm-hide-minibuffer diff --git a/custom/setup-helm.el b/custom/setup-helm.el deleted file mode 100644 index 1ed7612..0000000 --- a/custom/setup-helm.el +++ /dev/null @@ -1,50 +0,0 @@ -(require 'helm) -(require 'helm-config) - -;; replace vanilla commands with helm commands -(global-set-key (kbd "M-x") 'helm-M-x) -(global-set-key (kbd "M-y") 'helm-show-kill-ring) -(global-set-key (kbd "C-x b") 'helm-mini) -;; In vanilla, this is mapped to show-buffers, but I don't use that so map it to helm-mini as well -(global-set-key (kbd "C-x C-b") 'helm-mini) -(global-set-key (kbd "C-x C-f") 'helm-find-files) - -;; rebind tab to do persistent action -;; we use helm-execute-persistent-action more than helm-select-action (default for ) -(define-key helm-map (kbd "") 'helm-execute-persistent-action) -;; make TAB work in terminal -(define-key helm-map (kbd "C-i") 'helm-execute-persistent-action) -;; remap helm-select-action: lists actions -(define-key helm-map (kbd "C-z") 'helm-select-action) - -;; remap calculator -(global-set-key (kbd "C-c C-c") 'helm-calcul-expression) - -;; TODO: experiment with mark ring (breadcrumbs something?) -;; TODO: experiment with helm-regexp (build and test regexes) -;; TODO: remember helm-top (helm interface for top program) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; PACKAGE: helm-swoop ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Locate the helm-swoop folder to your path -(require 'helm-swoop) - -;; replace vanilla I-search with helm-swoop -(global-set-key (kbd "C-s") 'helm-swoop) - -;; From helm-swoop to helm-multi-swoop-all -;;(define-key helm-swoop-map (kbd "M-s") 'helm-multi-swoop-all-from-helm-swoop) -(define-key helm-swoop-map (kbd "C-s") 'helm-multi-swoop-all-from-helm-swoop) -;; TODO: find out how to switch from multi-swoop to swoop back again - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Next 2 lines make sure when using helm-swoop only the current window/buffer is affected ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; If this value is t, split window inside the current window -(setq helm-swoop-split-with-multiple-windows t) - -;; Split direcion. 'split-window-vertically or 'split-window-horizontally -(setq helm-swoop-split-direction 'split-window-vertically) - -(provide 'setup-helm) From 27b84978a74870bb0bb6fd6aa70a9cd36774e7f5 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 20:58:29 +0200 Subject: [PATCH 10/39] Add readme --- README.org | 1 + 1 file changed, 1 insertion(+) create mode 120000 README.org diff --git a/README.org b/README.org new file mode 120000 index 0000000..f13833e --- /dev/null +++ b/README.org @@ -0,0 +1 @@ +config.org \ No newline at end of file From dc8880dfc1f130c94b4cc61df88249fda5f0642b Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 21:19:17 +0200 Subject: [PATCH 11/39] Add helm-gtags section --- config.org | 23 +++++++++++++++++++++++ custom/setup-helm-gtags.el | 19 ------------------- 2 files changed, 23 insertions(+), 19 deletions(-) delete mode 100644 custom/setup-helm-gtags.el diff --git a/config.org b/config.org index c3f6a27..fa8e98d 100644 --- a/config.org +++ b/config.org @@ -470,6 +470,8 @@ To be fair, I didn't test this in a while... * Helm +** General config + #+BEGIN_SRC emacs-lisp (use-package helm :ensure t @@ -534,6 +536,27 @@ To be fair, I didn't test this in a while... #+END_SRC +** Helm-gtags + +#+BEGIN_SRC emacs-lisp +(use-package helm-gtags + :ensure t + :bind + ( "M-." . 'helm-gtags-find-tag-from-here) + ( "M-," . 'helm-gtags-pop-stack) + ( "C-c f" . 'helm-gtags-find-files) + ( "C-c p" . 'helm-gtags-parse-file) + :config + (add-hook 'c-mode-hook 'helm-gtags-mode) + (add-hook 'c++-mode-hook 'helm-gtags-mode) + (add-hook 'python-mode-hook 'helm-gtags-mode) + (add-hook 'java-mode-hook 'helm-gtags-mode) + (add-hook 'asm-mode-hook 'helm-gtags-mode) + + (custom-set-variables '(helm-gtags-auto-update t)) +) +#+END_SRC + * Old stuff, maybe usefull for lookup later ** Diff mode stuff diff --git a/custom/setup-helm-gtags.el b/custom/setup-helm-gtags.el deleted file mode 100644 index 09b7e09..0000000 --- a/custom/setup-helm-gtags.el +++ /dev/null @@ -1,19 +0,0 @@ -(require 'helm-gtags) - -;; Enable helm-gtags-mode in languages that GNU Global supports -(add-hook 'c-mode-hook 'helm-gtags-mode) -(add-hook 'c++-mode-hook 'helm-gtags-mode) -(add-hook 'python-mode-hook 'helm-gtags-mode) -(add-hook 'java-mode-hook 'helm-gtags-mode) -(add-hook 'asm-mode-hook 'helm-gtags-mode) - -;; customize behaviour -(custom-set-variables - '(helm-gtags-auto-update t)) - -(global-set-key (kbd "M-.") 'helm-gtags-find-tag-from-here) -(global-set-key (kbd "M-,") 'helm-gtags-pop-stack) -(global-set-key (kbd "C-c C-f") 'helm-gtags-find-files) -(global-set-key (kbd "C-c g f") 'helm-gtags-parse-file) - -(provide 'setup-helm-gtags) From 945a55a2c0eaa8ae509216ed13c38f166786324b Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 21:32:58 +0200 Subject: [PATCH 12/39] Set modeline theme to respectful --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index fa8e98d..49fbd44 100644 --- a/config.org +++ b/config.org @@ -206,7 +206,7 @@ FYI: At one point, used this together with sr-speedbar. They did not play well t :ensure t :config (setq sml/no-confirm-load-theme t) - (setq sml/theme 'powerline) + (setq sml/theme 'respectful) (sml/setup) ) #+END_SRC From 16a0b0bef67c53584b92c9b86089fc3f2df21f66 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 21:45:59 +0200 Subject: [PATCH 13/39] Fix helm section --- config.org | 52 +++++++++++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/config.org b/config.org index 49fbd44..a41b062 100644 --- a/config.org +++ b/config.org @@ -476,40 +476,42 @@ To be fair, I didn't test this in a while... (use-package helm :ensure t :bind - ("M-x" . 'helm-M-x) - ("M-y" . 'helm-show-kill-ring) - ("C-x b" . 'helm-mini) - ("C-x C-b" . 'helm-mini) - ("C-x C-f" . 'helm-find-files) + ("M-x" . helm-M-x) + ("M-y" . helm-show-kill-ring) + ("C-x b" . helm-mini) + ("C-x C-b" . helm-mini) + ("C-x C-f" . helm-find-files) :init - (helm-mode 1)) + (helm-mode 1) :config - (setq helm-M-x-fuzzy-match t - helm-buffers-fuzzy-matching t - helm-recentf-fuzzy-match t - helm-semantic-fuzzy-match t - helm-imenu-fuzzy-match t - helm-split-window-inside-p nil ;; open helm buffer inside current window - helm-scroll-amount 8 ;; scroll 8 lines other window using M-/M- + (setq helm-M-x-fuzzy-match t + helm-buffers-fuzzy-matching t + helm-recentf-fuzzy-match t + helm-semantic-fuzzy-match t + helm-imenu-fuzzy-match t + helm-split-window-inside-p nil ;; open helm buffer inside current window + helm-scroll-amount 8 ;; scroll 8 lines other window using M-/M- ;; helm-move-to-line-cycle-in-source nil ;; move to end or beginning of source when reaching to por bottom of source ;; helm-ff-search-library-in-sexp t ;; search for library in 'require' and 'declare-function' sexp ;; helm-echo-input-in-header-line t - ) + ) +) -(require 'helm-config) -;; (helm-autoresize-mode 1) -;; (define-key helm-find-files-map (kbd "C-b") 'helm-find-files-up-one-level) -;; (define-key helm-find-files-map (kbd "C-f") 'helm-execute-persistent-action) - -;; replace vanilla isearch with helm-swoop (use-package helm-swoop :ensure t :bind - ("C-s" . 'helm-swoop') + ("C-s" . helm-swoop) :config (define-key helm-swoop-map (kbd "C-s") 'helm-multi-swoop-all-from-helm-swoop) ) +;; (require 'helm-config) +;; ;; (helm-autoresize-mode 1) +;; ;; (define-key helm-find-files-map (kbd "C-b") 'helm-find-files-up-one-level) +;; ;; (define-key helm-find-files-map (kbd "C-f") 'helm-execute-persistent-action) +;; +;; ;; replace vanilla isearch with helm-swoop + ;; rebind tab to do persistent action ;; we use helm-execute-persistent-action more than helm-select-action (default for ) ;; (define-key helm-map (kbd "") 'helm-execute-persistent-action) @@ -542,10 +544,10 @@ To be fair, I didn't test this in a while... (use-package helm-gtags :ensure t :bind - ( "M-." . 'helm-gtags-find-tag-from-here) - ( "M-," . 'helm-gtags-pop-stack) - ( "C-c f" . 'helm-gtags-find-files) - ( "C-c p" . 'helm-gtags-parse-file) + ( "M-." . helm-gtags-find-tag-from-here) + ( "M-," . helm-gtags-pop-stack) + ( "C-c f" . helm-gtags-find-files) + ( "C-c p" . helm-gtags-parse-file) :config (add-hook 'c-mode-hook 'helm-gtags-mode) (add-hook 'c++-mode-hook 'helm-gtags-mode) From bc4ec44ceacd826a370f53c58151f96a77ea3418 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 21:59:24 +0200 Subject: [PATCH 14/39] Helm: split in current window + rebind for helm + enable autoresize --- config.org | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/config.org b/config.org index a41b062..b5e4887 100644 --- a/config.org +++ b/config.org @@ -489,12 +489,16 @@ To be fair, I didn't test this in a while... helm-recentf-fuzzy-match t helm-semantic-fuzzy-match t helm-imenu-fuzzy-match t - helm-split-window-inside-p nil ;; open helm buffer inside current window + helm-split-window-inside-p t ;; open helm buffer inside current window helm-scroll-amount 8 ;; scroll 8 lines other window using M-/M- ;; helm-move-to-line-cycle-in-source nil ;; move to end or beginning of source when reaching to por bottom of source ;; helm-ff-search-library-in-sexp t ;; search for library in 'require' and 'declare-function' sexp ;; helm-echo-input-in-header-line t ) + ;; rebind tab to do persistent action + ;; we use helm-execute-persistent-action more than helm-select-action (default for ) + (define-key helm-map (kbd "") 'helm-execute-persistent-action) + (helm-autoresize-mode 1) ;; Awesome feature together with helm-split-window-inside-p != nil ) (use-package helm-swoop @@ -506,15 +510,9 @@ To be fair, I didn't test this in a while... ) ;; (require 'helm-config) -;; ;; (helm-autoresize-mode 1) ;; ;; (define-key helm-find-files-map (kbd "C-b") 'helm-find-files-up-one-level) ;; ;; (define-key helm-find-files-map (kbd "C-f") 'helm-execute-persistent-action) ;; -;; ;; replace vanilla isearch with helm-swoop - -;; rebind tab to do persistent action -;; we use helm-execute-persistent-action more than helm-select-action (default for ) -;; (define-key helm-map (kbd "") 'helm-execute-persistent-action) ;; make TAB work in terminal ;; (define-key helm-map (kbd "C-i") 'helm-execute-persistent-action) ;; remap helm-select-action: lists actions From 3fcf20b86394db74c6cea44adf8d92b97a0d326e Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 22:00:49 +0200 Subject: [PATCH 15/39] Remove old dashboard file --- custom/setup-dashboard.el | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 custom/setup-dashboard.el diff --git a/custom/setup-dashboard.el b/custom/setup-dashboard.el deleted file mode 100644 index 6d1490a..0000000 --- a/custom/setup-dashboard.el +++ /dev/null @@ -1,17 +0,0 @@ -(require 'dashboard) - -(dashboard-setup-startup-hook) - -;; Set the startup message -(setq dashboard-banner-logo-title "") - -;; Set the banner -(setq dashboard-startup-banner 'logo) -(setq dashboard-items '((recents . 10) - (bookmarks . 5) - )) - -;; Enable recent files -(recentf-mode 1) - -(provide 'setup-dashboard) From 63258929387a09f11a4f05623542b9d5d81b6529 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 22:11:21 +0200 Subject: [PATCH 16/39] Helm-swoop: split window in current window --- config.org | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/config.org b/config.org index b5e4887..6803a61 100644 --- a/config.org +++ b/config.org @@ -506,7 +506,10 @@ To be fair, I didn't test this in a while... :bind ("C-s" . helm-swoop) :config + ;; "C-s" + "C-s" results in mult-swoop (define-key helm-swoop-map (kbd "C-s") 'helm-multi-swoop-all-from-helm-swoop) + ;; split window inside the current window when multiple windows open + (setq helm-swoop-split-with-multiple-windows t) ) ;; (require 'helm-config) @@ -525,15 +528,6 @@ To be fair, I didn't test this in a while... ;; TODO: experiment with helm-regexp (build and test regexes) ;; TODO: remember helm-top (helm interface for top program) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Next 2 lines make sure when using helm-swoop only the current window/buffer is affected ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; If this value is t, split window inside the current window -;; (setq helm-swoop-split-with-multiple-windows t) - -;; Split direcion. 'split-window-vertically or 'split-window-horizontally -;; (setq helm-swoop-split-direction 'split-window-vertically) - #+END_SRC ** Helm-gtags From 98b1dfc7ca72acfeaf21d3e351c912b7e27ee44f Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 22:15:57 +0200 Subject: [PATCH 17/39] Add multiple cursors section --- config.org | 16 ++++++++++++++++ custom/setup-cursors.el | 10 ---------- 2 files changed, 16 insertions(+), 10 deletions(-) delete mode 100644 custom/setup-cursors.el diff --git a/config.org b/config.org index 6803a61..093b32f 100644 --- a/config.org +++ b/config.org @@ -551,6 +551,22 @@ To be fair, I didn't test this in a while... ) #+END_SRC +* Mutliple cursors + +https://github.com/magnars/multiple-cursors.el + +#+BEGIN_SRC emacs-lisp +(use-package multiple-cursors + :ensure t + :bind + ("C-x r a" . mc/edit-lines) + ("C-x r e" . mc/edit-ends-of-lines) + ("C->" . mc/mark-next-like-this) + ("C-<" . mc/mark-previous-like-this) + ("C-c C->" . mc/mark-all-like-this) +) +#+END_SRC + * Old stuff, maybe usefull for lookup later ** Diff mode stuff diff --git a/custom/setup-cursors.el b/custom/setup-cursors.el deleted file mode 100644 index d5a1aca..0000000 --- a/custom/setup-cursors.el +++ /dev/null @@ -1,10 +0,0 @@ -(require 'multiple-cursors) - -(global-set-key (kbd "C-x r a") 'mc/edit-lines) -(global-set-key (kbd "C-x r e") 'mc/edit-ends-of-lines) - -(global-set-key (kbd "C->") 'mc/mark-next-like-this) -(global-set-key (kbd "C-<") 'mc/mark-previous-like-this) -(global-set-key (kbd "C-c C->") 'mc/mark-all-like-this) - -(provide 'setup-cursors) From 847f0d43eb05dc0cd44eb52cef2acc854d3aabf4 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 22:19:28 +0200 Subject: [PATCH 18/39] Add GDB section --- config.org | 41 +++++++++++++++++++++++++++++++++++++++++ custom/setup-gdb.el | 36 ------------------------------------ 2 files changed, 41 insertions(+), 36 deletions(-) delete mode 100644 custom/setup-gdb.el diff --git a/config.org b/config.org index 093b32f..738962b 100644 --- a/config.org +++ b/config.org @@ -567,6 +567,47 @@ https://github.com/magnars/multiple-cursors.el ) #+END_SRC +* GDB + +TODO: need to document this + +#+BEGIN_SRC emacs-lisp +(setq gdb-many-windows 1) + +;; Select a register number which is unlikely to get used elsewere +(defconst egdbe-windows-config-register 313465989 + "Internal used") + +(defvar egdbe-windows-config nil) + +(defun set-egdbe-windows-config () + (interactive) + (setq egdbe-windows-config (window-configuration-to-register egdbe-windows-config-register))) + +(defun egdbe-restore-windows-config () + (interactive) + (jump-to-register egdbe-windows-config-register)) + +(defun egdbe-start-gdb (&optional gdb-args) + "" + (interactive) + (set-egdbe-windows-config) + (call-interactively 'gdb)) + +(defun egdbe-quit () + "finish." + (interactive) + (gud-basic-call "quit") + (egdbe-restore-windows-config)) + +(defun egdbe-gud-mode-hook () + "" + (local-unset-key (kbd "q")) + (local-set-key (kbd "q") 'egdbe-quit)) + +(add-hook 'gud-mode-hook 'egdbe-gud-mode-hook) +#+END_SRC + * Old stuff, maybe usefull for lookup later ** Diff mode stuff diff --git a/custom/setup-gdb.el b/custom/setup-gdb.el deleted file mode 100644 index 4d40663..0000000 --- a/custom/setup-gdb.el +++ /dev/null @@ -1,36 +0,0 @@ -(setq gdb-many-windows 1) - -;; Select a register number which is unlikely to get used elsewere -(defconst egdbe-windows-config-register 313465989 - "Internal used") - -(defvar egdbe-windows-config nil) - -(defun set-egdbe-windows-config () - (interactive) - (setq egdbe-windows-config (window-configuration-to-register egdbe-windows-config-register))) - -(defun egdbe-restore-windows-config () - (interactive) - (jump-to-register egdbe-windows-config-register)) - -(defun egdbe-start-gdb (&optional gdb-args) - "" - (interactive) - (set-egdbe-windows-config) - (call-interactively 'gdb)) - -(defun egdbe-quit () - "finish." - (interactive) - (gud-basic-call "quit") - (egdbe-restore-windows-config)) - -(defun egdbe-gud-mode-hook () - "" - (local-unset-key (kbd "q")) - (local-set-key (kbd "q") 'egdbe-quit)) - -(add-hook 'gud-mode-hook 'egdbe-gud-mode-hook) - -(provide 'setup-gdb) From 96ab07c63805dccf5f6c1829e0fecfa6362e32a2 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 22:28:21 +0200 Subject: [PATCH 19/39] Add C coding setting + angry faces --- config.org | 43 ++++++++++++++++++++++++++++++++++++++++++ custom/setup-coding.el | 32 ------------------------------- 2 files changed, 43 insertions(+), 32 deletions(-) diff --git a/config.org b/config.org index 738962b..d1dbbed 100644 --- a/config.org +++ b/config.org @@ -267,6 +267,49 @@ Automatically delete trailing whitespace when saving a file. (add-hook 'before-save-hook 'delete-trailing-whitespace) #+END_SRC +** Angry faces + +#+BEGIN_SRC emacs-lisp +;; make angry face to get my attention +(setq prog-modes '(c++-mode python-mode erlang-mode java-mode c-mode emacs-lisp-mode scheme-mode prog-mode)) +(make-face 'font-lock-angry-face) +(modify-face 'font-lock-angry-face "Red" "Yellow" nil t nil t nil nil) + +;; Add keywords to recognize to angry face +(mapc (lambda (mode) + (font-lock-add-keywords + mode + '(("\\<\\(FIXME\\)" 1 'font-lock-angry-face t))) + ) + prog-modes) +(mapc (lambda (mode) + (font-lock-add-keywords + mode + '(("\\<\\(TODO\\)" 1 'font-lock-angry-face t))) + ) + prog-modes) +#+END_SRC + +** C Coding settings + +Some basic C-coding settings (style, indentation offset, ...). + +#+BEGIN_SRC emacs-lisp +;; default coding style +(setq c-default-style "linux") + +;; sane indentation offset +(setq c-basic-offset 4) +#+END_SRC + +** Tabs vs spaces + +Tabs are evil. + +#+BEGIN_SRC emacs-lisp +(setq-default indent-tabs-mode nil) +#+END_SRC + * Undo-tree Undo with =C-/=. diff --git a/custom/setup-coding.el b/custom/setup-coding.el index def1407..c4beb5f 100644 --- a/custom/setup-coding.el +++ b/custom/setup-coding.el @@ -1,35 +1,3 @@ -;; make angry face to get my attention -(setq prog-modes '(c++-mode python-mode erlang-mode java-mode c-mode emacs-lisp-mode scheme-mode prog-mode)) -(make-face 'font-lock-angry-face) -(modify-face 'font-lock-angry-face "Red" "Yellow" nil t nil t nil nil) - -;; Add keywords to recognize to angry face -(mapc (lambda (mode) - (font-lock-add-keywords - mode - '(("\\<\\(FIXME\\)" 1 'font-lock-angry-face t))) - ) - prog-modes) -(mapc (lambda (mode) - (font-lock-add-keywords - mode - '(("\\<\\(TODO\\)" 1 'font-lock-angry-face t))) - ) - prog-modes) - -;; default coding style -(setq c-default-style "linux") - -;; sane indentation offset -(setq c-basic-offset 4) - -;; Tab-space strategy -;; we use spaces, deal with it -(setq-default indent-tabs-mode nil) - -;; Enable subword mode for handling CamelCase format -(global-subword-mode t) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Python ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; From 623759dd64b4f4a21fb3d28d364fcc1282eeb88d Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 12 Jun 2018 22:39:05 +0200 Subject: [PATCH 20/39] Add magit section --- config.org | 10 ++++++++++ custom/setup-coding.el | 5 ----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/config.org b/config.org index d1dbbed..34d0c82 100644 --- a/config.org +++ b/config.org @@ -651,6 +651,16 @@ TODO: need to document this (add-hook 'gud-mode-hook 'egdbe-gud-mode-hook) #+END_SRC +* Magit + +#+BEGIN_SRC emacs-lisp +(use-package magit + :ensure t + :bind + ("C-c m" . magit-status) +) +#+END_SRC + * Old stuff, maybe usefull for lookup later ** Diff mode stuff diff --git a/custom/setup-coding.el b/custom/setup-coding.el index c4beb5f..d915503 100644 --- a/custom/setup-coding.el +++ b/custom/setup-coding.el @@ -8,9 +8,4 @@ (add-hook 'elpy-mode-hook 'flycheck-mode) (add-hook 'elpy-mode-hook 'py-autopep8-enable-on-save) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Magit (git) ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(global-set-key (kbd "C-c m") 'magit-status) - (provide 'setup-coding) From ef4b87f560b74303f4538a5f232b00d6a571f6d5 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Wed, 13 Jun 2018 00:07:20 +0200 Subject: [PATCH 21/39] Add melpa to package-archives (needed for flycheck-clang-*) --- init.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/init.el b/init.el index d614563..aaaaeda 100644 --- a/init.el +++ b/init.el @@ -6,6 +6,8 @@ ;; add melpa-stable to package-archives (add-to-list 'package-archives '("melpa-stable" . "https://stable.melpa.org/packages/") t) +(add-to-list 'package-archives + '("melpa" . "http://melpa.milkbox.net/packages/") t) ;; MUST be called after package-archives is updated (package-initialize) From 70662a4f65499bd707a15114e96740baddaaabcd Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Wed, 13 Jun 2018 00:38:20 +0200 Subject: [PATCH 22/39] Add programming section - Setup company/ivory/flycheck - basic setup --- config.org | 114 ++++++++++++++++++++++++++++----- custom/setup-autocompletion.el | 14 ---- 2 files changed, 98 insertions(+), 30 deletions(-) diff --git a/config.org b/config.org index 34d0c82..bbea73f 100644 --- a/config.org +++ b/config.org @@ -446,22 +446,6 @@ https://github.com/remyferre/comment-dwim-2 ) #+END_SRC -* Yasnippet - -Template system for Emacs. - -https://github.com/joaotavora/yasnippet - -#+BEGIN_SRC emacs-lisp -(use-package yasnippet - :ensure t - :config - (add-to-list 'load-path - "~/.emacs.d/plugins/yasnippet") - (yas-global-mode 1) -) -#+END_SRC - * Expand-region Expand region increases the selected region by semantic units. @@ -661,6 +645,104 @@ TODO: need to document this ) #+END_SRC +* Programming + +** Yasnippet + +Template system for Emacs. + +https://github.com/joaotavora/yasnippet + +#+BEGIN_SRC emacs-lisp +(use-package yasnippet + :ensure t + :init + (add-to-list 'load-path + "~/.emacs.d/plugins/yasnippet") + :config + (add-hook 'prog-mode-hook 'yas-minor-mode) +) +#+END_SRC + +** Flycheck + +On-the-fly syntax checking. + +#+BEGIN_SRC emacs-lisp +(use-package flycheck + :ensure t + :config + (add-hook 'prog-mode-hook 'flycheck-mode) +) +#+END_SRC + +** Company mode + +#+BEGIN_SRC emacs-lisp +(use-package company + :ensure t + :config + (setq company-idle-delay 0) + (setq company-minimum-prefix-length 3)) + (add-hook 'prog-mode-hook 'company-mode) +#+END_SRC + +** C/C++ mode + +*** Flycheck + +Clang static analyzer with flycheck + +https://github.com/alexmurray/flycheck-clang-analyzer +https://github.com/Sarcasm/flycheck-irony + +#+BEGIN_SRC emacs-lisp +(use-package flycheck-clang-analyzer + :ensure t + :config + (with-eval-after-load 'flycheck + (require 'flycheck-clang-analyzer) + (flycheck-clang-analyzer-setup))) + +(use-package flycheck-irony + :ensure t + :config + (eval-after-load 'flycheck + '(add-hook 'flycheck-mode-hook #'flycheck-irony-setup)) +) +#+END_SRC + +*** Company + +https://github.com/ikirill/irony-eldoc + +#+BEGIN_SRC emacs-lisp +(use-package company-c-headers + :ensure t) + +(use-package company-irony + :ensure t + :config + (setq company-backends '((company-c-headers +;; company-dabbrev-code ;; not sure what this is + company-irony)))) + +(use-package irony + :ensure t + :config + (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options) + (add-hook 'c++-mode-hook 'irony-mode) + (add-hook 'c-mode-hook 'irony-mode) + (add-hook 'objc-mode-hook 'irony-mode) +) + +(use-package irony-eldoc + :ensure t + :config + (add-hook 'irony-mode-hook 'irony-eldoc) +) +#+END_SRC + * Old stuff, maybe usefull for lookup later ** Diff mode stuff diff --git a/custom/setup-autocompletion.el b/custom/setup-autocompletion.el index e784b93..fbfbaca 100644 --- a/custom/setup-autocompletion.el +++ b/custom/setup-autocompletion.el @@ -1,21 +1,7 @@ -(add-hook 'after-init-hook 'global-company-mode) - -;; Add irony as company-backend -(eval-after-load 'company - '(add-to-list 'company-backends 'company-irony)) - ;; Add irony as flycheck hook (eval-after-load 'flycheck '(add-hook 'flycheck-mode-hook 'flycheck-irony-setup)) -(add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options) -(add-hook 'irony-mode-hook 'irony-eldoc) - -;; Add irony-, flycheck-, company-mode to c-mode -(add-hook 'c-mode-hook 'irony-mode) -(add-hook 'c-mode-hook 'flycheck-mode) -(add-hook 'c-mode-hook 'company-mode) - ;; Set tab to autocomplete or indent depending on context (global-set-key (kbd "") 'company-indent-or-complete-common) From 68afa8fc08252b47a0719ebf46811b85e129edce Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Wed, 13 Jun 2018 00:42:41 +0200 Subject: [PATCH 23/39] Add avy --- config.org | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/config.org b/config.org index bbea73f..bb723f5 100644 --- a/config.org +++ b/config.org @@ -743,6 +743,17 @@ https://github.com/ikirill/irony-eldoc ) #+END_SRC +* Avy + +https://github.com/abo-abo/avy + +#+BEGIN_SRC emacs-lisp +(use-package avy + :ensure t + :bind + ("M-s" . avy-goto-char-timer)) +#+END_SRC + * Old stuff, maybe usefull for lookup later ** Diff mode stuff From ad283281232e61b97f74ce6868e2bbd4e8276a1f Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Wed, 13 Jun 2018 00:53:53 +0200 Subject: [PATCH 24/39] Enable relative line numbers in program-mode --- config.org | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/config.org b/config.org index bb723f5..e051479 100644 --- a/config.org +++ b/config.org @@ -687,6 +687,16 @@ On-the-fly syntax checking. (add-hook 'prog-mode-hook 'company-mode) #+END_SRC +** (Relative) Line numbers + +#+BEGIN_SRC emacs-lisp +(use-package linum-relative + :ensure t + :config + (setq linum-relative-current-symbol "") + (add-hook 'prog-mode-hook 'linum-relative-mode)) +#+END_SRC + ** C/C++ mode *** Flycheck From 51f232a9dd0f7e40097e564608699890a79a3aba Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Wed, 13 Jun 2018 00:54:24 +0200 Subject: [PATCH 25/39] Window splitting convenience functions --- config.org | 23 +++++++++++++++++++++++ init.el | 15 +++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/config.org b/config.org index e051479..7fbae73 100644 --- a/config.org +++ b/config.org @@ -753,6 +753,29 @@ https://github.com/ikirill/irony-eldoc ) #+END_SRC +* Windows + +** Splitting + +After you split a window, your focus remains in the previous one. +Credit goes to https://github.com/daedreth/UncleDavesEmacs + +#+BEGIN_SRC emacs-lisp +(defun split-and-follow-horizontally () + (interactive) + (split-window-below) + (balance-windows) + (other-window 1)) +(global-set-key (kbd "C-x 2") 'split-and-follow-horizontally) + +(defun split-and-follow-vertically () + (interactive) + (split-window-right) + (balance-windows) + (other-window 1)) +(global-set-key (kbd "C-x 3") 'split-and-follow-vertically) +#+END_SRC + * Avy https://github.com/abo-abo/avy diff --git a/init.el b/init.el index aaaaeda..16b4ed1 100644 --- a/init.el +++ b/init.el @@ -22,3 +22,18 @@ (org-babel-load-file (expand-file-name "~/.emacs.d/config.org"))) (provide 'init) +(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. + '(helm-gtags-auto-update t) + '(package-selected-packages + (quote + (linum-relative avy flycheck-irony irony-eldoc company-irony company-c-headers flycheck magit py-autopep8 multiple-cursors helm-gtags helm-swoop zygospore yasnippet volatile-highlights use-package undo-tree smartparens smart-mode-line monokai-theme iedit helm expand-region dashboard comment-dwim-2)))) +(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. + ) From c8573cde04764e182b86dfc3251ee24792de0551 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Wed, 13 Jun 2018 00:58:51 +0200 Subject: [PATCH 26/39] Add switch-window --- config.org | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/config.org b/config.org index 7fbae73..3f66f63 100644 --- a/config.org +++ b/config.org @@ -776,6 +776,22 @@ Credit goes to https://github.com/daedreth/UncleDavesEmacs (global-set-key (kbd "C-x 3") 'split-and-follow-vertically) #+END_SRC +** Switching + +#+BEGIN_SRC emacs-lisp +(use-package switch-window + :ensure t + :config + (setq switch-window-input-style 'minibuffer) + (setq switch-window-increase 4) + (setq switch-window-threshold 2) + (setq switch-window-shortcut-style 'qwerty) + (setq switch-window-qwerty-shortcuts + '("a" "s" "d" "f" "j" "k" "l" "i" "o")) + :bind + ("C-x o" . switch-window)) +#+END_SRC + * Avy https://github.com/abo-abo/avy From 9db1ce210e1acf1984a2621413d21bada92853d2 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Wed, 13 Jun 2018 09:25:59 +0200 Subject: [PATCH 27/39] Set company-minimum-prefix to 2 --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index 3f66f63..5c35833 100644 --- a/config.org +++ b/config.org @@ -683,7 +683,7 @@ On-the-fly syntax checking. :ensure t :config (setq company-idle-delay 0) - (setq company-minimum-prefix-length 3)) + (setq company-minimum-prefix-length 2)) (add-hook 'prog-mode-hook 'company-mode) #+END_SRC From 9d650ebbd53daddb27658a557d27195f0f7692c4 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Wed, 13 Jun 2018 10:31:21 +0200 Subject: [PATCH 28/39] Add link to switch-window + tryout for multiple frames - Move window-switching specific stuff section from the past to here as well --- config.org | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/config.org b/config.org index 5c35833..e1dad54 100644 --- a/config.org +++ b/config.org @@ -86,23 +86,6 @@ Because I'm lazy, important yes-or-no questions can be answered with y-or-n: (add-to-list 'default-frame-alist '(fullscreen . maximized)) #+END_SRC -** Multi-frame rebindings - -Sometimes I have multiple emacs-frames open. -I prefer that the normal =C-x o= can deal with this. - -#+BEGIN_SRC emacs-lisp -;; Use C-x o to switch to other frame when using multi-monitor -(global-set-key (kbd "C-x o") 'next-multiframe-window) -#+END_SRC - -Now that =next-multiframe-window= is bound to =C-x o=, -Bind =C-x p= to =previous-multiframe-window=. - -#+BEGIN_SRC emacs-lisp -(global-set-key (kbd "\C-x p") 'previous-multiframe-window) -#+END_SRC - ** Enable disabled commands Some commands are disabled to protect the user. @@ -778,20 +761,44 @@ Credit goes to https://github.com/daedreth/UncleDavesEmacs ** Switching +https://github.com/dimitri/switch-window + #+BEGIN_SRC emacs-lisp (use-package switch-window :ensure t :config (setq switch-window-input-style 'minibuffer) - (setq switch-window-increase 4) + (setq switch-window-increase 6) (setq switch-window-threshold 2) (setq switch-window-shortcut-style 'qwerty) (setq switch-window-qwerty-shortcuts '("a" "s" "d" "f" "j" "k" "l" "i" "o")) +;; (setq switch-window-multiple-frames t) ;; TODO: doesn't work properly.. :bind ("C-x o" . switch-window)) #+END_SRC +When using exwm, have a look at this: https://github.com/dimitri/switch-window/pull/62 + + +** Multi-frame rebindings (obsolete with switch-window) + +Sometimes I have multiple emacs-frames open. +In the past, I preferred that the normal =C-x o= can deal with this but this is used by switch-window now. + +#+BEGIN_SRC emacs-lisp +;; Use C-x o to switch to other frame when using multi-monitor +;; (global-set-key (kbd "C-x o") 'next-multiframe-window) +#+END_SRC + +Now that =next-multiframe-window= is bound to =C-x o=, +Bind =C-x p= to =previous-multiframe-window=. + +#+BEGIN_SRC emacs-lisp +;; (global-set-key (kbd "\C-x p") 'previous-multiframe-window) +#+END_SRC + + * Avy https://github.com/abo-abo/avy From 39d0fdd7aad5775efee8d4a20d456be0e96d48d7 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Wed, 13 Jun 2018 10:48:59 +0200 Subject: [PATCH 29/39] Add configuration-convenience functions --- config.org | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/config.org b/config.org index e1dad54..c5afd1b 100644 --- a/config.org +++ b/config.org @@ -798,7 +798,6 @@ Bind =C-x p= to =previous-multiframe-window=. ;; (global-set-key (kbd "\C-x p") 'previous-multiframe-window) #+END_SRC - * Avy https://github.com/abo-abo/avy @@ -810,6 +809,27 @@ https://github.com/abo-abo/avy ("M-s" . avy-goto-char-timer)) #+END_SRC +* Convenience stuff + +** Visiting the configuration + +#+BEGIN_SRC emacs-lisp +(defun config-visit () + (interactive) + (find-file "~/.emacs.d/config.org")) +(global-set-key (kbd "C-c e") 'config-visit) +#+END_SRC + +** Reload the configuration + +#+BEGIN_SRC emacs-lisp +(defun config-reload () + "Reloads ~/.emacs.d/config.org at runtime" + (interactive) + (org-babel-load-file (expand-file-name "~/.emacs.d/config.org"))) +(global-set-key (kbd "C-c r") 'config-reload) +#+END_SRC + * Old stuff, maybe usefull for lookup later ** Diff mode stuff From a18574f65e82ed4ded702e3cdde1e0e39c309772 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Wed, 13 Jun 2018 10:49:29 +0200 Subject: [PATCH 30/39] Enable subword mode (globally) --- config.org | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config.org b/config.org index c5afd1b..3796347 100644 --- a/config.org +++ b/config.org @@ -830,6 +830,12 @@ https://github.com/abo-abo/avy (global-set-key (kbd "C-c r") 'config-reload) #+END_SRC +** Subword + +#+BEGIN_SRC emacs-lisp +(global-subword-mode 1) +#+END_SRC + * Old stuff, maybe usefull for lookup later ** Diff mode stuff From 9608eb5ac9eaccecb18914d1d4afa1645645e503 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Thu, 14 Jun 2018 23:30:27 +0200 Subject: [PATCH 31/39] Avy: Set 'M-s' to avy-goto-char --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index 3796347..b1168af 100644 --- a/config.org +++ b/config.org @@ -806,7 +806,7 @@ https://github.com/abo-abo/avy (use-package avy :ensure t :bind - ("M-s" . avy-goto-char-timer)) + ("M-s" . avy-goto-char)) #+END_SRC * Convenience stuff From 5e37f3e653fce60598ed19183db497c24e970fa0 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Thu, 14 Jun 2018 23:39:23 +0200 Subject: [PATCH 32/39] Start emacs server --- config.org | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/config.org b/config.org index b1168af..53f35dd 100644 --- a/config.org +++ b/config.org @@ -836,6 +836,15 @@ https://github.com/abo-abo/avy (global-subword-mode 1) #+END_SRC +* Server + +Emacs as a server. +Emacsclient will then use this emacs as its server. + +#+BEGIN_SRC emacs-lisp +(server-start) +#+END_SRC + * Old stuff, maybe usefull for lookup later ** Diff mode stuff From f2b345306f6d5c15b437b80fab416c63da9b9ced Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Fri, 15 Jun 2018 00:18:28 +0200 Subject: [PATCH 33/39] Add beacon section --- config.org | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/config.org b/config.org index 53f35dd..7c786a2 100644 --- a/config.org +++ b/config.org @@ -845,6 +845,19 @@ Emacsclient will then use this emacs as its server. (server-start) #+END_SRC +* Beacon + +https://github.com/Malabarba/beacon + +#+BEGIN_SRC emacs-lisp +(use-package beacon + :ensure t + :config + (beacon-mode 1) + (setq beacon-color "#FFFFCC") ;; yelowish +) +#+END_SRC + * Old stuff, maybe usefull for lookup later ** Diff mode stuff From b621088849ffe2bf09862ebde51b5292256ec7f8 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 26 Jun 2018 12:49:02 +0200 Subject: [PATCH 34/39] Make TAB work in minibuffer --- config.org | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config.org b/config.org index 7c786a2..6d2c3d4 100644 --- a/config.org +++ b/config.org @@ -526,10 +526,10 @@ To be fair, I didn't test this in a while... ;; ;; (define-key helm-find-files-map (kbd "C-b") 'helm-find-files-up-one-level) ;; ;; (define-key helm-find-files-map (kbd "C-f") 'helm-execute-persistent-action) ;; -;; make TAB work in terminal -;; (define-key helm-map (kbd "C-i") 'helm-execute-persistent-action) +;; make TAB work in terminal/minibuffer +(define-key helm-map (kbd "C-i") 'helm-execute-persistent-action) ;; remap helm-select-action: lists actions -;; (define-key helm-map (kbd "C-z") 'helm-select-action) +(define-key helm-map (kbd "C-z") 'helm-select-action) ;; remap calculator ;; (global-set-key (kbd "C-c C-c") 'helm-calcul-expression) From f4b6e239421c32c9255d0bbcc7ded5c5c185e4c4 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Tue, 26 Jun 2018 12:50:14 +0200 Subject: [PATCH 35/39] Set GC threshold --- config.org | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config.org b/config.org index 6d2c3d4..9161825 100644 --- a/config.org +++ b/config.org @@ -65,12 +65,12 @@ so rebind it to something easy to remember. I used to have the following enabled in my init to increase the gc threshold to speed-up emacs startup: (stolen from [[http://bling.github.io/blog/2016/01/18/why-are-you-changing-gc-cons-threshold/]]) -#+BEGIN_SRC -;; (setq gc-cons-threshold 100000000) +#+BEGIN_SRC emacs-lisp +(setq gc-cons-threshold 100000000) #+END_SRC But according to this: [[https://lists.gnu.org/archive/html/help-gnu-emacs/2007-06/msg00243.html ]], -it is no longer necessary. +it is no longer necessary. But I found that I still have to do this to speed up emacs. ** Yes-or-no questions From 878e2924407a6ab3bd56e8c33a7b051a548d1057 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Sun, 1 Jul 2018 16:20:40 +0200 Subject: [PATCH 36/39] Add elpy --- config.org | 18 +++++++++++++++++- init.el | 2 +- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/config.org b/config.org index 9161825..f34dfe9 100644 --- a/config.org +++ b/config.org @@ -18,7 +18,8 @@ This configuration requires the installation of : - =clang= (for ivory) - =cmake= (for ivory) - =llvm-libs= (for cmake, somehow not a dependency on Manjaro when installing cmake) - - Use python-pip to install =jedi=, =flake8=, =importmagic= and =autopep8= (for elpy) + - Use python-pip to install requirements for elpy: + =pip install jedi flake8 importmagic autopep8 yapf= - =ditaa= (for ascii to image generation in org-mode) When first checking out this config, run =irony-install-server= to make and install the irony-server. @@ -736,6 +737,21 @@ https://github.com/ikirill/irony-eldoc ) #+END_SRC +** Python mode + +Use =elpy=: +https://github.com/jorgenschaefer/elpy + +It is a full dev env and sometimes feels like a bit too much but overal good experience. + +#+BEGIN_SRC emacs-lisp +(use-package elpy + :ensure t + :config + (elpy-enable) +) +#+END_SRC + * Windows ** Splitting diff --git a/init.el b/init.el index 16b4ed1..dbbf211 100644 --- a/init.el +++ b/init.el @@ -30,7 +30,7 @@ '(helm-gtags-auto-update t) '(package-selected-packages (quote - (linum-relative avy flycheck-irony irony-eldoc company-irony company-c-headers flycheck magit py-autopep8 multiple-cursors helm-gtags helm-swoop zygospore yasnippet volatile-highlights use-package undo-tree smartparens smart-mode-line monokai-theme iedit helm expand-region dashboard comment-dwim-2)))) + (elpy linum-relative avy flycheck-irony irony-eldoc company-irony company-c-headers flycheck magit py-autopep8 multiple-cursors helm-gtags helm-swoop zygospore yasnippet volatile-highlights use-package undo-tree smartparens smart-mode-line monokai-theme iedit helm expand-region dashboard comment-dwim-2)))) (custom-set-faces ;; custom-set-faces was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. From 00798716825b4121dd4496d091ea64bd6b9ca154 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Sun, 1 Jul 2018 16:22:31 +0200 Subject: [PATCH 37/39] Disable audible bell --- config.org | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/config.org b/config.org index f34dfe9..7d448ed 100644 --- a/config.org +++ b/config.org @@ -852,6 +852,14 @@ https://github.com/abo-abo/avy (global-subword-mode 1) #+END_SRC +** Bell + +The audible bell is annoying AF. + +#+BEGIN_SRC emacs-lisp +(setq visible-bell 1) +#+END_SRC + * Server Emacs as a server. From 850711cfdd5a60437987d5949359e467f2ff1a6a Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Sun, 1 Jul 2018 15:43:36 +0200 Subject: [PATCH 38/39] Add sunrise commander as submodule --- .gitmodules | 3 +++ extra/sunrise-commander | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 extra/sunrise-commander diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..f8db735 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "extra/sunrise-commander"] + path = extra/sunrise-commander + url = https://github.com/escherdragon/sunrise-commander diff --git a/extra/sunrise-commander b/extra/sunrise-commander new file mode 160000 index 0000000..cf8305a --- /dev/null +++ b/extra/sunrise-commander @@ -0,0 +1 @@ +Subproject commit cf8305a149a321d028858057e7a7c92f0038a06a From 368de145873a53bf16194a48ea1bdd26f2fb0343 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Sun, 1 Jul 2018 15:43:59 +0200 Subject: [PATCH 39/39] Add basic sunrise commander config --- config.org | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/config.org b/config.org index 7d448ed..9f19416 100644 --- a/config.org +++ b/config.org @@ -882,6 +882,22 @@ https://github.com/Malabarba/beacon ) #+END_SRC +* Sunrise commander + +https://github.com/escherdragon/sunrise-commander + +** Install + +#+BEGIN_SRC emacs-lisp +(add-to-list 'load-path "~/.emacs.d/extra/sunrise-commander") + +(require 'sunrise-commander) +(require 'sunrise-x-buttons) +(require 'sunrise-x-modeline) + +(add-to-list 'auto-mode-alist '("\\.srvm\\'" . sr-virtual-mode)) +#+END_SRC + * Old stuff, maybe usefull for lookup later ** Diff mode stuff