mirror of
https://github.com/doomemacs/doomemacs
synced 2025-09-08 15:23:35 -05:00
Final update
This commit is contained in:
@@ -1,185 +0,0 @@
|
||||
;; Global editor behavior
|
||||
(electric-indent-mode -1)
|
||||
(setq electric-indent-chars '(? ?: ?{))
|
||||
(add-hook 'python-mode-hook 'electric-indent-local-mode)
|
||||
|
||||
(add-hook 'emacs-lisp-mode-hook 'turn-on-eldoc-mode)
|
||||
(add-hook! 'eldoc-mode-hook (diminish 'eldoc-mode " ?"))
|
||||
|
||||
(setq-default fill-column 80)
|
||||
(diminish 'auto-fill-function)
|
||||
;; Sane scroll settings
|
||||
(setq scroll-margin 5)
|
||||
(setq scroll-conservatively 9999)
|
||||
(setq scroll-preserve-screen-position 1)
|
||||
;; I'll use visual mode, kthxbai
|
||||
(setq shift-select-mode nil)
|
||||
|
||||
;;;; Modes 'n hooks ;;;;;;;;;;;;;;;;;
|
||||
(associate-mode "/LICENSE[^/]*$" 'text-mode)
|
||||
(associate-mode "zsh\\(env\\|rc\\)?$" 'sh-mode)
|
||||
(associate-mode "z\\(profile\\|login\\|logout\\)?$" 'sh-mode)
|
||||
(associate-mode "zsh/" 'sh-mode)
|
||||
(associate-mode "\\.applescript$" 'applescript-mode)
|
||||
(associate-mode "Cask$" 'emacs-lisp-mode)
|
||||
(associate-mode "\\.el\\.gz$" 'emacs-lisp-mode)
|
||||
(associate-mode "/Makefile$" 'makefile-gmake-mode)
|
||||
(associate-mode "\\.plist$" 'nxml-mode)
|
||||
|
||||
(add-hook 'help-mode-hook 'visual-line-mode)
|
||||
(add-hook 'before-save-hook 'delete-trailing-whitespace)
|
||||
|
||||
;; (setenv "SHELL" (s-trim (shell-command-to-string "which zsh")))
|
||||
(setenv "SHELL" "/usr/local/bin/zsh")
|
||||
(setenv "EMACS" "1")
|
||||
|
||||
;; show-paren faces
|
||||
(set-face-background 'show-paren-match nil)
|
||||
(set-face-foreground 'show-paren-match "orange")
|
||||
(set-face-attribute 'show-paren-match nil :weight 'extra-bold)
|
||||
(setq show-paren-delay 0)
|
||||
|
||||
(let ((face 'evil-search-highlight-persist-highlight-face))
|
||||
(set-face-attribute face nil :inherit 'isearch-lazy-highlight-face)
|
||||
(set-face-foreground face nil)
|
||||
(set-face-background face nil))
|
||||
|
||||
(diminish 'isearch-mode)
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
(use-package anzu
|
||||
:diminish anzu-mode
|
||||
:config (global-anzu-mode +1))
|
||||
|
||||
(use-package smartparens
|
||||
:diminish smartparens-mode
|
||||
:config
|
||||
(progn
|
||||
(require 'smartparens-config)
|
||||
(smartparens-global-mode 1)
|
||||
|
||||
(setq blink-matching-paren t)
|
||||
(setq sp-autowrap-region nil ; let evil-surround handle this
|
||||
sp-highlight-pair-overlay nil
|
||||
sp-show-pair-delay 0
|
||||
sp-autoescape-string-quote nil)
|
||||
|
||||
;; Handle newlines + spaces
|
||||
(sp-pair "{" "}" :post-handlers '(("||\n[i]" "RET") ("| " " ")) :unless '(sp-point-before-word-p sp-point-before-same-p))
|
||||
(sp-pair "(" ")" :post-handlers '(("||\n[i]" "RET") ("| " " ")) :unless '(sp-point-before-word-p sp-point-before-same-p))
|
||||
|
||||
;; Auto-close more conservatively
|
||||
(sp-pair "[" nil :unless '(sp-point-before-word-p sp-point-before-same-p))
|
||||
(sp-pair "'" nil :unless '(sp-point-after-word-p sp-point-before-word-p sp-point-before-same-p))
|
||||
(sp-pair "\"" nil :unless '(sp-point-after-word-p sp-point-before-word-p sp-point-before-same-p))
|
||||
|
||||
(sp-with-modes '(json-mode js2-mode ruby-mode enh-ruby-mode python-mode)
|
||||
(sp-local-pair "[" nil :post-handlers '(("||\n[i]" "RET"))))
|
||||
|
||||
(sp-with-modes '(c-mode c++-mode objc-mode java-mode scss-mode css-mode php-mode)
|
||||
(sp-local-pair "/* " " */" :post-handlers '(("||\n[i]" "RET")))
|
||||
(sp-local-pair "/**" "*/" :post-handlers '(("||\n[i]" "RET"))))
|
||||
|
||||
;; Support for generics
|
||||
(sp-with-modes '(c-mode c++-mode objc-mode java-mode)
|
||||
(sp-local-pair "<" ">" :when '(sp-point-after-word-p) :unless '(sp-point-before-same-p)))
|
||||
|
||||
(sp-with-modes '(objc-mode scss-mode css-mode)
|
||||
(sp-local-pair "/*\n" "\n */" :post-handlers '(("||[i]" "RET"))))
|
||||
|
||||
(sp-with-modes '(c-mode c++-mode php-mode java-mode)
|
||||
(sp-local-pair "/*" "" :post-handlers '((" ||\n[i]*/" "RET"))))
|
||||
|
||||
(after "yasnippet"
|
||||
(defadvice yas-expand (before advice-for-yas-expand activate)
|
||||
(sp-remove-active-pair-overlay)))))
|
||||
|
||||
(use-package rotate-text
|
||||
:commands (rotate-word-at-point rotate-region))
|
||||
|
||||
(use-package smart-forward
|
||||
:commands (smart-up smart-down smart-left smart-right))
|
||||
|
||||
(use-package expand-region
|
||||
:commands (er/expand-region er/contract-region er/mark-symbol er/mark-word))
|
||||
|
||||
(use-package hl-todo
|
||||
:commands hl-todo-mode
|
||||
:init (add-hook 'prog-mode-hook 'hl-todo-mode))
|
||||
|
||||
(use-package emr
|
||||
:commands (emr-initialize emr-show-refactor-menu)
|
||||
:config (bind popup-menu-keymap [escape] 'keyboard-quit))
|
||||
|
||||
(use-package dash-at-point
|
||||
:if is-mac
|
||||
:commands (dash-at-point dash-at-point-with-docset)
|
||||
:config
|
||||
(add-to-list 'dash-at-point-mode-alist
|
||||
'(java-mode . "java,droid,javafx,grails,groovy,playjava,spring,cvj,processing,javadoc")))
|
||||
|
||||
(use-package rainbow-delimiters
|
||||
:commands rainbow-delimiters-mode
|
||||
:init (add-hooks '(emacs-lisp-mode-hook js2-mode-hook scss-mode-hook)
|
||||
'rainbow-delimiters-mode)
|
||||
:config
|
||||
(progn
|
||||
(setq rainbow-delimiters-outermost-only-face-count 1)
|
||||
(set-face-attribute 'rainbow-delimiters-depth-1-face nil
|
||||
:foreground 'unspecified
|
||||
:inherit 'my-outermost-paren-face)))
|
||||
|
||||
(use-package yaml-mode
|
||||
:mode "\\.ya?ml$"
|
||||
:init (add-hook 'yaml-mode-hook 'enable-tab-width-2))
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
(progn ; Code building
|
||||
(defvar my-build-command '("make %s" . "Makefile"))
|
||||
(make-variable-buffer-local 'my-build-command)
|
||||
|
||||
(defun set-build-command (command &optional file)
|
||||
(when (or (null file)
|
||||
(project-has-files file))
|
||||
(setq my-build-command `(,command . ,file))))
|
||||
|
||||
(evil-define-command my:build (arg)
|
||||
"Call a build command in the current directory.
|
||||
If ARG is nil this function calls `recompile', otherwise it calls
|
||||
`compile' passing ARG as build command."
|
||||
(interactive "<sh>")
|
||||
(when (null my-build-command)
|
||||
(user-error "No build command was set"))
|
||||
(let ((build-file (cdr my-build-command))
|
||||
(build-cmd (car my-build-command)))
|
||||
(if (project-has-files build-file)
|
||||
(compile (format "cd '%s' && %s" build-file (format build-cmd (or arg ""))))
|
||||
(error "Could not find Makefile")))))
|
||||
|
||||
(progn ; Code running
|
||||
(evil-define-operator my:eval-region (beg end)
|
||||
:move-point nil
|
||||
(interactive "<r>")
|
||||
(cond ((eq major-mode 'emacs-lisp-mode)
|
||||
(eval-region beg end))
|
||||
(t
|
||||
(let ((interp (my--get-interpreter))
|
||||
(max-mini-window-height 1))
|
||||
(when interp (shell-command-on-region beg end interp))))))
|
||||
|
||||
(evil-define-command my:eval-buffer ()
|
||||
(interactive)
|
||||
(cond ((eq major-mode 'emacs-lisp-mode)
|
||||
(eval-buffer))
|
||||
(t
|
||||
(let ((interp (my--get-interpreter))
|
||||
(max-mini-window-height 1))
|
||||
(when interp (shell-command-on-region (point-min) (point-max) interp))))))
|
||||
|
||||
(defun my--get-interpreter ()
|
||||
(car (--first (eq (cdr it) major-mode) interpreter-mode-alist))))
|
||||
|
||||
|
||||
(provide 'core-editor)
|
||||
;;; core-editor.el ends here
|
@@ -1,295 +0,0 @@
|
||||
;;;; Eeeeeeevil ;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
(use-package evil
|
||||
:diminish undo-tree-mode
|
||||
:config
|
||||
(progn
|
||||
(setq evil-want-visual-char-semi-exclusive nil
|
||||
evil-search-module 'evil-search
|
||||
evil-search-wrap nil
|
||||
evil-magic 'magic
|
||||
evil-want-C-u-scroll t ; enable C-u for scrolling
|
||||
evil-ex-visual-char-range t ; column range for ex commands
|
||||
evil-ex-search-vim-style-regexp t
|
||||
evil-ex-interactive-search-highlight 'selected-window
|
||||
|
||||
;; Color-coded state cursors
|
||||
evil-normal-state-cursor '("white" box)
|
||||
evil-emacs-state-cursor '("cyan" bar)
|
||||
evil-insert-state-cursor '("white" bar)
|
||||
evil-visual-state-cursor 'hollow)
|
||||
|
||||
(evil-mode 1)
|
||||
|
||||
;; Always ensure evil-shift-width is consistent with tab-width
|
||||
(add-hook! 'evil-local-mode-hook (setq evil-shift-width tab-width))
|
||||
;; Fix code folding
|
||||
(add-hook! 'prog-mode-hook (hs-minor-mode 1) (diminish 'hs-minor-mode))
|
||||
|
||||
;; highlight matching delimiters where it's important
|
||||
(defun show-paren-mode-off () (show-paren-mode -1))
|
||||
(add-hook 'evil-insert-state-entry-hook 'show-paren-mode)
|
||||
(add-hook 'evil-insert-state-exit-hook 'show-paren-mode-off)
|
||||
(add-hook 'evil-visual-state-entry-hook 'show-paren-mode)
|
||||
(add-hook 'evil-visual-state-exit-hook 'show-paren-mode-off)
|
||||
(add-hook 'evil-motion-state-entry-hook 'show-paren-mode)
|
||||
(add-hook 'evil-motion-state-exit-hook 'show-paren-mode-off)
|
||||
(add-hook 'evil-operator-state-entry-hook 'show-paren-mode)
|
||||
(add-hook 'evil-operator-state-exit-hook 'show-paren-mode-off)
|
||||
|
||||
;; Disable highlights on insert-mode
|
||||
(add-hook 'evil-insert-state-entry-hook 'evil-ex-nohighlight)
|
||||
|
||||
;; modes to map to different default states
|
||||
(dolist (mode-map '((cider-repl-mode . emacs)
|
||||
(comint-mode . emacs)
|
||||
(fundamental-mode . normal)
|
||||
(help-mode . normal)
|
||||
(term-mode . emacs)))
|
||||
(evil-set-initial-state `,(car mode-map) `,(cdr mode-map)))
|
||||
|
||||
;; predicate for visual line mode
|
||||
(defun evil-visual-line-state-p ()
|
||||
"Returns non-nil if in visual-line mode, nil otherwise."
|
||||
(and (evil-visual-state-p)
|
||||
(eq (evil-visual-type) 'line)))
|
||||
|
||||
|
||||
(progn ; evil plugins
|
||||
(use-package evil-indent-textobject) ; vii/vai/vaI
|
||||
|
||||
;; (use-package evil-ex-registers)
|
||||
(use-package evil-surround
|
||||
:commands (evil-surround-edit
|
||||
evil-Surround-edit
|
||||
evil-surround-region)
|
||||
:config (global-evil-surround-mode 1))
|
||||
|
||||
(use-package evil-numbers
|
||||
:commands (evil-numbers/inc-at-pt
|
||||
evil-numbers/dec-at-pt))
|
||||
|
||||
(use-package evil-matchit
|
||||
:commands (evilmi-jump-items)
|
||||
:config (global-evil-matchit-mode 1))
|
||||
|
||||
(use-package evil-search-highlight-persist
|
||||
:config (global-evil-search-highlight-persist t))
|
||||
|
||||
(use-package evil-commentary
|
||||
:diminish evil-commentary-mode
|
||||
:commands (evil-commentary
|
||||
evil-commentary-yank
|
||||
evil-commentary-line)
|
||||
:config (evil-commentary-mode 1))
|
||||
|
||||
(use-package evil-jumper
|
||||
:init (setq evil-jumper-file (expand-file-name "jumplist" my-tmp-dir))
|
||||
:config
|
||||
(setq evil-jumper-auto-center t
|
||||
evil-jumper-auto-save-interval 3600))
|
||||
|
||||
(use-package evil-exchange
|
||||
:commands (evil-exchange)
|
||||
:config
|
||||
(defadvice evil-force-normal-state (before evil-esc-quit-exchange activate)
|
||||
(when evil-exchange--overlays
|
||||
(evil-exchange-cancel))))
|
||||
|
||||
(use-package evil-visualstar
|
||||
:commands (evil-visualstar/begin-search
|
||||
evil-visualstar/begin-search-forward
|
||||
evil-visualstar/begin-search-backward)
|
||||
:config
|
||||
(progn
|
||||
;; I cut this down because the original visualstar wouldn't remember
|
||||
;; the last search if evil-search-module was 'evil-search.
|
||||
(defun evil-visualstar/begin-search (beg end direction)
|
||||
(when (evil-visual-state-p)
|
||||
(evil-exit-visual-state)
|
||||
(let ((selection (regexp-quote (buffer-substring-no-properties beg end))))
|
||||
(setq isearch-forward direction)
|
||||
(evil-search selection direction t))))
|
||||
(global-evil-visualstar-mode 1)))
|
||||
|
||||
(use-package evil-snipe
|
||||
:diminish evil-snipe-mode
|
||||
:config
|
||||
(progn
|
||||
(global-evil-snipe-mode +1)
|
||||
(setq evil-snipe-smart-case t
|
||||
evil-snipe-override-evil t
|
||||
evil-snipe-scope 'line
|
||||
evil-snipe-repeat-scope 'buffer
|
||||
evil-snipe-override-evil-repeat-keys nil)
|
||||
(setq-default evil-snipe-symbol-groups
|
||||
'((?\[ "[[{(]")
|
||||
(?\] "[]})]")))
|
||||
(bind 'motion
|
||||
"C-;" 'evil-snipe-repeat
|
||||
"C-," 'evil-snipe-repeat-reverse))))
|
||||
|
||||
(bind evil-ex-completion-map
|
||||
"C-r" #'evil-ex-paste-from-register ; registers in ex-mode
|
||||
"C-a" 'move-beginning-of-line
|
||||
"<s-left>" 'move-beginning-of-line
|
||||
"<s-right>" 'move-beginning-of-line
|
||||
"<s-backspace>" 'evil-delete-whole-line)
|
||||
|
||||
(progn ; evil hacks
|
||||
(defadvice evil-force-normal-state (before evil-esc-quit activate)
|
||||
(shut-up (evil-search-highlight-persist-remove-all) ; turn off highlights
|
||||
(evil-ex-nohighlight)
|
||||
;; Exit minibuffer is alive
|
||||
(if (minibuffer-window-active-p (minibuffer-window))
|
||||
(my--minibuffer-quit))))
|
||||
|
||||
;; Popwin: close popup window, if any
|
||||
(defadvice evil-force-normal-state (before evil-esc-quit-popwin activate)
|
||||
(shut-up (popwin:close-popup-window)))
|
||||
|
||||
;; Jump to new splits
|
||||
(defadvice evil-window-split (after evil-window-split-jump activate)
|
||||
(evil-window-down 1))
|
||||
(defadvice evil-window-vsplit (after evil-window-vsplit-jump activate)
|
||||
(evil-window-right 1)))
|
||||
|
||||
(progn ; ex-commands
|
||||
(evil-define-command my:kill-buffers (&optional bang)
|
||||
:repeat nil
|
||||
(interactive "<!>")
|
||||
(if (and (not bang) (projectile-project-p))
|
||||
(projectile-kill-buffers)
|
||||
(mapc 'kill-buffer (buffer-list)))
|
||||
(delete-other-windows)
|
||||
(switch-to-buffer (if (buffer-live-p project-scratch-buffer) project-scratch-buffer (get-buffer-create "*scratch*"))))
|
||||
|
||||
(evil-define-command my:kill-buried-buffers (&optional bang)
|
||||
:repeat nil
|
||||
(interactive "<!>")
|
||||
(mapc 'kill-buffer
|
||||
(my-living-buffer-list (if bang (projectile-project-buffers) (buffer-list)))))
|
||||
|
||||
(evil-define-command my:init-files (&optional bang) :repeat nil
|
||||
(interactive "<!>")
|
||||
(if bang
|
||||
(ido-find-file-in-dir my-modules-dir)
|
||||
(ido-find-file-in-dir my-dir)))
|
||||
|
||||
(evil-define-command my:notes () :repeat nil
|
||||
(interactive)
|
||||
(require 'org)
|
||||
(ido-find-file-in-dir org-directory))
|
||||
|
||||
(evil-define-command my:byte-compile (&optional bang)
|
||||
:repeat nil
|
||||
(interactive "<!>")
|
||||
(byte-recompile-file (expand-file-name "init.el" my-dir) bang 0)
|
||||
(dolist (file (append (f-glob "core*.el" my-modules-dir)
|
||||
(f-glob "defuns*.el" my-modules-dir)
|
||||
(f-glob "my*.el" my-modules-dir)))
|
||||
(byte-recompile-file file bang 0)))
|
||||
|
||||
(evil-define-command my:cd (dir)
|
||||
:repeat nil
|
||||
(interactive "<f>")
|
||||
(cd (if (zerop (length dir)) "~" dir)))
|
||||
|
||||
(defun --save-exit() (save-buffer) (kill-buffer) (remove-hook 'yas-after-exit-snippet-hook '--save-exit))
|
||||
(evil-define-command my:create-file (path &optional bang)
|
||||
"Deploy files (and their associated templates) quickly. Will prompt
|
||||
you to fill in each snippet field before buffer closes unless BANG is
|
||||
provided."
|
||||
:repeat nil
|
||||
(interactive "<f><!>")
|
||||
(let ((dir (f-dirname path))
|
||||
(fullpath (f-full path))
|
||||
(is-auto t))
|
||||
(when (and bang (not (f-exists? dir))) (f-mkdir dir))
|
||||
(if (f-exists? dir)
|
||||
(if (f-exists? fullpath)
|
||||
(error "File already exists: %s" path)
|
||||
(find-file fullpath)
|
||||
(add-hook 'yas-after-exit-snippet-hook '--save-exit)
|
||||
(if bang (--save-exit)))
|
||||
(error "Directory doesn't exist: %s" dir))))
|
||||
|
||||
(evil-define-command my:rename-this-file (new-name)
|
||||
"Renames current buffer and file it is visiting. Replaces %, # and other
|
||||
variables (see `evil-ex-replace-special-filenames')"
|
||||
:repeat nil
|
||||
(interactive "<f>")
|
||||
(let ((name (buffer-name))
|
||||
(filename (buffer-file-name)))
|
||||
(if (not (and filename (file-exists-p filename)))
|
||||
(error "Buffer '%s' is not visiting a file!" name)
|
||||
(let ((new-name
|
||||
(evil-ex-replace-special-filenames (if new-name
|
||||
new-name
|
||||
(read-file-name "New name: " filename)))))
|
||||
(if (get-buffer new-name)
|
||||
(error "A buffer named '%s' already exists!" new-name)
|
||||
(rename-file filename new-name 1)
|
||||
(rename-buffer new-name)
|
||||
(set-visited-file-name new-name)
|
||||
(set-buffer-modified-p nil)
|
||||
(save-place-forget-unreadable-files)
|
||||
(message "File '%s' successfully renamed to '%s'"
|
||||
name (file-name-nondirectory new-name)))))))
|
||||
|
||||
(evil-define-operator my:scratch-buffer (&optional beg end bang)
|
||||
"Send a selection to the scratch buffer. If BANG, then send it to org-capture
|
||||
instead."
|
||||
:move-point nil
|
||||
:type inclusive
|
||||
(interactive "<r><!>")
|
||||
(let ((mode major-mode)
|
||||
(text (when (and (evil-visual-state-p) beg end)
|
||||
(buffer-substring beg end))))
|
||||
(if bang
|
||||
;; use org-capture with bang
|
||||
(if text
|
||||
(org-capture-string text)
|
||||
(org-capture))
|
||||
;; or scratch buffer by default
|
||||
(let ((project-dir (projectile-project-root))
|
||||
(buffer-name (if (projectile-project-p)
|
||||
(format "*scratch* (%s)" (projectile-project-name))
|
||||
"*scratch*")))
|
||||
(popwin:popup-buffer (get-buffer-create buffer-name))
|
||||
(when (eq (get-buffer buffer-name) (current-buffer))
|
||||
(cd project-dir)
|
||||
(if text (insert text))
|
||||
(funcall mode))))))
|
||||
|
||||
(evil-define-command my:align (beg end &optional regexp bang)
|
||||
:repeat nil
|
||||
(interactive "<r><a><!>")
|
||||
(when regexp
|
||||
(align-regexp beg end
|
||||
(concat "\\(\\s-*\\)" (rxt-pcre-to-elisp regexp)) 1 1)))
|
||||
|
||||
(evil-define-operator my:retab (beg end)
|
||||
"Akin to vim's :retab, this changes all tabs-to-spaces or spaces-to-tabs,
|
||||
depending on `indent-tab-mode'. Untested."
|
||||
:motion nil
|
||||
:move-point nil
|
||||
:type line
|
||||
(interactive "<r>")
|
||||
(unless (and beg end)
|
||||
(setq beg (point-min))
|
||||
(setq end (point-max)))
|
||||
(if indent-tabs-mode
|
||||
(tabify beg end)
|
||||
(untabify beg end)))
|
||||
|
||||
(evil-define-operator my:narrow-indirect (beg end)
|
||||
"Indirectly narrow the region from BEG to END."
|
||||
:move-point nil
|
||||
:type exclusive
|
||||
:repeat nil
|
||||
(interactive "<r>")
|
||||
(evil-normal-state)
|
||||
(my-narrow-to-region-indirect beg end)))))
|
||||
|
||||
|
||||
(provide 'core-evil)
|
@@ -1,5 +0,0 @@
|
||||
(when is-linux (add-to-list 'load-path "~/.cask"))
|
||||
|
||||
(provide 'core-linux)
|
||||
|
||||
;; Nothing here yet
|
@@ -1,38 +0,0 @@
|
||||
;; Mac-specific settings
|
||||
|
||||
;; Use a shared clipboard
|
||||
(setq x-select-enable-clipboard t)
|
||||
;; Curse Lion and its sudden but inevitable fullscreen mode!
|
||||
(setq ns-use-native-fullscreen nil)
|
||||
;; Don't open files from the workspace in a new frame
|
||||
(setq ns-pop-up-frames nil)
|
||||
|
||||
;; Prefixes: Command = M, Alt = A
|
||||
(setq mac-command-modifier 'meta)
|
||||
(setq mac-option-modifier 'alt)
|
||||
|
||||
;; fix emacs PATH on OSX (GUI only)
|
||||
(use-package exec-path-from-shell
|
||||
:config (exec-path-from-shell-initialize))
|
||||
|
||||
(use-package applescript-mode :mode "\\.applescript$")
|
||||
|
||||
(after "evil"
|
||||
;; On OSX, stop copying each visual state move to the clipboard:
|
||||
;; https://bitbucket.org/lyro/evil/issue/336/osx-visual-state-copies-the-region-on
|
||||
;; Most of this code grokked from:
|
||||
;; http://stackoverflow.com/questions/15873346/elisp-rename-macro
|
||||
(defadvice evil-visual-update-x-selection (around clobber-x-select-text activate)
|
||||
(unless (featurep 'ns) ad-do-it)))
|
||||
|
||||
;; Send current file to OSX apps
|
||||
(defun my-open-with (&optional app-name path)
|
||||
(interactive)
|
||||
(let* ((path (f-full (s-replace "'" "\\'" (or path (if (eq major-mode 'dired-mode) (dired-get-file-for-visit) (buffer-file-name))))))
|
||||
(command (concat "open " (when app-name (concat "-a " (shell-quote-argument app-name))) " '" path "'")))
|
||||
(message "Trying: %s" command)
|
||||
(shell-command command)))
|
||||
|
||||
|
||||
(provide 'core-osx)
|
||||
;;; core-osx.el ends here
|
181
init/core-ui.el
181
init/core-ui.el
@@ -1,181 +0,0 @@
|
||||
;;; core-ui.el -- User interface layout & behavior
|
||||
|
||||
;;;; Load Theme ;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(when window-system
|
||||
(set-frame-font *default-font)
|
||||
(set-frame-parameter nil 'alpha '(100 75)))
|
||||
(add-to-list 'custom-theme-load-path my-themes-dir)
|
||||
(load-theme *default-theme t)
|
||||
|
||||
|
||||
;;;; GUI Settings ;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(when window-system
|
||||
(scroll-bar-mode -1) ; no scrollbar
|
||||
(tool-bar-mode -1) ; no toolbar
|
||||
(menu-bar-mode -1) ; no menubar
|
||||
(fringe-mode '(2 . 8))) ; no nonsense
|
||||
|
||||
(global-hl-line-mode 1) ; do highlight line
|
||||
(blink-cursor-mode 1) ; do blink cursor
|
||||
(line-number-mode 1) ; do show line no in modeline
|
||||
(column-number-mode 1) ; do show col no in modeline
|
||||
(tooltip-mode -1) ; don't show tooltips
|
||||
|
||||
;; Multiple cursors across buffers cause a strange redraw delay for
|
||||
;; some things, like auto-complete or evil-mode's cursor color
|
||||
;; switching.
|
||||
(setq-default cursor-in-non-selected-windows nil
|
||||
visible-bell nil ; silence of the bells
|
||||
use-dialog-box nil ; avoid GUI
|
||||
redisplay-dont-pause t
|
||||
;; do not soft-wrap lines
|
||||
truncate-lines t
|
||||
truncate-partial-width-windows nil
|
||||
indicate-buffer-boundaries nil
|
||||
indicate-empty-lines nil
|
||||
fringes-outside-margins t)
|
||||
|
||||
(use-package nlinum
|
||||
:commands nlinum-mode
|
||||
:init
|
||||
(progn
|
||||
(defface linum-highlight-face '((t (:inherit linum)))
|
||||
"Face for line highlights")
|
||||
|
||||
;; Preset width nlinum
|
||||
(add-hook! 'nlinum-mode-hook
|
||||
(setq nlinum--width
|
||||
(length (number-to-string
|
||||
(count-lines (point-min) (point-max))))))
|
||||
|
||||
;; Highlight line number
|
||||
(setq hl-nlinum-overlay nil)
|
||||
(setq hl-nlinum-line nil)
|
||||
(defun hl-nlinum-unhighlight-line ()
|
||||
(when hl-nlinum-overlay
|
||||
(let* ((ov hl-nlinum-overlay)
|
||||
(disp (get-text-property 0 'display (overlay-get ov 'before-string)))
|
||||
(str (nth 1 disp)))
|
||||
(put-text-property 0 (length str) 'face 'linum str)
|
||||
(setq hl-nlinum-overlay nil)
|
||||
(setq hl-nlinum-line nil))))
|
||||
|
||||
(defun hl-nlinum-highlight-line ()
|
||||
(let ((line-no (line-number-at-pos (point))))
|
||||
(when (and nlinum-mode (not (eq line-no hl-nlinum-line)))
|
||||
(let* ((pbol (point-at-bol))
|
||||
(peol (1+ pbol)))
|
||||
;; Handle EOF case
|
||||
(when (>= peol (point-max))
|
||||
(setq pbol (line-beginning-position 0))
|
||||
(setq peol (line-end-position 0)))
|
||||
(jit-lock-fontify-now pbol peol)
|
||||
(let* ((overlays (overlays-in pbol peol))
|
||||
(ov (-first (lambda (item) (overlay-get item 'nlinum)) overlays)))
|
||||
(when ov
|
||||
(hl-nlinum-unhighlight-line)
|
||||
(let* ((disp (get-text-property 0 'display (overlay-get ov 'before-string)))
|
||||
(str (nth 1 disp)))
|
||||
(put-text-property 0 (length str) 'face 'linum-highlight-face str)
|
||||
(put-text-property 0 (length str) 'face 'linum-highlight-face str)
|
||||
(setq hl-nlinum-overlay ov)
|
||||
(setq hl-nlinum-line line-no))))))))
|
||||
|
||||
(defun nlinum-toggle ()
|
||||
(interactive)
|
||||
(if nlinum-mode
|
||||
(nlinum-disable)
|
||||
(nlinum-enable)))
|
||||
(defun nlinum-enable ()
|
||||
(nlinum-mode +1)
|
||||
(add-hook 'post-command-hook 'hl-nlinum-highlight-line))
|
||||
(defun nlinum-disable ()
|
||||
(nlinum-mode -1)
|
||||
(remove-hook 'post-command-hook 'hl-nlinum-highlight-line)
|
||||
(hl-nlinum-unhighlight-line))
|
||||
|
||||
(add-hooks '(text-mode-hook prog-mode-hook) 'nlinum-enable)
|
||||
(add-hook 'org-mode-hook 'nlinum-disable))
|
||||
:config
|
||||
(setq-default nlinum-format " %4d "))
|
||||
|
||||
(when window-system
|
||||
(setq frame-title-format '(buffer-file-name "%f" ("%b")))
|
||||
(if (string-equal (system-name) "io")
|
||||
(set-frame-size (selected-frame) 326 119)))
|
||||
|
||||
(defadvice save-buffers-kill-emacs (around no-query-kill-emacs activate)
|
||||
"Prevent annoying \"Active processes exist\" query when you quit Emacs."
|
||||
(flet ((process-list ())) ad-do-it))
|
||||
|
||||
;; [pedantry intensifies]
|
||||
(rename-mode-name emacs-lisp-mode "Elisp")
|
||||
|
||||
(use-package vim-empty-lines-mode
|
||||
:config (global-vim-empty-lines-mode +1))
|
||||
|
||||
|
||||
;;;; Modeline ;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
(use-package uniquify
|
||||
:config
|
||||
(setq uniquify-buffer-name-style 'post-forward-angle-brackets
|
||||
uniquify-separator ":"
|
||||
uniquify-ignore-buffers-re "^\\*"))
|
||||
|
||||
(use-package smart-mode-line
|
||||
:config
|
||||
(progn
|
||||
(setq sml/no-confirm-load-theme t
|
||||
sml/mode-width 'full
|
||||
sml/extra-filler (if window-system -1 0)
|
||||
sml/show-remote nil
|
||||
sml/modified-char "*"
|
||||
sml/encoding-format nil
|
||||
sml/replacer-regexp-list '(("^~/Dropbox/Projects/" "PROJECTS:")
|
||||
("^~/.emacs.d/" "EMACS.D:")
|
||||
("^~/Dropbox/notes/" "NOTES:")))
|
||||
|
||||
;; Hide evil state indicator
|
||||
(after "evil" (setq evil-mode-line-format nil))
|
||||
|
||||
(setq-default mode-line-misc-info
|
||||
'((which-func-mode ("" which-func-format ""))
|
||||
(global-mode-string ("" global-mode-string ""))))
|
||||
|
||||
(add-hook! 'after-change-major-mode-hook
|
||||
(unless (null mode-line-format)
|
||||
(setq mode-line-format
|
||||
'((if window-system " ")
|
||||
"%e"
|
||||
;; mode-line-mule-info
|
||||
;; mode-line-client
|
||||
;; mode-line-remote
|
||||
;; mode-line-frame-identification
|
||||
mode-line-buffer-identification
|
||||
mode-line-modified
|
||||
mode-line-modes
|
||||
mode-line-misc-info
|
||||
(vc-mode vc-mode)
|
||||
" "
|
||||
mode-line-position
|
||||
" "
|
||||
mode-line-front-space
|
||||
)))
|
||||
|
||||
(add-to-list 'mode-line-modes
|
||||
'(sml/buffer-identification-filling
|
||||
sml/buffer-identification-filling
|
||||
(:eval (setq sml/buffer-identification-filling
|
||||
(sml/fill-for-buffer-identification))))))
|
||||
|
||||
(let ((-linepo mode-line-position))
|
||||
(sml/setup)
|
||||
(sml/apply-theme 'respectful)
|
||||
(setq mode-line-position -linepo)
|
||||
(sml/filter-mode-line-list 'mode-line-position))))
|
||||
|
||||
|
||||
(provide 'core-ui)
|
||||
;;; core-ui.el ends here
|
365
init/core.el
365
init/core.el
@@ -1,365 +0,0 @@
|
||||
(defconst is-mac (eq system-type 'darwin))
|
||||
(defconst is-linux (eq system-type 'gnu/linux))
|
||||
(defconst is-windows (eq system-type 'windows-nt))
|
||||
|
||||
(setq use-package-verbose DEBUG-MODE)
|
||||
|
||||
(cd "~") ; instead of /
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(require 'defuns)
|
||||
(require 'autoloads) ; use make autoloads to generate autoloads file
|
||||
(use-package shut-up
|
||||
:config
|
||||
(progn
|
||||
(setq shut-up-ignore DEBUG-MODE)
|
||||
(when noninteractive (shut-up-silence-emacs)))) ; http://youtu.be/Z6woIRLnbmE
|
||||
|
||||
;; Make sure undo/backup folders exist
|
||||
(defconst my-tmp-dir-undo (expand-file-name "undo" my-tmp-dir))
|
||||
(defconst my-tmp-dir-backup (expand-file-name "backup" my-tmp-dir))
|
||||
(defconst my-tmp-dir-autosave (expand-file-name "autosave" my-tmp-dir))
|
||||
(unless (file-directory-p my-tmp-dir)
|
||||
(make-directory my-tmp-dir-undo t)
|
||||
(make-directory my-tmp-dir-backup t)
|
||||
(make-directory my-tmp-dir-autosave t))
|
||||
|
||||
;; (setq load-prefer-newer t)
|
||||
(setq debug-on-quit DEBUG-MODE)
|
||||
|
||||
;;;; Sane defaults ;;;;;;;;;;;;;;;;;;;;;;;
|
||||
(auto-compression-mode t) ; Transparently open compressed files
|
||||
(global-font-lock-mode t) ; Enable syntax highlighting for older emacs
|
||||
;; (global-auto-revert-mode 1) ; revert buffers for changed files
|
||||
|
||||
;;; window layout undo/redo
|
||||
(setq winner-boring-buffers '("*Completions*" "*Compile-Log*" "*inferior-lisp*"
|
||||
"*Fuzzy Completions*" "*Apropos*" "*Help*" "*cvs*"
|
||||
"*Buffer List*" "*Ibuffer*" "*esh command on file*"))
|
||||
(winner-mode 1)
|
||||
|
||||
(use-package semantic
|
||||
:commands semantic-mode
|
||||
:init (add-hook 'prog-mode-hook 'semantic-mode)
|
||||
:config
|
||||
(progn
|
||||
(setq semanticdb-default-save-directory (expand-file-name "semanticdb" my-tmp-dir))
|
||||
(semantic-mode 1)))
|
||||
|
||||
;;; UTF-8 please
|
||||
(setq locale-coding-system 'utf-8) ; pretty
|
||||
(set-terminal-coding-system 'utf-8) ; pretty
|
||||
(set-keyboard-coding-system 'utf-8) ; pretty
|
||||
(set-selection-coding-system 'utf-8) ; please
|
||||
(prefer-coding-system 'utf-8) ; with sugar on top
|
||||
(fset 'yes-or-no-p 'y-or-n-p) ; y/n instead of yes/no
|
||||
|
||||
;;; Show tab characters
|
||||
;; (global-whitespace-mode 1)
|
||||
(setq whitespace-style '(trailing face tabs tab-mark) ; needs to be re-set in every buffer
|
||||
whitespace-display-mappings
|
||||
'((tab-mark ?\t [?| ?\t] [?\\ ?\t])
|
||||
(newline-mark 10 [36 10]))) ; for whitespace-newline-mode
|
||||
|
||||
;; avoid garbage collection (default is 400k)
|
||||
(setq-default gc-cons-threshold 20000000)
|
||||
(setq-default confirm-kill-emacs nil)
|
||||
|
||||
;; minibufferception? Yay!
|
||||
(setq-default enable-recursive-minibuffers t)
|
||||
|
||||
;; Show me those keystrokes
|
||||
(setq echo-keystrokes 0.02)
|
||||
|
||||
(setq ring-bell-function 'ignore)
|
||||
|
||||
(setq inhibit-startup-screen t ; don't show EMACs start screen
|
||||
inhibit-splash-screen t
|
||||
inhibit-startup-buffer-menu t
|
||||
|
||||
initial-major-mode 'fundamental-mode ; initial scratch buffer mode
|
||||
initial-scratch-message nil
|
||||
initial-scratch-buffer nil ; empty scratch buffer
|
||||
|
||||
compilation-always-kill t
|
||||
compilation-ask-about-save nil
|
||||
compilation-scroll-output t)
|
||||
|
||||
(setq sentence-end-double-space nil) ; sentences end with periods. Period.
|
||||
|
||||
(setq ediff-diff-options "-w"
|
||||
ediff-split-window-function 'split-window-horizontally ; side-by-side diffs
|
||||
ediff-window-setup-function 'ediff-setup-windows-plain) ; no extra frames
|
||||
|
||||
;; Don't save clipboard contents into kill-ring before replacing them
|
||||
(setq save-interprogram-paste-before-kill nil)
|
||||
|
||||
;; don't let the cursor go into minibuffer prompt
|
||||
;; Tip taken from Xah Lee: http://ergoemacs.org/emacs/emacs_stop_cursor_enter_prompt.html
|
||||
(setq minibuffer-prompt-properties
|
||||
'(read-only t point-entered minibuffer-avoid-prompt face minibuffer-prompt))
|
||||
|
||||
;; remove annoying ellipsis when printing sexp in message buffer
|
||||
(setq eval-expression-print-length nil
|
||||
eval-expression-print-level nil)
|
||||
|
||||
;; Save history across sessions
|
||||
(use-package savehist
|
||||
:config
|
||||
(progn
|
||||
(setq savehist-file (expand-file-name "savehist" my-tmp-dir) ; keep the home clean
|
||||
history-length 1000
|
||||
savehist-additional-variables '(kill-ring
|
||||
global-mark-ring
|
||||
search-ring
|
||||
regexp-search-ring
|
||||
extended-command-history))
|
||||
(savehist-mode 1)))
|
||||
|
||||
;; Save cursor location across sessions
|
||||
(use-package saveplace
|
||||
:config
|
||||
(progn
|
||||
(setq-default save-place-file (expand-file-name "saveplace" my-tmp-dir))
|
||||
;; activate save-place only for files that exist
|
||||
(add-hook! 'find-file-hook (if (file-exists-p buffer-file-name) (setq save-place t)))))
|
||||
|
||||
(use-package recentf
|
||||
:config
|
||||
(progn
|
||||
(add-hook 'kill-emacs-hook 'recentf-cleanup)
|
||||
(setq recentf-save-file (expand-file-name "recentf" my-tmp-dir)
|
||||
recentf-exclude '("/tmp/" "/ssh:" "\\.?ido\\.last$" "\\.revive$" "/TAGS$" "/\\.cache/.+" "emacs\\.d/workgroups/.+$" ".emacs.workgroup")
|
||||
recentf-max-menu-items 0
|
||||
recentf-max-saved-items 250
|
||||
recentf-auto-cleanup 'never)
|
||||
(recentf-mode 1)))
|
||||
|
||||
|
||||
;;;; Backup ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Disable all backups (that's what git/dropbox are for)
|
||||
(setq bookmark-save-flag t)
|
||||
(setq bookmark-default-file (expand-file-name "bookmarks" my-tmp-dir))
|
||||
(setq auto-save-default nil)
|
||||
(setq auto-save-list-file-name (expand-file-name ".auto-save" my-tmp-dir-autosave))
|
||||
(setq auto-save-file-name-transforms `((".*" ,my-tmp-dir-autosave t)))
|
||||
;; In case I want to reactivate backup files
|
||||
(setq make-backup-files nil)
|
||||
(setq create-lockfiles nil)
|
||||
(setq backup-directory-alist `((".*" . ,my-tmp-dir-backup)))
|
||||
;; Remember undo history
|
||||
(setq-default undo-tree-auto-save-history t)
|
||||
(setq-default undo-tree-history-directory-alist `(("." . ,my-tmp-dir-undo)))
|
||||
;; Keep region when undoing in region
|
||||
(defadvice undo-tree-undo (around keep-region activate)
|
||||
(if (use-region-p)
|
||||
(let ((m (set-marker (make-marker) (mark)))
|
||||
(p (set-marker (make-marker) (point))))
|
||||
ad-do-it
|
||||
(goto-char p)
|
||||
(set-mark m)
|
||||
(set-marker p nil)
|
||||
(set-marker m nil))
|
||||
ad-do-it))
|
||||
|
||||
;; Keep region when undoing in region
|
||||
(defadvice undo-tree-undo (around keep-region activate)
|
||||
(if (use-region-p)
|
||||
(let ((m (set-marker (make-marker) (mark)))
|
||||
(p (set-marker (make-marker) (point))))
|
||||
ad-do-it
|
||||
(goto-char p)
|
||||
(set-mark m)
|
||||
(set-marker p nil)
|
||||
(set-marker m nil))
|
||||
ad-do-it))
|
||||
|
||||
;; Shut up undo-tree's constant complaining
|
||||
(defadvice undo-tree-load-history-hook (around undo-tree-load-history-shut-up activate)
|
||||
(shut-up ad-do-it))
|
||||
;; (defadvice undo-tree-save-history-hook (around undo-tree-save-history-shut-up activate)
|
||||
;; (shut-up ad-do-it))
|
||||
|
||||
;; Silences an annoying error:
|
||||
;; undo-tree-mapc: Wrong type argument: listp, \.\.\.
|
||||
(defun undo-tree-position (node list)
|
||||
(when (listp list)
|
||||
(let ((i 0))
|
||||
(catch 'found
|
||||
(while (progn
|
||||
(when (eq node (car list)) (throw 'found i))
|
||||
(incf i)
|
||||
(setq list (cdr list))))
|
||||
nil))))
|
||||
|
||||
;; What we do every night, Pinkie...
|
||||
(defun display-startup-echo-area-message ()
|
||||
(message "What're we gonna do tonight, Brain? (Loaded in %s)" (emacs-init-time)))
|
||||
|
||||
|
||||
;;;; Editor behavior ;;;;;;;;;;;;;;;;
|
||||
;; spaces instead of tabs
|
||||
(setq-default indent-tabs-mode nil ; spaces instead of tabs
|
||||
tab-always-indent t
|
||||
tab-width 4)
|
||||
|
||||
(setq require-final-newline t)
|
||||
(setq delete-trailing-lines nil)
|
||||
(add-hook! 'makefile-mode-hook (setq indent-tabs-mode t)) ; Use normal tabs in makefiles
|
||||
|
||||
;; Project defuns ;;;;;;;;;;;;;;;;;;;;;;
|
||||
(require 'f)
|
||||
|
||||
(defvar project-root-files '(".git" ".hg" ".svn" ".project" "local.properties" "project.properties" "rebar.config" "project.clj" "SConstruct" "pom.xml" "build.sbt" "build.gradle" "Gemfile" "requirements.txt" "tox.ini" "package.json" "gulpfile.js" "Gruntfile.js" "bower.json" "composer.json" "Cargo.toml" "mix.exs")
|
||||
"A list of files that count as 'project files', which determine whether a
|
||||
folder is the root of a project or not.")
|
||||
(defun project-root (&optional strict-p)
|
||||
"Get the path to the root of your project. Uses `project-root-files' to
|
||||
determine if a directory is a project."
|
||||
(catch 'found
|
||||
(f-traverse-upwards
|
||||
(lambda (path)
|
||||
(let ((path (file-truename path))
|
||||
(home (file-truename "~")))
|
||||
(if (f-equal? home path)
|
||||
(throw 'found (if strict-p nil default-directory))
|
||||
(dolist (file project-root-files)
|
||||
(when (f-exists? (expand-file-name file path))
|
||||
(throw 'found path)))))) default-directory)
|
||||
default-directory))
|
||||
|
||||
(defun project-has-files (files &optional root)
|
||||
"Return non-nil if `file' exists in the project root."
|
||||
(let ((root (or root (project-root)))
|
||||
(files (if (listp files) files (list files)))
|
||||
found-p file)
|
||||
(while (and files (not found-p))
|
||||
(setq file (pop files))
|
||||
(setq found-p (f-exists? (project-path-to file root))))
|
||||
found-p))
|
||||
|
||||
(defun project-path-to (file &optional root)
|
||||
(let ((root (or root (project-root))))
|
||||
(expand-file-name file root)))
|
||||
|
||||
(defun project-name ()
|
||||
(file-name-nondirectory (directory-file-name (project-root))))
|
||||
|
||||
(defun project-p ()
|
||||
(not (null (project-root t))))
|
||||
|
||||
;; Make sure scratch buffer is always "in a project"
|
||||
(defvar project-scratch-buffer nil)
|
||||
(defun project-create-scratch-buffer ()
|
||||
(let* ((scratch-buffer (get-buffer-create "*scratch*"))
|
||||
(project-name (project-name))
|
||||
(root (project-root)))
|
||||
(mapc (lambda (b)
|
||||
(if (string-match-p "\\*scratch\\* (.+)" (buffer-name b))
|
||||
(kill-buffer b)))
|
||||
(buffer-list))
|
||||
(save-window-excursion
|
||||
(switch-to-buffer scratch-buffer)
|
||||
(setq project-scratch-buffer scratch-buffer)
|
||||
(erase-buffer)
|
||||
(cd root)
|
||||
(rename-buffer (format "*scratch* (%s)" project-name)))))
|
||||
(add-hook 'find-file-hook 'project-create-scratch-buffer)
|
||||
|
||||
|
||||
;; Automatic minor modes ;;;;;;;;;;;
|
||||
(defvar auto-minor-mode-alist ()
|
||||
"Alist of filename patterns vs correpsonding minor mode functions,
|
||||
see `auto-mode-alist' All elements of this alist are checked, meaning
|
||||
you can enable multiple minor modes for the same regexp.")
|
||||
(defun enable-minor-mode-based-on-path ()
|
||||
"check file name against auto-minor-mode-alist to enable minor modes
|
||||
the checking happens for all pairs in auto-minor-mode-alist"
|
||||
(when buffer-file-name
|
||||
(let ((name buffer-file-name)
|
||||
(remote-id (file-remote-p buffer-file-name))
|
||||
(alist auto-minor-mode-alist))
|
||||
;; Remove backup-suffixes from file name.
|
||||
(setq name (file-name-sans-versions name))
|
||||
;; Remove remote file name identification.
|
||||
(when (and (stringp remote-id)
|
||||
(string-match-p (regexp-quote remote-id) name))
|
||||
(setq name (substring name (match-end 0))))
|
||||
(while (and alist (caar alist) (cdar alist))
|
||||
(if (string-match (caar alist) name)
|
||||
(funcall (cdar alist) 1))
|
||||
(setq alist (cdr alist))))))
|
||||
(add-hook 'find-file-hook 'enable-minor-mode-based-on-path)
|
||||
|
||||
|
||||
;;;; Utility plugins ;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(use-package smex
|
||||
:commands (smex smex-major-mode-commands)
|
||||
:config
|
||||
(progn
|
||||
(smex-initialize)
|
||||
;; Hook up smex to auto-update, rather than update on every run
|
||||
(defun smex-update-after-load (unused)
|
||||
(when (boundp 'smex-cache) (smex-update)))
|
||||
(add-hook 'after-load-functions 'smex-update-after-load)))
|
||||
|
||||
(use-package popwin
|
||||
:config
|
||||
(progn ; popwin config
|
||||
(popwin-mode 1)
|
||||
(setq popwin:popup-window-height 0.45)
|
||||
(setq popwin:special-display-config
|
||||
(append '(("\\`\\*helm.*?\\*\\'" :regexp t :position bottom :height 15)
|
||||
("^\\*Flycheck.*\\*$" :regexp t :position bottom :height 0.25 :noselect t)
|
||||
(inf-enh-ruby-mode :position bottom :stick t)
|
||||
(snippet-mode :position bottom :stick t)
|
||||
("^\\*eclim.*\\*" :regexp t :position bottom :height 0.25)
|
||||
("*ansi-term*" :position bottom :height 0.45 :stick t)
|
||||
("*terminal*" :position bottom :height 0.45 :stick t)
|
||||
("*Async Shell Command*" :position bottom)
|
||||
("*Shell Command Output*" :position bottom :stick t :height 15)
|
||||
("* Regexp Explain *" :position top :height 0.35)
|
||||
("*anaconda-doc*" :position bottom :height 15 :noselect t)
|
||||
("*anaconda-nav*" :position bottom :height 15 :stick t)
|
||||
("^\\*Python.+\\*$" :regexp t :position bottom :height 20 :noselect t)
|
||||
(help-mode :height 25 :position bottom :stick t)
|
||||
(compilation-mode :height 0.5 :position bottom :noselect t)
|
||||
(diff-mode :position bottom :stick t)
|
||||
("*Backtrace*")
|
||||
("*Warnings*")
|
||||
("*Process List*")
|
||||
("*Compile-Log*" :height 0.3 :position bottom :noselect t)
|
||||
(" *undo-tree*" :width 0.3 :position right)
|
||||
("^\\*scratch\\*.*" :regexp t :stick t)
|
||||
(image-mode)
|
||||
("*NeoTree*" :position left :width 22 :stick t))
|
||||
popwin:special-display-config))
|
||||
|
||||
(defun popwin:toggle-popup-window ()
|
||||
(interactive)
|
||||
(if (popwin:popup-window-live-p)
|
||||
(popwin:close-popup-window)
|
||||
(popwin:popup-last-buffer)))))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
(cond (is-mac (require 'core-osx))
|
||||
(is-linux (require 'core-linux))
|
||||
(is-windows (require 'core-windows)))
|
||||
|
||||
;; Performance checks
|
||||
(add-hook! 'find-file-hook
|
||||
;; If file is oversized...
|
||||
(when (> (buffer-size) (* 1024 1024))
|
||||
(setq buffer-read-only t)
|
||||
(buffer-disable-undo)
|
||||
(fundamental-mode)
|
||||
(visual-line-mode)))
|
||||
|
||||
(use-package server
|
||||
:config (unless (server-running-p) (server-start)))
|
||||
|
||||
|
||||
(provide 'core)
|
||||
;;; core.el ends here
|
@@ -1,135 +0,0 @@
|
||||
;; Inspired by http://demonastery.org/2013/04/emacs-evil-narrow-region/
|
||||
;;;###autoload
|
||||
(defun my-narrow-to-region-indirect (start end)
|
||||
"Restrict editing in this buffer to the current region, indirectly."
|
||||
(interactive "r")
|
||||
(deactivate-mark)
|
||||
(let ((buf (clone-indirect-buffer nil nil)))
|
||||
(with-current-buffer buf
|
||||
(narrow-to-region start end))
|
||||
(switch-to-buffer buf)))
|
||||
|
||||
;;;###autoload
|
||||
(defun my--set-region-read-only (begin end)
|
||||
"See http://stackoverflow.com/questions/7410125"
|
||||
(let ((modified (buffer-modified-p)))
|
||||
(add-text-properties begin end '(read-only t))
|
||||
(set-buffer-modified-p modified)))
|
||||
|
||||
;;;###autoload
|
||||
(defun my--set-region-writeable (begin end)
|
||||
"See http://stackoverflow.com/questions/7410125"
|
||||
(let ((modified (buffer-modified-p))
|
||||
(inhibit-read-only t))
|
||||
(remove-text-properties begin end '(read-only t))
|
||||
(set-buffer-modified-p modified)))
|
||||
|
||||
;;;###autoload
|
||||
(defun my-living-buffer-list (&optional buffer-list)
|
||||
(-remove 'get-buffer-window (or buffer-list (buffer-list))))
|
||||
|
||||
|
||||
;; Killing Buffers ;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Buffer defuns
|
||||
(defvar my-cleanup-buffers-list '("^ \\*"
|
||||
"^\\*Backtrace\\*$"
|
||||
"^\\*Warnings\\*$"
|
||||
"^\\*Compile-Log\\*$"
|
||||
"^\\*Ediff.*\\*$"
|
||||
help-mode
|
||||
image-mode
|
||||
dired-mode
|
||||
reb-mode)
|
||||
"A list of buffer name regexps or major-mode symbols. If buried buffers
|
||||
match/have that mode active, `cleanup-buffers' will kill them.")
|
||||
|
||||
(defvar my-cleanup-processes-alist '(("pry" . ruby-mode)
|
||||
("irb" . ruby-mode)
|
||||
("ipython" . python-mode))
|
||||
"An alist of (process-name . major-mode), that `my-cleanup-processes' checks
|
||||
before killing processes. If there are no buffers with matching major-modes, it
|
||||
gets killed.")
|
||||
|
||||
;;;###autoload
|
||||
(defun my--cleanup-buffers-add (regexp)
|
||||
(add-to-list 'my-cleanup-buffers-list regexp))
|
||||
|
||||
;;;###autoload
|
||||
(defun my-cleanup-buffers ()
|
||||
"Kill left-over temporary, dired or buried special buffers"
|
||||
(interactive)
|
||||
(let* ((this-frame (selected-frame))
|
||||
(kill-list (buffer-list this-frame)))
|
||||
(setq kill-list
|
||||
(-filter (lambda (b)
|
||||
(unless (get-buffer-window b) ; don't kill if visible
|
||||
(-any? (lambda (pred)
|
||||
(cond ((stringp pred)
|
||||
(s-matches? pred (buffer-name b)))
|
||||
((symbolp pred)
|
||||
(eq (buffer-local-value 'major-mode b) pred))))
|
||||
my-cleanup-buffers-list)))
|
||||
kill-list))
|
||||
|
||||
(message "Cleaned up %s buffers" (length kill-list))
|
||||
(mapc 'kill-buffer kill-list)
|
||||
|
||||
(my-cleanup-processes)))
|
||||
|
||||
;;;###autoload
|
||||
(defun my-cleanup-processes ()
|
||||
(interactive)
|
||||
(let ((buffer-list (buffer-list)))
|
||||
(dolist (p (process-list))
|
||||
(let* ((process-name (process-name p))
|
||||
(assoc (assoc process-name my-cleanup-processes-alist)))
|
||||
(when (and assoc
|
||||
(not (string= process-name "server"))
|
||||
(process-live-p p)
|
||||
(not (-any? (lambda (b)
|
||||
(let ((mode (buffer-local-value 'major-mode b)))
|
||||
(eq mode (cdr assoc))))
|
||||
buffer-list)))
|
||||
(message "Cleanup: killing %s" process-name)
|
||||
(delete-process p))))))
|
||||
|
||||
;;;###autoload
|
||||
(defun my-kill-matching-buffers (regexp &optional buffer-list)
|
||||
(interactive)
|
||||
(mapc (lambda (b)
|
||||
(if (string-match-p regexp (buffer-name b))
|
||||
(kill-buffer b)))
|
||||
(if buffer-list buffer-list (buffer-list))))
|
||||
|
||||
;; From spacemacs <https://github.com/syl20bnr/spacemacs/blob/master/spacemacs/funcs.el>
|
||||
;;;###autoload
|
||||
(defun my-next-real-buffer ()
|
||||
"Switch to the next buffer and avoid special buffers."
|
||||
(interactive)
|
||||
(switch-to-next-buffer)
|
||||
(let ((i 0))
|
||||
(while (and (< i 100) (string-equal "*" (substring (buffer-name) 0 1)))
|
||||
(1+ i)
|
||||
(switch-to-next-buffer))))
|
||||
|
||||
;;;###autoload
|
||||
(defun my-previous-real-buffer ()
|
||||
"Switch to the previous buffer and avoid special buffers."
|
||||
(interactive)
|
||||
(switch-to-prev-buffer)
|
||||
(let ((i 0))
|
||||
(while (and (< i 100) (string-equal "*" (substring (buffer-name) 0 1)))
|
||||
(1+ i)
|
||||
(switch-to-prev-buffer))))
|
||||
|
||||
;;;###autoload
|
||||
(defun my-kill-real-buffer ()
|
||||
"Kill buffer (but only bury scratch buffer)"
|
||||
(interactive)
|
||||
(let ((bname (buffer-name)))
|
||||
(cond ((string-match-p "^\\*scratch\\*" bname)
|
||||
(erase-buffer)
|
||||
(bury-buffer))
|
||||
((string-equal "*" (substring bname 0 1))
|
||||
(previous-buffer))
|
||||
(t (kill-this-buffer)))))
|
@@ -1,132 +0,0 @@
|
||||
;;;###autoload
|
||||
(defun my--point-at-bol-non-blank()
|
||||
(save-excursion (evil-first-non-blank) (point)))
|
||||
|
||||
;;;###autoload
|
||||
(defun my--surrounded-p ()
|
||||
(and (looking-back "[[{(]\\(\s+\\|\n\\)?\\(\s\\|\t\\)*")
|
||||
(let* ((whitespace (match-string 1))
|
||||
(match-str (concat whitespace (match-string 2) "[])}]")))
|
||||
(looking-at-p match-str))))
|
||||
|
||||
;;;###autoload
|
||||
(defun my.backward-kill-to-bol-and-indent ()
|
||||
"Kill line to the first non-blank character. If invoked again
|
||||
afterwards, kill line to column 1."
|
||||
(interactive)
|
||||
(let ((empty-line (sp-point-in-blank-line)))
|
||||
(evil-delete (point-at-bol) (point))
|
||||
(if (not empty-line)
|
||||
(indent-according-to-mode))))
|
||||
|
||||
;;;###autoload
|
||||
(defun my.move-to-bol ()
|
||||
"Moves cursor to the first non-blank character on the line. If
|
||||
already there, move it to the true bol."
|
||||
(interactive)
|
||||
(evil-save-goal-column
|
||||
(let ((point-at-bol (my--point-at-bol-non-blank))
|
||||
(point (point)))
|
||||
(if (= point-at-bol point)
|
||||
(evil-move-beginning-of-line)
|
||||
(unless (= (point-at-bol) point)
|
||||
(evil-first-non-blank))))))
|
||||
|
||||
;;;###autoload
|
||||
(defun my.move-to-eol ()
|
||||
(interactive)
|
||||
(evil-save-goal-column
|
||||
(let ((old-point (point)))
|
||||
(when (comment-search-forward (point-at-eol) t)
|
||||
(goto-char (match-beginning 0))
|
||||
(skip-syntax-backward " ^<*" (my--point-at-bol-non-blank))
|
||||
|
||||
(if (eq old-point (point)) ;
|
||||
(evil-move-end-of-line))))))
|
||||
|
||||
;; Mimic expandtab in vim
|
||||
;;;###autoload
|
||||
(defun my.backward-delete-whitespace-to-column ()
|
||||
"Delete back to the previous column of whitespace, or as much
|
||||
whitespace as possible, or just one char if that's not possible."
|
||||
(interactive)
|
||||
(cond ;; If in a string
|
||||
((sp-point-in-string)
|
||||
(call-interactively 'backward-delete-char-untabify))
|
||||
;; If using tabs (or at bol), just delete normally
|
||||
((or indent-tabs-mode
|
||||
(= (point-at-bol) (point)))
|
||||
(call-interactively 'backward-delete-char))
|
||||
;; Delete up to the nearest tab column IF only whitespace between point
|
||||
;; and bol.
|
||||
((looking-back "^[\\t ]*" (point-at-bol))
|
||||
(let ((movement (% (current-column) tab-width))
|
||||
(p (point)))
|
||||
(when (= movement 0)
|
||||
(setq movement tab-width))
|
||||
(save-match-data
|
||||
(if (string-match "\\w*\\(\\s-+\\)$"
|
||||
(buffer-substring-no-properties (- p movement) p))
|
||||
(backward-delete-char (- (match-end 1) (match-beginning 1)))
|
||||
(backward-delete-char-untabify 1)))))
|
||||
;; Otherwise do a regular delete
|
||||
(t
|
||||
(backward-delete-char-untabify 1))))
|
||||
|
||||
;;;###autoload
|
||||
(defun my.dumb-indent ()
|
||||
"Inserts a tab character (or spaces x tab-width). Checks if the
|
||||
auto-complete window is open."
|
||||
(interactive)
|
||||
(if indent-tabs-mode
|
||||
(insert "\t")
|
||||
(let* ((movement (% (current-column) tab-width))
|
||||
(spaces (if (zerop movement) tab-width (- tab-width movement))))
|
||||
(insert (s-repeat spaces " ")))))
|
||||
|
||||
;;;###autoload
|
||||
(defun my.inflate-space-maybe ()
|
||||
"Checks if point is surrounded by {} [] () delimiters and adds a
|
||||
space on either side of the point if so."
|
||||
(interactive)
|
||||
(if (my--surrounded-p)
|
||||
(progn (call-interactively 'self-insert-command)
|
||||
(save-excursion (call-interactively 'self-insert-command)))
|
||||
(call-interactively 'self-insert-command)))
|
||||
|
||||
;;;###autoload
|
||||
(defun my.deflate-space-maybe ()
|
||||
"Checks if point is surrounded by {} [] () delimiters, and deletes
|
||||
spaces on either side of the point if so. Resorts to
|
||||
`my.backward-delete-whitespace-to-column' otherwise."
|
||||
(interactive)
|
||||
(save-match-data
|
||||
(if (my--surrounded-p)
|
||||
(let ((whitespace-match (match-string 1)))
|
||||
(cond ((not whitespace-match)
|
||||
(call-interactively 'delete-backward-char))
|
||||
((string-match "\n" whitespace-match)
|
||||
(evil-delete (point-at-bol) (point))
|
||||
(delete-char -1)
|
||||
(save-excursion (delete-char 1)))
|
||||
(t
|
||||
(just-one-space 0))))
|
||||
(my.backward-delete-whitespace-to-column))))
|
||||
|
||||
;;;###autoload
|
||||
(defun my.newline-and-indent ()
|
||||
(interactive)
|
||||
(cond
|
||||
((sp-point-in-string)
|
||||
(newline))
|
||||
((sp-point-in-comment)
|
||||
(cond ((eq major-mode 'js2-mode)
|
||||
(js2-line-break))
|
||||
((-contains? '(java-mode php-mode) major-mode)
|
||||
(c-indent-new-comment-line))
|
||||
((-contains? '(c-mode c++-mode objc-mode css-mode scss-mode) major-mode)
|
||||
(newline-and-indent)
|
||||
(insert "* ")
|
||||
(indent-according-to-mode))
|
||||
(t (indent-new-comment-line))))
|
||||
(t (newline-and-indent))))
|
@@ -1,17 +0,0 @@
|
||||
(eval-when-compile (require 'cl))
|
||||
|
||||
;;;###autoload
|
||||
(defun toggle-transparency ()
|
||||
(interactive)
|
||||
(let* ((alpha (frame-parameter nil 'alpha))
|
||||
(alpha-val (if (listp alpha) (car alpha) alpha)))
|
||||
(if (/= alpha-val 97)
|
||||
(set-frame-parameter nil 'alpha 97)
|
||||
(set-frame-parameter nil 'alpha 0))))
|
||||
|
||||
;;;###autoload
|
||||
(defun toggle-fullscreen ()
|
||||
(interactive)
|
||||
(set-frame-parameter nil 'fullscreen
|
||||
(when (not (frame-parameter nil 'fullscreen)) 'fullboth)))
|
||||
|
@@ -1,34 +0,0 @@
|
||||
|
||||
;; String Defuns ;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;###autoload
|
||||
(defun s-count-lines (s)
|
||||
"Get number of lines in a string"
|
||||
(length (s-lines s)))
|
||||
|
||||
;; Misc Defuns ;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;###autoload
|
||||
(defun what-face (pos)
|
||||
"Tells you the name of the face (point) is on."
|
||||
(interactive "d")
|
||||
(let ((face (or (get-char-property (point) 'read-face-name)
|
||||
(get-char-property (point) 'face))))
|
||||
(if face (message "Face: %s" face) (message "No face at %d" pos))))
|
||||
|
||||
;;;###autoload
|
||||
(defun what-col ()
|
||||
(interactive)
|
||||
(message "Column %d" (current-column)))
|
||||
|
||||
;;;###autoload
|
||||
(defun what-bindings (key)
|
||||
(list
|
||||
(minor-mode-key-binding key)
|
||||
(local-key-binding key)
|
||||
(global-key-binding key)))
|
||||
|
||||
;;;###autoload
|
||||
(defun echo (msg &rest args)
|
||||
"Display MSG in echo-area without logging it in *Messages* buffer."
|
||||
(interactive)
|
||||
(let ((message-log-max nil))
|
||||
(apply 'message msg args)))
|
154
init/defuns.el
154
init/defuns.el
@@ -1,154 +0,0 @@
|
||||
;; Convenience ;;;;;;;;;;;;;;;;;;;;;
|
||||
(defun associate-mode (match mode)
|
||||
"Associate a major mode with a filepath through `auto-mode-alist'"
|
||||
(add-to-list 'auto-mode-alist (cons match mode)))
|
||||
|
||||
(defun associate-minor-mode (match mode)
|
||||
"Associate a minor mode with a filepath through `auto-minor-mode-alist'"
|
||||
(add-to-list 'auto-minor-mode-alist (cons match mode)))
|
||||
|
||||
(defmacro λ (&rest body)
|
||||
"A shortcut for: `(lambda () (interactive) ,@body)"
|
||||
`(lambda () (interactive) ,@body))
|
||||
|
||||
(defun add-hooks (hooks funs)
|
||||
"Add multiple hooks to multiple funs."
|
||||
(let ((funs (if (listp funs) funs (list funs)))
|
||||
(hooks (if (listp hooks) hooks (list hooks))))
|
||||
(dolist (hook hooks)
|
||||
(dolist (fun funs)
|
||||
(add-hook hook fun)))))
|
||||
|
||||
(defmacro add-hook! (hook &rest body)
|
||||
"A shortcut macro for `add-hook' that auto-wraps `body' in a lambda"
|
||||
`(add-hook ,hook (lambda() ,@body)))
|
||||
|
||||
;; Backwards compatible `with-eval-after-load'
|
||||
(unless (fboundp 'with-eval-after-load)
|
||||
(defmacro with-eval-after-load (file &rest body)
|
||||
`(eval-after-load ,file
|
||||
`(funcall (function ,(lambda () ,@body))))))
|
||||
|
||||
(defmacro after (feature &rest forms)
|
||||
`(,(if (or (not (boundp 'byte-compile-current-file))
|
||||
(not byte-compile-current-file)
|
||||
(if (symbolp feature)
|
||||
(require feature nil :no-error)
|
||||
(load feature :no-message :no-error)))
|
||||
'progn
|
||||
(message "after: cannot find %s" feature)
|
||||
'with-no-warnings)
|
||||
(with-eval-after-load ',feature ,@forms)))
|
||||
|
||||
(defmacro rename-mode-name (mode new-name)
|
||||
`(defadvice ,mode (after rename-modeline activate)
|
||||
(setq mode-name ,new-name)))
|
||||
|
||||
|
||||
;; Keybindings ;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
(defun bind (&rest keys)
|
||||
(let (state-list keymap key def)
|
||||
(while keys
|
||||
(setq key (pop keys))
|
||||
(cond ((keymapp key)
|
||||
(setq keymap key))
|
||||
((or (evil-state-p key)
|
||||
(and (listp key) (evil-state-p (car key))))
|
||||
(setq state-list key))
|
||||
(t
|
||||
(if (stringp key)
|
||||
(setq key (kbd key)))
|
||||
(when (eq (length keys) 0)
|
||||
(user-error "No definition for '%s' keybinding" key))
|
||||
(setq def (pop keys))
|
||||
(if (null state-list)
|
||||
(if (null keymap)
|
||||
(global-set-key key def)
|
||||
(define-key keymap key def))
|
||||
(unless (listp state-list)
|
||||
(setq state-list (list state-list)))
|
||||
(dolist (state state-list)
|
||||
(define-key (if keymap
|
||||
(evil-get-auxiliary-keymap keymap state t)
|
||||
(evil-state-property state :keymap t)) key def))))))))
|
||||
|
||||
(after "evil"
|
||||
(evil-define-command my--maybe-exit-insert-mode ()
|
||||
"Exits insert mode using jk without the momentary pause caused by
|
||||
key-chord-define."
|
||||
:repeat change
|
||||
(interactive)
|
||||
(let ((modified (buffer-modified-p)))
|
||||
(insert "j")
|
||||
(let ((evt (read-event nil nil 0.4)))
|
||||
(cond
|
||||
((null evt) (message ""))
|
||||
((and (integerp evt) (char-equal evt ?k))
|
||||
(delete-char -1)
|
||||
(set-buffer-modified-p modified)
|
||||
(push 'escape unread-command-events))
|
||||
(t (setq unread-command-events (append unread-command-events (list evt)))))))))
|
||||
|
||||
;; Hooks ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
(defun enable-comment-hard-wrap ()
|
||||
(set (make-local-variable 'comment-auto-fill-only-comments) t)
|
||||
(turn-on-auto-fill))
|
||||
|
||||
(defun enable-tab-width-2 ()
|
||||
(setq tab-width 2 evil-shift-width 2))
|
||||
|
||||
(defun enable-tab-width-4 ()
|
||||
(setq tab-width 4 evil-shift-width 4))
|
||||
|
||||
(defun disable-final-newline ()
|
||||
(set (make-local-variable 'require-final-newline) nil))
|
||||
|
||||
|
||||
;;;; Global Defuns ;;;;;;;;;;;;;;;;;;;;;
|
||||
(defun my--minibuffer-quit ()
|
||||
"Abort recursive edit. In Delete Selection mode, if the mark is
|
||||
active, just deactivate it; then it takes a second \\[keyboard-quit]
|
||||
to abort the minibuffer."
|
||||
(interactive)
|
||||
(if (and delete-selection-mode transient-mark-mode mark-active)
|
||||
(setq deactivate-mark t)
|
||||
(when (get-buffer "*Completions*")
|
||||
(delete-windows-on "*Completions*"))
|
||||
(abort-recursive-edit)))
|
||||
|
||||
(defun my--line-at-click ()
|
||||
"Determine the line number at click"
|
||||
(save-excursion
|
||||
(let ((click-y (cddr (mouse-position)))
|
||||
(debug-on-error t)
|
||||
(line-move-visual t))
|
||||
(goto-char (window-start))
|
||||
(next-line (1- click-y))
|
||||
(1+ (line-number-at-pos)))))
|
||||
|
||||
(defun my-select-linum (event)
|
||||
"Set point as *linum-mdown-line*"
|
||||
(interactive "e")
|
||||
(mouse-select-window event)
|
||||
(goto-line (my--line-at-click))
|
||||
(evil-visual-line)
|
||||
(setq *linum-mdown-line*
|
||||
(line-number-at-pos)))
|
||||
|
||||
(defun my-select-block ()
|
||||
"Select the current block of text between blank lines."
|
||||
(interactive)
|
||||
(let (p1 p2)
|
||||
(progn
|
||||
(if (re-search-backward "\n[ \t]*\n" nil "move")
|
||||
(progn (re-search-forward "\n[ \t]*\n")
|
||||
(setq p1 (point)))
|
||||
(setq p1 (point)))
|
||||
(if (re-search-forward "\n[ \t]*\n" nil "move")
|
||||
(progn (re-search-backward "\n[ \t]*\n")
|
||||
(setq p2 (point)))
|
||||
(setq p2 (point))))
|
||||
(set-mark p1)))
|
||||
|
||||
|
||||
(provide 'defuns)
|
@@ -1,10 +1,11 @@
|
||||
(use-package autoinsert
|
||||
:init (auto-insert-mode 1)
|
||||
:config
|
||||
(progn
|
||||
;; (setq auto-insert-directory "%/.emacs.d/templates/")
|
||||
(setq auto-insert-query nil) ; Don't prompt before insertion
|
||||
(setq auto-insert-alist '())))
|
||||
(setq auto-insert-alist '())
|
||||
|
||||
(auto-insert-mode 1)))
|
||||
|
||||
(after "yasnippet"
|
||||
(defun add-template (regexp-or-major-mode uuid yas-mode &optional project-only)
|
||||
@@ -13,7 +14,7 @@
|
||||
|
||||
(defun insert-template (uuid mode &optional project-only)
|
||||
"Expand snippet template in MODE by its UUID"
|
||||
(unless (or (and project-only (not (project-p)))
|
||||
(unless (or (and project-only (not (narf/project-p)))
|
||||
(not (or (eq major-mode mode)
|
||||
(symbol-value mode))))
|
||||
(insert uuid)
|
||||
@@ -47,14 +48,14 @@
|
||||
;; ;; Python
|
||||
;; (add-template "tests?/test_.+\\.py$" "%%" 'nose-mode)
|
||||
;; (add-template "/setup\\.py$" "%setup%" 'python-mode)
|
||||
(add-template "\\.py$" "%%" 'python-mode)
|
||||
(add-template "\\.py$" "%%" 'python-mode)
|
||||
|
||||
;; ;; PHP
|
||||
;; (add-template "\\.class\\.php$" "%class%" 'php-mode)
|
||||
;; (add-template "\\.php$" "%%" 'php-mode)
|
||||
|
||||
;; ;; Markdown
|
||||
(add-template "/README\\.md$" "%README.md%" 'markdown-mode)
|
||||
(add-template "\\.md$" "%%" 'markdown-mode)
|
||||
;; (add-template "/_posts/.+\\.md$" "%jekyll-post" 'markdown-mode)
|
||||
;; (add-template "/_layouts/.+\\.html$" "%jekyll-layout%" 'web-mode)
|
||||
|
||||
|
215
init/init-cc.el
215
init/init-cc.el
@@ -4,9 +4,9 @@
|
||||
(progn
|
||||
(after "company"
|
||||
(use-package company-cmake
|
||||
:config (company--backend-on 'cmake-mode-hook 'company-cmake 'company-yasnippet)))))
|
||||
:config
|
||||
(narf/add-company-backend cmake-mode (company-cmake company-yasnippet))))))
|
||||
|
||||
;; Shaders
|
||||
(use-package glsl-mode
|
||||
:mode (("\\.glsl\\'" . glsl-mode)
|
||||
("\\.vert\\'" . glsl-mode)
|
||||
@@ -14,10 +14,17 @@
|
||||
("\\.geom\\'" . glsl-mode)))
|
||||
|
||||
(use-package cc-mode
|
||||
:defines (c-syntactic-context)
|
||||
:functions (c-toggle-electric-state c-toggle-auto-newline
|
||||
c-skip-comments-and-strings c-forward-sws c-end-of-macro
|
||||
c-font-lock-invalid-string csharp-log c-font-lock-declarators
|
||||
c-get-lang-constant c-forward-keyword-clause
|
||||
c-fontify-recorded-types-and-refs c-forward-type imenu--split
|
||||
c-backward-sws c-determine-limit c-beginning-of-decl-1)
|
||||
:commands (c-mode c++-mode objc-mode java-mode)
|
||||
:init
|
||||
(progn
|
||||
(associate-mode "\\.h$" 'c++-mode)
|
||||
(associate-mode "\\.h$" 'c++-mode)
|
||||
(associate-mode "\\.mm$" 'objc-mode))
|
||||
:config
|
||||
(progn
|
||||
@@ -26,42 +33,109 @@
|
||||
c-tab-always-indent nil
|
||||
c-electric-flag nil)
|
||||
|
||||
(when is-mac
|
||||
(progn ; C/C++ Settings
|
||||
(after "flycheck"
|
||||
(setq flycheck-clang-language-standard "c++11"
|
||||
flycheck-clang-standard-library "libc++"
|
||||
flycheck-c/c++-clang-executable "clang++"
|
||||
flycheck-clang-include-path '("/usr/local/include"))))
|
||||
(when IS-MAC
|
||||
(setq flycheck-clang-language-standard "c++11"
|
||||
flycheck-clang-standard-library "libc++"
|
||||
flycheck-c/c++-clang-executable "clang++"
|
||||
flycheck-clang-include-path '("/usr/local/include"))))
|
||||
|
||||
(after "company"
|
||||
;; TODO Clang is *really* slow in larger projects, maybe replace it with irony-mode or ycmd?
|
||||
(company--backend-on 'c-mode-hook 'company-c-headers 'company-clang)
|
||||
(company--backend-on 'c++-mode-hook 'company-c-headers 'company-clang)
|
||||
(company--backend-on 'objc-mode-hook 'company-c-headers 'company-xcode))
|
||||
(after "company"
|
||||
;; TODO Clang is *really* slow in larger projects, maybe replace it with irony-mode or ycmd?
|
||||
(narf/add-company-backend c-mode (company-c-headers company-clang))
|
||||
(narf/add-company-backend c++-mode (company-c-headers company-clang))
|
||||
(narf/add-company-backend objc-mode (company-c-headers company-xcode)))
|
||||
|
||||
(defun my-c-lineup-inclass (langelem)
|
||||
(let ((inclass (assoc 'inclass c-syntactic-context)))
|
||||
(save-excursion
|
||||
(goto-char (c-langelem-pos inclass))
|
||||
(if (or (looking-at "struct")
|
||||
(looking-at "typedef struct"))
|
||||
'+
|
||||
'++))))
|
||||
(defun narf--c-lineup-inclass (langelem)
|
||||
(let ((inclass (assoc 'inclass c-syntactic-context)))
|
||||
(save-excursion
|
||||
(goto-char (c-langelem-pos inclass))
|
||||
(if (or (looking-at "struct")
|
||||
(looking-at "typedef struct"))
|
||||
'+
|
||||
'++))))
|
||||
(defun narf|init-c/c++-settings ()
|
||||
(c-toggle-electric-state -1)
|
||||
(c-toggle-auto-newline -1)
|
||||
(c-set-offset 'substatement-open '0) ; brackets should be at same indentation level as the statements they open
|
||||
(c-set-offset 'inline-open '+)
|
||||
(c-set-offset 'block-open '+)
|
||||
(c-set-offset 'brace-list-open '+) ; all "opens" should be indented by the c-indent-level
|
||||
(c-set-offset 'case-label '+) ; indent case labels by c-indent-level, too
|
||||
(c-set-offset 'access-label '-)
|
||||
(c-set-offset 'inclass 'narf--c-lineup-inclass)
|
||||
;; DEL mapping interferes with smartparens and my custom DEL binding
|
||||
(define-key c-mode-map (kbd "DEL") nil))
|
||||
(add-hook 'c-mode-hook 'narf|init-c/c++-settings)
|
||||
(add-hook 'c++-mode-hook 'narf|init-c/c++-settings)
|
||||
|
||||
(defun my-c/c++-settings ()
|
||||
(c-toggle-electric-state -1)
|
||||
(c-toggle-auto-newline -1)
|
||||
(c-set-offset 'substatement-open '0) ; brackets should be at same indentation level as the statements they open
|
||||
(c-set-offset 'inline-open '+)
|
||||
(c-set-offset 'block-open '+)
|
||||
(c-set-offset 'brace-list-open '+) ; all "opens" should be indented by the c-indent-level
|
||||
(c-set-offset 'case-label '+) ; indent case labels by c-indent-level, too
|
||||
(c-set-offset 'access-label '-)
|
||||
(c-set-offset 'inclass 'my-c-lineup-inclass)
|
||||
;; DEL mapping interferes with smartparens and my.deflate-maybe
|
||||
(define-key c-mode-map (kbd "DEL") nil))
|
||||
(add-hook 'c-mode-hook 'my-c/c++-settings)
|
||||
(add-hook 'c++-mode-hook 'my-c/c++-settings)
|
||||
;; C++11 syntax support (until cc-mode is updated)
|
||||
(require 'font-lock)
|
||||
(defun --copy-face (new-face face)
|
||||
"Define NEW-FACE from existing FACE."
|
||||
(copy-face face new-face)
|
||||
(eval `(defvar ,new-face nil))
|
||||
(set new-face new-face))
|
||||
|
||||
(--copy-face 'font-lock-label-face ; labels, case, public, private, proteced, namespace-tags
|
||||
'font-lock-keyword-face)
|
||||
(--copy-face 'font-lock-doc-markup-face ; comment markups such as Javadoc-tags
|
||||
'font-lock-doc-face)
|
||||
(--copy-face 'font-lock-doc-string-face ; comment markups
|
||||
'font-lock-comment-face)
|
||||
(global-font-lock-mode t)
|
||||
(setq font-lock-maximum-decoration t)
|
||||
|
||||
(add-hook! 'c++-mode-hook
|
||||
;; We could place some regexes into `c-mode-common-hook', but
|
||||
;; note that their evaluation order matters.
|
||||
(font-lock-add-keywords
|
||||
nil '(;; complete some fundamental keywords
|
||||
("\\<\\(void\\|unsigned\\|signed\\|char\\|short\\|bool\\|int\\|long\\|float\\|double\\)\\>" . font-lock-keyword-face)
|
||||
;; namespace names and tags - these are rendered as constants by cc-mode
|
||||
("\\<\\(\\w+::\\)" . font-lock-function-name-face)
|
||||
;; new C++11 keywords
|
||||
("\\<\\(alignof\\|alignas\\|constexpr\\|decltype\\|noexcept\\|nullptr\\|static_assert\\|thread_local\\|override\\|final\\)\\>" . font-lock-keyword-face)
|
||||
("\\<\\(char16_t\\|char32_t\\)\\>" . font-lock-keyword-face)
|
||||
;; PREPROCESSOR_CONSTANT, PREPROCESSORCONSTANT
|
||||
("\\<[A-Z]*_[A-Z_]+\\>" . font-lock-constant-face)
|
||||
("\\<[A-Z]\\{3,\\}\\>" . font-lock-constant-face)
|
||||
;; hexadecimal numbers
|
||||
("\\<0[xX][0-9A-Fa-f]+\\>" . font-lock-constant-face)
|
||||
;; integer/float/scientific numbers
|
||||
("\\<[\\-+]*[0-9]*\\.?[0-9]+\\([ulUL]+\\|[eE][\\-+]?[0-9]+\\)?\\>" . font-lock-constant-face)
|
||||
;; c++11 string literals
|
||||
;; L"wide string"
|
||||
;; L"wide string with UNICODE codepoint: \u2018"
|
||||
;; u8"UTF-8 string", u"UTF-16 string", U"UTF-32 string"
|
||||
("\\<\\([LuU8]+\\)\".*?\"" 1 font-lock-keyword-face)
|
||||
;; R"(user-defined literal)"
|
||||
;; R"( a "quot'd" string )"
|
||||
;; R"delimiter(The String Data" )delimiter"
|
||||
;; R"delimiter((a-z))delimiter" is equivalent to "(a-z)"
|
||||
("\\(\\<[uU8]*R\"[^\\s-\\\\()]\\{0,16\\}(\\)" 1 font-lock-keyword-face t) ; start delimiter
|
||||
( "\\<[uU8]*R\"[^\\s-\\\\()]\\{0,16\\}(\\(.*?\\))[^\\s-\\\\()]\\{0,16\\}\"" 1 font-lock-string-face t) ; actual string
|
||||
( "\\<[uU8]*R\"[^\\s-\\\\()]\\{0,16\\}(.*?\\()[^\\s-\\\\()]\\{0,16\\}\"\\)" 1 font-lock-keyword-face t) ; end delimiter
|
||||
|
||||
;; user-defined types (rather project-specific)
|
||||
("\\<[A-Za-z_]+[A-Za-z_0-9]*_\\(type\\|ptr\\)\\>" . font-lock-type-face)
|
||||
("\\<\\(xstring\\|xchar\\)\\>" . font-lock-type-face)
|
||||
)) t)
|
||||
|
||||
;; Fix enum and C++11 lambda indentation
|
||||
(defadvice c-lineup-arglist (around c-lineup-arglist-indent-fix activate)
|
||||
"Improve indentation of continued C++11 lambda function opened as argument."
|
||||
(setq ad-return-value
|
||||
(if (and (equal major-mode 'c++-mode)
|
||||
(ignore-errors
|
||||
(save-excursion
|
||||
(goto-char (c-langelem-pos langelem))
|
||||
;; Detect "[...](" or "[...]{". preceded by "," or "(",
|
||||
;; and with unclosed brace.
|
||||
(looking-at ".*[(,][ \t]*\\[[^]]*\\][ \t]*[({][^}]*$"))))
|
||||
0 ; no additional indent
|
||||
ad-do-it))))
|
||||
|
||||
(progn ; Obj-C
|
||||
(add-to-list 'magic-mode-alist
|
||||
@@ -70,75 +144,8 @@
|
||||
(re-search-forward "@\\<interface\\>"
|
||||
magic-mode-regexp-match-limit t)))
|
||||
. objc-mode))
|
||||
(after "flycheck" (add-hook! 'objc-mode-hook (use-package flycheck-objc))))
|
||||
|
||||
|
||||
;; C++11 syntax support (until cc-mode is updated)
|
||||
(require 'font-lock)
|
||||
(defun --copy-face (new-face face)
|
||||
"Define NEW-FACE from existing FACE."
|
||||
(copy-face face new-face)
|
||||
(eval `(defvar ,new-face nil))
|
||||
(set new-face new-face))
|
||||
|
||||
(--copy-face 'font-lock-label-face ; labels, case, public, private, proteced, namespace-tags
|
||||
'font-lock-keyword-face)
|
||||
(--copy-face 'font-lock-doc-markup-face ; comment markups such as Javadoc-tags
|
||||
'font-lock-doc-face)
|
||||
(--copy-face 'font-lock-doc-string-face ; comment markups
|
||||
'font-lock-comment-face)
|
||||
(global-font-lock-mode t)
|
||||
(setq font-lock-maximum-decoration t)
|
||||
|
||||
(add-hook! 'c++-mode-hook
|
||||
;; We could place some regexes into `c-mode-common-hook', but
|
||||
;; note that their evaluation order matters.
|
||||
(font-lock-add-keywords
|
||||
nil '(;; complete some fundamental keywords
|
||||
("\\<\\(void\\|unsigned\\|signed\\|char\\|short\\|bool\\|int\\|long\\|float\\|double\\)\\>" . font-lock-keyword-face)
|
||||
;; namespace names and tags - these are rendered as constants by cc-mode
|
||||
("\\<\\(\\w+::\\)" . font-lock-function-name-face)
|
||||
;; new C++11 keywords
|
||||
("\\<\\(alignof\\|alignas\\|constexpr\\|decltype\\|noexcept\\|nullptr\\|static_assert\\|thread_local\\|override\\|final\\)\\>" . font-lock-keyword-face)
|
||||
("\\<\\(char16_t\\|char32_t\\)\\>" . font-lock-keyword-face)
|
||||
;; PREPROCESSOR_CONSTANT, PREPROCESSORCONSTANT
|
||||
("\\<[A-Z]*_[A-Z_]+\\>" . font-lock-constant-face)
|
||||
("\\<[A-Z]\\{3,\\}\\>" . font-lock-constant-face)
|
||||
;; hexadecimal numbers
|
||||
("\\<0[xX][0-9A-Fa-f]+\\>" . font-lock-constant-face)
|
||||
;; integer/float/scientific numbers
|
||||
("\\<[\\-+]*[0-9]*\\.?[0-9]+\\([ulUL]+\\|[eE][\\-+]?[0-9]+\\)?\\>" . font-lock-constant-face)
|
||||
;; c++11 string literals
|
||||
;; L"wide string"
|
||||
;; L"wide string with UNICODE codepoint: \u2018"
|
||||
;; u8"UTF-8 string", u"UTF-16 string", U"UTF-32 string"
|
||||
("\\<\\([LuU8]+\\)\".*?\"" 1 font-lock-keyword-face)
|
||||
;; R"(user-defined literal)"
|
||||
;; R"( a "quot'd" string )"
|
||||
;; R"delimiter(The String Data" )delimiter"
|
||||
;; R"delimiter((a-z))delimiter" is equivalent to "(a-z)"
|
||||
("\\(\\<[uU8]*R\"[^\\s-\\\\()]\\{0,16\\}(\\)" 1 font-lock-keyword-face t) ; start delimiter
|
||||
( "\\<[uU8]*R\"[^\\s-\\\\()]\\{0,16\\}(\\(.*?\\))[^\\s-\\\\()]\\{0,16\\}\"" 1 font-lock-string-face t) ; actual string
|
||||
( "\\<[uU8]*R\"[^\\s-\\\\()]\\{0,16\\}(.*?\\()[^\\s-\\\\()]\\{0,16\\}\"\\)" 1 font-lock-keyword-face t) ; end delimiter
|
||||
|
||||
;; user-defined types (rather project-specific)
|
||||
("\\<[A-Za-z_]+[A-Za-z_0-9]*_\\(type\\|ptr\\)\\>" . font-lock-type-face)
|
||||
("\\<\\(xstring\\|xchar\\)\\>" . font-lock-type-face)
|
||||
)) t)
|
||||
|
||||
;; Fix enum and C++11 lambda indentation
|
||||
(defadvice c-lineup-arglist (around c-lineup-arglist-indent-fix activate)
|
||||
"Improve indentation of continued C++11 lambda function opened as argument."
|
||||
(setq ad-return-value
|
||||
(if (and (equal major-mode 'c++-mode)
|
||||
(ignore-errors
|
||||
(save-excursion
|
||||
(goto-char (c-langelem-pos langelem))
|
||||
;; Detect "[...](" or "[...]{". preceded by "," or "(",
|
||||
;; and with unclosed brace.
|
||||
(looking-at ".*[(,][ \t]*\\[[^]]*\\][ \t]*[({][^}]*$"))))
|
||||
0 ; no additional indent
|
||||
ad-do-it))) ; default behavior
|
||||
(after "flycheck"
|
||||
(add-hook! 'objc-mode-hook (use-package flycheck-objc))))
|
||||
))
|
||||
|
||||
|
||||
|
@@ -1,121 +0,0 @@
|
||||
(use-package company
|
||||
:diminish company-mode
|
||||
:config
|
||||
(progn
|
||||
(global-company-mode 1)
|
||||
(setq company-idle-delay nil
|
||||
company-minimum-prefix-length 1
|
||||
company-show-numbers nil
|
||||
company-tooltip-limit 20
|
||||
company-dabbrev-downcase nil
|
||||
company-dabbrev-ignore-case nil
|
||||
company-tooltip-align-annotations t
|
||||
company-require-match 'never
|
||||
company-global-modes
|
||||
'(not eshell-mode comint-mode org-mode erc-mode message-mode help-mode))
|
||||
|
||||
(require 'color)
|
||||
(let ((bg (face-attribute 'default :background)))
|
||||
(custom-set-faces
|
||||
`(company-tooltip ((t (:inherit default :background ,(color-lighten-name bg 9)))))
|
||||
`(company-scrollbar-bg ((t (:background ,(color-lighten-name bg 15)))))
|
||||
`(company-scrollbar-fg ((t (:background ,(color-lighten-name bg 5)))))
|
||||
`(company-search ((t (:background ,(color-lighten-name bg 15)))))
|
||||
`(company-tooltip-selection ((t (:inherit font-lock-function-name-face))))
|
||||
`(company-tooltip-common ((t (:inherit font-lock-constant-face))))))
|
||||
|
||||
;; Sort candidates by
|
||||
(add-to-list 'company-transformers 'company-sort-by-occurrence)
|
||||
(use-package company-statistics
|
||||
:config
|
||||
(progn
|
||||
(setq company-statistics-file (expand-file-name "company-statistics-cache.el" my-tmp-dir))
|
||||
(company-statistics-mode)))
|
||||
|
||||
;; frontends
|
||||
(setq-default company-frontends '(company-pseudo-tooltip-unless-just-one-frontend
|
||||
company-echo-metadata-frontend
|
||||
company-preview-if-just-one-frontend))
|
||||
|
||||
(progn ; backends
|
||||
(defun company--backend-on (hook &rest backends)
|
||||
(add-hook hook
|
||||
`(lambda()
|
||||
(set (make-local-variable 'company-backends)
|
||||
(append '((,@backends company-semantic)) company-backends)))))
|
||||
|
||||
(company--backend-on 'nxml-mode-hook 'company-nxml 'company-yasnippet)
|
||||
(company--backend-on 'emacs-lisp-mode-hook 'company-elisp 'company-yasnippet)
|
||||
|
||||
;; Rewrite evil-complete to use company-dabbrev
|
||||
(setq company-dabbrev-code-other-buffers t)
|
||||
(setq company-dabbrev-code-buffers nil)
|
||||
(setq evil-complete-next-func
|
||||
(lambda(arg)
|
||||
(call-interactively 'company-dabbrev)
|
||||
(if (eq company-candidates-length 1)
|
||||
(company-complete))))
|
||||
(setq evil-complete-previous-func
|
||||
(lambda (arg)
|
||||
(let ((company-selection-wrap-around t))
|
||||
(call-interactively 'company-dabbrev)
|
||||
(if (eq company-candidates-length 1)
|
||||
(company-complete)
|
||||
(call-interactively 'company-select-previous)))))
|
||||
|
||||
;; Simulates ac-source-dictionary (without global dictionary)
|
||||
(defconst my-dicts-dir (concat my-dir "dict/"))
|
||||
(defvar company-dictionary-alist '())
|
||||
(defvar company-dictionary-major-minor-modes '())
|
||||
(defun company-dictionary-active-minor-modes ()
|
||||
(-filter (lambda (mode) (when (boundp mode) (symbol-value mode))) company-dictionary-major-minor-modes))
|
||||
(defun company-dictionary-assemble ()
|
||||
(let ((minor-modes (company-dictionary-active-minor-modes))
|
||||
(dicts (cdr (assq major-mode company-dictionary-alist))))
|
||||
(dolist (mode minor-modes)
|
||||
(setq dicts (append dicts (cdr (assq mode company-dictionary-alist)))))
|
||||
dicts))
|
||||
(defun company-dictionary-init ()
|
||||
(dolist (file (f-files my-dicts-dir))
|
||||
(add-to-list 'company-dictionary-alist `(,(intern (f-base file)) ,@(s-split "\n" (f-read file) t)))))
|
||||
(defun company-dictionary (command &optional arg &rest ignored)
|
||||
"`company-mode' back-end for user-provided dictionaries."
|
||||
(interactive (list 'interactive))
|
||||
(unless company-dictionary-alist (company-dictionary-init))
|
||||
(let ((dict (company-dictionary-assemble)))
|
||||
(cl-case command
|
||||
(interactive (company-begin-backend 'company-dictionary))
|
||||
(prefix (and dict (or (company-grab-symbol) 'stop)))
|
||||
(candidates
|
||||
(let ((completion-ignore-case nil)
|
||||
(symbols dict))
|
||||
(all-completions arg symbols)))
|
||||
(sorted t))))
|
||||
|
||||
(setq-default company-backends '((company-capf company-yasnippet) (company-dictionary company-keywords)))
|
||||
|
||||
(progn ; keybinds
|
||||
(define-key company-active-map "C-w" nil)
|
||||
(bind company-active-map
|
||||
"C-o" 'company-search-kill-others
|
||||
"C-n" 'company-select-next-or-abort
|
||||
"C-p" 'company-select-previous-or-abort
|
||||
"C-h" 'company-show-doc-buffer
|
||||
"C-S-h" 'company-show-location
|
||||
"C-S-s" 'company-search-candidates
|
||||
"C-s" 'company-filter-candidates
|
||||
"C-SPC" 'company-complete-common
|
||||
[tab] 'company-complete
|
||||
"<backtab>" 'company-select-previous
|
||||
[escape] 'company-abort)
|
||||
|
||||
(bind company-search-map
|
||||
"C-n" 'company-search-repeat-forward
|
||||
"C-p" 'company-search-repeat-backward
|
||||
[escape] 'company-abort)
|
||||
|
||||
(bind company-active-map "<C-return>" 'helm-company)))))
|
||||
|
||||
|
||||
(provide 'init-company)
|
||||
;;; init-company.el ends here
|
@@ -7,4 +7,5 @@
|
||||
|
||||
(add-hook 'ruby-mode-hook (function cscope-minor-mode))
|
||||
|
||||
|
||||
(provide 'init-cscope)
|
||||
|
@@ -1,7 +1,8 @@
|
||||
(use-package csharp-mode :mode "\\.cs$"
|
||||
:init
|
||||
(add-hook 'csharp-mode-hook 'flycheck-mode)
|
||||
:config
|
||||
(progn
|
||||
(after "flycheck" (add-hook 'csharp-mode-hook 'flycheck-mode))
|
||||
(use-package omnisharp
|
||||
:defer t
|
||||
:config
|
||||
@@ -9,15 +10,16 @@
|
||||
(setq omnisharp-server-executable-path
|
||||
"~/Dropbox/projects/lib/Omnisharp/server/OmniSharp/bin/Debug/OmniSharp.exe")
|
||||
|
||||
(bind 'normal omnisharp-mode-map
|
||||
(bind :normal :map omnisharp-mode-map
|
||||
"gd" 'omnisharp-go-to-definition)
|
||||
|
||||
(after "company"
|
||||
(company--backend-on 'csharp-mode-hook 'company-omnisharp)
|
||||
(add-hook 'csharp-mode-hook 'turn-on-eldoc-mode))))))
|
||||
(narf/add-company-backend csharp-mode (company-omnisharp))
|
||||
(add-hook 'csharp-mode-hook 'turn-on-eldoc-mode))))))
|
||||
|
||||
;; unity shaders
|
||||
(use-package shaderlab-mode :mode "\\.shader$")
|
||||
|
||||
|
||||
(provide 'init-csharp)
|
||||
;;; init-csharp.el ends here
|
||||
|
11
init/init-data.el
Normal file
11
init/init-data.el
Normal file
@@ -0,0 +1,11 @@
|
||||
(use-package yaml-mode
|
||||
:mode "\\.ya?ml$"
|
||||
:init (add-hook 'yaml-mode-hook 'narf|enable-tab-width-2))
|
||||
|
||||
(use-package json-mode
|
||||
:mode (("\\.json$" . json-mode)
|
||||
("\\.jshintrc$" . json-mode)))
|
||||
|
||||
|
||||
(provide 'init-data)
|
||||
;;; init-data.el ends here
|
@@ -3,13 +3,13 @@
|
||||
;; (push '("*eshell*" :position left :width 80 :stick t) popwin:special-display-config)
|
||||
|
||||
;; ;; eshell
|
||||
;; (setq eshell-directory-name (concat my-tmp-dir "eshell"))
|
||||
;; (setq eshell-directory-name (concat TMP-DIR "eshell"))
|
||||
;; (setq eshell-scroll-to-bottom-on-input 'all)
|
||||
;; (setq eshell-buffer-shorthand t)
|
||||
|
||||
|
||||
;; ;; em-alias
|
||||
;; (setq eshell-aliases-file (concat my-tmp-dir ".eshell-aliases"))
|
||||
;; (setq eshell-aliases-file (concat TMP-DIR ".eshell-aliases"))
|
||||
|
||||
|
||||
;; ;; em-glob
|
||||
|
@@ -1,39 +1,42 @@
|
||||
(use-package flycheck
|
||||
:functions (flycheck-buffer)
|
||||
:commands (flycheck-mode flycheck-list-errors)
|
||||
:init
|
||||
(add-hooks '(ruby-mode-hook
|
||||
python-mode-hook
|
||||
php-mode-hook
|
||||
lua-mode-hook
|
||||
shell-mode-hook
|
||||
scss-mode-hook
|
||||
c++-mode-hook
|
||||
c-mode-hook)
|
||||
'flycheck-mode)
|
||||
(add-to-hooks 'flycheck-mode '(ruby-mode-hook
|
||||
python-mode-hook
|
||||
php-mode-hook
|
||||
lua-mode-hook
|
||||
shell-mode-hook
|
||||
scss-mode-hook
|
||||
c++-mode-hook
|
||||
c-mode-hook))
|
||||
:config
|
||||
(progn ; flycheck settings
|
||||
(defun my-shorter-fly-status (result)
|
||||
(format "[%s]" (replace-regexp-in-string " FlyC:?" "" result)))
|
||||
(advice-add 'flycheck-mode-line-status-text :filter-return 'my-shorter-fly-status)
|
||||
|
||||
(setq-default flycheck-indication-mode 'right-fringe
|
||||
;; Removed checks on idle/change for snappiness
|
||||
flycheck-check-syntax-automatically '(save mode-enabled idle-change)
|
||||
flycheck-disabled-checkers '(emacs-lisp-checkdoc make))
|
||||
|
||||
(my--cleanup-buffers-add "^\\*Flycheck.*\\*$")
|
||||
(narf/add-throwaway-buffer "^\\*Flycheck.*\\*$")
|
||||
|
||||
(bind 'normal flycheck-error-list-mode-map
|
||||
(bind :normal :map flycheck-error-list-mode-map
|
||||
[escape] 'kill-this-buffer
|
||||
"q" 'kill-this-buffer)
|
||||
|
||||
(evil-initial-state 'flycheck-error-list-mode 'emacs)
|
||||
|
||||
(defun my--evil-flycheck-buffer ()
|
||||
(defun narf/evil-flycheck-buffer ()
|
||||
(if (and (featurep 'flycheck) flycheck-mode)
|
||||
(flycheck-buffer)))
|
||||
|
||||
;; Check buffer when normal mode is entered
|
||||
(add-hook 'evil-normal-state-entry-hook 'my--evil-flycheck-buffer)
|
||||
(add-hook 'evil-normal-state-entry-hook 'narf/evil-flycheck-buffer)
|
||||
;; And on ESC in normal mode.
|
||||
(defadvice evil-force-normal-state (after evil-esc-flycheck-buffer activate)
|
||||
(my--evil-flycheck-buffer))))
|
||||
(advice-add 'evil-force-normal-state :after 'narf/evil-flycheck-buffer)))
|
||||
|
||||
(use-package flyspell :commands flyspell-mode)
|
||||
|
||||
|
@@ -3,11 +3,11 @@
|
||||
:interpreter "go"
|
||||
:config
|
||||
(progn
|
||||
(bind 'normal go-mode-map "gd" 'godef-jump)
|
||||
(bind normal :map go-mode-map "gd" 'godef-jump)
|
||||
|
||||
(use-package company-go
|
||||
:config
|
||||
(company--backend-on 'go-mode-hook 'company-go 'company-yasnippet))))
|
||||
(narf/add-company-backend go-mode (company-go company-yasnippet)))))
|
||||
|
||||
|
||||
(provide 'init-go)
|
||||
|
@@ -1,9 +1,64 @@
|
||||
;; Ex-mode interface for `helm-recentf' and `helm-projectile-recentf'. If
|
||||
;; `bang', then `search' is interpreted as regexp
|
||||
(evil-define-command my:helm-recentf (&optional bang)
|
||||
:repeat nil
|
||||
(interactive "<!>")
|
||||
(if bang (helm-recentf) (helm-projectile-recentf)))
|
||||
(use-package helm
|
||||
:commands (helm
|
||||
helm-etags-select
|
||||
helm-show-kill-ring
|
||||
helm-bookmarks
|
||||
helm-wg
|
||||
helm-ag
|
||||
helm-alive-p
|
||||
helm-attrset)
|
||||
:init
|
||||
(progn
|
||||
(defvar helm-global-prompt ">>> ")
|
||||
(evil-set-initial-state 'helm-mode 'emacs))
|
||||
:config
|
||||
(progn
|
||||
(use-package helm-grep)
|
||||
(use-package helm-ag
|
||||
:functions (helm-ag--select-source)
|
||||
:defines (helm-ag-source helm-ag--last-query))
|
||||
|
||||
;; No persistent header
|
||||
(defun narf--helm-display-mode-line (source &optional force)
|
||||
(setq mode-line-format nil)
|
||||
(setq header-line-format nil))
|
||||
(advice-add 'helm-display-mode-line :override 'narf--helm-display-mode-line)
|
||||
|
||||
;; Minimalistic split-fn; leaves popwin to handle helm buffers
|
||||
(defun narf--helm-split-window-fn (window)
|
||||
(if (one-window-p t)
|
||||
(let ((helm-full-frame t))
|
||||
(selected-window))
|
||||
(other-window-for-scrolling)))
|
||||
|
||||
(setq helm-quick-update t
|
||||
helm-idle-delay 0.05
|
||||
helm-input-idle-delay 0.05
|
||||
helm-reuse-last-window-split-state t
|
||||
helm-buffers-fuzzy-matching t
|
||||
helm-candidate-number-limit 40
|
||||
helm-bookmark-show-location t
|
||||
helm-split-window-default-side 'other
|
||||
helm-split-window-preferred-function 'narf--helm-split-window-fn) ; let popwin handle this
|
||||
|
||||
(after "winner"
|
||||
;; Tell winner-mode to ignore helm buffers
|
||||
(dolist (bufname '("*helm recentf*"
|
||||
"*helm projectile*"
|
||||
"*helm imenu*"
|
||||
"*helm company*"
|
||||
"*helm buffers*"
|
||||
;; "*helm tags*"
|
||||
"*helm-ag*"
|
||||
"*Helm Swoop*"))
|
||||
(push bufname winner-boring-buffers)))
|
||||
(narf/add-throwaway-buffer "^\\*[Hh]elm.*\\*$")
|
||||
|
||||
(bind :map helm-map
|
||||
"C-w" 'evil-delete-backward-word
|
||||
"C-u" 'helm-delete-minibuffer-contents
|
||||
"C-r" 'evil-ex-paste-from-register ; Evil registers in helm! Glorious!
|
||||
[escape] 'helm-keyboard-quit)))
|
||||
|
||||
(use-package projectile
|
||||
:commands (projectile-ack
|
||||
@@ -28,6 +83,8 @@
|
||||
projectile-switch-to-buffer
|
||||
projectile-vc
|
||||
projectile-project-p
|
||||
projectile-global-mode
|
||||
helm-projectile-switch-to-buffer
|
||||
helm-projectile-find-file
|
||||
helm-projectile-recentf
|
||||
helm-projectile-find-other-file
|
||||
@@ -35,12 +92,15 @@
|
||||
:diminish projectile-mode
|
||||
:config
|
||||
(progn
|
||||
(defun narf/project-invalidate-cache-maybe ()
|
||||
(when (projectile-project-p) (projectile-invalidate-cache nil)))
|
||||
(add-hook 'kill-emacs-hook 'narf/project-invalidate-cache-maybe)
|
||||
(setq-default projectile-enable-caching t)
|
||||
(setq projectile-sort-order 'recentf
|
||||
projectile-cache-file (concat my-tmp-dir "projectile.cache")
|
||||
projectile-known-projects-file (concat my-tmp-dir "projectile.projects")
|
||||
projectile-cache-file (concat TMP-DIR "projectile.cache")
|
||||
projectile-known-projects-file (concat TMP-DIR "projectile.projects")
|
||||
projectile-indexing-method 'alien
|
||||
projectile-project-root-files project-root-files)
|
||||
projectile-project-root-files narf/project-root-files)
|
||||
(add-to-list 'projectile-globally-ignored-files "ido.last")
|
||||
(add-to-list 'projectile-globally-ignored-directories "assets")
|
||||
(add-to-list 'projectile-other-file-alist '("scss" "css"))
|
||||
@@ -52,76 +112,35 @@
|
||||
;; Don't show the project name in the prompts; I already know.
|
||||
(defun projectile-prepend-project-name (string) helm-global-prompt)))
|
||||
|
||||
(use-package helm
|
||||
:commands (helm
|
||||
helm-M-x
|
||||
helm-buffers-list
|
||||
helm-semantic-or-imenu
|
||||
helm-etags-select
|
||||
helm-apropos
|
||||
helm-show-kill-ring
|
||||
helm-bookmarks
|
||||
helm-wg)
|
||||
:init
|
||||
(evil-set-initial-state 'helm-mode 'emacs)
|
||||
(use-package helm-org
|
||||
:commands (helm-org-in-buffer-headings
|
||||
helm-org-agenda-files-headings
|
||||
helm-org-capture-templates)
|
||||
:config
|
||||
(progn ; helm settings
|
||||
(defvar helm-global-prompt ">>> ")
|
||||
(setq helm-quick-update t
|
||||
helm-idle-delay 0.01
|
||||
helm-input-idle-delay 0.01
|
||||
helm-reuse-last-window-split-state t
|
||||
helm-buffers-fuzzy-matching nil
|
||||
helm-candidate-number-limit 40
|
||||
helm-bookmark-show-location t)
|
||||
|
||||
(after "winner"
|
||||
;; Tell winner-mode to ignore helm buffers
|
||||
(dolist (bufname '("*helm recentf*"
|
||||
"*helm projectile*"
|
||||
"*helm imenu*"
|
||||
"*helm company*"
|
||||
"*helm buffers*"
|
||||
;; "*helm tags*"
|
||||
"*helm-ag*"
|
||||
"*Helm Swoop*"))
|
||||
(push bufname winner-boring-buffers)))
|
||||
|
||||
(my--cleanup-buffers-add "^\\*[Hh]elm.*\\*$")
|
||||
|
||||
(progn ; helm hacks
|
||||
;; No persistent header
|
||||
(defadvice helm-display-mode-line (after undisplay-header activate)
|
||||
(setq header-line-format nil))
|
||||
|
||||
;; Hide the mode-line in helm (<3 minimalism)
|
||||
(defun helm-display-mode-line (source &optional force)
|
||||
(set (make-local-variable 'helm-mode-line-string)
|
||||
(helm-interpret-value (or (and (listp source) ; Check if source is empty.
|
||||
(assoc-default 'mode-line source))
|
||||
(default-value 'helm-mode-line-string))
|
||||
source))
|
||||
(let ((follow (and (eq (cdr (assq 'follow source)) 1) "(HF) ")))
|
||||
(if helm-mode-line-string
|
||||
(setq mode-line-format nil)
|
||||
(setq mode-line-format (default-value 'mode-line-format)))
|
||||
(let* ((hlstr (helm-interpret-value
|
||||
(and (listp source)
|
||||
(assoc-default 'header-line source))
|
||||
source))
|
||||
(hlend (make-string (max 0 (- (window-width) (length hlstr))) ? )))
|
||||
(setq header-line-format
|
||||
(propertize (concat " " hlstr hlend) 'face 'helm-header))))
|
||||
(when force (force-mode-line-update))))
|
||||
|
||||
(bind helm-map
|
||||
"C-w" 'evil-delete-backward-word
|
||||
"C-u" 'helm-delete-minibuffer-contents
|
||||
"C-r" 'evil-ex-paste-from-register ; Evil registers in helm! Glorious!
|
||||
[escape] 'helm-keyboard-quit)))
|
||||
(defun helm-get-org-candidates-in-file (filename min-depth max-depth
|
||||
&optional fontify nofname)
|
||||
(with-current-buffer (pcase filename
|
||||
((pred bufferp) filename)
|
||||
((pred stringp) (find-file-noselect filename)))
|
||||
(and fontify (jit-lock-fontify-now))
|
||||
(let ((match-fn (if fontify 'match-string 'match-string-no-properties)))
|
||||
(save-excursion
|
||||
(goto-char (point-min))
|
||||
(cl-loop with width = (window-width)
|
||||
while (re-search-forward org-complex-heading-regexp nil t)
|
||||
if (let ((num-stars (length (match-string-no-properties 1))))
|
||||
(and (>= num-stars min-depth) (<= num-stars max-depth)))
|
||||
collect `(,(let ((heading (funcall match-fn 4))
|
||||
(file (unless nofname
|
||||
(concat (f-no-ext (f-relative filename org-directory)) ":")))
|
||||
(level (length (match-string-no-properties 1))))
|
||||
(org-format-outline-path
|
||||
(append (org-get-outline-path t level heading)
|
||||
(list heading)) width file))
|
||||
. ,(point-marker))))))))
|
||||
|
||||
(use-package helm-files
|
||||
:commands (helm-recentf)
|
||||
:commands helm-recentf
|
||||
:config
|
||||
(progn
|
||||
;; Reconfigured `helm-recentf' to use `helm', instead of `helm-other-buffer'
|
||||
@@ -132,75 +151,26 @@
|
||||
:buffer "*helm recentf*"
|
||||
:prompt helm-global-prompt)))))
|
||||
|
||||
(use-package helm-ag
|
||||
:commands (helm-ag
|
||||
my:helm-ag-search
|
||||
my:helm-ag-regex-search
|
||||
my:helm-ag-search-cwd
|
||||
my:helm-ag-regex-search-cwd)
|
||||
:config
|
||||
(progn
|
||||
;; Ex-mode interface for `helm-ag'. If `bang', then `search' is interpreted as
|
||||
;; regexp.
|
||||
(evil-define-operator my:helm-ag-search (beg end &optional search hidden-files-p pwd-p regex-p)
|
||||
:type inclusive
|
||||
:repeat nil
|
||||
(interactive "<r><a><!>")
|
||||
(let* ((helm-ag-default-directory (if pwd-p default-directory (project-root)))
|
||||
(helm-ag-command-option (concat (unless regex-p "-Q ") (if hidden-files-p "--hidden ")))
|
||||
(input "")
|
||||
(header-name (format "Search in %s" helm-ag-default-directory)))
|
||||
(if search
|
||||
(progn
|
||||
(helm-attrset 'search-this-file nil helm-ag-source)
|
||||
(setq helm-ag--last-query search))
|
||||
(if (and beg end (/= beg (1- end)))
|
||||
(setq input (buffer-substring-no-properties beg end))))
|
||||
(helm-attrset 'name header-name helm-ag-source)
|
||||
(helm :sources (if search (helm-ag--select-source) '(helm-source-do-ag))
|
||||
:buffer "*helm-ag*"
|
||||
:input input
|
||||
:prompt helm-global-prompt)))
|
||||
|
||||
(evil-define-operator my:helm-ag-regex-search (beg end &optional search bang)
|
||||
:type inclusive :repeat nil
|
||||
(interactive "<r><a><!>")
|
||||
(my:helm-ag-search beg end search bang nil t))
|
||||
(evil-define-operator my:helm-ag-search-cwd (beg end &optional search bang)
|
||||
;; Ex-mode interface for `helm-do-ag'. If `bang', then `search' is interpreted
|
||||
;; as regexp
|
||||
:type inclusive :repeat nil
|
||||
(interactive "<r><a><!>")
|
||||
(my:helm-ag-search beg end search bang t nil))
|
||||
(evil-define-operator my:helm-ag-regex-search-cwd (beg end &optional search bang)
|
||||
:type inclusive :repeat nil
|
||||
(interactive "<r><a><!>")
|
||||
(my:helm-ag-search beg end search bang t t))))
|
||||
|
||||
(use-package helm-company :defer t)
|
||||
|
||||
(use-package helm-css-scss ; https://github.com/ShingoFukuyama/helm-css-scss
|
||||
:commands (helm-css-scss
|
||||
helm-css-scss-multi
|
||||
helm-css-scss-insert-close-comment))
|
||||
:commands (helm-css-scss
|
||||
helm-css-scss-multi
|
||||
helm-css-scss-insert-close-comment))
|
||||
|
||||
(use-package helm-swoop ; https://github.com/ShingoFukuyama/helm-swoop
|
||||
:commands (helm-swoop helm-multi-swoop my:helm-swoop)
|
||||
:defines (helm-swoop-last-prefix-number)
|
||||
:commands (helm-swoop helm-multi-swoop helm-multi-swoop-all)
|
||||
:config
|
||||
(progn
|
||||
(setq helm-swoop-use-line-number-face t
|
||||
helm-swoop-split-with-multiple-windows t
|
||||
helm-swoop-speed-or-color t)
|
||||
(setq helm-swoop-use-line-number-face t
|
||||
helm-swoop-split-with-multiple-windows t
|
||||
helm-swoop-speed-or-color t))
|
||||
|
||||
(use-package helm-c-yasnippet :commands helm-yas-visit-snippet-file)
|
||||
(use-package helm-buffers :commands helm-buffers-list)
|
||||
(use-package helm-semantic :commands helm-semantic-or-imenu)
|
||||
(use-package helm-elisp :commands helm-apropos)
|
||||
(use-package helm-command :commands helm-M-x)
|
||||
(use-package helm-company :defer t)
|
||||
|
||||
;; Ex-mode interface for `helm-swoop', `helm-multi-swoop-all' (if `bang'), or
|
||||
;; `helm-css-scss' and `helm-css-scss-multi' (if `bang') if major-mode is
|
||||
;; `scss-mode'
|
||||
(evil-define-command my:helm-swoop (&optional search bang)
|
||||
:repeat nil
|
||||
(interactive "<a><!>")
|
||||
(if (eq major-mode 'scss-mode)
|
||||
(if bang (helm-css-scss-multi search) (helm-css-scss search))
|
||||
(if bang (helm-multi-swoop-all search) (helm-swoop :$query search))))))
|
||||
|
||||
(provide 'init-helm)
|
||||
;;; init-helm.el ends here
|
||||
|
112
init/init-ido.el
112
init/init-ido.el
@@ -1,67 +1,61 @@
|
||||
;; ido remaps its keys every time it's invoked, this screws with
|
||||
;; custom mappings. So we've gotta neuter ido.
|
||||
;; (defun ido-init-completion-maps ())
|
||||
;; (setq ido-common-completion-map (make-sparse-keymap)
|
||||
;; ido-file-dir-completion-map (make-sparse-keymap)
|
||||
;; ido-file-completion-map (make-sparse-keymap)
|
||||
;; ido-buffer-completion-map (make-sparse-keymap))
|
||||
(use-package ido
|
||||
:defines (flx-ido-mode ido-ubiquitous-debug-mode ido-context-switch-command ido-temp-list)
|
||||
:functions (ido-to-end)
|
||||
:commands (ido-mode
|
||||
ido-everywhere
|
||||
ido-vertical-mode
|
||||
flx-ido-mode
|
||||
ido-ubiquitous-mode
|
||||
ido-find-file
|
||||
ido-find-file-in-dir)
|
||||
:config
|
||||
(progn
|
||||
(ido-mode 1)
|
||||
(ido-everywhere 1)
|
||||
|
||||
;; (set-keymap-parent ido-common-completion-map minibuffer-local-map)
|
||||
;; (set-keymap-parent ido-file-dir-completion-map ido-common-completion-map)
|
||||
;; (set-keymap-parent ido-file-completion-map ido-file-dir-completion-map)
|
||||
;; (set-keymap-parent ido-buffer-completion-map ido-common-completion-map)
|
||||
(use-package ido-vertical-mode :config (ido-vertical-mode 1))
|
||||
(use-package flx-ido :config (flx-ido-mode 1))
|
||||
(use-package ido-ubiquitous :config (ido-ubiquitous-mode 1))
|
||||
|
||||
(setq ido-use-faces nil
|
||||
ido-confirm-unique-completion t
|
||||
ido-case-fold t
|
||||
ido-enable-tramp-completion nil
|
||||
ido-enable-flex-matching t
|
||||
ido-create-new-buffer 'always
|
||||
ido-enable-tramp-completion t
|
||||
ido-enable-last-directory-history t
|
||||
ido-save-directory-list-file (concat TMP-DIR "ido.last"))
|
||||
|
||||
(ido-mode 1)
|
||||
(ido-everywhere 1)
|
||||
(add-to-list 'ido-ignore-files "\\`.DS_Store$")
|
||||
(add-to-list 'ido-ignore-files "Icon\\?$")
|
||||
(setq ido-ignore-buffers
|
||||
'("\\` " "^\\*ESS\\*" "^\\*Messages\\*" "^\\*Help\\*" "^\\*Buffer"
|
||||
"^\\*.*Completions\\*$" "^\\*Ediff" "^\\*tramp" "^\\*cvs-"
|
||||
"_region_" " output\\*$" "^TAGS$" "^\*Ido"))
|
||||
|
||||
(use-package ido-vertical-mode :config (ido-vertical-mode 1))
|
||||
(use-package flx-ido :config (flx-ido-mode 1))
|
||||
(use-package ido-ubiquitous :config (ido-ubiquitous-mode 1))
|
||||
; sort ido filelist by mtime instead of alphabetically
|
||||
(add-hook 'ido-make-file-list-hook 'ido-sort-mtime)
|
||||
(add-hook 'ido-make-dir-list-hook 'ido-sort-mtime)
|
||||
(defun ido-sort-mtime ()
|
||||
(setq ido-temp-list
|
||||
(sort ido-temp-list
|
||||
(lambda (a b)
|
||||
(time-less-p
|
||||
(sixth (file-attributes (concat ido-current-directory b)))
|
||||
(sixth (file-attributes (concat ido-current-directory a)))))))
|
||||
(ido-to-end ;; move . files to end (again)
|
||||
(delq nil (mapcar
|
||||
(lambda (x) (and (char-equal (string-to-char x) ?.) x))
|
||||
ido-temp-list))))
|
||||
|
||||
(setq ido-use-faces nil
|
||||
ido-confirm-unique-completion t
|
||||
ido-case-fold t
|
||||
ido-enable-tramp-completion nil
|
||||
ido-enable-flex-matching t
|
||||
ido-create-new-buffer 'always
|
||||
ido-enable-tramp-completion t
|
||||
ido-enable-last-directory-history t
|
||||
ido-save-directory-list-file (concat my-tmp-dir "ido.last"))
|
||||
|
||||
(add-to-list 'ido-ignore-files "\\`.DS_Store$")
|
||||
(add-to-list 'ido-ignore-files "Icon\\?$")
|
||||
(setq ido-ignore-buffers
|
||||
'("\\` " "^\\*ESS\\*" "^\\*Messages\\*" "^\\*Help\\*" "^\\*Buffer"
|
||||
"^\\*.*Completions\\*$" "^\\*Ediff" "^\\*tramp" "^\\*cvs-"
|
||||
"_region_" " output\\*$" "^TAGS$" "^\*Ido"))
|
||||
|
||||
; sort ido filelist by mtime instead of alphabetically
|
||||
(add-hook 'ido-make-file-list-hook 'ido-sort-mtime)
|
||||
(add-hook 'ido-make-dir-list-hook 'ido-sort-mtime)
|
||||
(defun ido-sort-mtime ()
|
||||
(setq ido-temp-list
|
||||
(sort ido-temp-list
|
||||
(lambda (a b)
|
||||
(time-less-p
|
||||
(sixth (file-attributes (concat ido-current-directory b)))
|
||||
(sixth (file-attributes (concat ido-current-directory a)))))))
|
||||
(ido-to-end ;; move . files to end (again)
|
||||
(delq nil (mapcar
|
||||
(lambda (x) (and (char-equal (string-to-char x) ?.) x))
|
||||
ido-temp-list))))
|
||||
|
||||
;; Press ~ to go to $HOME in ido
|
||||
(add-hook 'ido-setup-hook
|
||||
(lambda ()
|
||||
;; Go straight home
|
||||
(define-key ido-file-completion-map
|
||||
(kbd "~")
|
||||
(lambda ()
|
||||
(interactive)
|
||||
(if (looking-back "/")
|
||||
(insert "~/")
|
||||
(call-interactively 'self-insert-command))))))
|
||||
;; Press ~ to go to $HOME in ido
|
||||
(add-hook! 'ido-setup-hook
|
||||
;; Go straight home
|
||||
(define-key ido-file-completion-map (kbd "~")
|
||||
(λ (if (looking-back "/")
|
||||
(insert "~/")
|
||||
(call-interactively 'self-insert-command)))))))
|
||||
|
||||
|
||||
(provide 'init-ido)
|
||||
|
@@ -1,21 +1,22 @@
|
||||
(defun my-java-project-package ()
|
||||
(defun narf/java-project-package ()
|
||||
(if (eq major-mode 'java-mode)
|
||||
(s-chop-suffix "." (s-replace "/" "." (f-dirname (f-relative (buffer-file-name)
|
||||
(concat (project-root) "/src/")))))
|
||||
(concat (narf/project-root) "/src/")))))
|
||||
""))
|
||||
|
||||
(defun my-java-class-name ()
|
||||
(defun narf/java-class-name ()
|
||||
(if (eq major-mode 'java-mode)
|
||||
(f-no-ext (f-base (buffer-file-name)))
|
||||
""))
|
||||
|
||||
(use-package eclim
|
||||
:functions (eclim--project-dir eclim--project-name)
|
||||
:commands (eclim-mode global-eclim-mode)
|
||||
:init
|
||||
(progn
|
||||
(setq eclim-eclipse-dirs '("/Applications/eclipse")
|
||||
eclim-executable "/Applications/eclipse/eclim")
|
||||
(when (f-exists? eclim-executable)
|
||||
eclim-executable "/Applications/eclipse/eclim")
|
||||
(when (file-exists-p eclim-executable)
|
||||
(add-hook 'java-mode-hook 'eclim-mode)))
|
||||
:config
|
||||
(progn
|
||||
@@ -35,21 +36,21 @@
|
||||
(use-package company-emacs-eclim
|
||||
:config (company-emacs-eclim-setup)))
|
||||
|
||||
(bind 'motion java-mode-map "gd" 'eclim-java-find-declaration)))
|
||||
|
||||
(use-package groovy-mode :mode "\\.gradle$")
|
||||
(bind :motion :map java-mode-map "gd" 'eclim-java-find-declaration)))
|
||||
|
||||
(use-package android-mode
|
||||
:defer t
|
||||
:commands android-mode
|
||||
:init
|
||||
(progn
|
||||
;; yasnippet defuns
|
||||
(defun android-mode-is-layout-file ()
|
||||
(and android-mode
|
||||
(eq major-mode 'nxml-mode)
|
||||
(string-equal (file-name-base (directory-file-name default-directory)) "layout")))
|
||||
|
||||
(defun android-mode-in-tags (&rest tags)
|
||||
(-contains? tags (android-mode-tag-name)))
|
||||
|
||||
(defun android-mode-tag-name ()
|
||||
(save-excursion
|
||||
(let (beg end)
|
||||
@@ -60,18 +61,23 @@
|
||||
(setq end (1+ (point)))
|
||||
(buffer-substring-no-properties beg end))))
|
||||
|
||||
(defun my-android-mode-enable-maybe ()
|
||||
(let ((root (project-root)))
|
||||
(when (or (project-has-files "local.properties" root)
|
||||
(project-has-files "AndroidManifest.xml" root)
|
||||
(project-has-files "src/main/AndroidManifest.xml" root))
|
||||
(defun narf|android-mode-enable-maybe ()
|
||||
(let ((root (narf/project-root)))
|
||||
(when (or (narf/project-has-files "local.properties" root)
|
||||
(narf/project-has-files "AndroidManifest.xml" root)
|
||||
(narf/project-has-files "src/main/AndroidManifest.xml" root))
|
||||
(android-mode +1)
|
||||
(set-build-command "./gradlew %s" "build.gradle"))))
|
||||
(narf/set-build-command "./gradlew %s" "build.gradle"))))
|
||||
|
||||
(after "company" (add-to-list 'company-dictionary-major-minor-modes 'android-mode))
|
||||
(add-hook 'java-mode-hook 'my-android-mode-enable-maybe)
|
||||
(add-hook 'groovy-mode-hook 'my-android-mode-enable-maybe)
|
||||
(add-hook 'nxml-mode-hook 'my-android-mode-enable-maybe)
|
||||
(add-hook! 'android-mode-hook (my--init-yas-mode 'android-mode))))
|
||||
(add-hook 'java-mode-hook 'narf|android-mode-enable-maybe)
|
||||
(add-hook 'groovy-mode-hook 'narf|android-mode-enable-maybe)
|
||||
(add-hook 'nxml-mode-hook 'narf|android-mode-enable-maybe)
|
||||
(add-hook! 'android-mode-hook (narf/init-yas-mode 'android-mode))))
|
||||
|
||||
(use-package groovy-mode
|
||||
:functions (is-groovy-mode)
|
||||
:mode "\\.gradle$")
|
||||
|
||||
|
||||
(provide 'init-java)
|
||||
|
@@ -14,29 +14,24 @@
|
||||
|
||||
(after "web-beautify"
|
||||
(add-hook! 'js2-mode-hook (setenv "jsbeautify_indent_size" "4"))
|
||||
(bind 'motion js2-mode-map "gQ" 'web-beautify-js))
|
||||
(bind :motion :map js2-mode-map "gQ" 'web-beautify-js))
|
||||
|
||||
(after "emr" (use-package js2-refactor))
|
||||
|
||||
(rename-mode-name js2-mode "Javascript2")
|
||||
;; [pedantry intensifies]
|
||||
(defadvice js2-mode (after js2-mode-rename-modeline activate)
|
||||
(setq mode-name "Javascript2"))
|
||||
|
||||
(use-package tern
|
||||
:diminish (tern-mode . "tern")
|
||||
:commands tern-mode
|
||||
:init (add-hook 'js2-mode-hook 'tern-mode)
|
||||
:init
|
||||
(add-hook 'js2-mode-hook 'tern-mode)
|
||||
:config
|
||||
(after "company"
|
||||
(use-package company-tern
|
||||
:config
|
||||
(company--backend-on 'js2-mode-hook 'company-tern)
|
||||
;; (setq company-tern-meta-as-single-line t)
|
||||
;; (setq company-tern-property-marker "")
|
||||
;; (setq company-tooltip-align-annotations t)
|
||||
)))))
|
||||
|
||||
(use-package json-mode
|
||||
:mode (("\\.json$" . json-mode)
|
||||
("\\.jshintrc$" . json-mode)))
|
||||
(narf/add-company-backend js2-mode (company-tern)))))))
|
||||
|
||||
;; For UnityScript
|
||||
(use-package unityjs-mode
|
||||
@@ -45,14 +40,18 @@
|
||||
(progn
|
||||
(add-hook 'unityjs-mode-hook 'flycheck-mode)
|
||||
(add-hook! 'unityjs-mode-hook
|
||||
(enable-tab-width-2)
|
||||
(narf|enable-tab-width-2)
|
||||
(setq js-indent-level 2))))
|
||||
|
||||
;; For launchbar script development
|
||||
(define-minor-mode lb6-mode
|
||||
:lighter " lb6"
|
||||
:keymap (make-sparse-keymap)
|
||||
(my--init-yas-mode 'lb6-mode))
|
||||
"Launchbar development mode."
|
||||
:init-value nil
|
||||
:lighter "lb6"
|
||||
:keymap (make-sparse-keymap)
|
||||
(narf/init-yas-mode 'lb6-mode))
|
||||
(associate-minor-mode "\\.lb\\(action\\|ext\\)/.*$" 'lb6-mode)
|
||||
|
||||
|
||||
(provide 'init-js)
|
||||
;;; init-js.el ends here
|
||||
|
19
init/init-lisp.el
Normal file
19
init/init-lisp.el
Normal file
@@ -0,0 +1,19 @@
|
||||
|
||||
;; TODO: Do this later
|
||||
|
||||
(add-hook! 'hs-minor-mode-hook (when hs-minor-mode (hs-hide-level 3)))
|
||||
|
||||
;; [pedantry intensifies]
|
||||
(defadvice emacs-lisp-mode (after emacs-lisp-mode-rename-modeline activate)
|
||||
(setq mode-name "Elisp"))
|
||||
|
||||
;; Real go-to-definition for elisp
|
||||
(bind :motion :map emacs-lisp-mode-map
|
||||
"gd" (λ (let ((func (function-called-at-point)))
|
||||
(if func (find-function func))))
|
||||
"gD" (λ (let ((func (function-called-at-point)))
|
||||
(if func (find-function-other-window func)))))
|
||||
|
||||
|
||||
(provide 'init-lisp)
|
||||
;;; init-lisp.el ends here
|
@@ -3,21 +3,25 @@
|
||||
:interpreter "lua"
|
||||
:init
|
||||
(progn
|
||||
(define-minor-mode love-mode
|
||||
"Buffer local minor mode for Love2D"
|
||||
:init-value nil
|
||||
:lighter " <3"
|
||||
:keymap (make-sparse-keymap)
|
||||
(my--init-yas-mode 'love-mode))
|
||||
(add-hook! 'lua-mode-hook
|
||||
(setq lua-indent-level tab-width)
|
||||
(set-build-command "open -a love.app '%s'" "main.lua")
|
||||
(when (project-has-files "main.lua")
|
||||
(love-mode +1)))
|
||||
(setq lua-indent-level tab-width)
|
||||
|
||||
(when (file-exists-p "/Applications/love.app")
|
||||
(define-minor-mode love-mode
|
||||
"Buffer local minor mode for Love2D"
|
||||
:init-value nil
|
||||
:lighter " <3"
|
||||
:keymap (make-sparse-keymap)
|
||||
(narf/init-yas-mode 'love-mode))
|
||||
(add-hook! 'lua-mode-hook
|
||||
(narf/set-build-command "open -a love.app '%s'" "main.lua")
|
||||
(when (narf/project-has-files "main.lua")
|
||||
(love-mode +1))))
|
||||
|
||||
(after "company" (add-to-list 'company-dictionary-major-minor-modes 'love-mode))
|
||||
|
||||
(add-hook 'lua-mode-hook 'enable-tab-width-2)))
|
||||
(add-hook! 'lua-mode-hook
|
||||
(narf|enable-tab-width-2)
|
||||
(setq lua-indent-level 2))))
|
||||
|
||||
|
||||
(provide 'init-lua)
|
||||
|
185
init/init-org.el
185
init/init-org.el
@@ -1,16 +1,23 @@
|
||||
(use-package org
|
||||
:defines (org-directory)
|
||||
:functions (org-bookmark-jump-unhide outline-next-heading org-end-of-subtree
|
||||
outline-flag-region org-remove-inline-images org-display-inline-images
|
||||
org-at-item-checkbox-p org-toggle-checkbox org-entry-is-todo-p org-todo
|
||||
org-format-outline-path org-get-outline-path)
|
||||
:commands (org-capture
|
||||
org-capture-string
|
||||
my:org-capture)
|
||||
:mode (("\\.org$" . org-mode)
|
||||
org-capture-string)
|
||||
:mode (("\\.org$" . org-mode)
|
||||
("\\.opml$" . org-mode))
|
||||
:init
|
||||
(progn
|
||||
(add-hook 'org-mode-hook 'enable-tab-width-2)
|
||||
(add-hook 'org-mode-hook 'turn-on-auto-fill)
|
||||
(add-hook 'org-mode-hook 'iimage-mode)
|
||||
(add-hook 'org-mode-hook 'org-indent-mode)
|
||||
(add-hook 'org-mode-hook 'evil-org-mode)
|
||||
(define-minor-mode evil-org-mode
|
||||
"Evil-mode bindings for org-mode."
|
||||
:init-value nil
|
||||
:lighter "!"
|
||||
:keymap (make-sparse-keymap) ; defines evil-org-mode-map
|
||||
:group 'evil-org)
|
||||
|
||||
(add-to-hook 'org-mode-hook '(narf|enable-tab-width-2 'narf|enable-hard-wrap 'iimage-mode 'org-indent-mode 'evil-org-mode))
|
||||
(add-hook! 'org-mode-hook (hl-line-mode -1)))
|
||||
:config
|
||||
(progn
|
||||
@@ -20,8 +27,8 @@
|
||||
(setq org-directory "~/Dropbox/notes")
|
||||
(setq org-project-directory (expand-file-name "projects" org-directory) ; custom variable
|
||||
org-default-notes-file (expand-file-name "notes.org" org-directory)
|
||||
org-agenda-files (append (list org-directory)
|
||||
(f-entries org-project-directory (lambda (path) (f-ext? path "org")) t))
|
||||
org-agenda-files (f-entries org-directory (lambda (path) (and (f-ext? path "org")
|
||||
(not (f-same? path (f-expand "inbox.org" org-directory))))) t)
|
||||
org-archive-location (concat org-directory "/archive/%s::")
|
||||
org-confirm-babel-evaluate nil
|
||||
org-src-tab-acts-natively t
|
||||
@@ -58,16 +65,11 @@
|
||||
("@writing" . ?w)
|
||||
("@projects" . ?r)))
|
||||
|
||||
(defun project-org-filename (cat)
|
||||
(interactive (list (completing-read "Choose category:"
|
||||
(mapcar 'f-filename (f-directories org-project-directory)))))
|
||||
(expand-file-name (concat (f-filename (project-root)) ".org")
|
||||
(expand-file-name cat org-project-directory)))
|
||||
(setq org-capture-templates
|
||||
'(("t" "TODO" entry (file+headline "~/Dropbox/notes/todo.org" "Inbox") "* TODO %? %u\n%i")
|
||||
("T" "Project TODO" entry (file+headline (project-org-filename) "Tasks") "** TODO %?\n%i" :prepend t)
|
||||
("N" "Project Note" entry (file+headline (project-org-filename) "Notes") "** %u %?\n%i")
|
||||
("c" "Changelog" entry (file+datetree (project-org-filename)) "** %<%H:%M>: %? :unsorted:\n%i" :prepend t)
|
||||
("T" "Project TODO" entry (file+headline (narf/project-org-filename) "Tasks") "** TODO %?\n%i" :prepend t)
|
||||
("N" "Project Note" entry (file+headline (narf/project-org-filename) "Notes") "** %u %?\n%i")
|
||||
("c" "Changelog" entry (file+datetree (narf/project-org-filename)) "** %<%H:%M>: %? :unsorted:\n%i" :prepend t)
|
||||
("n" "Note" entry (file+datetree org-default-notes-file) "** %<%H:%M>: %?\n%i" :prepend t)
|
||||
("j" "Journal" entry (file+datetree "~/Dropbox/notes/journal.org") "** %?%^g\nAdded: %U\n%i")
|
||||
("a" "Trivia" entry (file "~/Dropbox/notes/trivia.org") "* %u %?\n%i" :prepend t)
|
||||
@@ -88,14 +90,7 @@
|
||||
(latex . t)))
|
||||
|
||||
;; Remove occur highlights on ESC in normal mode
|
||||
(defadvice evil-force-normal-state (before evil-esc-org-remove-highlights activate)
|
||||
(org-remove-occur-highlights))
|
||||
|
||||
(define-minor-mode evil-org-mode
|
||||
:init-value nil
|
||||
:lighter " !"
|
||||
:keymap (make-sparse-keymap) ; defines evil-org-mode-map
|
||||
:group 'evil-org)
|
||||
(advice-add 'evil-force-normal-state :before 'org-remove-occur-highlights)
|
||||
|
||||
;; (progn ; opml support
|
||||
;; (defun set-buffer-file-format-to-opml ()
|
||||
@@ -118,49 +113,6 @@
|
||||
;; (shut-up (load-library "ox-opml")))
|
||||
|
||||
(progn ; key bindings
|
||||
(defun my--org-in-list-p ()
|
||||
(and (save-excursion (search-backward-regexp "^ *\\([0-9]+[\.)]\\|[-*+]\\) " (line-beginning-position) t))
|
||||
(org-in-item-p)))
|
||||
(defun my--org-insert-item-after ()
|
||||
"Inserts a new heading or item, depending on the context."
|
||||
(interactive)
|
||||
(org-end-of-line)
|
||||
(cond ((org-at-item-checkbox-p)
|
||||
(org-insert-heading)
|
||||
(insert "[ ] "))
|
||||
((my--org-in-list-p)
|
||||
(org-insert-heading))
|
||||
((org-on-heading-p)
|
||||
(org-insert-heading-after-current))
|
||||
(t
|
||||
(org-insert-heading-after-current)
|
||||
(delete-char 1)))
|
||||
(evil-insert-state))
|
||||
|
||||
;; TODO Check if this and -forward can be combined
|
||||
(defun my--org-insert-item-before ()
|
||||
"Inserts a new heading or item, depending on the context."
|
||||
(interactive)
|
||||
(evil-first-non-blank)
|
||||
(cond ((org-at-item-checkbox-p)
|
||||
(org-insert-heading)
|
||||
(insert "[ ] "))
|
||||
((my--org-in-list-p)
|
||||
(org-insert-heading))
|
||||
(t (org-insert-heading)))
|
||||
(evil-insert-state))
|
||||
|
||||
(defun my--toggle-checkbox ()
|
||||
(interactive)
|
||||
(save-excursion
|
||||
(org-end-of-line)
|
||||
(cond ((org-in-item-p)
|
||||
(if (search-backward-regexp "\\[[ +-]\\]" (line-beginning-position) t)
|
||||
(delete-char 4)
|
||||
(org-beginning-of-line)))
|
||||
(t (org-insert-heading)))
|
||||
(insert "[ ] ")))
|
||||
|
||||
;; Hide properties PERMANENTLY
|
||||
(defun org-cycle-hide-drawers (state)
|
||||
"Re-hide all drawers after a visibility state change."
|
||||
@@ -197,14 +149,14 @@
|
||||
("tg" tags-todo "+gamedev")
|
||||
("tw" tags-tree "+webdev"))))
|
||||
|
||||
(bind 'insert org-mode-map [remap my.inflate-space-maybe] 'self-insert-command)
|
||||
|
||||
(bind org-mode-map
|
||||
(bind :map org-mode-map
|
||||
"RET" nil
|
||||
"C-j" nil
|
||||
"C-k" nil)
|
||||
"C-k" nil
|
||||
|
||||
(bind '(normal insert) evil-org-mode-map
|
||||
:insert [remap narf:inflate-space-maybe] 'self-insert-command
|
||||
|
||||
:normal :insert :map evil-org-mode-map
|
||||
"A-l" 'org-metaright ; M-j
|
||||
"A-h" 'org-metaleft ; M-h
|
||||
"A-k" 'org-metaup ; M-k
|
||||
@@ -212,45 +164,37 @@
|
||||
"A-l" 'org-shiftmetaright ; M-L
|
||||
"A-h" 'org-shiftmetaleft ; M-H
|
||||
"A-k" 'org-shiftmetaup ; M-K
|
||||
"A-j" 'org-shiftmetadown) ; M-J
|
||||
"A-j" 'org-shiftmetadown ; M-J
|
||||
|
||||
(bind 'insert evil-org-mode-map
|
||||
"C-e" 'org-end-of-line
|
||||
"C-a" 'org-beginning-of-line)
|
||||
(bind '(insert normal) evil-org-mode-map
|
||||
"<M-left>" 'org-beginning-of-line
|
||||
"<M-right>" 'org-end-of-line
|
||||
"<M-up>" 'org-up-element
|
||||
"<M-down>" 'org-down-element)
|
||||
"<M-down>" 'org-down-element
|
||||
|
||||
;; Formatting shortcuts
|
||||
(defun my/org-surround (delim)
|
||||
(insert delim) (save-excursion (insert delim)))
|
||||
|
||||
(bind evil-org-mode-map
|
||||
",;" 'helm-org-in-buffer-headings
|
||||
"M-a" 'mark-whole-buffer
|
||||
", l" 'org-insert-link
|
||||
|
||||
'insert
|
||||
:insert
|
||||
"C-e" 'org-end-of-line
|
||||
"C-a" 'org-beginning-of-line
|
||||
;; Add new header line before this line
|
||||
"<S-M-return>" 'my--org-insert-item-before
|
||||
"<S-M-return>" 'narf/org-insert-item-before
|
||||
;; Add new header line after this line
|
||||
"<M-return>" 'my--org-insert-item-after
|
||||
"<M-return>" 'narf/org-insert-item-after
|
||||
|
||||
"M-b" (λ (my/org-surround "*")) ; bold
|
||||
"M-u" (λ (my/org-surround "_")) ; underline
|
||||
"M-i" (λ (my/org-surround "/")) ; italics
|
||||
"M-`" (λ (my/org-surround "+")) ; strikethrough
|
||||
"M-b" (λ (narf/org-surround "*")) ; bold
|
||||
"M-u" (λ (narf/org-surround "_")) ; underline
|
||||
"M-i" (λ (narf/org-surround "/")) ; italics
|
||||
"M-`" (λ (narf/org-surround "+")) ; strikethrough
|
||||
|
||||
'visual
|
||||
:visual
|
||||
"M-b" "S*"
|
||||
"M-u" "S_"
|
||||
"M-i" "S/"
|
||||
"M-`" "S+"
|
||||
|
||||
'(normal visual)
|
||||
", l" 'org-insert-link
|
||||
|
||||
'normal
|
||||
:normal
|
||||
",=" 'org-align-all-tags
|
||||
",/" 'org-sparse-tree
|
||||
",?" 'org-tags-view
|
||||
@@ -283,10 +227,10 @@
|
||||
"<" 'org-metaleft
|
||||
">" 'org-metaright
|
||||
"-" 'org-cycle-list-bullet
|
||||
",SPC" 'my--toggle-checkbox
|
||||
",SPC" 'narf/org-toggle-checkbox
|
||||
",<return>" 'org-archive-subtree
|
||||
"<S-M-return>" 'my--org-insert-item-before
|
||||
"<M-return>" 'my--org-insert-item-after
|
||||
"<S-M-return>" 'narf/org-insert-item-before
|
||||
"<M-return>" 'narf/org-insert-item-after
|
||||
"RET" (λ (cond ((org-at-item-checkbox-p)
|
||||
(org-toggle-checkbox))
|
||||
((org-entry-is-todo-p)
|
||||
@@ -294,49 +238,12 @@
|
||||
[tab] 'org-cycle)
|
||||
|
||||
(after "org-agenda"
|
||||
(bind 'emacs org-agenda-mode-map
|
||||
(bind :emacs :map org-agenda-mode-map
|
||||
"<escape>" 'org-agenda-Quit
|
||||
"C-j" 'org-agenda-next-item
|
||||
"C-k" 'org-agenda-previous-item
|
||||
"C-n" 'org-agenda-next-item
|
||||
"C-p" 'org-agenda-previous-item)))
|
||||
|
||||
(evil-define-operator my:org-capture (&optional beg end)
|
||||
"Send a selection to org-capture."
|
||||
:move-point nil
|
||||
:type inclusive
|
||||
(interactive "<r><!>")
|
||||
(let ((text (when (and (evil-visual-state-p) beg end)
|
||||
(buffer-substring beg end))))
|
||||
(if text
|
||||
(org-capture-string text)
|
||||
(org-capture))))
|
||||
|
||||
(evil-define-command my:org-insert-image-url (&optional image-url)
|
||||
:repeat nil
|
||||
(interactive "<f><!>")
|
||||
(unless image-url
|
||||
(user-error "You must specify an image URL to insert"))
|
||||
(let ((dest (f-join org-directory "images/" (concat (format-time-string "%Y%m%d-") (f-filename filename)))))
|
||||
(shell-command (format "wget '%s' -O '%s'" image-url dest))
|
||||
(insert (format "<%s>" (f-relative dest (f-dirname (buffer-file-name)))))
|
||||
(indent-according-to-mode)))
|
||||
|
||||
(evil-define-command my:org-insert-image (&optional filename bang)
|
||||
:repeat nil
|
||||
(interactive "<f><!>")
|
||||
(if bang
|
||||
(my:org-insert-image-url filename)
|
||||
(unless filename
|
||||
(user-error "You must specify a file to attach"))
|
||||
(unless (file-exists-p filename)
|
||||
(user-error "File %s does not exist" filename))
|
||||
(let ((dest (f-join org-directory "images/" (concat (format-time-string "%Y%m%d-") (f-filename filename)))))
|
||||
(when (f-exists? dest)
|
||||
(user-error "File %s already exists at destination!"))
|
||||
(copy-file filename dest)
|
||||
(insert (format "<file:%s>" (f-relative dest (f-dirname (buffer-file-name)))))
|
||||
(indent-according-to-mode))))))
|
||||
"C-p" 'org-agenda-previous-item)))))
|
||||
|
||||
|
||||
(provide 'init-org)
|
||||
|
@@ -6,7 +6,8 @@
|
||||
(add-hook 'php-mode-hook 'turn-on-eldoc-mode)
|
||||
|
||||
(use-package php-extras
|
||||
:config (company--backend-on 'php-mode-hook 'php-extras-company))
|
||||
:config
|
||||
(narf/add-company-backend php-mode (php-extras-company)))
|
||||
|
||||
;; TODO Tie into emr
|
||||
(use-package php-refactor-mode
|
||||
|
@@ -1,21 +1,33 @@
|
||||
;; Project nav+search tools (projectile, helm, ag)
|
||||
(use-package neotree
|
||||
:commands (neotree-show neotree-hide neotree-toggle neo-global--window-exists-p neotree-dir neotree-find)
|
||||
:functions (neo-buffer--unlock-width neo-buffer--lock-width
|
||||
projectile-current-project-dirs projectile-file-cached-p
|
||||
projectile-purge-file-from-cache neo-buffer--insert-with-face
|
||||
neo-global--get-buffer)
|
||||
:commands (neotree-show
|
||||
neotree-hide
|
||||
neotree-toggle
|
||||
neo-global--window-exists-p
|
||||
neotree-dir
|
||||
neotree-find)
|
||||
:init
|
||||
(progn
|
||||
(defun my-neotree-open (&optional dir)
|
||||
(defun narf:neotree-open (&optional dir)
|
||||
(interactive)
|
||||
(neotree-dir (or dir (project-root))))
|
||||
(defun my-neotree-toggle ()
|
||||
(neotree-dir (or dir (narf/project-root))))
|
||||
|
||||
(defun narf:neotree-toggle ()
|
||||
(interactive)
|
||||
(if (neo-global--window-exists-p)
|
||||
(neotree-hide)
|
||||
(my-neotree-open)))
|
||||
(defun my-neotree-find ()
|
||||
(narf:neotree-open)))
|
||||
|
||||
(defun narf:neotree-find ()
|
||||
(interactive)
|
||||
(save-excursion (my-neotree-open))
|
||||
(save-excursion (narf:neotree-open))
|
||||
(neotree-find))
|
||||
(add-hook 'neotree-mode-hook 'my-neotree-keymap))
|
||||
|
||||
(add-hook 'neotree-mode-hook 'narf|init-neotree-keymap))
|
||||
:config
|
||||
(progn
|
||||
(setq neo-create-file-auto-open t
|
||||
@@ -31,14 +43,15 @@
|
||||
;; frame.
|
||||
neo-modern-sidebar t)
|
||||
|
||||
;; Custom ascii theme
|
||||
(defun neo-buffer--insert-fold-symbol (name)
|
||||
;; Redefinition for custom ascii theme
|
||||
(defun narf/neo-buffer-fold-symbol (name)
|
||||
(let ((n-insert-symbol (lambda (n)
|
||||
(neo-buffer--insert-with-face
|
||||
n 'neo-expand-btn-face))))
|
||||
(or (and (equal name 'open) (funcall n-insert-symbol "- "))
|
||||
(and (equal name 'close) (funcall n-insert-symbol "> "))
|
||||
(and (equal name 'leaf) (funcall n-insert-symbol " ")))))
|
||||
(advice-add 'neo-buffer--insert-fold-symbol :override 'narf/neo-buffer-fold-symbol)
|
||||
|
||||
;; Close neotree on window changes, to prevent ensuing mindbuggery
|
||||
(add-hook! 'window-configuration-change-hook
|
||||
@@ -49,8 +62,8 @@
|
||||
(after "projectile"
|
||||
(setq projectile-switch-project-action 'neotree-projectile-action))
|
||||
(add-to-list 'evil-motion-state-modes 'neotree-mode)
|
||||
(defun my-neotree-keymap ()
|
||||
(bind evil-motion-state-local-map
|
||||
(defun narf|init-neotree-keymap ()
|
||||
(bind :map evil-motion-state-local-map
|
||||
"ESC" 'neotree-hide
|
||||
"\\\\" 'neotree-hide
|
||||
"RET" 'neotree-enter
|
||||
|
@@ -1,30 +1,25 @@
|
||||
(use-package python
|
||||
:mode ("\\.py\\'" . python-mode)
|
||||
:interpreter ("python" . python-mode)
|
||||
:mode ("\\.py\\'" . python-mode)
|
||||
:interpreter ("python" . python-mode)
|
||||
:commands (python-mode)
|
||||
:init
|
||||
(progn
|
||||
(add-hook 'python-mode-hook 'enable-tab-width-4)
|
||||
(add-hook 'python-mode-hook 'emr-initialize))
|
||||
(add-to-hook 'python-mode-hook '(narf|enable-tab-width-4 emr-initialize))
|
||||
:config
|
||||
(progn
|
||||
(setq-default python-indent-offset 4)
|
||||
(setq python-environment-directory my-tmp-dir)
|
||||
(setq python-environment-directory TMP-DIR)
|
||||
(setq python-shell-interpreter "ipython")
|
||||
;; interferes with smartparens
|
||||
(define-key python-mode-map (kbd "DEL") nil)
|
||||
|
||||
(use-package anaconda-mode
|
||||
:init
|
||||
(progn
|
||||
(add-hook 'python-mode-hook 'anaconda-mode)
|
||||
(add-hook 'python-mode-hook 'eldoc-mode)
|
||||
;; (add-hook! 'anaconda-mode-hook
|
||||
;; (process-buffer (python-shell-get-or-create-process python-shell-interpreter t nil)))
|
||||
)
|
||||
:defines (anaconda-mode-map anaconda-nav-mode-map)
|
||||
:functions (anaconda-mode-running-p)
|
||||
:init (add-to-hook 'python-mode-hook '(anaconda-mode eldoc-mode))
|
||||
:config
|
||||
(progn
|
||||
(bind 'motion anaconda-mode-map "gd" 'anaconda-mode-goto-definitions)
|
||||
(bind 'normal anaconda-nav-mode-map [escape] 'anaconda-nav-quit)
|
||||
(bind :motion :map anaconda-mode-map "gd" 'anaconda-mode-goto-definitions)
|
||||
(bind :normal :map anaconda-nav-mode-map [escape] 'anaconda-nav-quit)
|
||||
|
||||
;; Delete the window on escape or C-g
|
||||
(defadvice anaconda-mode-doc-buffer (after anaconda-doc-buffer-escape-to-close activate)
|
||||
@@ -62,24 +57,23 @@
|
||||
|
||||
(after "company"
|
||||
(use-package company-anaconda
|
||||
:config (company--backend-on 'python-mode-hook 'company-anaconda)))))
|
||||
:config
|
||||
(narf/add-company-backend python-mode (company-anaconda))))))
|
||||
|
||||
(use-package nose
|
||||
:commands nose-mode
|
||||
:init
|
||||
(progn
|
||||
;; Reset nose keymap, we'll set new ones in my-keymaps.el
|
||||
(defvar nose-mode-map (make-sparse-keymap))
|
||||
(associate-minor-mode "/test_.+\\.py\\'" 'nose-mode))
|
||||
:preface (defvar nose-mode-map (make-sparse-keymap))
|
||||
:init (associate-minor-mode "/test_.+\\.py\\'" 'nose-mode)
|
||||
:config
|
||||
(bind 'normal nose-mode-map
|
||||
",tr" 'nosetests-again
|
||||
",ta" 'nosetests-all
|
||||
",ts" 'nosetests-one
|
||||
",tv" 'nosetests-module
|
||||
",tA" 'nosetests-pdb-all
|
||||
",tO" 'nosetests-pdb-one
|
||||
",tV" 'nosetests-pdb-module))))
|
||||
(bind normal :map nose-mode-map
|
||||
:prefix leader
|
||||
"tr" 'nosetests-again
|
||||
"ta" 'nosetests-all
|
||||
"ts" 'nosetests-one
|
||||
"tv" 'nosetests-module
|
||||
"tA" 'nosetests-pdb-all
|
||||
"tO" 'nosetests-pdb-one
|
||||
"tV" 'nosetests-pdb-module))))
|
||||
|
||||
|
||||
(provide 'init-python)
|
||||
|
10
init/init-r.el
Normal file
10
init/init-r.el
Normal file
@@ -0,0 +1,10 @@
|
||||
(use-package ess-site
|
||||
:config
|
||||
(progn
|
||||
(setq ess-indent-level 4)
|
||||
(setq ess-arg-function-offset 4)
|
||||
(setq ess-else-offset 4)
|
||||
))
|
||||
|
||||
(provide 'init-r)
|
||||
;;; init-r.el ends here
|
@@ -1,29 +1,30 @@
|
||||
(use-package re-builder
|
||||
:defer t
|
||||
:commands (re-builder reb-mode-buffer-p)
|
||||
:config
|
||||
(progn
|
||||
(bind 'normal reb-mode-map
|
||||
(bind :normal :map reb-mode-map
|
||||
"C-g" 'reb-quit
|
||||
[escape] 'reb-quit
|
||||
(kbd "C-g") 'reb-quit
|
||||
[backtab] 'reb-change-syntax)
|
||||
|
||||
(defun my--reb-cleanup ()
|
||||
(defun narf|reb-cleanup ()
|
||||
(replace-regexp "^[ \n]*" "" nil (point-min) (point-max))
|
||||
(text-scale-set 1.5)
|
||||
(goto-char 2))
|
||||
(add-hook 'reb-mode-hook 'my--reb-cleanup)
|
||||
(add-hook 'reb-mode-hook 'narf|reb-cleanup)
|
||||
|
||||
(use-package pcre2el
|
||||
:functions (rxt--re-builder-switch-pcre-mode)
|
||||
:config
|
||||
(progn
|
||||
(bind 'normal rxt-help-mode-map [escape] 'kill-buffer-and-window)
|
||||
(bind :normal :map rxt-help-mode-map [escape] 'kill-buffer-and-window)
|
||||
(setq reb-re-syntax 'pcre)))
|
||||
|
||||
(after "evil"
|
||||
(evil-set-initial-state 'reb-mode 'insert)
|
||||
;; Either a) converts selected (or entered-in) pcre regex into elisp
|
||||
;; regex, OR b) opens up re-builder.
|
||||
(evil-define-operator my:regex (beg end type &optional regexstr bang)
|
||||
(evil-define-operator narf::regex (beg end type &optional regexstr bang)
|
||||
:move-point nil
|
||||
:type inclusive
|
||||
:repeat nil
|
||||
@@ -48,8 +49,7 @@
|
||||
(setq newregex (s-replace "\\" "\\\\" newregex)))
|
||||
(kill-new newregex)
|
||||
(message "Copied regex to kill ring: %s" newregex)))
|
||||
(t
|
||||
(re-builder))))))))
|
||||
(t (re-builder))))))))
|
||||
|
||||
|
||||
(provide 'init-regex)
|
||||
|
@@ -9,16 +9,18 @@
|
||||
("/Vagrantfile$" . enh-ruby-mode)
|
||||
("/Rakefile$" . enh-ruby-mode))
|
||||
:interpreter "ruby"
|
||||
:init
|
||||
(progn
|
||||
(add-hook 'enh-ruby-mode-hook 'narf|enable-tab-width-2)
|
||||
(add-hook! 'enh-ruby-mode-hook (set-build-command "rake %s" "Rakefile")))
|
||||
:config
|
||||
(progn
|
||||
;;; Formatting
|
||||
(setq ruby-indent-level 2)
|
||||
(setq ruby-deep-indent-paren t)
|
||||
(setq enh-ruby-check-syntax nil)
|
||||
(setq ruby-indent-level 2
|
||||
ruby-deep-indent-paren t
|
||||
enh-ruby-check-syntax nil)
|
||||
|
||||
(associate-mode "/\\.rspec$" 'text-mode)
|
||||
(add-hook 'enh-ruby-mode-hook 'enable-tab-width-2)
|
||||
(add-hook! 'enh-ruby-mode-hook (set-build-command "rake %s" "Rakefile"))
|
||||
|
||||
;; Don't interfere with my custom RET behavior
|
||||
(define-key enh-ruby-mode-map [?\n] nil)
|
||||
@@ -53,7 +55,7 @@
|
||||
(define-minor-mode rake-mode
|
||||
"Buffer local minor mode for rake files"
|
||||
:lighter " Rake" :keymap (make-sparse-keymap)
|
||||
(my--init-yas-mode 'rake-mode))
|
||||
(narf/init-yas-mode 'rake-mode))
|
||||
(associate-minor-mode "/\\(Rakefile\\|\\.rake\\)$" 'rake-mode)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
@@ -61,7 +63,7 @@
|
||||
(define-minor-mode vagrant-mode
|
||||
"Buffer local minor mode for vagrant files"
|
||||
:lighter " Va" :keymap (make-sparse-keymap)
|
||||
(my--init-yas-mode 'vagrant-mode))
|
||||
(narf/yas-init-mode 'vagrant-mode))
|
||||
(associate-minor-mode "/Vagrantfile$" 'vagrant-mode)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
@@ -71,7 +73,7 @@
|
||||
:init
|
||||
(progn
|
||||
(associate-minor-mode "\\(/spec_helper\\|_spec\\)\\.rb$" 'rspec-mode)
|
||||
(associate-minor-mode "/\\.rspec$" 'rspec-mode)
|
||||
(associate-minor-mode "/\\.rspec$" 'rspec-mode)
|
||||
|
||||
(defvar rspec-mode-verifiable-map (make-sparse-keymap))
|
||||
(defvar evilmi-ruby-match-tags
|
||||
@@ -82,7 +84,7 @@
|
||||
;; Rake
|
||||
(("task" "namespace") () "end"))))
|
||||
:config
|
||||
(bind 'normal
|
||||
(bind :normal
|
||||
",tr" 'rspec-rerun
|
||||
",ta" 'rspec-verify-all
|
||||
",ts" 'rspec-verify-single
|
||||
@@ -96,16 +98,17 @@
|
||||
(evil-set-initial-state 'inf-enh-ruby-mode 'insert)
|
||||
(after "company"
|
||||
(use-package company-inf-ruby
|
||||
:config (company--backend-on 'inf-enh-ruby-mode-hook 'company-inf-ruby)))))
|
||||
:config (narf/add-company-backend inf-enh-ruby-mode (company-inf-ruby))))))
|
||||
|
||||
(use-package robe
|
||||
:functions (robe-mode robe-start ruby-load-file)
|
||||
:config
|
||||
(progn
|
||||
(after "company"
|
||||
(use-package company-robe
|
||||
:config (company--backend-on 'enh-ruby-mode-hook 'company-robe)))
|
||||
:config (narf/add-company-backend enh-ruby-mode (company-robe))))
|
||||
|
||||
(defun my-enable-robe-maybe ()
|
||||
(defun narf|enable-robe-maybe ()
|
||||
(let ((file (buffer-file-name)))
|
||||
;; Don't run in gemfiles, capfiles or vagrantfiles
|
||||
(unless (or (string-equal (f-filename file) "Gemfile")
|
||||
@@ -113,10 +116,10 @@
|
||||
(string-equal (f-filename file) "Vagrantfile")
|
||||
(f-ext? file "org")) ;; or org-mode
|
||||
(robe-mode 1)
|
||||
(my--ruby-load-file file))))
|
||||
(add-hook 'enh-ruby-mode-hook 'my-enable-robe-maybe)
|
||||
(narf|ruby-load-file file))))
|
||||
(add-hook 'enh-ruby-mode-hook 'narf|enable-robe-maybe)
|
||||
|
||||
(defun my--ruby-load-file (&optional file)
|
||||
(defun narf|ruby-load-file (&optional file)
|
||||
(let ((file (or file buffer-file-name)))
|
||||
(when (and (eq major-mode 'enh-ruby-mode)
|
||||
(featurep 'robe)
|
||||
@@ -124,7 +127,7 @@
|
||||
(file-exists-p buffer-file-name))
|
||||
(unless robe-running (robe-start 1))
|
||||
(when robe-running (ruby-load-file file)))))
|
||||
(add-hook 'after-save-hook 'my--ruby-load-file)))))
|
||||
(add-hook 'after-save-hook 'narf|ruby-load-file)))))
|
||||
|
||||
|
||||
(provide 'init-ruby)
|
||||
|
@@ -1,20 +1,28 @@
|
||||
(use-package scss-mode
|
||||
:mode "\\.scss$"
|
||||
(use-package sass-mode
|
||||
:mode "\\.sass$"
|
||||
:init
|
||||
(add-hook 'sass-mode-hook 'narf|enable-tab-width-2)
|
||||
:config
|
||||
(progn
|
||||
;; Syntax coloring breaks on consecutive loads for some reason. This fixes that:
|
||||
(add-hook 'scss-mode-hook 'css-mode)
|
||||
(add-hook 'scss-mode-hook 'enable-tab-width-2)
|
||||
(after "company" (narf/add-company-backend sass-mode (company-css)))))
|
||||
|
||||
(use-package scss-mode
|
||||
:mode "\\.scss$"
|
||||
:init
|
||||
(add-hook 'scss-mode-hook 'narf|enable-tab-width-2)
|
||||
:config
|
||||
(progn
|
||||
(setq-default css-indent-offset 2)
|
||||
(setq scss-compile-at-save nil)
|
||||
|
||||
;; Syntax coloring breaks on consecutive loads for some reason. This fixes that:
|
||||
(add-hook 'scss-mode-hook 'css-mode)
|
||||
|
||||
(after "web-beautify"
|
||||
(add-hook! 'scss-mode-hook (setenv "jsbeautify_indent_size" "2"))
|
||||
(bind 'motion scss-mode-map "gQ" 'web-beautify-css))
|
||||
(bind :motion :map scss-mode-map "gQ" 'web-beautify-css))
|
||||
|
||||
(after "auto-complete" (add-hook 'scss-mode-hook 'ac-css-mode-setup))
|
||||
(after "company" (company--backend-on 'scss-mode-hook 'company-css))))
|
||||
(after "company" (narf/add-company-backend scss-mode (company-css)))))
|
||||
|
||||
(use-package rainbow-mode
|
||||
:defer t
|
||||
|
@@ -1,5 +1,5 @@
|
||||
(my--cleanup-buffers-add "^\\*Shell Command Output\\*$")
|
||||
(my--cleanup-buffers-add "^\\*Async Shell Command\\*$")
|
||||
(narf/add-throwaway-buffer "^\\*Shell Command Output\\*$")
|
||||
(narf/add-throwaway-buffer "^\\*Async Shell Command\\*$")
|
||||
|
||||
;; Make shell scrips executable on save?
|
||||
;; (add-hook 'after-save-hook 'executable-make-buffer-file-executable-if-script-p)
|
||||
|
@@ -3,7 +3,7 @@
|
||||
:config
|
||||
(progn
|
||||
(after "flycheck" (add-to-list 'flycheck-cehckers 'swift))
|
||||
(after "company" (company--backend-on 'swift-mode-hook 'company-xcode))))
|
||||
(after "company" (narf/add-company-backend swift-mode (company-xcode)))))
|
||||
|
||||
;; TODO Set up emacs task runners for fruitstrap
|
||||
|
||||
|
@@ -1,9 +1,11 @@
|
||||
(add-hook 'text-mode-hook 'turn-on-auto-fill)
|
||||
(add-hook 'prog-mode-hook 'enable-comment-hard-wrap)
|
||||
(add-hook 'text-mode-hook 'narf|enable-hard-wrap)
|
||||
(add-hook 'prog-mode-hook 'narf|enable-comment-hard-wrap)
|
||||
|
||||
(use-package markdown-mode
|
||||
:mode (("\\.md$" . markdown-mode)
|
||||
("/README$" . markdown-mode))
|
||||
:functions (markdown-use-region-p markdown-unwrap-things-in-region
|
||||
markdown-wrap-or-insert markdown-unwrap-thing-at-point)
|
||||
:init
|
||||
;; Implement strike-through formatting
|
||||
(defvar markdown-regex-del "\\(^\\|[^\\]\\)\\(\\(~\\{2\\}\\)\\([^ \n \\]\\|[^ \n ]\\(?:.\\|\n[^\n]\\)*?[^\\ ]\\)\\(\\3\\)\\)")
|
||||
@@ -22,31 +24,32 @@
|
||||
(if (thing-at-point-looking-at markdown-regex-del)
|
||||
(markdown-unwrap-thing-at-point nil 2 4)
|
||||
(markdown-wrap-or-insert delim delim 'word nil nil)))))
|
||||
(sp-local-pair 'markdown-mode "*" "*" :unless '(sp-point-after-bol-p sp-point-before-same-p sp-point-after-same-p))
|
||||
|
||||
(let ((map markdown-mode-map))
|
||||
(bind '(normal visual) map
|
||||
",i" 'markdown-insert-image
|
||||
",l" 'markdown-insert-link
|
||||
",L" 'markdown-insert-reference-link-dwim
|
||||
",b" 'markdown-preview)
|
||||
(sp-local-pair 'markdown-mode "*" "*"
|
||||
:unless '(sp-point-after-bol-p sp-point-before-same-p sp-point-after-same-p))
|
||||
|
||||
(bind 'normal map
|
||||
"[p" 'markdown-promote
|
||||
"]p" 'markdown-demote)
|
||||
(bind :map markdown-mode-map
|
||||
"<backspace>" nil
|
||||
"<M-left>" nil
|
||||
"<M-right>" nil
|
||||
|
||||
(bind 'insert map
|
||||
(kbd "M--") 'markdown-insert-hr)
|
||||
"M-*" 'markdown-insert-list-item
|
||||
"M-b" 'markdown-insert-bold
|
||||
"M-i" 'markdown-insert-italic
|
||||
"M-`" 'markdown-insert-del
|
||||
|
||||
(bind map
|
||||
(kbd "<backspace>") nil
|
||||
(kbd "<M-left>") nil
|
||||
(kbd "<M-right>") nil
|
||||
:normal :visual
|
||||
",i" 'markdown-insert-image
|
||||
",l" 'markdown-insert-link
|
||||
",L" 'markdown-insert-reference-link-dwim
|
||||
",b" 'markdown-preview
|
||||
|
||||
(kbd "M-*") 'markdown-insert-list-item
|
||||
(kbd "M-b") 'markdown-insert-bold
|
||||
(kbd "M-i") 'markdown-insert-italic
|
||||
(kbd "M-`") 'markdown-insert-del))))
|
||||
:normal
|
||||
"[p" 'markdown-promote
|
||||
"]p" 'markdown-demote
|
||||
|
||||
:insert
|
||||
"M--" 'markdown-insert-hr)))
|
||||
|
||||
|
||||
(provide 'init-text)
|
||||
|
@@ -1,35 +0,0 @@
|
||||
;;; init.tmux.el - settings for interacting with tmux
|
||||
|
||||
(defun my--tmux-send (command)
|
||||
(shell-command (format "tmux send-keys %s" command)))
|
||||
|
||||
(after "evil"
|
||||
(evil-define-interactive-code "<tmux>"
|
||||
"Ex tmux argument (a mix between <sh> <f> and <fsh>)"
|
||||
:ex-arg shell
|
||||
(list (when (evil-ex-p) (evil-ex-file-arg))))
|
||||
|
||||
(evil-define-command my:tmux-run (&optional command bang)
|
||||
"Sends input to tmux. Use `bang' to append to tmux"
|
||||
(interactive "<tmux><!>")
|
||||
(my--tmux-send (format (if bang "C-u %s Enter" "%s")
|
||||
(shell-quote-argument command)))
|
||||
(when (evil-ex-p)
|
||||
(message "[Tmux] %s" command)))
|
||||
|
||||
(evil-define-command my:tmux-chdir (&optional path bang)
|
||||
"CDs in tmux using `project-root'"
|
||||
(interactive "<f><!>")
|
||||
(let ((dir (shell-quote-argument
|
||||
(if (and path (not (s-blank? path)))
|
||||
(if (file-directory-p path)
|
||||
(file-truename path)
|
||||
(error "Directory doesn't exist %s" path))
|
||||
(if bang default-directory (project-root))))))
|
||||
(my--tmux-send (format "C-u cd Space %s Enter" (shell-quote-argument dir)))
|
||||
(when (evil-ex-p)
|
||||
(message "[Tmux] cd %s" dir)))))
|
||||
|
||||
|
||||
(provide 'init-tmux)
|
||||
;;; init-tmux.el ends here
|
@@ -28,93 +28,6 @@
|
||||
(setq diff-hl-draw-borders nil)
|
||||
(global-diff-hl-mode +1)))
|
||||
|
||||
;; (use-package git-gutter-fringe+
|
||||
;; :diminish (git-gutter+-mode . " git")
|
||||
;; :config
|
||||
;; (progn
|
||||
;; ;; (global-git-gutter+-mode +1)
|
||||
;; (add-hooks '(text-mode-hook prog-mode-hook) 'git-gutter+-mode)
|
||||
;; ;; Fixes "git-gutter+-process-diff: Wrong number of arguments: nil" error
|
||||
;; (defadvice git-gutter+-process-diff (before git-gutter+-process-diff-advice activate)
|
||||
;; (ad-set-arg 0 (file-truename (ad-get-arg 0))))
|
||||
|
||||
;; (fringe-helper-define 'git-gutter-fr+-added nil
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X....")
|
||||
|
||||
;; (fringe-helper-define 'git-gutter-fr+-deleted nil
|
||||
;; "....X...."
|
||||
;; "....XXXXX"
|
||||
;; "....XXXXX"
|
||||
;; "....X...."
|
||||
;; "........."
|
||||
;; "........."
|
||||
;; "........."
|
||||
;; "........."
|
||||
;; "........."
|
||||
;; "........."
|
||||
;; "........."
|
||||
;; "........."
|
||||
;; "........."
|
||||
;; "........."
|
||||
;; "........."
|
||||
;; "........."
|
||||
;; "........."
|
||||
;; "........."
|
||||
;; "........."
|
||||
;; "........."
|
||||
;; "........."
|
||||
;; "........."
|
||||
;; ".........")
|
||||
|
||||
;; (fringe-helper-define 'git-gutter-fr+-modified nil
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X...."
|
||||
;; "....X....")))
|
||||
|
||||
|
||||
(provide 'init-vc)
|
||||
;;; init-vc.el ends here
|
||||
|
7
init/init-vim.el
Normal file
7
init/init-vim.el
Normal file
@@ -0,0 +1,7 @@
|
||||
(use-package vimrc-mode
|
||||
:mode (("/\\.?g?vimrc$" . vimrc-mode)
|
||||
("\\.vim$" . vimrc-mode)))
|
||||
|
||||
|
||||
(provide 'init-vim)
|
||||
;;; init-vim.el ends here
|
@@ -3,17 +3,17 @@
|
||||
:init
|
||||
(after "css-mode"
|
||||
(add-hook! 'css-mode-hook (setenv "jsbeautify_indent_size" "2"))
|
||||
(bind 'motion css-mode-map "gQ" 'web-beautify-css)))
|
||||
(bind :motion :map css-mode-map "gQ" 'web-beautify-css)))
|
||||
|
||||
(use-package web-mode
|
||||
:mode (("\\.\\(p\\)?htm\\(l\\)?$" . web-mode)
|
||||
("\\.tpl\\(\\.php\\)?$" . web-mode)
|
||||
("\\.erb$" . web-mode)
|
||||
("wp-content/themes/.+/.+\\.php$" . web-mode))
|
||||
:mode (("\\.\\(p\\)?htm\\(l\\)?$" . web-mode)
|
||||
("\\.tpl\\(\\.php\\)?$" . web-mode)
|
||||
("\\.erb$" . web-mode)
|
||||
("wp-content/themes/.+/.+\\.php$" . web-mode))
|
||||
:init
|
||||
(add-hook 'web-mode-hook 'narf|enable-tab-width-2)
|
||||
:config
|
||||
(progn
|
||||
(add-hook 'web-mode-hook 'enable-tab-width-2)
|
||||
|
||||
(setq web-mode-markup-indent-offset 2
|
||||
web-mode-code-indent-offset 2
|
||||
web-mode-css-indent-offset 2
|
||||
@@ -29,18 +29,20 @@
|
||||
(not (or (get-text-property (point) 'part-side)
|
||||
(get-text-property (point) 'block-side))))
|
||||
t))
|
||||
|
||||
(sp-local-pair 'web-mode "<" nil :when '(sp-web-mode-is-code-context)))
|
||||
|
||||
(after "web-beautify"
|
||||
(add-hook! 'web-mode-hook (setenv "jsbeautify_indent_size" "4"))
|
||||
(bind 'motion web-mode-map "gQ" 'web-beautify-html))
|
||||
(bind :motion :map web-mode-map "gQ" 'web-beautify-html))
|
||||
|
||||
(bind web-mode-map (kbd "M-/") 'web-mode-comment-or-uncomment)
|
||||
(bind 'normal web-mode-map
|
||||
(bind :map web-mode-map
|
||||
"M-/" 'web-mode-comment-or-uncomment
|
||||
|
||||
:normal
|
||||
"zf" 'web-mode-fold-or-unfold
|
||||
",t" 'web-mode-element-rename)
|
||||
(bind '(normal visual) web-mode-map
|
||||
",t" 'web-mode-element-rename
|
||||
|
||||
:normal :visual
|
||||
"]a" 'web-mode-attribute-next
|
||||
"[a" 'web-mode-attribute-previous
|
||||
"]t" 'web-mode-tag-next
|
||||
@@ -51,39 +53,35 @@
|
||||
(use-package emmet-mode
|
||||
:defer t
|
||||
:init
|
||||
(progn
|
||||
(add-hook 'scss-mode-hook 'emmet-mode)
|
||||
(add-hook 'web-mode-hook 'emmet-mode)
|
||||
(add-hook 'html-mode-hook 'emmet-mode)
|
||||
(add-hook 'haml-mode-hook 'emmet-mode)
|
||||
(add-hook 'nxml-mode-hook 'emmet-mode))
|
||||
(add-to-hooks 'emmet-mode '(scss-mode-hook web-mode-hook html-mode-hook haml-mode-hook nxml-mode-hook))
|
||||
:config
|
||||
(progn
|
||||
(setq emmet-move-cursor-between-quotes t)
|
||||
(bind 'insert emmet-mode-keymap
|
||||
(bind insert :map emmet-mode-keymap
|
||||
"M-e" 'emmet-expand-yas
|
||||
"M-E" 'emmet-expand-line)))
|
||||
|
||||
(define-minor-mode jekyll-mode
|
||||
"Jekyll development mode."
|
||||
:init-value nil
|
||||
:lighter " :{"
|
||||
:keymap (make-sparse-keymap)
|
||||
(my--init-yas-mode 'jekyll-mode))
|
||||
(defun jekyll-mode-enable-maybe ()
|
||||
(when (project-has-files '("_config.yml" "_layouts"))
|
||||
(narf/init-yas-mode 'jekyll-mode))
|
||||
(defun narf|jekyll-mode-enable-maybe ()
|
||||
(when (narf/project-has-files '("_config.yml" "_layouts"))
|
||||
(jekyll-mode 1)))
|
||||
(associate-minor-mode "/_\\(layouts\\|posts\\)/.+$" 'jekyll-mode)
|
||||
(add-hooks '(web-mode-hook scss-mode-hook html-mode-hook markdown-mode markdown-mode-hook)
|
||||
'jekyll-mode-enable-maybe)
|
||||
(add-to-hooks 'narf|jekyll-mode-enable-maybe '(web-mode-hook scss-mode-hook html-mode-hook markdown-mode markdown-mode-hook))
|
||||
(after "company" (add-to-list 'company-dictionary-major-minor-modes 'jekyll-mode))
|
||||
|
||||
(define-minor-mode wordpress-mode
|
||||
"Wordpress development mode."
|
||||
:init-value nil
|
||||
:lighter " wp"
|
||||
:keymap (make-sparse-keymap)
|
||||
(my--init-yas-mode 'wordpress-mode))
|
||||
(associate-minor-mode "/wp-\\(content\\|admin\\|includes\\)/.+$" 'wordpress-mode)
|
||||
(associate-minor-mode "/wp-.+\\.php$" 'wordpress-mode)
|
||||
(narf/init-yas-mode 'wordpress-mode))
|
||||
(associate-minor-mode "/wp-\\(content\\|admin\\|includes\\)/.+$" 'wordpress-mode)
|
||||
(associate-minor-mode "/wp-.+\\.php$" 'wordpress-mode)
|
||||
(after "company" (add-to-list 'company-dictionary-major-minor-modes 'wordpress-mode))
|
||||
|
||||
|
||||
|
@@ -1,63 +1,40 @@
|
||||
(use-package workgroups2
|
||||
:diminish workgroups-mode
|
||||
:init
|
||||
(setq wg-session-file (expand-file-name "wg-default" TMP-DIR)
|
||||
wg-workgroup-directory (expand-file-name "workgroups" TMP-DIR)
|
||||
wg-first-wg-name "main"
|
||||
wg-session-load-on-start t
|
||||
wg-mode-line-display-on nil
|
||||
;; What to do on Emacs exit / workgroups-mode exit?
|
||||
wg-emacs-exit-save-behavior 'save ; Options: 'save 'ask nil
|
||||
wg-workgroups-mode-exit-save-behavior 'save)
|
||||
:config
|
||||
(progn
|
||||
(setq wg-session-file "~/.emacs.workgroup"
|
||||
wg-workgroup-directory "~/.emacs.d/workgroups/"
|
||||
wg-first-wg-name "main"
|
||||
wg-session-load-on-start t
|
||||
wg-mode-line-display-on nil
|
||||
;; What to do on Emacs exit / workgroups-mode exit?
|
||||
wg-emacs-exit-save-behavior 'save ; Options: 'save 'ask nil
|
||||
wg-workgroups-mode-exit-save-behavior 'save) ; Options: 'save 'ask nil
|
||||
|
||||
(evil-define-command my:save-session (&optional bang session-name)
|
||||
(interactive "<!><a>")
|
||||
(if session-name
|
||||
(wg-save-session-as (concat wg-workgroup-directory session-name) (not bang))
|
||||
(wg-save-session)))
|
||||
|
||||
(evil-define-command my:load-session (&optional bang session-name)
|
||||
(interactive "<!><a>")
|
||||
(wg-open-session (if session-name
|
||||
(concat wg-workgroup-directory session-name)
|
||||
wg-session-file)))
|
||||
|
||||
(evil-define-command my:new-workgroup (bang name)
|
||||
(interactive "<!><a>")
|
||||
(unless name
|
||||
(user-error "No name specified for new workgroup"))
|
||||
(if bang
|
||||
(wg-clone-workgroup (wg-current-workgroup) name)
|
||||
(wg-create-workgroup name t)))
|
||||
|
||||
(evil-define-command my:rename-workgroup (new-name)
|
||||
(interactive "<a>")
|
||||
(wg-rename-workgroup new-name))
|
||||
|
||||
(after "helm"
|
||||
(defun my-wg-switch-to-workgroup (name)
|
||||
(defun narf/helm-switch-to-workgroup (name)
|
||||
(wg-switch-to-workgroup (wg-get-workgroup name)))
|
||||
|
||||
(defun helm-wg ()
|
||||
(interactive)
|
||||
(helm :sources '(helm-source-wg)))
|
||||
|
||||
(defvar helm-source-wg
|
||||
'((name . "Workgroups")
|
||||
(defvar narf/helm-source-wg
|
||||
'((name . "Workgroups")
|
||||
(candidates . wg-workgroup-names)
|
||||
(action . my-wg-switch-to-workgroup))))
|
||||
(action . narf/helm-switch-to-workgroup)))
|
||||
(defun narf:helm-wg ()
|
||||
(interactive)
|
||||
(helm :sources '(helm-source-wg))))
|
||||
|
||||
;; Turns projectile switch-project interface (or helm's interface to it)
|
||||
;; create a new workgroup for the new project.
|
||||
(after "projectile"
|
||||
(defun my-projectile-workgroup-switch-project ()
|
||||
(let ((workgroup-name (file-name-nondirectory (directory-file-name (project-root)))))
|
||||
(defun narf/wg-projectile-switch-project ()
|
||||
(let ((workgroup-name (file-name-nondirectory (directory-file-name (narf/project-root)))))
|
||||
(wg-create-workgroup workgroup-name t)
|
||||
(helm-projectile-find-file)))
|
||||
(setq projectile-switch-project-action 'my-projectile-workgroup-switch-project))
|
||||
(setq projectile-switch-project-action 'narf/wg-projectile-switch-project))
|
||||
|
||||
(workgroups-mode 1)))
|
||||
;; Initialize!
|
||||
(defun narf|init-workgroups ()
|
||||
(workgroups-mode +1)
|
||||
(diminish 'workgroups-mode))
|
||||
(add-hook 'after-init-hook 'narf|init-workgroups)))
|
||||
|
||||
|
||||
(provide 'init-workgroups)
|
||||
|
@@ -1,76 +1,68 @@
|
||||
(use-package yasnippet
|
||||
:diminish (yas-minor-mode . " @")
|
||||
:commands (yas-minor-mode yas-minor-mode-on my--init-yas-mode my:snippets)
|
||||
:diminish (yas-minor-mode . "Y")
|
||||
:commands (yas-minor-mode yas-minor-mode-on narf/init-yas-mode)
|
||||
:mode (("emacs\\.d/snippets/.+$" . snippet-mode))
|
||||
:init
|
||||
(progn
|
||||
(add-to-hooks 'yas-minor-mode-on '(prog-mode-hook
|
||||
snippet-mode-hook
|
||||
markdown-mode-hook
|
||||
org-mode-hook))
|
||||
(add-hook 'snippet-mode-hook 'disable-final-newline)
|
||||
|
||||
;; Switch to insert mode when expanding a template via backtab, or go back
|
||||
;; to normal mode if there are no fields.
|
||||
(defun narf/insert-yas-snippet ()
|
||||
(interactive)
|
||||
(yas-insert-snippet)
|
||||
(evil-insert-state +1))
|
||||
|
||||
(defvar yas-minor-mode-map
|
||||
(let ((map (make-sparse-keymap)))
|
||||
(bind 'insert map [(tab)] 'yas-expand)
|
||||
(bind 'visual map "<backtab>" 'yas-insert-snippet)
|
||||
map))
|
||||
|
||||
(add-hook 'snippet-mode-hook 'yas-minor-mode-on)
|
||||
(add-hook 'text-mode-hook 'yas-minor-mode-on)
|
||||
(add-hook 'prog-mode-hook 'yas-minor-mode-on)
|
||||
(add-hook 'js2-mode-hook 'yas-minor-mode-on)
|
||||
(add-hook 'org-mode-hook 'yas-minor-mode-on)
|
||||
(add-hook 'snippet-mode-hook 'disable-final-newline))
|
||||
(bind insert :map map [(tab)] 'yas-expand)
|
||||
(bind visual :map map "<backtab>" 'narf/insert-yas-snippet)
|
||||
map)))
|
||||
:config
|
||||
(progn
|
||||
(bind 'insert [(tab)] nil)
|
||||
(bind 'visual "<backtab>" nil)
|
||||
|
||||
(setq yas-verbosity 0)
|
||||
(setq yas-indent-line 'auto)
|
||||
(setq yas-also-auto-indent-first-line t)
|
||||
(setq yas-wrap-around-region nil)
|
||||
|
||||
;; Only load personal snippets
|
||||
(setq yas-snippet-dirs `(,my-snippets-dir))
|
||||
(setq yas-prompt-functions '(yas-ido-prompt yas-no-prompt))
|
||||
|
||||
(yas-reload-all)
|
||||
;; Undo global maps
|
||||
(bind insert [(tab)] nil)
|
||||
(bind visual "<backtab>" nil)
|
||||
|
||||
(after "helm" (add-to-list 'yas-dont-activate 'helm-alive-p))
|
||||
|
||||
(setq yas-verbosity 0
|
||||
yas-indent-line 'auto
|
||||
yas-also-auto-indent-first-line t
|
||||
yas-wrap-around-region nil
|
||||
;; Only load personal snippets
|
||||
yas-snippet-dirs `(,SNIPPETS-DIR)
|
||||
yas-prompt-functions '(yas-ido-prompt yas-no-prompt))
|
||||
(yas-reload-all)
|
||||
|
||||
;; Exit snippets on ESC in normal mode
|
||||
(defadvice evil-force-normal-state (before evil-esc-quit-yasnippet activate)
|
||||
(yas-exit-all-snippets))
|
||||
(advice-add 'evil-force-normal-state :before 'yas-exit-all-snippets)
|
||||
;; Once you're in normal mode, you're out
|
||||
(add-hook 'evil-normal-state-entry-hook 'yas-abort-snippet)
|
||||
|
||||
;; Fixes: evil's visual-line mode gobbles up the newline on the right.
|
||||
;; This prevents that by essentially doing (1- (region-end)).
|
||||
(defadvice yas-expand-snippet (around yas-expand-snippet-visual-line activate)
|
||||
(if (evil-visual-line-state-p)
|
||||
(ad-set-arg 2 (1- (ad-get-arg 2)))) ad-do-it)
|
||||
(when (evil-visual-line-state-p)
|
||||
(ad-set-arg 2 (1- (ad-get-arg 2)))) ad-do-it)
|
||||
|
||||
;; Fixes: visual-line includes indentation before the selection. This
|
||||
;; strips it out.
|
||||
(add-hook! 'yas-before-expand-snippet-hook
|
||||
(if (evil-visual-line-state-p)
|
||||
(setq-local yas-selected-text
|
||||
(replace-regexp-in-string
|
||||
"\\(^ *\\|\n? $\\)" ""
|
||||
(buffer-substring-no-properties (region-beginning)
|
||||
(1- (region-end)))))))
|
||||
(when (evil-visual-line-state-p)
|
||||
(setq-local yas-selected-text
|
||||
(replace-regexp-in-string
|
||||
"\\(^ *\\|\n? $\\)" ""
|
||||
(buffer-substring-no-properties (region-beginning)
|
||||
(1- (region-end)))))))
|
||||
;; Previous hook causes yas-selected-text to persist between expansions.
|
||||
;; This little hack gets around it.
|
||||
(add-hook! 'yas-after-exit-snippet-hook (setq-local yas-selected-text nil))
|
||||
|
||||
(evil-define-operator my:snippets (beg end &optional name)
|
||||
:motion nil
|
||||
:move-point nil
|
||||
:type exclusive
|
||||
:repeat nil
|
||||
(interactive "<r><a>")
|
||||
(if (and beg end)
|
||||
(yas-insert-snippet)
|
||||
(if name
|
||||
(popwin:find-file (concat my-snippets-dir (symbol-name major-mode) "/" name))
|
||||
(yas-visit-snippet-file))))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
;; Snippet helpers
|
||||
@@ -78,31 +70,30 @@
|
||||
;; Shorthand defun to surround text with newlines if more than one line.
|
||||
(defun !%! ()
|
||||
(when %
|
||||
(if (> (s-count-lines %) 1)
|
||||
(if (> (length (s-lines %)) 1)
|
||||
(concat "\n" % "\n")
|
||||
(s-trim %))))
|
||||
;; Shorthand defun for snippets: prepends a newline to `yas-selected-text'
|
||||
;; IF it contains more than one line.
|
||||
(defun !% ()
|
||||
(when %
|
||||
(if (> (s-count-lines %) 1)
|
||||
(if (> (length (s-lines %)) 1)
|
||||
(concat "\n" %)
|
||||
(s-trim %))))
|
||||
|
||||
;; Trim selection; do no further processing
|
||||
(defun %1 () (s-trim %))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
;; Inter-field navigation
|
||||
(defun my/yas-goto-start-of-field ()
|
||||
(defun narf/yas-goto-start-of-field ()
|
||||
(interactive)
|
||||
(let* ((snippet (car (yas--snippets-at-point)))
|
||||
(position (yas--field-start (yas--snippet-active-field snippet))))
|
||||
(if (= (point) position)
|
||||
(move-beginning-of-line 1)
|
||||
(goto-char position))))
|
||||
(defun my/yas-goto-end-of-field ()
|
||||
(defun narf/yas-goto-end-of-field ()
|
||||
(interactive)
|
||||
(let* ((snippet (car (yas--snippets-at-point)))
|
||||
(position (yas--field-end (yas--snippet-active-field snippet))))
|
||||
@@ -111,7 +102,7 @@
|
||||
(goto-char position))))
|
||||
|
||||
;; Prevents Yas from stepping on my toes when I use backspace
|
||||
(defun my/yas-backspace (&optional field)
|
||||
(defun narf/yas-backspace (&optional field)
|
||||
(interactive)
|
||||
(let ((field (or field (and yas--active-field-overlay
|
||||
(overlay-buffer yas--active-field-overlay)
|
||||
@@ -119,7 +110,7 @@
|
||||
(cond ((eq (point) (marker-position (yas--field-start field))) nil)
|
||||
(t (delete-char -1)))))
|
||||
|
||||
(defun my/yas-delete (&optional field)
|
||||
(defun narf/yas-delete (&optional field)
|
||||
(interactive)
|
||||
(let ((field (or field (and yas--active-field-overlay
|
||||
(overlay-buffer yas--active-field-overlay)
|
||||
@@ -132,7 +123,7 @@
|
||||
((eq (point) (marker-position (yas--field-end field))) nil)
|
||||
(t (delete-char 1)))))
|
||||
|
||||
(defun my/yas-clear-to-sof (&optional field)
|
||||
(defun narf/yas-clear-to-sof (&optional field)
|
||||
(interactive)
|
||||
(let* ((field (or field (and yas--active-field-overlay
|
||||
(overlay-buffer yas--active-field-overlay)
|
||||
@@ -141,26 +132,26 @@
|
||||
(when (and field (> (point) sof))
|
||||
(delete-region sof (point)))))
|
||||
|
||||
(defun my--init-yas-mode (&rest modes)
|
||||
(defun narf/init-yas-mode (&rest modes)
|
||||
;; Yasnippet 0.8.1+
|
||||
(after "yasnippet"
|
||||
(when (boundp 'yas-extra-modes)
|
||||
(dolist (mode modes)
|
||||
(if (symbol-value mode)
|
||||
(yas-activate-extra-mode mode)
|
||||
(setq yas-extra-modes (delq mode yas-extra-modes)))))))
|
||||
(when (boundp 'yas-extra-modes)
|
||||
(dolist (mode modes)
|
||||
(if (symbol-value mode)
|
||||
(yas-activate-extra-mode mode)
|
||||
(setq yas-extra-modes (delq mode yas-extra-modes)))))))
|
||||
|
||||
;; keybinds
|
||||
(bind yas-keymap
|
||||
"C-e" 'my/yas-goto-end-of-field
|
||||
"C-a" 'my/yas-goto-start-of-field
|
||||
"<M-right>" 'my/yas-goto-end-of-field
|
||||
"<M-left>" 'my/yas-goto-start-of-field
|
||||
(bind :map yas-keymap
|
||||
"C-e" 'narf/yas-goto-end-of-field
|
||||
"C-a" 'narf/yas-goto-start-of-field
|
||||
"<M-right>" 'narf/yas-goto-end-of-field
|
||||
"<M-left>" 'narf/yas-goto-start-of-field
|
||||
"<S-tab>" 'yas-prev-field
|
||||
"<M-backspace>" 'my/yas-clear-to-sof
|
||||
"<M-backspace>" 'narf/yas-clear-to-sof
|
||||
|
||||
[backspace] 'my/yas-backspace
|
||||
"<delete>" 'my/yas-delete)))
|
||||
[backspace] 'narf/yas-backspace
|
||||
"<delete>" 'narf/yas-delete)))
|
||||
|
||||
|
||||
(provide 'init-yasnippet)
|
||||
|
@@ -1,313 +0,0 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Global keymaps ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(bind "A-x" 'smex
|
||||
"A-X" 'smex-major-mode-commands
|
||||
"A-M-x" 'helm-M-x
|
||||
"A-;" 'eval-expression
|
||||
"C-`" 'popwin:toggle-popup-window
|
||||
"M-=" 'text-scale-increase
|
||||
"M--" 'text-scale-decrease
|
||||
"M-w" 'evil-window-delete
|
||||
"M-/" 'evil-commentary-line
|
||||
"M-b" 'my:build)
|
||||
|
||||
(bind 'motion
|
||||
;; Faster scrolling
|
||||
"M-j" "6j"
|
||||
"M-k" "6k"
|
||||
"M-r" 'my:eval-region
|
||||
|
||||
'normal
|
||||
"M-o" 'ido-find-file
|
||||
"M-O" 'my-ido-find-project-file
|
||||
"<f1>" 'dash-at-point
|
||||
"M-R" 'my:eval-buffer)
|
||||
|
||||
(when is-mac
|
||||
;; Restore text nav keys
|
||||
(bind "<A-left>" 'backward-word
|
||||
"<A-right>" 'forward-word
|
||||
"<M-backspace>" 'my.backward-kill-to-bol-and-indent
|
||||
"A-SPC" 'just-one-space
|
||||
"M-a" 'mark-whole-buffer
|
||||
"M-c" 'evil-yank
|
||||
"M-s" 'save-buffer
|
||||
"M-v" 'yank))
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Local keymaps ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(define-prefix-command 'my-leader-map)
|
||||
(define-prefix-command 'my-localleader-map)
|
||||
|
||||
(bind '(normal motion visual) ";" 'evil-ex)
|
||||
|
||||
;; <leader>
|
||||
(bind my-leader-map
|
||||
"," (λ (if (projectile-project-p) (helm-projectile-switch-to-buffer) (helm-buffers-list)))
|
||||
"<" 'helm-buffers-list
|
||||
"." 'ido-find-file
|
||||
">" (λ (let ((default-directory (project-root))) (ido-find-file)))
|
||||
"/" 'helm-projectile-find-file
|
||||
";" 'helm-semantic-or-imenu
|
||||
"]" 'helm-etags-select
|
||||
"a" 'helm-projectile-find-other-file
|
||||
"E" 'my:init-files
|
||||
"g" 'git-gutter+-show-hunk
|
||||
"h" 'helm-apropos
|
||||
"n" 'my:notes
|
||||
"m" 'helm-recentf
|
||||
"M" 'helm-projectile-recentf ; recent PROJECT files
|
||||
"p" 'helm-projectile-switch-project
|
||||
"r" 'emr-show-refactor-menu ; init-dev.el
|
||||
"x" 'my:org-capture
|
||||
"qq" 'evil-save-and-quit
|
||||
"QQ" (λ (my:kill-buffers t) (evil-quit-all))
|
||||
|
||||
"oo" 'my-open-with
|
||||
"ob" (λ (my-open-with "Google Chrome"))
|
||||
"of" (λ (my-open-with "Finder.app" default-directory))
|
||||
"oF" (λ (my-open-with "Finder.app" (project-root)))
|
||||
"ou" (λ (my-open-with "Transmit"))
|
||||
"oU" (λ (my-open-with "Transmit" default-directory))
|
||||
"ol" (λ (my-open-with "LaunchBar"))
|
||||
"oL" (λ (my-open-with "LaunchBar" default-directory))
|
||||
;; tmux: cd (default-directory)
|
||||
"ot" (λ (my:tmux-chdir nil t))
|
||||
;; tmux: cd [project root]
|
||||
"oT" 'my:tmux-chdir)
|
||||
|
||||
;; <localleader>
|
||||
(bind my-localleader-map
|
||||
"\\" 'my-neotree-toggle
|
||||
"." 'my-neotree-find
|
||||
";" 'nlinum-toggle
|
||||
"=" 'toggle-transparency
|
||||
"E" 'evil-emacs-state
|
||||
|
||||
"]" 'next-buffer
|
||||
"[" 'previous-buffer
|
||||
|
||||
"g" 'git-gutter+-show-hunk
|
||||
"e" (λ (flycheck-buffer) (flycheck-list-errors))
|
||||
"p" 'helm-show-kill-ring
|
||||
"b" 'helm-bookmarks
|
||||
"w" 'helm-wg)
|
||||
|
||||
|
||||
(bind 'normal
|
||||
"," 'my-leader-map
|
||||
"\\" 'my-localleader-map
|
||||
|
||||
;; behave like D and C; yank to end of line
|
||||
"Y" (λ (evil-yank (point) (point-at-eol)))
|
||||
"zx" 'my-kill-real-buffer
|
||||
"ZX" 'bury-buffer
|
||||
"]b" 'my-next-real-buffer
|
||||
"[b" 'my-previous-real-buffer
|
||||
"]w" 'wg-switch-to-workgroup-right
|
||||
"[w" 'wg-switch-to-workgroup-left
|
||||
|
||||
;; Increment/decrement number under cursor
|
||||
"g=" 'evil-numbers/inc-at-pt
|
||||
"g-" 'evil-numbers/dec-at-pt
|
||||
"gR" 'my:eval-buffer ; init-dev.el
|
||||
"gc" 'evil-commentary
|
||||
"gy" 'evil-commentary-yank
|
||||
|
||||
'visual
|
||||
",=" 'align-regexp
|
||||
|
||||
;; vnoremap < <gv
|
||||
"<" (λ (evil-shift-left (region-beginning) (region-end))
|
||||
(evil-normal-state)
|
||||
(evil-visual-restore))
|
||||
;; vnoremap > >gv
|
||||
">" (λ (evil-shift-right (region-beginning) (region-end))
|
||||
(evil-normal-state)
|
||||
(evil-visual-restore))
|
||||
|
||||
'motion
|
||||
"%" 'evilmi-jump-items
|
||||
[tab] 'evilmi-jump-items ; alias for %
|
||||
|
||||
"]g" 'git-gutter+-next-hunk
|
||||
"[g" 'git-gutter+-previous-hunk
|
||||
|
||||
"]e" (λ (call-interactively (if flycheck-mode 'flycheck-next-error 'next-error)))
|
||||
"[e" (λ (call-interactively (if flycheck-mode 'flycheck-previous-error 'previous-error)))
|
||||
|
||||
"C-=" 'er/expand-region
|
||||
"C--" 'er/contract-region
|
||||
|
||||
;; "gl" (λ (nlinum-enable) (evil-ex "") (nlinum-disable))
|
||||
"gx" 'evil-exchange
|
||||
"gr" 'my:eval-region ; init-dev.el
|
||||
"g]" 'smart-down
|
||||
"g[" 'smart-up
|
||||
|
||||
'insert
|
||||
"<A-backspace>" 'evil-delete-backward-word
|
||||
"<A-delete>" (λ (evil-forward-word) (evil-delete-backward-word))
|
||||
|
||||
;; Newline magic
|
||||
"<backspace>" 'backward-delete-char-untabify
|
||||
"<M-backspace>" 'my.backward-kill-to-bol-and-indent
|
||||
"<C-return>" 'evil-ret-and-indent
|
||||
|
||||
;; Textmate-esque indent shift left/right
|
||||
"M-[" (kbd "C-o m l C-o I DEL C-o ` l")
|
||||
"M-]" (λ (evil-shift-right (point-at-bol) (point-at-eol)))
|
||||
"<backtab>" (kbd "M-[")
|
||||
|
||||
;; Easy escape from insert mode (more responsive than using key-chord-define)
|
||||
"j" 'my--maybe-exit-insert-mode
|
||||
"C-g" 'evil-normal-state
|
||||
|
||||
;; Company-mode
|
||||
"C-SPC" 'company-complete-common
|
||||
"C-x C-k" 'company-dictionary
|
||||
"C-x C-f" 'company-files
|
||||
"C-x C-]" 'company-etags
|
||||
"C-x s" 'company-ispell
|
||||
"C-x C-s" 'company-yasnippet
|
||||
"C-x C-o" 'company-semantic
|
||||
"C-x C-n" 'company-dabbrev-code
|
||||
"C-x C-p" (λ (let ((company-selection-wrap-around t))
|
||||
(call-interactively 'company-dabbrev-code)
|
||||
(company-select-previous-or-abort)))
|
||||
|
||||
'operator
|
||||
"s" 'evil-surround-edit
|
||||
"S" 'evil-Surround-edit
|
||||
|
||||
'visual
|
||||
"z" 'evil-snipe-s
|
||||
"Z" 'evil-snipe-S
|
||||
|
||||
"S" 'evil-surround-region
|
||||
|
||||
;; Rotate-text (see elisp/rotate-text.el)
|
||||
'normal "!" 'rotate-word-at-point
|
||||
'visual "!" 'rotate-region
|
||||
|
||||
'emacs
|
||||
[escape] 'evil-normal-state)
|
||||
|
||||
(bind evil-window-map
|
||||
;; winner-mode: window layout undo/redo (see core.el)
|
||||
"u" 'winner-undo
|
||||
"C-u" 'winner-undo
|
||||
"C-r" 'winner-redo)
|
||||
|
||||
;; Real go-to-definition for elisp
|
||||
(bind 'motion emacs-lisp-mode-map
|
||||
"gd" (λ (let ((func (function-called-at-point)))
|
||||
(if func (find-function func))))
|
||||
"gD" (λ (let ((func (function-called-at-point)))
|
||||
(if func (find-function-other-window func)))))
|
||||
|
||||
;; Peek at file from dired
|
||||
;; (bind dired-mode-map "o" (λ (popwin:find-file (dired-get-file-for-visit))))
|
||||
|
||||
(after "help-mode"
|
||||
(bind 'normal help-mode-map
|
||||
"<escape>" (λ (kill-buffer)
|
||||
(if (eq popwin:popup-buffer (current-buffer))
|
||||
(popwin:close-popup-window)
|
||||
(evil-window-delete)))
|
||||
"]]" 'help-go-forward
|
||||
"[[" 'help-go-back))
|
||||
|
||||
(bind '(insert normal)
|
||||
;; Textmate-esque insert-line before/after
|
||||
(kbd "<M-return>") 'evil-open-below
|
||||
(kbd "<S-M-return>") 'evil-open-above)
|
||||
|
||||
;; Fix osx keymappings and then some
|
||||
(bind 'insert
|
||||
"<M-left>" 'my.move-to-bol
|
||||
"<M-right>" 'my.move-to-eol
|
||||
"<M-up>" 'beginning-of-buffer
|
||||
"<M-down>" 'end-of-buffer
|
||||
"<A-up>" 'smart-up
|
||||
"<A-down>" 'smart-down)
|
||||
|
||||
;; Line selection via linum
|
||||
(bind "<left-margin> <down-mouse-1>" 'my-select-linum
|
||||
"<left-margin> <mouse-1>" 'my-select-linum
|
||||
"<left-margin> <drag-mouse-1>" 'my-select-linum
|
||||
"<left-margin> <double-mouse-1>" 'my-select-block)
|
||||
|
||||
(bind 'visual
|
||||
"*" 'evil-visualstar/begin-search-forward
|
||||
"#" 'evil-visualstar/begin-search-backward)
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Keymap fixes ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
;; This section is dedicated to keymaps that "fix" certain keys so
|
||||
;; that they behave more like vim (or how I like it).
|
||||
|
||||
;; Restores "dumb" indentation to the tab key. This rustles a lot of
|
||||
;; peoples' jimmies, apparently, but it's how I like it.
|
||||
(bind 'insert "<tab>" 'my.dumb-indent)
|
||||
(bind 'insert "<A-tab>" 'indent-for-tab-command)
|
||||
|
||||
;; No dumb-tab for lisp
|
||||
(bind 'insert lisp-mode-map [remap my.dumb-indent] 'indent-for-tab-command)
|
||||
(bind 'insert emacs-lisp-mode-map [remap my.dumb-indent] 'indent-for-tab-command)
|
||||
|
||||
;; Highjacks space/backspace to:
|
||||
;; a) delete spaces on either side of the cursor, if present ( | ) -> (|)
|
||||
;; b) allow backspace to delete space-indented blocks intelligently
|
||||
;; c) and not do any of this magic when inside a string
|
||||
(bind 'insert
|
||||
"SPC" 'my.inflate-space-maybe
|
||||
[remap backward-delete-char-untabify] 'my.deflate-space-maybe
|
||||
[remap newline] 'my.newline-and-indent
|
||||
|
||||
;; Smarter move-to-beginning-of-line
|
||||
[remap move-beginning-of-line] 'my.move-to-bol
|
||||
|
||||
;; Restore bash-esque keymaps in insert mode; C-w and C-a already exist
|
||||
"C-e" 'my.move-to-eol
|
||||
"C-u" 'my.backward-kill-to-bol-and-indent
|
||||
|
||||
;; Fixes delete
|
||||
(kbd "<kp-delete>") 'delete-char)
|
||||
|
||||
;; Make ESC quit all the things
|
||||
(dolist (map (list minibuffer-local-map
|
||||
minibuffer-local-ns-map
|
||||
minibuffer-local-completion-map
|
||||
minibuffer-local-must-match-map
|
||||
minibuffer-local-isearch-map))
|
||||
(bind map [escape] 'my--minibuffer-quit))
|
||||
(bind 'emacs [escape] 'my--minibuffer-quit)
|
||||
|
||||
;; Redefine to get rid of that silly delete-other-windows nonsense
|
||||
(defun keyboard-escape-quit ()
|
||||
(interactive)
|
||||
(cond ((eq last-command 'mode-exited) nil)
|
||||
((region-active-p)
|
||||
(deactivate-mark))
|
||||
((> (minibuffer-depth) 0)
|
||||
(abort-recursive-edit))
|
||||
(current-prefix-arg
|
||||
nil)
|
||||
((> (recursion-depth) 0)
|
||||
(exit-recursive-edit))
|
||||
(buffer-quit-function
|
||||
(funcall buffer-quit-function))
|
||||
((string-match "^ \\*" (buffer-name (current-buffer)))
|
||||
(bury-buffer))))
|
||||
|
||||
|
||||
(provide 'my-bindings)
|
||||
;;; my-bindings.el ends here
|
@@ -1,77 +0,0 @@
|
||||
(defalias 'exmap 'evil-ex-define-cmd)
|
||||
|
||||
(exmap "l[ast]" 'popwin:popup-last-buffer)
|
||||
(exmap "m[sg]" 'popwin:messages)
|
||||
|
||||
(exmap "full[scr]" 'toggle-fullscreen)
|
||||
(exmap "ini" 'my:init-files)
|
||||
(exmap "n[otes]" 'my:notes)
|
||||
(exmap "recompile" 'my:byte-compile)
|
||||
(exmap "cd" 'my:cd)
|
||||
(exmap "en[ew]" 'my:create-file)
|
||||
(exmap "ren[ame]" 'my:rename-this-file) ; rename [NEWNAME] # rename file
|
||||
(exmap "al[ign]" 'my:align)
|
||||
(exmap "retab" 'my:retab)
|
||||
(exmap "sq[uint]" 'my:narrow-indirect) ; Narrow buffer to selection
|
||||
(exmap "x" 'my:scratch-buffer)
|
||||
|
||||
(exmap "k[ill]" 'kill-this-buffer) ; Kill current buffer
|
||||
(exmap "k[ill]o" 'my-cleanup-buffers) ; Kill current project buffers
|
||||
(exmap "k[ill]all" 'my:kill-buffers) ; Kill all buffers (bang = project buffers only)
|
||||
(exmap "k[ill]buried" 'my:kill-buried-buffers) ; Kill all buffers (bang = project buffers only)
|
||||
|
||||
(exmap "ma[ke]" 'my:build)
|
||||
|
||||
(exmap "t" 'my:tmux-run)
|
||||
(exmap "tcd" 'my:tmux-chdir)
|
||||
|
||||
(exmap "a" 'helm-projectile-find-other-file)
|
||||
(exmap "proj[ect]" 'helm-projectile-switch-project)
|
||||
(exmap "ag" 'my:helm-ag-search)
|
||||
(exmap "agr" 'my:helm-ag-regex-search)
|
||||
(exmap "ag[cw]d" 'my:helm-ag-search-cwd)
|
||||
(exmap "agr[cw]d" 'my:helm-ag-regex-search-cwd)
|
||||
(exmap "sw[oop]" 'my:helm-swoop)
|
||||
(exmap "rec[ent]" 'my:helm-recentf)
|
||||
(exmap "snip[pets]" 'my:snippets)
|
||||
(exmap "ref[actor]" 'emr-show-refactor-menu)
|
||||
|
||||
(after "flycheck"
|
||||
(exmap "er[rors]" (λ (flycheck-buffer) (flycheck-list-errors))))
|
||||
|
||||
(after "git-gutter-fringe+"
|
||||
(exmap "gstage" 'git-gutter+-stage-hunks)
|
||||
(exmap "grevert" 'git-gutter+-revert-hunks)
|
||||
(exmap "gdiff" 'git-gutter+-show-hunk))
|
||||
|
||||
(after "re-builder"
|
||||
(exmap "re[gex]" 'my:regex))
|
||||
|
||||
(after "workgroups2"
|
||||
(exmap "sl[oad]" 'my:load-session)
|
||||
(exmap "ss[ave]" 'my:save-session)
|
||||
(exmap "wg" (λ (message (wg-workgroup-list-display))))
|
||||
(exmap "wnew" 'my:new-workgroup)
|
||||
(exmap "wre[name]" 'my:rename-workgroup)
|
||||
(exmap "wn[ext]" 'wg-switch-to-workgroup-right)
|
||||
(exmap "wp[rev]" 'wg-switch-to-workgroup-left)
|
||||
(exmap "wl[ast]" 'wg-switch-to-previous-workgroup)
|
||||
(exmap "k[ill]w" 'wg-kill-workgroup)
|
||||
(exmap "k[ill]ow" (λ (let (workgroup (wg-current-workgroup))
|
||||
(dolist (w (wg-workgroup-list))
|
||||
(unless (wg-current-workgroup-p w)
|
||||
(wg-kill-workgroup w)))))))
|
||||
|
||||
(after "org"
|
||||
(exmap "o[rg]edit" 'org-edit-special)
|
||||
(exmap "o[rg]refile" 'org-refile)
|
||||
(exmap "o[rg]archive" 'org-archive-subtree)
|
||||
(exmap "o[rg]agenda" 'org-agenda)
|
||||
(exmap "o[rg]todo" 'org-show-todo-tree)
|
||||
(exmap "o[rg]link" 'org-link)
|
||||
(exmap "o[rg]align" 'org-align-all-tags)
|
||||
(exmap "o[rg]image" 'my:org-insert-image))
|
||||
|
||||
|
||||
(provide 'my-commands)
|
||||
;;; my-commands.el ends here
|
@@ -1,26 +0,0 @@
|
||||
|
||||
;;;; HTML ;;;;
|
||||
;; Replace smart quotes and other MS Word verbiage into plain text
|
||||
(defun replace:plain-textify (beg end)
|
||||
(interactive "r")
|
||||
(replace-regexp "…" "..." nil beg end)
|
||||
(replace-regexp "[‘’]" "'" nil beg end)
|
||||
(replace-regexp "[“”]" "\"" nil beg end))
|
||||
|
||||
;; Email address with mailto link
|
||||
(defun replace:email2mailto (beg end)
|
||||
(interactive "r")
|
||||
(replace-regexp "\\b\\([a-zA-Z0-9._+-%]+@[a-zA-Z0-9-.]+\\.[a-zA-Z]+\\)\\b"
|
||||
"<a href=\"mailto:\\1\">\\1</a>"
|
||||
nil beg end))
|
||||
|
||||
;; Link with anchor
|
||||
(defun replace:url2anchor (beg end)
|
||||
(interactive "r")
|
||||
(replace-regexp "\\bhttps?://.+?\\b"
|
||||
"<a href=\"\\1\">\\1</a>"
|
||||
nil beg end))
|
||||
|
||||
|
||||
(provide 'my-defuns)
|
||||
;;; my-defuns.el ends here
|
@@ -1,27 +0,0 @@
|
||||
(set-register ?. "~/.dotfiles/")
|
||||
(set-register ?d "~/Dropbox/Projects/")
|
||||
(set-register ?@ "~/.emacs.d/init.el")
|
||||
|
||||
;;;; Keymap Fixes ;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Implements some helpful keymappings for emacs sub-modes
|
||||
(add-hook! 'ido-setup-hook
|
||||
(bind ido-completion-map
|
||||
"<backspace>" 'ido-delete-backward-updir
|
||||
"C-w" 'ido-delete-backward-word-updir))
|
||||
|
||||
(bind 'emacs [escape] 'my--minibuffer-quit)
|
||||
(bind 'normal evil-command-window-mode-map [escape] 'kill-buffer-and-window)
|
||||
;; (bind evil-ex-map [escape] 'my--minibuffer-quit)
|
||||
|
||||
;; (dolist (map (list evil-ex-search-keymap minibuffer-local-map ido-common-completion-map ido-completion-map))
|
||||
;; (bind map "C-w" 'evil-delete-backward-word))
|
||||
|
||||
(bind minibuffer-local-map "\C-u" 'evil-delete-whole-line)
|
||||
|
||||
(global-unset-key (kbd "<drag-mouse-1>"))
|
||||
|
||||
(if is-mac (global-set-key (kbd "M-q") (λ (message "Gee, I dunno Brain..."))))
|
||||
|
||||
|
||||
(provide 'my-settings)
|
||||
;;; my-settings.el ends here
|
348
init/narf-bindings.el
Normal file
348
init/narf-bindings.el
Normal file
@@ -0,0 +1,348 @@
|
||||
(eval-when-compile (require 'defuns))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Global keymaps ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(bind "M-x" 'smex
|
||||
"M-X" 'smex-major-mode-commands
|
||||
"M-A-x" 'helm-M-x
|
||||
"M-;" 'eval-expression
|
||||
"C-`" 'popwin:toggle-popup-window
|
||||
"M-=" 'text-scale-increase
|
||||
"M--" 'text-scale-decrease
|
||||
"M-w" 'evil-window-delete
|
||||
"M-/" 'evil-commentary-line
|
||||
"M-b" 'narf::build
|
||||
"M-t" 'helm-projectile-find-file)
|
||||
|
||||
(bind motion
|
||||
;; Faster scrolling
|
||||
"M-j" "6j"
|
||||
"M-k" "6k"
|
||||
"M-r" 'narf::eval
|
||||
|
||||
normal
|
||||
"M-o" 'narf:ido-find-file
|
||||
"M-O" 'narf:ido-find-project-file
|
||||
"<f1>" 'dash-at-point
|
||||
|
||||
"M-R" 'narf::eval-buffer)
|
||||
|
||||
;; Restore text nav keys
|
||||
(bind :if IS-MAC
|
||||
"<A-left>" 'backward-word
|
||||
"<A-right>" 'forward-word
|
||||
"<M-backspace>" 'narf:backward-kill-to-bol-and-indent
|
||||
"A-SPC" 'just-one-space
|
||||
"M-a" 'mark-whole-buffer
|
||||
"M-c" 'evil-yank
|
||||
"M-s" 'save-buffer
|
||||
"M-v" 'clipboard-yank
|
||||
"M-q" 'evil-quit-all
|
||||
"M-z" 'undo
|
||||
"M-Z" 'redo
|
||||
"C-M-f" 'narf:toggle-fullscreen)
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Local keymaps ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(bind (normal motion visual) ";" 'evil-ex)
|
||||
|
||||
(bind normal
|
||||
:prefix leader
|
||||
"," (λ (if (narf/project-p) (helm-projectile-switch-to-buffer) (helm-buffers-list)))
|
||||
"<" 'helm-buffers-list
|
||||
"." 'narf:ido-find-file
|
||||
">" 'narf:ido-find-file-other-window
|
||||
"/" 'helm-projectile-find-file
|
||||
";" 'helm-semantic-or-imenu
|
||||
|
||||
"]" 'helm-etags-select
|
||||
"a" 'helm-projectile-find-other-file
|
||||
"E" 'narf::initfiles
|
||||
"h" 'helm-apropos
|
||||
"n" 'narf::notes
|
||||
"m" 'helm-recentf
|
||||
"M" 'helm-projectile-recentf ; recent PROJECT files
|
||||
"p" 'helm-projectile-switch-project
|
||||
"r" 'emr-show-refactor-menu
|
||||
|
||||
"qq" 'evil-save-and-quit
|
||||
"QQ" (λ (let ((confirm-kill-emacs nil)) (narf::kill-buffers t) (evil-quit-all)))
|
||||
|
||||
;; insert lines in-place
|
||||
"jj" (λ (save-excursion (evil-insert-newline-below)))
|
||||
"kk" (λ (save-excursion (evil-insert-newline-above)))
|
||||
|
||||
"oo" 'narf:osx-open-with
|
||||
"ob" (λ (narf:osx-open-with "Google Chrome"))
|
||||
"of" (λ (narf:osx-open-with "Finder.app" default-directory))
|
||||
"oF" (λ (narf:osx-open-with "Finder.app" (narf/project-root)))
|
||||
"ou" (λ (narf:osx-open-with "Transmit"))
|
||||
"oU" (λ (narf:osx-open-with "Transmit" default-directory))
|
||||
"ol" (λ (narf:osx-open-with "LaunchBar"))
|
||||
"oL" (λ (narf:osx-open-with "LaunchBar" default-directory))
|
||||
"ot" (λ (narf::tmux-chdir nil t)) ; tmux: cd (default-directory)
|
||||
"oT" 'narf::tmux-chdir ; tmux: cd [project root]
|
||||
|
||||
:prefix localleader
|
||||
"\\" 'narf:neotree-toggle
|
||||
"." 'narf:neotree-find
|
||||
";" 'narf:nlinum-toggle
|
||||
"=" 'toggle-transparency
|
||||
"E" 'evil-emacs-state
|
||||
|
||||
"]" 'next-buffer
|
||||
"[" 'previous-buffer
|
||||
|
||||
"s" (λ (narf::snippets t)) ; ido snippets dir
|
||||
"g" 'diff-hl-diff-goto-hunk
|
||||
"e" (λ (call-interactively 'flycheck-buffer) (flycheck-list-errors))
|
||||
"p" 'helm-show-kill-ring
|
||||
"b" 'helm-bookmarks
|
||||
"w" 'helm-wg)
|
||||
|
||||
(bind normal
|
||||
"Y" (λ (evil-yank (point) (point-at-eol))) ; yank to eol, like D and C
|
||||
|
||||
"zr" 'narf:open-folds
|
||||
"zm" 'narf:close-folds
|
||||
|
||||
"zx" 'narf:kill-real-buffer
|
||||
"zX" 'bury-buffer
|
||||
|
||||
"]b" 'narf:next-real-buffer
|
||||
"[b" 'narf:previous-real-buffer
|
||||
"]w" 'wg-switch-to-workgroup-right
|
||||
"[w" 'wg-switch-to-workgroup-left
|
||||
|
||||
;; Increment/decrement number under cursor
|
||||
"g=" 'evil-numbers/inc-at-pt
|
||||
"g-" 'evil-numbers/dec-at-pt
|
||||
"gR" 'narf::eval-buffer
|
||||
"gc" 'evil-commentary
|
||||
"gy" 'evil-commentary-yank
|
||||
|
||||
visual
|
||||
"gR" 'narf::eval-region-and-replace
|
||||
",=" 'align-regexp
|
||||
|
||||
;; vnoremap < <gv
|
||||
"<" (λ (evil-shift-left (region-beginning) (region-end))
|
||||
(evil-normal-state)
|
||||
(evil-visual-restore))
|
||||
;; vnoremap > >gv
|
||||
">" (λ (evil-shift-right (region-beginning) (region-end))
|
||||
(evil-normal-state)
|
||||
(evil-visual-restore))
|
||||
|
||||
;; undo/redo for regions
|
||||
;; "u" 'undo-tree-undo
|
||||
;; "C-r" 'redo-tree-redo
|
||||
|
||||
"*" 'evil-visualstar/begin-search-forward
|
||||
"#" 'evil-visualstar/begin-search-backward
|
||||
|
||||
;; paste from recent yank register; which isn't overwritten by deletes or
|
||||
;; other operations.
|
||||
"P" "\"0p"
|
||||
|
||||
"S" 'evil-surround-region
|
||||
"R" 'evil-iedit-state/iedit-mode ; edit all instances of marked region
|
||||
"v" 'er/expand-region
|
||||
"V" 'er/contract-region
|
||||
|
||||
motion
|
||||
;; aliases for %
|
||||
"%" 'evilmi-jump-items
|
||||
[tab] (λ (if (ignore-errors (hs-already-hidden-p))
|
||||
(hs-toggle-hiding)
|
||||
(call-interactively 'evilmi-jump-items)))
|
||||
|
||||
"]g" 'diff-hl-next-hunk
|
||||
"[g" 'diff-hl-previous-hunk
|
||||
|
||||
"]e" (λ (call-interactively (if (bound-and-true-p flycheck-mode) 'flycheck-next-error 'next-error)))
|
||||
"[e" (λ (call-interactively (if (bound-and-true-p flycheck-mode) 'flycheck-previous-error 'previous-error)))
|
||||
|
||||
"gl" 'narf:goto-line
|
||||
"gs" 'evil-ace-jump-two-chars-mode
|
||||
"gx" 'evil-exchange
|
||||
"gr" 'narf::eval-region
|
||||
"g]" 'smart-down
|
||||
"g[" 'smart-up
|
||||
|
||||
insert
|
||||
"<A-backspace>" 'evil-delete-backward-word
|
||||
"<A-delete>" (λ (evil-forward-word) (evil-delete-backward-word))
|
||||
|
||||
;; Newline magic
|
||||
"<backspace>" 'backward-delete-char-untabify
|
||||
"<M-backspace>" 'narf:backward-kill-to-bol-and-indent
|
||||
"<C-return>" 'evil-ret-and-indent
|
||||
|
||||
;; Textmate-esque indent shift left/right
|
||||
"M-[" (kbd "C-o m l C-o I DEL C-o ` l")
|
||||
"M-]" (λ (evil-shift-right (point-at-bol) (point-at-eol)))
|
||||
"<backtab>" (kbd "M-[")
|
||||
|
||||
;; Company-mode
|
||||
"C-SPC" 'company-complete-common
|
||||
"C-x C-k" 'company-dictionary
|
||||
"C-x C-f" 'company-files
|
||||
"C-x C-]" 'company-tags
|
||||
"C-x s" 'company-ispell
|
||||
"C-x C-s" 'company-yasnippet
|
||||
"C-x C-o" 'company-semantic
|
||||
"C-x C-n" 'company-dabbrev-code
|
||||
"C-x C-p" (λ (let ((company-selection-wrap-around t))
|
||||
(call-interactively 'company-dabbrev-code)
|
||||
(company-select-previous-or-abort)))
|
||||
|
||||
(insert replace)
|
||||
;; escape from insert mode (more responsive than using key-chord-define)
|
||||
"j" 'narf:exit-mode-maybe
|
||||
|
||||
(insert replace visual)
|
||||
"C-g" 'evil-normal-state
|
||||
|
||||
operator
|
||||
"s" 'evil-surround-edit
|
||||
"S" 'evil-Surround-edit
|
||||
|
||||
;; Rotate-text (see elisp/rotate-text.el)
|
||||
normal "!" 'rotate-word-at-point
|
||||
visual "!" 'rotate-region
|
||||
emacs [escape] 'evil-normal-state)
|
||||
|
||||
(bind :map evil-window-map
|
||||
;; winner-mode: window layout undo/redo (see core.el)
|
||||
"u" 'winner-undo
|
||||
"C-u" 'winner-undo
|
||||
"C-r" 'winner-redo
|
||||
|
||||
"C-w" 'ace-window
|
||||
"C-S-w" (λ (ace-window 4)) ; swap windows
|
||||
"C-C" (λ (ace-window 16))) ; delete windows
|
||||
|
||||
(after "help-mode"
|
||||
(bind normal :map help-mode-map
|
||||
"<escape>" (λ (kill-buffer)
|
||||
(if (eq popwin:popup-buffer (current-buffer))
|
||||
(popwin:close-popup-window)
|
||||
(evil-window-delete)))
|
||||
"]]" 'help-go-forward
|
||||
"[[" 'help-go-back))
|
||||
|
||||
(bind :map evil-ex-completion-map
|
||||
"C-r" 'evil-ex-paste-from-register ; registers in ex-mode
|
||||
"C-a" 'move-beginning-of-line
|
||||
"<s-left>" 'move-beginning-of-line
|
||||
"<s-right>" 'move-beginning-of-line
|
||||
"<s-backspace>" 'evil-delete-whole-line)
|
||||
|
||||
(bind :map company-active-map
|
||||
"C-o" 'company-search-kill-others
|
||||
"C-n" 'company-select-next-or-abort
|
||||
"C-p" 'company-select-previous-or-abort
|
||||
"C-h" 'company-show-doc-buffer
|
||||
"C-S-h" 'company-show-location
|
||||
"C-S-s" 'company-search-candidates
|
||||
"C-s" 'company-filter-candidates
|
||||
"C-SPC" 'company-complete-common
|
||||
[tab] 'company-complete
|
||||
"<backtab>" 'company-select-previous
|
||||
[escape] 'company-abort
|
||||
"<C-return>" 'helm-company
|
||||
"C-w" nil
|
||||
|
||||
:map company-search-map
|
||||
"C-n" 'company-search-repeat-forward
|
||||
"C-p" 'company-search-repeat-backward
|
||||
[escape] 'company-abort
|
||||
"C-w" nil)
|
||||
|
||||
(bind :map evil-snipe-override-mode-map
|
||||
"C-;" 'evil-snipe-repeat
|
||||
"C-," 'evil-snipe-repeat-reverse)
|
||||
|
||||
;; TODO: Swap helm's C-z and Tab
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Keymap fixes ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
;; This section is dedicated to keymaps that "fix" certain keys so
|
||||
;; that they behave more like vim (or how I like it).
|
||||
|
||||
;; Restores "dumb" indentation to the tab key. This rustles a lot of
|
||||
;; peoples' jimmies, apparently, but it's how I like it.
|
||||
(bind insert
|
||||
"<tab>" 'narf:dumb-indent
|
||||
"<C-tab>" 'indent-for-tab-command
|
||||
|
||||
;; No dumb-tab for lisp
|
||||
:map lisp-mode-map [remap narf:dumb-indent] 'indent-for-tab-command
|
||||
:map emacs-lisp-mode-map [remap narf:dumb-indent] 'indent-for-tab-command)
|
||||
|
||||
;; Highjacks space/backspace to:
|
||||
;; a) delete spaces on either side of the cursor, if present ( | ) -> (|)
|
||||
;; b) allow backspace to delete space-indented blocks intelligently
|
||||
;; c) and not do any of this magic when inside a string
|
||||
(bind insert
|
||||
"SPC" 'narf:inflate-space-maybe
|
||||
[remap backward-delete-char-untabify] 'narf:deflate-space-maybe
|
||||
[remap newline] 'narf:newline-and-indent
|
||||
|
||||
;; Smarter move-to-beginning-of-line
|
||||
[remap move-beginning-of-line] 'narf:move-to-bol
|
||||
|
||||
;; Restore bash-esque keymaps in insert mode; C-w and C-a already exist
|
||||
"C-e" 'narf:move-to-eol
|
||||
"C-u" 'narf:backward-kill-to-bol-and-indent
|
||||
|
||||
;; Fixes delete
|
||||
"<kp-delete>" 'delete-char
|
||||
|
||||
;; Fix osx keymappings and then some
|
||||
"<M-left>" 'narf:move-to-bol
|
||||
"<M-right>" 'narf:move-to-eol
|
||||
"<M-up>" 'beginning-of-buffer
|
||||
"<M-down>" 'end-of-buffer
|
||||
"<C-up>" 'smart-up
|
||||
"<C-down>" 'smart-down
|
||||
|
||||
;; Fix emacs motion keys
|
||||
"A-b" 'evil-backward-word-begin
|
||||
"A-w" 'evil-forward-word-begin
|
||||
"A-e" 'evil-forward-word-end
|
||||
|
||||
(insert normal)
|
||||
;; Textmate-esque insert-line before/after
|
||||
"<M-return>" 'evil-open-below
|
||||
"<S-M-return>" 'evil-open-above)
|
||||
|
||||
;; Make ESC quit all the things
|
||||
(bind :map (minibuffer-local-map
|
||||
minibuffer-local-ns-map
|
||||
minibuffer-local-completion-map
|
||||
minibuffer-local-must-match-map
|
||||
minibuffer-local-isearch-map)
|
||||
[escape] 'narf/minibuffer-quit)
|
||||
(bind emacs [escape] 'narf/minibuffer-quit)
|
||||
|
||||
(bind :map read-expression-map "C-w" 'evil-delete-backward-word)
|
||||
|
||||
;; Line selection via linum
|
||||
(bind "<left-margin> <down-mouse-1>" 'narf/mouse-select-line
|
||||
"<left-margin> <mouse-1>" 'narf/mouse-select-line
|
||||
"<left-margin> <drag-mouse-1>" 'narf/mouse-select-line
|
||||
"<left-margin> <double-mouse-1>" 'narf/mouse-select-block)
|
||||
|
||||
|
||||
(provide 'narf-bindings)
|
||||
;;; narf-bindings.el ends here
|
88
init/narf-commands.el
Normal file
88
init/narf-commands.el
Normal file
@@ -0,0 +1,88 @@
|
||||
;; ex-commands
|
||||
(evil-define-command narf::byte-compile (&optional bang)
|
||||
:repeat nil
|
||||
(interactive "<!>")
|
||||
(when emacs-lisp-mode
|
||||
(if (not bang)
|
||||
(progn ;; (byte-recompile-file (concat CORE-DIR "defuns.el") t 0)
|
||||
(byte-recompile-file (buffer-file-name) t 0))
|
||||
(byte-recompile-file (expand-file-name "init.el" BASE-DIR) nil 0)
|
||||
(byte-recompile-directory CORE-DIR 0 nil)
|
||||
(byte-recompile-directory CONTRIB-DIR 0 nil)
|
||||
(dolist (path (directory-files MODULES-DIR t "\\(core\\|defuns\\|narf\\).*\\.el$"))
|
||||
(byte-recompile-file path nil 0)))))
|
||||
|
||||
(evil-define-command narf::autoload-compile (&optional bang)
|
||||
:repeat nil
|
||||
(interactive "<!>")
|
||||
(defvar generated-autoload-file (expand-file-name "autoloads.el" MODULES-DIR))
|
||||
(update-directory-autoloads CORE-DIR MODULES-DIR CONTRIB-DIR))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(excmd! "settr[im]" 'narf:toggle-delete-trailing-whitespace)
|
||||
|
||||
(excmd! "echo" 'narf::echo)
|
||||
(excmd "l[ast]" 'popwin:popup-last-buffer)
|
||||
(excmd "m[sg]" 'popwin:messages)
|
||||
(excmd! "full[scr]" 'narf:toggle-fullscreen)
|
||||
(excmd! "ini" 'narf::initfiles)
|
||||
(excmd! "bcomp[ile]" 'narf::byte-compile)
|
||||
(excmd! "acomp[ile]" 'narf::autoload-compile)
|
||||
(excmd! "cd" 'narf::cd)
|
||||
(excmd! "en[ew]" 'narf::create-file)
|
||||
(excmd! "ren[ame]" 'narf::rename-this-file) ; rename [NEWNAME] # rename file
|
||||
(excmd! "del[ete]" 'narf::delete-this-file) ; delete[!]
|
||||
(excmd! "al[ign]" 'narf::align)
|
||||
(excmd! "retab" 'narf::retab)
|
||||
(excmd! "na[rrow]" 'narf::narrow-indirect-or-widen) ; Narrow buffer to selection
|
||||
(excmd! "x" 'narf::scratch-buffer)
|
||||
(excmd "k[ill]" 'kill-this-buffer) ; Kill current buffer
|
||||
(excmd! "k[ill]o" 'narf:cleanup-buffers) ; Kill current project buffers
|
||||
(excmd! "k[ill]all" 'narf::kill-buffers) ; Kill all buffers (bang = project buffers only)
|
||||
(excmd! "k[ill]buried" 'narf::kill-buried-buffers) ; Kill all buffers (bang = project buffers only)
|
||||
(excmd! "ma[ke]" 'narf::build)
|
||||
(excmd! "t" 'narf::tmux-run)
|
||||
(excmd! "tcd" 'narf::tmux-chdir)
|
||||
(excmd! "a" 'helm-projectile-find-other-file)
|
||||
(excmd! "proj[ect]" 'helm-projectile-switch-project)
|
||||
(excmd! "ag" 'narf::ag-search)
|
||||
(excmd! "agr" 'narf::ag-regex-search)
|
||||
(excmd! "ag[cw]d" 'narf::ag-search-cwd)
|
||||
(excmd! "agr[cw]d" 'narf::ag-regex-search-cwd)
|
||||
(excmd! "sw[oop]" 'narf::swoop)
|
||||
(excmd! "rec[ent]" 'narf::recentf)
|
||||
(excmd! "ref[actor]" 'emr-show-refactor-menu)
|
||||
(excmd! "snip[pets]" 'narf::snippets) ; snip[!]
|
||||
(excmd! "cap[ture]" 'helm-org-capture-templates)
|
||||
(excmd! "n[otes]" 'helm-org-agenda-files-headings)
|
||||
(after "flycheck"
|
||||
(excmd! "er[rors]" (λ (flycheck-buffer) (flycheck-list-errors))))
|
||||
(after "re-builder"
|
||||
(excmd "re[gex]" 'narf::regex))
|
||||
(after "org"
|
||||
(excmd "o[rg]edit" 'org-edit-special)
|
||||
(excmd "o[rg]refile" 'org-refile)
|
||||
(excmd "o[rg]archive" 'org-archive-subtree)
|
||||
(excmd "o[rg]agenda" 'org-agenda)
|
||||
(excmd "o[rg]todo" 'org-show-todo-tree)
|
||||
(excmd "o[rg]link" 'org-link)
|
||||
(excmd "o[rg]align" 'org-align-all-tags))
|
||||
(after "workgroups2"
|
||||
(excmd! "sl[oad]" 'narf::load-session)
|
||||
(excmd! "ss[ave]" 'narf::save-session)
|
||||
(excmd "wg" (λ (message (wg-workgroup-list-display))))
|
||||
(excmd! "wnew" 'narf::new-workgroup)
|
||||
(excmd! "wre[name]" 'narf::rename-workgroup)
|
||||
(excmd "wn[ext]" 'wg-switch-to-workgroup-right)
|
||||
(excmd "wp[rev]" 'wg-switch-to-workgroup-left)
|
||||
(excmd "wl[ast]" 'wg-switch-to-previous-workgroup)
|
||||
(excmd "k[ill]w" 'wg-kill-workgroup)
|
||||
(excmd "k[ill]ow" (λ (let (workgroup (wg-current-workgroup))
|
||||
(dolist (w (wg-workgroup-list))
|
||||
(unless (wg-current-workgroup-p w)
|
||||
(wg-kill-workgroup w)))))))
|
||||
|
||||
|
||||
(provide 'narf-commands)
|
||||
;;; narf-commands.el ends here
|
26
init/narf-settings.el
Normal file
26
init/narf-settings.el
Normal file
@@ -0,0 +1,26 @@
|
||||
(set-register ?. "~/.dotfiles/")
|
||||
(set-register ?d "~/Dropbox/Projects/")
|
||||
(set-register ?@ "~/.emacs.d/init.el")
|
||||
|
||||
;;;; Keymap Fixes ;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Implements some helpful keymappings for emacs sub-modes
|
||||
(add-hook! 'ido-setup-hook
|
||||
(bind :map (ido-completion-map ido-file-completion-map)
|
||||
;; "<backspace>" 'ido-delete-backward-updir
|
||||
"C-w" 'ido-delete-backward-word-updir))
|
||||
|
||||
(bind :normal :map evil-command-window-mode-map [escape] 'kill-buffer-and-window)
|
||||
(bind :map evil-ex-map [escape] 'narf/minibuffer-quit)
|
||||
|
||||
(bind :map minibuffer-local-map "\C-u" 'evil-delete-whole-line)
|
||||
|
||||
;; Disable the global drag-mouse map; clicking in new buffers often sends evil
|
||||
;; into visual mode, which is UN...ACCEPTAABBLLLEEEE!
|
||||
(global-unset-key (kbd "<drag-mouse-1>"))
|
||||
|
||||
;; Don't allow quitting easily.
|
||||
(setq confirm-kill-emacs (lambda (prompt) (y-or-n-p ">> Gee, I dunno Brain... Are you sure?")))
|
||||
|
||||
|
||||
(provide 'narf-settings)
|
||||
;;; narf-settings.el ends here
|
Reference in New Issue
Block a user