remove buffer id of special buffer when construct mode-line
[dotfiles.git] / emacs.d / elisp / my-mode-line.el
index 5843635..6c528ce 100644 (file)
@@ -64,7 +64,11 @@ window type."
        (t
         4)))
 
-(defface my-powerline-hl-ws '((t (:background "red" :foreground "black" :inherit mode-line)))
+(defface my-powerline-hl-ws '((t (:background "blue" :foreground "black" :inherit mode-line)))
+  "My Powerline face 1 based on powerline-active1."
+  :group 'powerline)
+
+(defface my-powerline-ws-bg '((t (:background "blue" :foreground "black" :inherit mode-line)))
   "My Powerline face 1 based on powerline-active1."
   :group 'powerline)
 
@@ -72,15 +76,47 @@ window type."
   "Return the name list of workspaces gotten from `perspeen-modestring' without the properties."
   (split-string (substring-no-properties (cadr perspeen-modestring)) "|"))
 
+(defun my-get-selected-ws-name ()
+  (let ((ret))
+    (dolist (i (split-string (cadr perspeen-modestring) "|") ret)
+      (if (equal (car (text-properties-at 1 i))
+                'face)
+         (setq ret (substring-no-properties i))))))
+
 (defun my-build-left-below-mode-line (separator lface face1)
-  (let ((l))
+  (let ((l)
+       (selected-name (my-get-selected-ws-name))
+       (name-list (my-get-ws-name-list)))
     (setq l (list (powerline-raw " workspace " lface)))
-    (mapc (lambda (i)
-           (setq l (append l (list (powerline-raw i lface))))
-           (setq l (append l (list (funcall separator lface face1)))))
-         (my-get-ws-name-list))
+    (if (string= selected-name (car name-list))
+       (progn
+         (nconc l (list (funcall separator lface 'my-powerline-hl-ws)
+                        (powerline-raw (car name-list) 'my-powerline-hl-ws)
+                        (funcall separator 'my-powerline-hl-ws face1)))
+         (dolist (i (cdr name-list))
+           (nconc l (list (powerline-raw i face1)
+                          (funcall separator face1 face1)))))
+      (nconc l (list (funcall separator lface face1)))
+      (while name-list
+       (let ((current-selected (string= selected-name (car name-list)))
+             (next-selected (string= selected-name (cadr name-list))))
+         (nconc l (list (powerline-raw (car name-list) (if current-selected 'my-powerline-hl-ws face1))
+                        (funcall separator (if current-selected 'my-powerline-hl-ws face1) (if next-selected 'my-powerline-hl-ws face1)))))
+       (pop name-list)))
     l))
 
+(defun my-is-special-buffer ()
+  ;; suppose all buffer name started with a star is a special buffer.
+  (string-match "\*" (buffer-name)))
+
+(defun my-get-buffer-name-face (orignal-face &optional active)
+  (cond
+   ((not active) orignal-face)
+   (buffer-read-only 
+    'sd/buffer-view-active1)
+   ((and (buffer-modified-p) (not (my-is-special-buffer)))
+    'sd/buffer-modified-active1)
+   (t orignal-face)))
 
 (defun sd/powerline-center-theme_revised-2 ()
   "Setup a mode-line with major and minor modes centered."
@@ -91,65 +127,43 @@ window type."
                    (let* ((window-type (my-get-window-type))
                          (active (powerline-selected-window-active))
                          (my-face1 'sd/powerline-active1 )
-                          ;; (my-face-buffer-modified (if (and (sd/buffer-is-eshel-or-scratch) (buffer-modified-p) (not buffer-read-only)) 
-                          ;;                              'sd/buffer-modified-active1
-                          ;;                            (if buffer-read-only 'sd/buffer-view-active1
-                          ;;                              my-face1)))
                           (face1 'powerline-active1)
                           (face2 'powerline-active2)
-                          (separator-left (intern (format "powerline-%s-%s"
-                                                          (powerline-current-separator)
-                                                          (car powerline-default-separator-dir))))
-                          (separator-right (intern (format "powerline-%s-%s"
-                                                           (powerline-current-separator)
-                                                           (cdr powerline-default-separator-dir))))
-                         (lface (if (and (not active) (or (= window-type 3) (= window-type 6)))
-                                    face2
-                                  my-face1))
+                          (separator-left (intern (format "powerline-%s-%s" (powerline-current-separator) (car powerline-default-separator-dir))))
+                          (separator-right (intern (format "powerline-%s-%s" (powerline-current-separator) (cdr powerline-default-separator-dir))))
+                         (lface (if (and (not active) (or (= window-type 3) (= window-type 6))) face2 my-face1))
                          (cface (if active my-face1 face2))
-                         (rface (if (and (not active) (or (= window-type 2) (= window-type 5)))
-                                    face2
-                                  my-face1))
+                         (rface (if (and (not active) (or (= window-type 2) (= window-type 5))) face2 my-face1))
                           (lhs (cond ((or (= window-type 1) (= window-type 2))
-                                     (my-build-left-below-mode-line separator-left lface face1)
-                                     ;; (list (powerline-raw "==wwww===" 'powerline-active1))
-                                     ;; (list (powerline-raw " workspace " lface)
-
-                                     ;;            ;; workspaces
-                               
-                                           
-                                     ;;            (funcall separator-left lface 'my-powerline-hl-ws)
-                                     ;;            (powerline-raw " ws1 " 'my-powerline-hl-ws)
-                                     ;;            (funcall separator-left 'my-powerline-hl-ws lface)
-                                     ;;            (powerline-raw " ws2 " lface)
-                                     ;;            (funcall separator-left lface face1)
-                                     ;;            )
-                                     )
+                                     (my-build-left-below-mode-line separator-left lface face1))
                                     ((or (= window-type 3) (= window-type 6))
-                                     (list (powerline-buffer-id lface 'l)
-                                           (powerline-raw "%* " lface)
-                                           (funcall separator-left lface face1 )))
+                                     (list (powerline-buffer-id (my-get-buffer-name-face lface active) 'l)
+                                           (unless (my-is-special-buffer)
+                                             (powerline-raw "%* " (my-get-buffer-name-face lface active)))
+                                           (funcall separator-left (my-get-buffer-name-face lface active) face1 )))
                                     (t
                                      nil)))
-                          (center (if (or (= window-type 1) (= window-type 4))
-                                     (list (powerline-raw " " face1)
-                                           (funcall separator-right face1 cface)
-                                           (powerline-raw "%*" cface)
-                                           (powerline-buffer-id cface 'r)
-                                           (funcall separator-left cface face1))
-                                   nil)
-                          )
+                          (center (cond ((or (= window-type 1) (= window-type 4))
+                                        (list (powerline-raw " " face1)
+                                              (funcall separator-right face1 (my-get-buffer-name-face cface active))
+                                              (unless (my-is-special-buffer)
+                                                (powerline-raw "%*" (my-get-buffer-name-face cface active)))
+                                              (powerline-buffer-id (my-get-buffer-name-face cface active) 'r)
+                                              (funcall separator-left (my-get-buffer-name-face cface active) face1)))
+                                       (t
+                                        nil)))
                          (rhs (cond ((or (= window-type 1) (= window-type 3))
-                                     (list (funcall separator-right face1 rface)
-                                           (powerline-raw (format-time-string " %I:%M %p ") rface 'r)))
+                                     (list (powerline-raw (format-time-string "%Y-%m-%d %a") face1 'r)
+                                           (funcall separator-right face1 rface)
+                                           (powerline-raw (format-time-string " %I:%M %p ") rface 'r)))
                                     ((or (= window-type 2) (= window-type 5))
-                                     (list (funcall separator-right face1 rface)
-                                           (powerline-raw "%*" rface)
-                                           (powerline-buffer-id rface 'r)
-                                           (powerline-raw " " rface)))
+                                     (list (funcall separator-right face1 (my-get-buffer-name-face rface active))
+                                           (unless (my-is-special-buffer)
+                                             (powerline-raw "%*" (my-get-buffer-name-face rface active)))
+                                           (powerline-buffer-id (my-get-buffer-name-face rface active) 'r)
+                                           (powerline-raw " " (my-get-buffer-name-face rface active))))
                                     (t
-                                     nil))
-                              ))
+                                     nil))))
                      (concat (powerline-render lhs)
                              (powerline-fill-center face1 (/ (powerline-width center) 2.0))
                              (powerline-render center)
@@ -158,6 +172,9 @@ window type."
 
 (sd/powerline-center-theme_revised-2)
 
+
+
+
 (provide 'my-mode-line)
 ;;; my-mode-line.el ends here