My name is Henrik and I'm an emacs addict. (Hello Henrik)
This commit is contained in:
parent
eafb74110f
commit
7d44ea4db4
50 changed files with 1154 additions and 2571 deletions
|
@ -1,48 +0,0 @@
|
|||
;; Global editor behavior
|
||||
(use-package expand-region
|
||||
:commands (er/expand-region er/contract-region))
|
||||
|
||||
(use-package rotate-text
|
||||
:commands (rotate-word-at-point rotate-region))
|
||||
|
||||
(use-package smartparens
|
||||
: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"))))
|
||||
|
||||
(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)))))
|
||||
|
||||
(provide 'core-editor)
|
||||
;;; core-editor.el ends here
|
|
@ -1,328 +0,0 @@
|
|||
(provide 'core-evil)
|
||||
|
||||
;;;; Eeeeeeevil ;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
(use-package evil
|
||||
:config
|
||||
(progn
|
||||
(setq evil-want-visual-char-semi-exclusive t
|
||||
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
|
||||
|
||||
;; 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! 'after-change-major-mode-hook (setq evil-shift-width tab-width))
|
||||
(add-hook 'prog-mode-hook '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)))
|
||||
|
||||
(progn ; evil plugins
|
||||
(use-package evil-ex-registers)
|
||||
(use-package evil-indent-textobject) ; vii/vai/vaI
|
||||
(use-package evil-numbers)
|
||||
(use-package evil-matchit :config (global-evil-matchit-mode 1))
|
||||
(use-package evil-surround :config (global-evil-surround-mode 1))
|
||||
(use-package evil-commentary :config (evil-commentary-mode 1))
|
||||
(use-package evil-search-highlight-persist
|
||||
:config
|
||||
(global-evil-search-highlight-persist t))
|
||||
|
||||
(use-package evil-jumper
|
||||
:init (setq evil-jumper-file (expand-file-name "jumplist" my-tmp-dir))
|
||||
:config
|
||||
(progn
|
||||
(setq evil-jumper-auto-center t
|
||||
evil-jumper-auto-save-interval 3600)
|
||||
(define-key evil-motion-state-map (kbd "H-i") 'evil-jumper/forward)))
|
||||
|
||||
(use-package 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
|
||||
: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
|
||||
:config
|
||||
(progn
|
||||
(global-evil-snipe-mode +1)
|
||||
(setq evil-snipe-smart-case t)
|
||||
(setq evil-snipe-override-evil t)
|
||||
(setq evil-snipe-scope 'line)
|
||||
(setq evil-snipe-repeat-scope 'buffer)
|
||||
(setq evil-snipe-override-evil-repeat-keys nil)
|
||||
(setq-default evil-snipe-symbol-groups
|
||||
'((?\[ "[[{(]")
|
||||
(?\] "[]})]")))
|
||||
|
||||
(bind 'motion
|
||||
"C-;" 'evil-snipe-repeat
|
||||
"C-," 'evil-snipe-repeat-reverse
|
||||
|
||||
'visual
|
||||
"z" 'evil-snipe-s
|
||||
"Z" 'evil-snipe-S))))
|
||||
|
||||
(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))
|
||||
|
||||
;; 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)))
|
||||
|
||||
(progn ; extensions
|
||||
(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)))
|
||||
|
||||
(defun evil-ex-replace-special-filenames (file-name)
|
||||
"Replace special symbols in FILE-NAME.
|
||||
|
||||
% => full path to file (/project/src/thing.c)
|
||||
# => alternative file path (/project/include/thing.h)
|
||||
%:p => path to project root (/project/)
|
||||
%:d => path to current directory (/project/src/)
|
||||
%:e => the file's extension (c)
|
||||
%:r => the full path without its extension (/project/src/thing)
|
||||
%:t => the file's basename (thing.c)"
|
||||
(let ((current-fname (buffer-file-name))
|
||||
(alternate-fname (and (other-buffer)
|
||||
(buffer-file-name (other-buffer)))))
|
||||
(setq file-name
|
||||
;; %:p:h => the project root (or current directory otherwise)
|
||||
(replace-regexp-in-string "\\(^\\|[^\\\\]\\)\\(%:p\\)"
|
||||
(project-root) file-name t t 2))
|
||||
(setq file-name
|
||||
;; %:p => the project root (or current directory otherwise)
|
||||
(replace-regexp-in-string "\\(^\\|[^\\\\]\\)\\(%:d\\)"
|
||||
default-directory file-name t t 2))
|
||||
(when current-fname
|
||||
(setq file-name
|
||||
;; %:e => ext
|
||||
(replace-regexp-in-string "\\(^\\|[^\\\\]\\)\\(%:e\\)"
|
||||
(f-ext current-fname) file-name t t 2))
|
||||
(setq file-name
|
||||
;; %:r => filename
|
||||
(replace-regexp-in-string "\\(^\\|[^\\\\]\\)\\(%:r\\)"
|
||||
(f-no-ext current-fname) file-name t t 2))
|
||||
(setq file-name
|
||||
;; %:t => filename.ext
|
||||
(replace-regexp-in-string "\\(^\\|[^\\\\]\\)\\(%:t\\)"
|
||||
(f-base current-fname) file-name t t 2))
|
||||
(setq file-name
|
||||
;; % => file path for current frame
|
||||
(replace-regexp-in-string "\\(^\\|[^\\\\]\\)\\(%\\)"
|
||||
current-fname file-name t t 2)))
|
||||
(when alternate-fname
|
||||
(setq file-name
|
||||
;; # => file path for alternative frame
|
||||
(replace-regexp-in-string "\\(^\\|[^\\\\]\\)\\(#\\)"
|
||||
alternate-fname file-name t t 2)))
|
||||
(setq file-name
|
||||
(replace-regexp-in-string "\\\\\\([#%]\\)"
|
||||
"\\1" file-name t)))
|
||||
file-name))
|
||||
|
||||
(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)
|
||||
(ido-find-file-in-dir org-directory))
|
||||
|
||||
(evil-define-command my:byte-compile (&optional bang)
|
||||
:repeat nil
|
||||
(interactive "<!>")
|
||||
(if bang
|
||||
(byte-recompile-directory (concat my-dir ".cask") 0 t)
|
||||
(byte-recompile-directory my-dir 0 t)))
|
||||
|
||||
(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)))))
|
|
@ -1,3 +0,0 @@
|
|||
(provide 'core-linux)
|
||||
|
||||
;; Nothing here yet
|
|
@ -1,37 +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
|
||||
:if (memq window-system '(mac ns))
|
||||
:init (exec-path-from-shell-initialize))
|
||||
|
||||
(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 ((app-name (if app-name (concat "-a " app-name)))
|
||||
(path (or path (if (eq major-mode 'dired-mode) (dired-get-file-for-visit) (buffer-file-name)))))
|
||||
(message "Trying: %s" (concat "open " app-name " " (shell-quote-argument path)))
|
||||
(shell-command (concat "open " app-name " " (shell-quote-argument path)))))
|
||||
|
||||
|
||||
(provide 'core-osx)
|
||||
;;; core-osx.el ends here
|
136
core/core-ui.el
136
core/core-ui.el
|
@ -1,136 +0,0 @@
|
|||
;;; core-ui.el -- User interface layout & behavior
|
||||
|
||||
;;;; Load Theme ;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
(when window-system
|
||||
(set-frame-parameter nil 'alpha '(96 86))
|
||||
(cycle-font 0)) ; Load font
|
||||
|
||||
(add-to-list 'custom-theme-load-path my-themes-dir)
|
||||
(load-dark-theme)
|
||||
|
||||
|
||||
;;;; GUI Settings ;;;;;;;;;;;;;;;;;;;;;;
|
||||
(tooltip-mode -1)
|
||||
(blink-cursor-mode -1) ; blink cursor
|
||||
(global-hl-line-mode 1) ; highlight line
|
||||
|
||||
(setq linum-format " %3d")
|
||||
|
||||
;; 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)
|
||||
|
||||
(setq-default visible-bell nil) ; silence of the bells
|
||||
(setq-default use-dialog-box nil) ; avoid GUI
|
||||
(setq-default redisplay-dont-pause t)
|
||||
;; (setq window-combination-resize nil)
|
||||
|
||||
;; do not soft-wrap lines
|
||||
(setq-default truncate-lines t)
|
||||
(setq-default truncate-partial-width-windows nil)
|
||||
(setq-default indicate-buffer-boundaries nil)
|
||||
(setq-default indicate-empty-lines nil)
|
||||
|
||||
(when (functionp 'scroll-bar-mode) (scroll-bar-mode -1)) ; no scrollbar
|
||||
(when (functionp 'tool-bar-mode) (tool-bar-mode -1)) ; no toolbar
|
||||
(when (functionp 'menu-bar-mode) (menu-bar-mode -1)) ; no menubar
|
||||
(when (fboundp 'fringe-mode) (fringe-mode '(5 . 10))) ; no nonsense
|
||||
|
||||
(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))
|
||||
|
||||
|
||||
;;;; Modeline ;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
(use-package vim-empty-lines-mode
|
||||
:config (global-vim-empty-lines-mode +1))
|
||||
|
||||
(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
|
||||
(setq rm-blacklist
|
||||
(mapconcat 'identity
|
||||
'(" SP"
|
||||
" Fill"
|
||||
" EvilOrg"
|
||||
" Abbrev"
|
||||
" snipe"
|
||||
" company"
|
||||
" Anaconda"
|
||||
" WS"
|
||||
" GitGutter"
|
||||
" Undo-Tree"
|
||||
" Projectile\\[.+\\]"
|
||||
" hs"
|
||||
" ElDoc"
|
||||
" wg"
|
||||
" ~"
|
||||
" s-/"
|
||||
;; " yas"
|
||||
" emr"
|
||||
" Refactor"
|
||||
) "\\|"))
|
||||
:init
|
||||
(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)
|
||||
|
||||
(setq sml/replacer-regexp-list '(("^~/Dropbox/Projects/" "PROJECTS:")
|
||||
("^~/.emacs.d/" "EMACS.D:")))
|
||||
|
||||
(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
|
||||
(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
|
326
core/core.el
326
core/core.el
|
@ -1,326 +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))
|
||||
|
||||
(when is-linux (add-to-list 'load-path "~/.cask"))
|
||||
(setq use-package-verbose DEBUG-MODE)
|
||||
|
||||
(cd "~") ; instead of /
|
||||
|
||||
;; 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)
|
||||
|
||||
(require 'shut-up)
|
||||
(setq shut-up-ignore DEBUG-MODE)
|
||||
(when noninteractive (shut-up-silence-emacs)) ; http://youtu.be/Z6woIRLnbmE
|
||||
|
||||
(shut-up
|
||||
;;;; Sane defaults ;;;;;;;;;;;;;;;;;;;;;;;
|
||||
(line-number-mode 1) ; hide line no in modeline
|
||||
(column-number-mode 1) ; hide col no in modeline
|
||||
(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
|
||||
(electric-indent-mode 1)
|
||||
(setq electric-indent-chars '(? ?: ?{))
|
||||
|
||||
;;; 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)
|
||||
|
||||
(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)
|
||||
|
||||
(setq-default fill-column 80)
|
||||
|
||||
;; minibufferception? Yay!
|
||||
(setq-default enable-recursive-minibuffers t)
|
||||
|
||||
;; Sane scroll settings
|
||||
(setq scroll-margin 5)
|
||||
(setq scroll-conservatively 9999)
|
||||
(setq scroll-preserve-screen-position 1)
|
||||
|
||||
;; Show me those keystrokes
|
||||
(setq echo-keystrokes 0.02)
|
||||
|
||||
;; I'll use visual mode, kthxbai
|
||||
(setq shift-select-mode nil)
|
||||
|
||||
(setq ring-bell-function 'ignore)
|
||||
|
||||
(setq inhibit-startup-screen t) ; don't show EMACs start screen
|
||||
(setq inhibit-splash-screen t)
|
||||
(setq inhibit-startup-buffer-menu t)
|
||||
|
||||
(setq initial-major-mode 'text-mode) ; initial scratch buffer mode
|
||||
(setq initial-scratch-message nil)
|
||||
(setq initial-scratch-buffer nil) ; empty scratch buffer
|
||||
|
||||
(setq compilation-always-kill t)
|
||||
(setq compilation-ask-about-save nil)
|
||||
(setq compilation-scroll-output t)
|
||||
|
||||
(setq sentence-end-double-space nil) ; sentences end with periods. Period.
|
||||
|
||||
(setq show-paren-delay 0)
|
||||
|
||||
(setq ediff-diff-options "-w")
|
||||
(setq ediff-split-window-function 'split-window-horizontally) ; side-by-side diffs
|
||||
(setq ediff-window-setup-function 'ediff-setup-windows-plain) ; no extra frames
|
||||
|
||||
;; Fixes C-i's synonymity with TAB
|
||||
(keyboard-translate ?\C-i ?\H-i)
|
||||
|
||||
;; 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)
|
||||
|
||||
|
||||
;;;; 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)))
|
||||
|
||||
;; Save history across sessions
|
||||
(require 'savehist)
|
||||
(setq savehist-file (concat my-tmp-dir "savehist") ; 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
|
||||
(require 'saveplace)
|
||||
(setq-default save-place-file (concat my-tmp-dir "saveplace"))
|
||||
;; activate save-place only for files that exist
|
||||
(add-hook 'find-file-hook (lambda() (if (file-exists-p buffer-file-name) (setq save-place t))))
|
||||
|
||||
(require 'recentf)
|
||||
(setq recentf-save-file (concat my-tmp-dir "recentf"))
|
||||
(setq recentf-exclude '("/tmp/" "/ssh:" "\\.?ido\\.last\\'" "\\.revive\\'", "/TAGS\\'"))
|
||||
(setq recentf-max-menu-items 0)
|
||||
(setq recentf-max-saved-items 1000)
|
||||
(setq recentf-auto-cleanup 'never)
|
||||
(add-hook 'kill-emacs-hook 'recentf-cleanup)
|
||||
(recentf-mode 1)
|
||||
|
||||
;; 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
|
||||
(setq-default tab-always-indent t)
|
||||
(setq-default tab-width 4)
|
||||
|
||||
(setq require-final-newline t)
|
||||
(setq delete-trailing-lines nil)
|
||||
(add-hook 'makefile-mode-hook (lambda () (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")
|
||||
"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 ;;;;;;;;;;;;;;;;;;
|
||||
(require 'defuns)
|
||||
(require 'autoloads) ; use make autoloads to generate autoloads file
|
||||
|
||||
(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 display-buffer-function 'popwin:display-buffer)
|
||||
|
||||
(push '("\\`\\*helm.*?\\*\\'" :regexp t :position bottom :height 15) popwin:special-display-config)
|
||||
|
||||
(push '("^\\*Flycheck.*\\*$" :regexp t :position bottom :height 0.25 :noselect t) popwin:special-display-config)
|
||||
(push '(inf-enh-ruby-mode :position bottom :stick t) popwin:special-display-config)
|
||||
(push '(snippet-mode :position bottom :stick t) popwin:special-display-config)
|
||||
(push '("^\\*eclim.*\\*" :regexp t :position bottom :height 0.25) popwin:special-display-config)
|
||||
|
||||
(push '("*ansi-term*" :position bottom :height 0.45 :stick t) popwin:special-display-config)
|
||||
(push '("*terminal*" :position bottom :height 0.45 :stick t) popwin:special-display-config)
|
||||
(push '("*Async Shell Command*" :position bottom) popwin:special-display-config)
|
||||
(push '("*Shell Command Output*" :position bottom :stick t :height 15) popwin:special-display-config)
|
||||
|
||||
(push '("* Regexp Explain *" :position top :height 0.35) popwin:special-display-config)
|
||||
|
||||
(push '("*anaconda-doc*" :position bottom :height 15 :noselect t) popwin:special-display-config)
|
||||
(push '("*anaconda-nav*" :position bottom :height 15 :stick t) popwin:special-display-config)
|
||||
(push '("^\\*Python.+\\*$" :regexp t :position bottom :height 20 :noselect t) popwin:special-display-config)
|
||||
|
||||
(push '(help-mode :height 0.5 :position bottom :stick t) popwin:special-display-config)
|
||||
(push '(compilation-mode :height 0.5 :position bottom :noselect t) popwin:special-display-config)
|
||||
(push '(diff-mode :position bottom :stick t) popwin:special-display-config)
|
||||
(push '("*Backtrace*") popwin:special-display-config)
|
||||
(push '("*Warnings*") popwin:special-display-config)
|
||||
(push '("*Process List*") popwin:special-display-config)
|
||||
(push '("*Compile-Log*" :height 0.3 :position bottom :noselect t) popwin:special-display-config)
|
||||
(push '(" *undo-tree*" :width 0.3 :position right) popwin:special-display-config)
|
||||
(push '("^\\*scratch\\*.*" :regexp t :stick t) popwin:special-display-config)
|
||||
(push '(image-mode) 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)))
|
||||
|
||||
(require 'server)
|
||||
(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,37 +0,0 @@
|
|||
(eval-when-compile (require 'cl))
|
||||
|
||||
(defvar my/dark-theme-p t)
|
||||
(defvar my/cycle-font-i 0)
|
||||
|
||||
;;;###autoload
|
||||
(defun load-dark-theme()
|
||||
(interactive)
|
||||
(load-theme *dark-theme t))
|
||||
|
||||
;;;###autoload
|
||||
(defun load-light-theme()
|
||||
(interactive)
|
||||
(load-theme *light-theme t))
|
||||
|
||||
;;;###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-theme ()
|
||||
(interactive)
|
||||
(if my/dark-theme-p
|
||||
(load-light-theme)
|
||||
(load-dark-theme)))
|
||||
|
||||
;;;###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)))
|
164
core/defuns.el
164
core/defuns.el
|
@ -1,164 +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)))
|
||||
|
||||
|
||||
;; 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))
|
||||
|
||||
|
||||
;; Font Defuns ;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
(defun cycle-font (&optional i)
|
||||
"Cycle between fonts specified in *fonts in init.el"
|
||||
(interactive)
|
||||
(if (numberp i)
|
||||
(setq my/cycle-font-i i)
|
||||
(if (>= my/cycle-font-i (1- (length *fonts)))
|
||||
(setq my/cycle-font-i 0)
|
||||
(cl-incf my/cycle-font-i)))
|
||||
(let ((font (nth my/cycle-font-i *fonts)))
|
||||
(message "Changing font to %s" (nth 1 (font-face-attributes font)))
|
||||
(set-frame-font font)))
|
||||
|
||||
|
||||
;;;; 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)
|
Loading…
Add table
Add a link
Reference in a new issue