cleanup
authorIan Kelling <iank@fsf.org>
Fri, 4 Sep 2020 16:13:11 +0000 (12:13 -0400)
committerIan Kelling <iank@fsf.org>
Fri, 4 Sep 2020 16:13:11 +0000 (12:13 -0400)
init.el
misc-disabled.el

diff --git a/init.el b/init.el
index 021fc6c9ccfdcfd3cc8a34779c92a442ee4d39c3..61e347ecc8edfbf4c4a5654b8d923d40b436a663 100644 (file)
--- a/init.el
+++ b/init.el
@@ -1,4 +1,4 @@
-;; Copyright (C) 2019 Ian Kelling
+;; Copyright (C) 2020 Ian Kelling
 
 ;; This program is free software: you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
@@ -20,7 +20,7 @@
 
 ;;; init.el --- the start of customization
 
-;; (toggle-debug-on-error) ;uncomment to help debug
+(toggle-debug-on-error) ;uncomment to help debug
 
 
 ;; stop from minimizing & freezing the gui
@@ -49,8 +49,8 @@
 ;; 2019-6-26, 1.26s
 ;; ; to profile init:
 ;; ; uncomment the following block
- (require 'benchmark-init)
- (add-hook 'after-init-hook 'benchmark-init/deactivate)
+(require 'benchmark-init)
+(add-hook 'after-init-hook 'benchmark-init/deactivate)
 ;; ; Then run:
 ;; ; emacs -f benchmark-init/show-durations-tabulated
 ;; ; emacs -f benchmark-init/show-durations-tree
 
 
 ;; Ubiquitous Packages. these could go anywhere actually
-(use-package saveplace
-  :unless noninteractive
-  :config
-  (save-place-mode 1))
+
 ;; find file at point
 (use-package ffap)
 
 
+
+
 (setq package-archives
       (quote
        (("gnu" . "https://elpa.gnu.org/packages/")
 
 ;; avoid window config hook saving too much, it can
 ;; get into loops in some random situations
-(setq my-auto-save-last nil)
+(defvar my-auto-save-last nil)
+(defvar my-as nil)
+(defvar my-auto-save-last nil)
 (defun my-auto-save-win ()
   (unless (eq (current-buffer) my-auto-save-last)
     (my-auto-save (current-buffer))))
 
 (defun my-as-on-local (&rest ignore)
   (interactive)
-  (setq-local my-as on))
+  (setq-local my-as t))
 
 ;; based on suggestion in the emacs docs, redefine these 2 functions
 ;; to avoid prompt spamming the user when we do auto-save
@@ -505,6 +506,7 @@ A non-nil CURRENT-ONLY argument means save only current buffer."
       ;; assume hard linked files are done on purpose, don't screw them up
       backup-by-copying-when-linked t)
 
+(defvar last-backup-time 0)
 ;; todo, the time needs to be an integer, not a vector type thing
 (defun constant-backup ()
   "Backup conditioned on some time passing since last one.
@@ -549,18 +551,6 @@ A non-nil CURRENT-ONLY argument means save only current buffer."
 ;; lowest bound of functionality is actually about 15 input events
 ;; (setq auto-save-interval ...)
 
-;;; c-like settings
-;; change last thing from gnu.
-;; notably this avoids brace indent after if, and 4 space indent
-(setq c-default-style '((java-mode . "java")
-                        (awk-mode . "awk")
-                        (other . "stroustrup")))
-;; for emacs itself, use
-;; (setq c-default-style '((java-mode . "java")
-;;                         (awk-mode . "awk")
-;;                         (other . "gnu")))
-;; (setq-default c-basic-offset 2)
-
 ;;; color theme
 
 ;; A Theme builder is available at http://elpa.gnu.org/themes/ along with
@@ -573,7 +563,9 @@ A non-nil CURRENT-ONLY argument means save only current buffer."
   (while custom-enabled-themes
     (disable-theme (car custom-enabled-themes)))
   (load-theme arg t))
-(setq color-theme-is-global t)
+
+;; not a real var? remove when I see this again
+;;(setq color-theme-is-global t)
 
 ;; temporary, make night be default
 
@@ -645,9 +637,10 @@ A non-nil CURRENT-ONLY argument means save only current buffer."
 (use-package saveplace
   :unless noninteractive
   :config
-  save-place-version-control 'nospecial
-  save-place-limit 4000
-  save-place-file "~/.emacs.d/places"
+  (setq
+   save-place-version-control 'nospecial
+   save-place-limit 4000
+   save-place-file "~/.emacs.d/places")
   (save-place-mode 1))
 
 
@@ -667,202 +660,11 @@ A non-nil CURRENT-ONLY argument means save only current buffer."
 ;; dired - reuse current buffer by pressing 'a'
 (put 'dired-find-alternate-file 'disabled nil)
 
-;;; mu4e
-
-;; alsot tried notmuch, it had some glitches, and it's config has a list
-;; of folders which i'd rather not publish, so it's config is archived.
-
-;;(add-to-list 'load-path "/usr/local/share/emacs/site-lisp/mu4e")
-;;(add-to-list 'load-path "/usr/share/emacs/site-lisp/mu4e")
-;;  (require 'mu4e)
-
-;; (setq mu4e-headers-results-limit 2000)
-
-
-
-(defun my-mu4e-init ()
-  (setq mu4e-headers-fields (delq (assoc :mailing-list mu4e-headers-fields) mu4e-headers-fields))
-  ;; it's implemented in mu4e, but not in the actions list for
-  ;; some reason.
-  (add-to-list 'mu4e-view-actions
-               '("browser view" . mu4e-action-view-in-browser) t)
-
-  (add-to-list 'mu4e-headers-actions
-               '("from this sender" . mu4e-action-msgs-by-this-sender) t)
-  (add-to-list 'mu4e-view-actions
-               '("from this sender" . mu4e-action-msgs-by-this-sender) t)
-  ;; normally, you would add to this, but we want to
-  ;; modify unread messages. the first 4 are defined by default.
-  (setq mu4e-bookmarks
-        `( ,(make-mu4e-bookmark
-             :name  "Unread messages"
-             ;; old less restrictive unread, for adapting in the future:
-             ;; flag:unread AND NOT flag:trashed AND NOT maildir:/Junk AND NOT maildir:/fwfw AND NOT maildir:/log
-             :query "flag:unread maildir:/INBOX"
-             :key ?u)
-           ,(make-mu4e-bookmark
-             :name "Today's messages"
-             :query "date:today..now"
-             :key ?t)
-           ,(make-mu4e-bookmark
-             :name "Last 7 days"
-             :query "date:7d..now"
-             :key ?w)
-           ,(make-mu4e-bookmark
-             :name "Messages with images"
-             :query "mime:image/*"
-             :key ?p))
-        )
-  )
-
-(eval-after-load "mu4e" '(my-mu4e-init))
-
-(setq
- ;; message mode prompted me on first message.
- ;; a function which describes options then sets this
- ;; the other options were to use smtp directly or pass to another mail client
- ;; here we use the standard sendmail interface. This applies for gnus too.
- send-mail-function (quote sendmail-send-it)
- ;; https://github.com/djcb/mu/issues/1025
- mail-user-agent 'mu4e-user-agent
- ;; common to gnus. default sendmail-query-once asks us, then sets this via customize.
- send-mail-function (quote sendmail-send-it)
- ;; use the standard imap folders
- mu4e-sent-folder   "/Sent"
- mu4e-drafts-folder "/Drafts"
- mu4e-trash-folder  "/Trash"
- ;; reindex new mail this often in seconds
- ;; show addresses instead of just names
- mu4e-view-show-addresses t
- mu4e-use-fancy-chars t
- mu4e-confirm-quit nil
- mu4e-headers-leave-behavior 'apply ;; dont ask, do whatever was marked
- ;; default 500.
- mu4e-headers-results-limit 1000
- ;; tell exim to use from: as envelope from.
- ;; exim's default is use outgoing_msg_localpart@hostname.
- mail-specify-envelope-from t
-
- ;; looking up the list of maildirs when doing jo from summary
- ;; can take a few seconds if we have a ton of messages.
- ;; Only take that time for the first lookup.
- ;; if we add a new maildir, just restart mu4e for it to be in that list.
- mu4e-cache-maildir-list t
- ;; default is 8, way too small for my big monitors
- mu4e-headers-visible-lines 50
- message-sendmail-envelope-from 'header
- ;; trying this out
- ;;mu4e-view-use-gnus t
- ;; had problems where mu4e and gnus would hang verifying signatures, gnus man
- ;; said this should help, but it didnt work. they still got verified.
- ;; mm-verify-option 'never
- )
-
-;; fucks up reading unread bookmark. when that is fixed, enable it
-;; (setq mu4e-update-interval 60)
-
-
-;; this file includes setting up my email addresses, which are not public,
-;; including
-;; mu4e-user-mail-address-list
-;; and a function
-;; inspired by mu4e info manual, search for mu4e-compose-pre-hook.
-(when (file-exists-p "/p/c/mymu4e.el")
-  (load "/p/c/mymu4e.el"))
-
-(defun my-decrypt ()
-  ;; use for decrypting in mu4e
-  (interactive)
-  (beginning-of-buffer)
-  (when (search-forward "-----BEGIN PGP MESSAGE-----" nil t)
-    (read-only-mode 0)
-    (let ((start (match-beginning 0))
-          (end (search-forward "-----END PGP MESSAGE-----" nil t)))
-      (shell-command-on-region start end "gpg2 -dq" nil t shell-command-default-error-buffer t)
-      )))
-(add-hook 'mu4e-view-mode-hook 'my-decrypt)
-
-(defun iank-set-from-name (regexes)
-  "If we find an address matching regex, then set that address as the to,
-and whatever was used"
-  (when mu4e-compose-parent-message
-    (let ((found nil))
-      (while (and regexes (not found))
-        (setq re (car regexes)
-              regexes (cdr regexes)
-              found (mu4e-message-contact-field-matches
-                     mu4e-compose-parent-message :to re)))
-      (when found
-        (setq user-full-name (car found))
-        ;; we get an error unless we do this. that is a bug. I could
-        ;; send a patch...  also a bug: setting message-from-style nil
-        ;; doesnt work in mu4e unless user-full-name is also nil.
-        (unless user-full-name
-          (setq message-from-style nil))
-        (setq user-mail-address (cdr found)
-              mail-signature nil))
-      found)))
-(defun iank-set-from (regexes)
-  "If we find an address matching regex, then set that address as the to,
-and Ian Kelling as the name"
-  (when mu4e-compose-parent-message
-    (let ((found nil))
-      (while (and regexes (not found))
-        (setq re (car regexes)
-              sig (cadr regexes)
-              regexes (cddr regexes)
-              found (cdr (mu4e-message-contact-field-matches
-                          mu4e-compose-parent-message :to re))))
-      (when found (setq user-mail-address found
-                        user-full-name "Ian Kelling"))
-      found)))
-
-
-(defun mu-exit-wait ()
-  (interactive)
-  ;; taken from the mu source
-  (let* ((buf (get-buffer mu4e~proc-name))
-        (proc (and (buffer-live-p buf) (get-buffer-process buf))))
-    (mu4e-quit)
-    ;; without sleep, we get database locked by another process error when hitting u
-    ;; if another mu was running.
-    (if proc (sleep-for 0 1000))))
-
-(defun fsf-mu4e ()
-  (interactive)
-  (my-mu4e-commmon)
-  (setq
-   user-mail-address "iank@fsf.org"
-   iank-user-mail-address user-mail-address
-   ;; WARNING: be careful editing this, there needs to be a space after --, and my editor
-   ;; and git will automatically remove it unless i manually disable it.
-   mail-signature fsf-sig
-   ) ;; end setq
-  (add-hook 'mu4e-compose-pre-hook 'my-mu4e-to)
-  (mu4e))
-
-
-
-
-(defun mu4e-action-msgs-by-this-sender (msg)
-  "In header view, view messages by the sender of the message under point."
-  (let ((from (mu4e-message-field msg :from)))
-    (unless from
-      (mu4e-error "No from header for this message"))
-    ;; from is structured like: (("Anacron" . "root@x2.lan"))
-    (mu4e-headers-search (concat "f:" (cdar from)))))
-
-
-
 ;;; elisp settings
 ;; when manually evaluating lisp, go into debugger on error
 (setq eval-expression-debug-on-error t)
 
 
-(eval-after-load "python-mode"
-  '(progn
-     (define-key python-mode-map (kbd "C-j") nil)))
-
 ;;; isearch
 (setq
  isearch-allow-scroll t
@@ -987,50 +789,65 @@ and Ian Kelling as the name"
 ;; interactive modes don't need whitespace checks
 (defun interactive-lisp-coding-defaults ()
   (whitespace-mode -1))
-(setq prelude-interactive-lisp-coding-hook 'prelude-interactive-lisp-coding-defaults)
 
+;;; modes with little configuration needed
 
-;; ielm is an interactive Emacs Lisp shell
-(defun ielm-mode-defaults ()
-  (run-hooks 'prelude-interactive-lisp-coding-hook)
-  (turn-on-eldoc-mode))
-(add-hook 'ielm-mode-hook 'ielm-mode-defaults)
+(custom-set-variables
+ '(css-indent-offset 2)
+ '(sh-here-document-word "'EOF'")
+ '(outline-minor-mode-prefix "\ 3\ 1")
+ '(tramp-default-method "ssh")
+ ;; change last thing from gnu.
+ ;; notably this avoids brace indent after if, and 4 space indent
+ ;; for emacs itself, use
+ ;; (setq c-default-style '((java-mode . "java")
+ ;;                         (awk-mode . "awk")
+ ;;                         (other . "gnu")))
+ ;; (setq-default c-basic-offset 2)
+ '(c-default-style '((java-mode . "java")
+                     (awk-mode . "awk")
+                     (other . "stroustrup")))
+ )
 
-;;; modes with little configuration needed
 
-(setq outline-minor-mode-prefix "\ 3\ 1"
-      css-indent-offset 2
-      ;; auto indent shell script comments
-      sh-indent-comment t
-      sh-here-document-word "'EOF'"
-      tramp-default-method "ssh"
-      ;; ediff-buffers is the main command to use
-      ;; don't start another frame for the control panel
-      ;; unfortunately, this doesn't allow me to use 2 frames for the diff buffers
-      ;; so disable this temporarily with the next line if you want that
-      ;; sometime I should setup 2 functions to explicitly do each type
-      ediff-window-setup-function 'ediff-setup-windows-plain
-      ;;(setq ediff-window-setup-function 'ediff-setup-windows-default)
-      ;; do side by side diffs
-      ediff-split-window-function 'split-window-horizontally
-      ;; ediff things I tried which didn't work, which intuitively I think should
-      ;; work better: I can open the second diff buffer in a new frame, and
-      ;; close it's window in the first frame after starting ediff, but when I
-      ;; hit n to go to the next diff, it restores the window in the first
-      ;; frame. Another thing I tried is to open 2 new frames and set them up
-      ;; as I want. However, if I try to open the *Ediff Control Panel* buffer
-      ;; in a different window from its original one, my mouse jumps to one of
-      ;; the diff frames, or if that isn't visible, the buffer just hangs
-      ;; until I select the original ediff control panel window. This seems
-      ;; like a bug to me. I am using a very recent development version of
-      ;; emacs.
-
-      )
+(setq
+ ;; ediff-buffers is the main command to use
+ ;; don't start another frame for the control panel
+ ;; unfortunately, this doesn't allow me to use 2 frames for the diff buffers
+ ;; so disable this temporarily with the next line if you want that
+ ;; sometime I should setup 2 functions to explicitly do each type
+ ediff-window-setup-function 'ediff-setup-windows-plain
+ ;;(setq ediff-window-setup-function 'ediff-setup-windows-default)
+ ;; do side by side diffs
+ ediff-split-window-function 'split-window-horizontally
+ ;; ediff things I tried which didn't work, which intuitively I think should
+ ;; work better: I can open the second diff buffer in a new frame, and
+ ;; close it's window in the first frame after starting ediff, but when I
+ ;; hit n to go to the next diff, it restores the window in the first
+ ;; frame. Another thing I tried is to open 2 new frames and set them up
+ ;; as I want. However, if I try to open the *Ediff Control Panel* buffer
+ ;; in a different window from its original one, my mouse jumps to one of
+ ;; the diff frames, or if that isn't visible, the buffer just hangs
+ ;; until I select the original ediff control panel window. This seems
+ ;; like a bug to me. I am using a very recent development version of
+ ;; emacs.
+
+ )
 
 ;; disabled temporarily. todo, look into it
 ;;(add-hook 'outline-minor-mode-hook 'outshine-mode)
 
 
+
+;; this file includes setting up my email addresses, which are not public,
+;; including
+;; mu4e-user-mail-address-list
+;; and a function
+;; inspired by mu4e info manual, search for mu4e-compose-pre-hook.
+(when (file-exists-p "/p/c/mymu4e.el")
+  (load "/p/c/mymu4e.el"))
+
+
 (when (file-exists-p "/a/h/iank-mod.el")
   (load-file "/a/h/iank-mod.el"))
 
@@ -1059,18 +876,24 @@ and Ian Kelling as the name"
 ;; todo, put this on a hook with prog mode
 ;;(highlight-indentation-mode 1)
 
-(add-hook 'auto-revert-tail-mode-hook
-          (lambda ()
-            (when (string=
-                   buffer-file-name
-                   "/var/log/cloudman/development/cm-service.log")
-              (setq-local prev-auto-revert-max 0)
-              ;; set buffer-local hook
-              (add-hook 'after-revert-hook 'tail-colorize nil t))))
-(defun tail-colorize ()
-  (ansi-color-apply-on-region prev-auto-revert-max (point-max))
-  (setq-local prev-auto-revert-max (point-max)))
 
+;; example of a syntax highlighted tail
+(use-package autorevert
+  :defer t
+  :config
+  (defvar prev-auto-revert-max)
+  (defun tail-colorize ()
+    (ansi-color-apply-on-region prev-auto-revert-max (point-max))
+    (setq-local prev-auto-revert-max (point-max)))
+  (add-hook 'auto-revert-tail-mode-hook
+            (lambda ()
+              (when (string=
+                     buffer-file-name
+                     "/var/log/cloudman/development/cm-service.log")
+                (setq-local prev-auto-revert-max 0)
+                ;; set buffer-local hook
+                (add-hook 'after-revert-hook 'tail-colorize nil t))))
+  )
 
 ;; delete active selection with self-insert commands
 (delete-selection-mode t)
@@ -1080,7 +903,7 @@ and Ian Kelling as the name"
 
 ;; dot mode, repeats last action
 (require 'dot-mode)
-(add-hook 'find-file-hooks 'dot-mode-on)
+(add-hook 'find-file-hook 'dot-mode-on)
 
 ;; clean up obsolete buffers automatically at midnight
 (require 'midnight)
@@ -1245,9 +1068,6 @@ and Ian Kelling as the name"
       ring-bell-function 'ignore
       case-replace nil
       revert-without-query '(".*")
-      ;; don't pause display code on input.
-      ;; smoother display performance at slight cost of input performance
-      redisplay-dont-pause t
       font-lock-maximum-decoration t) ; probably default and not necesary
 
 
@@ -1341,7 +1161,7 @@ and Ian Kelling as the name"
 (defun fill-buffer ()
   (interactive)
   (save-mark-and-excursion
-    (beginning-of-buffer)
+    (goto-char (point-min))
     (while (= (forward-line) 0)
       (fill-paragraph))))
 
@@ -1434,72 +1254,6 @@ Go to the next directory based on where the cursor is."
 ;; make window title be the buffer name
 (setq frame-title-format "%b")
 
-;; -----------------------------
-;; fixing up the mode line
-;; modified from mastering emacs blog
-;; ----------------------------
-
-(defvar mode-line-cleaner-alist
-  `((auto-complete-mode . "")
-    (yas/minor-mode . "")
-    (paredit-mode . "")
-    (auto-fill-function . "")
-    (eldoc-mode . "")
-    (abbrev-mode . "")
-    (flyspell-mode . "")
-    (glasses-mode . "")
-    (dot-mode . "")
-    (yas-global-mode . "")
-    (yas-minor-mode . "")
-    (undo-tree-mode . "")
-    (volatile-highlights-mode . "")
-    (highlight-symbol-mode . "")
-    ;; Major modes
-    (lisp-interaction-mode . "λ")
-    (hi-lock-mode . "")
-    (python-mode . "Py")
-    (emacs-lisp-mode . "EL")
-    (nxhtml-mode . "nx"))
-  "Alist for `clean-mode-line'.
-
-  When you add a new element to the alist, keep in mind that you
-  must pass the correct minor/major mode symbol and a string you
-  want to use in the modeline *in lieu of* the original.")
-
-
-(defun clean-mode-line ()
-  (interactive)
-  (loop for cleaner in mode-line-cleaner-alist
-        do (let* ((mode (car cleaner))
-                  (mode-str (cdr cleaner))
-                  (old-mode-str (cdr (assq mode minor-mode-alist))))
-             (when old-mode-str
-               (setcar old-mode-str mode-str))
-             ;; major mode
-             (when (eq mode major-mode)
-               (setq mode-name mode-str)))))
-
-                                        ; disabled
-                                        ;  (add-hook 'after-change-major-mode-hook 'clean-mode-line)
-
-
-;; alias the new `flymake-report-status-slim' to
-;; `flymake-report-status'
-(defalias 'flymake-report-status 'flymake-report-status-slim)
-(defun flymake-report-status-slim (e-w &optional status)
-  "Show \"slim\" flymake status in mode line."
-  (when e-w
-    (setq flymake-mode-line-e-w e-w))
-  (when status
-    (setq flymake-mode-line-status status))
-  (let* ((mode-line " Φ"))
-    (when (> (length flymake-mode-line-e-w) 0)
-      (setq mode-line (concat mode-line ":" flymake-mode-line-e-w)))
-    (setq mode-line (concat mode-line flymake-mode-line-status))
-    (setq flymake-mode-line mode-line)
-    (force-mode-line-update)))
-
-
 (defun my-after-change-major-mode-hook ()
   (setq mode-line-mule-info nil
         minor-mode-alist nil
@@ -1614,7 +1368,6 @@ Go to the next directory based on where the cursor is."
   (variable-pitch-mode 0))
 (add-hook 'yaml-mode-hook 'variable-pitch-off)
 
-(eval-after-load "org" '(my-org-face-init))
 
 (defun my-org-face-init()
   (set-face-attribute 'org-table nil :family (face-attribute 'fixed-pitch :family))
@@ -1625,6 +1378,8 @@ Go to the next directory based on where the cursor is."
   (set-face-attribute 'org-date nil :family (face-attribute 'fixed-pitch :family))
   )
 
+(eval-after-load "org" '(my-org-face-init))
+
 (defun remove-org-binds ()
   (define-key org-mode-map (kbd "<M-return>") nil)
   (define-key org-mode-map (kbd "C-'") nil)
@@ -1789,15 +1544,19 @@ indent yanked text (with prefix arg don't indent)."
 
 
 ;;; tex
-(setq-default TeX-PDF-mode t) ; use pdf
-;; more sensible defaults based on info manual quickstart
-(setq TeX-auto-save t
-      TeX-parse-self t
-      ;; not documented, but looking at the source, I find this
-      ;; stops me from being asked what command on every C-c-c
-      ;; when doing a latex document.
-      TeX-command-force "LaTeX"
-      )
+
+(use-package latex-mode
+  :no-require t
+  :config
+  (setq-default TeX-PDF-mode t) ; use pdf
+  ;; more sensible defaults based on info manual quickstart
+  (setq TeX-auto-save t
+        TeX-parse-self t
+        ;; not documented, but looking at the source, I find this
+        ;; stops me from being asked what command on every C-c-c
+        ;; when doing a latex document.
+        TeX-command-force "LaTeX"
+        ))
 
 ;;; visible mark mode
 
@@ -2537,7 +2296,7 @@ modes like org-mode which have their own yank function."
 
 (global-set-key (kbd "M-g") 'abort-recursive-edit)
 
-;;;;; C-M-g - gnus
+;;;;; C-M-g - mu4e
 
 (global-set-key (kbd "C-M-g") 'mu4e)
 
index 2804aa639e505495b120ad1d107bc0a89e85491d..ac5fea81e8b31389f869393eb6f6c1791ff799ff 100644 (file)
 
 ;; Except in HTML
 (sp-local-pair 'html-mode "\"" nil :unless '(:rem sp-point-after-word-p))
+
+
+
+
+;; alias the new `flymake-report-status-slim' to
+;; `flymake-report-status'
+(defalias 'flymake-report-status 'flymake-report-status-slim)
+(defun flymake-report-status-slim (e-w &optional status)
+  "Show \"slim\" flymake status in mode line."
+  (when e-w
+    (setq flymake-mode-line-e-w e-w))
+  (when status
+    (setq flymake-mode-line-status status))
+  (let* ((mode-line " Φ"))
+    (when (> (length flymake-mode-line-e-w) 0)
+      (setq mode-line (concat mode-line ":" flymake-mode-line-e-w)))
+    (setq mode-line (concat mode-line flymake-mode-line-status))
+    (setq flymake-mode-line mode-line)
+    (force-mode-line-update)))