From 0e8a2d65bfc2291f15799e397dd4841f2c4e4274 Mon Sep 17 00:00:00 2001 From: Ivan Malison Date: Sun, 23 Nov 2014 02:12:58 -0800 Subject: [PATCH] sauron and flyspell. Rudimentary alerting for erc. --- init.el | 143 +++++++++++++++++++++++++++++++++++-------- load.d/erc-notify.el | 65 -------------------- load.d/mu4e.el | 6 ++ 3 files changed, 125 insertions(+), 89 deletions(-) delete mode 100644 load.d/erc-notify.el diff --git a/init.el b/init.el index 577db43d..fb7f5193 100644 --- a/init.el +++ b/init.el @@ -121,6 +121,10 @@ (setq split-height-threshold nil) (setq split-width-threshold 160) +;; No popup frames. +(setq ns-pop-up-frames nil) +(setq pop-up-frames nil) + ;; ============================================================================= ;; functions ;; ============================================================================= @@ -217,6 +221,16 @@ buffer is not visiting a file." (setq imenu-create-index-function (flatten-imenu-index-function imenu-create-index-function))) +(defun notification-center (title message) + (flet ((encfn (s) (encode-coding-string s (keyboard-coding-system)))) + (shell-command + (format "osascript -e 'display notification \"%s\" with title \"%s\"'" + (encfn message) (encfn title))))) + +(defun growl-notify (title message) + (shell-command (format "grownotify -t %s -m %s" title message))) + + ;; ============================================================================= ;; General Emacs Options ;; ============================================================================= @@ -232,7 +246,7 @@ buffer is not visiting a file." (line-number-mode t) (column-number-mode t) (global-linum-mode t) -(setq visible-bell nil) +(setq visible-bell t) (show-paren-mode 1) ;; Make buffer names unique. @@ -250,12 +264,11 @@ buffer is not visiting a file." (add-hook 'after-init-hook '(lambda () (setq debug-on-error t))) -;; Don't popup frames in OSX. -(setq ns-pop-up-frames nil) - ;; Make mouse scrolling less jumpy. (setq mouse-wheel-scroll-amount '(1 ((shift) . 1))) +(eval-after-load 'subword-mode '(diminish 'subword-mode)) + (use-package load-dir :ensure t :config @@ -280,6 +293,7 @@ buffer is not visiting a file." (progn (setq guide-key/guide-key-sequence '("C-c" "C-c p" "C-x C-k" "C-x r" "C-x c")) (guide-key-mode 1) + (diminish 'guide-key-mode) (setq guide-key/idle-delay 0.25) (setq guide-key/recursive-key-sequence-flag t) (setq guide-key/popup-window-position 'bottom))) @@ -296,8 +310,7 @@ buffer is not visiting a file." (progn (setq ace-jump-mode-scope 'window)) :bind (("C-;" . ace-jump-mode) - ;; This is needed for terminal emacs. - ("C-c j" . ace-jump-mode))) + ("C-c j" . ace-jump-mode))) (use-package flycheck :ensure t @@ -379,9 +392,9 @@ buffer is not visiting a file." (diminish 'undo-tree-mode) :init (progn + ;;(setq undo-tree-visualizer-diff t) ;; This causes performance problems (global-undo-tree-mode) - (setq undo-tree-visualizer-timestamps t) - (setq undo-tree-visualizer-diff t))) + (setq undo-tree-visualizer-timestamps t))) (use-package smooth-scrolling :ensure t @@ -407,17 +420,21 @@ buffer is not visiting a file." (use-package org :ensure t - :commands org-mode - :mode "\\.org\\'" + :commands (org-mode org) + :mode ("\\.org\\'" . org-mode) :init (progn + (setq org-directory "~/Dropbox/org") + (setq org-mobile-inbox-for-pull "~/Dropbox/org/flagged.org") + (setq org-mobile-directory "~/Dropbox/Apps/MobileOrg") (defun guide-key/my-hook-function-for-org-mode () (guide-key/add-local-guide-key-sequence "C-c") (guide-key/add-local-guide-key-sequence "C-c C-x") (guide-key/add-local-highlight-command-regexp "org-")) (add-hook 'org-mode-hook 'guide-key/my-hook-function-for-org-mode) (add-hook 'org-mode-hook (lambda () (linum-mode 0))) - (define-key mode-specific-map [?a] 'org-agenda))) + (define-key mode-specific-map [?a] 'org-agenda) + (local-set-key (kbd "C-j") 'ace-jump-mode))) (use-package epg :ensure t @@ -427,7 +444,57 @@ buffer is not visiting a file." (use-package erc :ensure t :commands erc - :config (progn (use-package erc-colorize :ensure t) (erc-colorize-mode 1))) + :config + (progn + (setq sauron-nick-insensitivity 1) + (use-package erc-colorize :ensure t) (erc-colorize-mode 1) + (add-hook 'sauron-event-added-functions + (lambda (origin priority message &optional properties) + (message "triggered...XXX") + (notification-center "test" message))))) + +(use-package sauron + :ensure t + :commands (sauron-start sauron-start-hidden) + :config (progn (setq sauron-separate-frame nil)) + :idle (sauron-start-hidden) + :idle-priority 3) + +(use-package flyspell + :ensure t + :config + (progn + (bind-key "M-s" 'flyspell-correct-word-before-point flyspell-mode-map) + (unbind-key "C-;" flyspell-mode-map) + (defun flyspell-emacs-popup-textual (event poss word) + "A textual flyspell popup menu." + (let* ((corrects (if flyspell-sort-corrections + (sort (car (cdr (cdr poss))) 'string<) + (car (cdr (cdr poss))))) + (cor-menu (if (consp corrects) + (mapcar (lambda (correct) + (list correct correct)) + corrects) + '())) + (affix (car (cdr (cdr (cdr poss))))) + show-affix-info + (base-menu (let ((save (if (and (consp affix) show-affix-info) + (list + (list (concat "Save affix: " (car affix)) + 'save) + '("Accept (session)" session) + '("Accept (buffer)" buffer)) + '(("Save word" save) + ("Accept (session)" session) + ("Accept (buffer)" buffer))))) + (if (consp cor-menu) + (append cor-menu (cons "" save)) + save))) + (menu (mapcar + (lambda (arg) (if (consp arg) (car arg) arg)) + base-menu))) + (cadr (assoc (popup-menu* menu :scroll-bar t) base-menu)))) + (fset 'flyspell-emacs-popup 'flyspell-emacs-popup-textual))) ;; ============================================================================= ;; Programming Mode Hooks @@ -435,6 +502,8 @@ buffer is not visiting a file." (add-hook 'prog-mode-hook (lambda () (auto-fill-mode -1))) (add-hook 'prog-mode-hook (lambda () (subword-mode t))) +(add-hook 'prog-mode-hook 'flyspell-prog-mode) + ;; (add-hook 'prog-mode-hook (lambda () (highlight-lines-matching-regexp ;; ".\\{81\\}" 'hi-blue))) @@ -446,9 +515,8 @@ buffer is not visiting a file." :ensure t :commands helm-mode :bind (("M-y" . helm-show-kill-ring) - ("M-x" . helm-M-x)) - ;; :idle (helm-mode) - ;; :idle-priority 1 + ("M-x" . helm-M-x) + ("C-h a" . helm-apropos)) :init (progn (use-package helm-ag :ensure t :defer t)) @@ -547,6 +615,7 @@ buffer is not visiting a file." (add-hook 'emacs-lisp-mode-hook (lambda () (setq indent-tabs-mode nil))) (define-key lisp-mode-shared-map (kbd "C-c C-c") 'eval-defun) (define-key lisp-mode-shared-map (kbd "C-c C-f") 'find-function) +(define-key lisp-mode-shared-map (kbd "C-c C-v") 'find-variable) (define-key lisp-mode-shared-map (kbd "C-c C-r") 'eval-and-replace) ;; ============================================================================= @@ -618,8 +687,6 @@ buffer is not visiting a file." ;; Scala ;; ============================================================================= -;; (load "~/.emacs.d/lisp/ensime-imenu.el") - (use-package scala-mode2 :init (progn (add-hook 'scala-mode-hook @@ -635,8 +702,8 @@ buffer is not visiting a file." (progn (add-hook 'scala-mode-hook 'ensime-scala-mode-hook) (defun guide-key/scala-mode-hook () - (guide-key/add-local-guide-key-sequence "C-c C-v") - (add-hook 'scala-mode-hook 'guide-key/scala-mode-hook)) + (guide-key/add-local-guide-key-sequence "C-c C-v")) + (add-hook 'scala-mode-hook 'guide-key/scala-mode-hook) :ensure t)) (setq scala-indent:align-parameters t)) :mode (("\\.scala\\'" . scala-mode) @@ -800,11 +867,40 @@ buffer is not visiting a file." (defvar packages-appearance '(monokai-theme solarized-theme zenburn-theme base16-theme molokai-theme - tango-2-theme gotham-theme sublime-themes ansi-color rainbow-delimiters - smart-mode-line)) + tango-2-theme gotham-theme sublime-themes ansi-color rainbow-delimiters)) (ensure-packages-installed packages-appearance) +(use-package smart-mode-line + :ensure t + :disabled use-powerline) + +(defun powerline-simple-theme () + (interactive) + (setq mode-line-format + '("%e" + (:eval + (let* ((lhs (list (powerline-raw + (format " %s (%%l/%d) %%c " (downcase mode-name) + (line-number-at-pos (point-max))) nil 'l))) + (rhs (list (powerline-raw + (cond + ((not (buffer-file-name)) "_ ") + ((buffer-modified-p) "! ") + (t " ")) nil 'r))) + (center (list (powerline-raw "%b" nil)))) + (concat (powerline-render lhs) + (powerline-fill-center nil (/ (powerline-width center) 2.0)) + (powerline-render center) + (powerline-fill nil (powerline-width rhs)) + (powerline-render rhs))))))) + +(use-package powerline + :ensure t + :config + :disabled (not use-powerline) + (powerline-simple-theme)) + ;; No splash screen please... jeez (setq inhibit-startup-screen t) (blink-cursor-mode -1) @@ -823,8 +919,7 @@ buffer is not visiting a file." (add-hook 'compilation-filter-hook 'colorize-compilation-buffer) (defun modeline-setup () - (if (and (boundp 'use-powerline) use-powerline) - (powerline-default-theme) + (unless (and (boundp 'use-powerline) use-powerline) (progn (sml/setup) (sml/apply-theme 'automatic)))) @@ -884,7 +979,7 @@ buffer is not visiting a file." (condition-case exp (set-frame-font (random-choice fonts) nil t) ('error (package-refresh-contents) - (set-frame-font "monaco-11" nil t) nil))) + (set-frame-font "Monaco for Powerline-11" nil t) nil))) (defun remove-fringe-and-hl-line-mode (&rest stuff) (modeline-setup) diff --git a/load.d/erc-notify.el b/load.d/erc-notify.el deleted file mode 100644 index 6d1c990d..00000000 --- a/load.d/erc-notify.el +++ /dev/null @@ -1,65 +0,0 @@ -;;; Notify me when a keyword is matched (someone wants to reach me) - -(defvar my-erc-page-message "%s is calling your name." - "Format of message to display in dialog box") - -(defvar my-erc-page-nick-alist nil - "Alist of nicks and the last time they tried to trigger a -notification") - -(defvar my-erc-page-timeout 30 - "Number of seconds that must elapse between notifications from -the same person.") - -(defun my-erc-page-popup-notification (nick msg) - (notification-center-command (format "%s says:" nick) msg)) - -(defun my-erc-page-allowed (nick &optional delay) - "Return non-nil if a notification should be made for NICK. -If DELAY is specified, it will be the minimum time in seconds -that can occur between two notifications. The default is -`my-erc-page-timeout'." - (unless delay (setq delay my-erc-page-timeout)) - (let ((cur-time (time-to-seconds (current-time))) - (cur-assoc (assoc nick my-erc-page-nick-alist)) - (last-time)) - (if cur-assoc - (progn - (setq last-time (cdr cur-assoc)) - (setcdr cur-assoc cur-time) - (> (abs (- cur-time last-time)) delay)) - (push (cons nick cur-time) my-erc-page-nick-alist) - t))) - -(defun my-erc-page-me (match-type nick message) - "Notify the current user when someone sends a message that -matches a regexp in `erc-keywords'." - (interactive) - (when (and (eq match-type 'keyword) - ;; I don't want to see anything from the erc server - (null (string-match "\\`\\([sS]erver\\|localhost\\)" nick)) - ;; or bots - (null (string-match "\\(bot\\|serv\\)!" nick)) - ;; or from those who abuse the system - (my-erc-page-allowed nick)) - (my-erc-page-popup-notification nick))) - -(defun my-erc-page-me-PRIVMSG (proc parsed) - (let ((nick (car (erc-parse-user (erc-response.sender parsed)))) - (target (car (erc-response.command-args parsed))) - (msg (erc-response.contents parsed))) - (when (and (erc-current-nick-p target) - (not (erc-is-message-ctcp-and-not-action-p msg)) - (my-erc-page-allowed nick)) - (my-erc-page-popup-notification nick msg) - nil))) - -(add-hook 'erc-text-matched-hook 'my-erc-page-me) -(add-hook 'erc-server-PRIVMSG-functions 'my-erc-page-me-PRIVMSG) - -(defvar notify-function #'notification-center) - -(defun notification-center-command (title message) - (flet ((encfn (s) (encode-coding-string s (keyboard-coding-system)))) - (shell-command (format "osascript -e 'display notification \"%s\" with title \"%s\"'" - (encfn message) (encfn title))))) diff --git a/load.d/mu4e.el b/load.d/mu4e.el index 27ba40f9..8909fb37 100644 --- a/load.d/mu4e.el +++ b/load.d/mu4e.el @@ -4,6 +4,7 @@ (use-package mu4e :config (progn + (setq mu4e-compose-complete-only-after nil) (setq mu4e-maildir "~/Mail") (setq mu4e-drafts-folder "/[Gmail].Drafts") @@ -26,6 +27,11 @@ ;; allow for updating mail using 'U' in the main view: (setq mu4e-get-mail-command "offlineimap") + ;; show images + (setq mu4e-show-images t) + (add-hook 'mu4e-compose-mode-hook + (defun my-do-compose-stuff () (flyspell-mode))) + (setq mu4e-update-interval 15) ;; ;; something about ourselves ;; (setq