4

I got the following snippet in my init.el:

(define-minor-mode sticky-buffer-mode
  "Make the current window always display this buffer."
  nil " locked" nil
  (set-window-dedicated-p (selected-window) sticky-buffer-mode))
(global-set-key [f11] 'sticky-buffer-mode)

So, I can use F11 to lock one window, but the minor mode indicator "locked" shows in the mode line is not easy to see when more than one windows exist in one frame, so I wonder how can I change the color of mode-line-buffer-id or something like filename(locked) in mode line(change color would be better).

Note: the original version is able to toggle the status with the same key, so the modified version should be so. Since the minor mode is unnecessary, it would be better to modify define-minor-mode to defun.

CodyChan
  • 2,599
  • 1
  • 19
  • 33
  • Related, but not a duplicate: [How can I prevent a command from using specific windows?](http://emacs.stackexchange.com/q/2189/504) – itsjeyd Oct 18 '14 at 13:31

3 Answers3

5

You could install rich-minority from Melpa. It is a minor mode that can highlight or even hide certain minor modes from the mode line.

So you can configure it to highlight " locked" and to hide other stuff to make more space.

Here's an example.

(setq rm-text-properties '(("\\` locked\\'" 'face 'font-lock-warning-face))
(add-to-list 'rm-blacklist " company") ; company will be hidden.

You can also install smart-mode-line, which comes bundled with rich-minority.

Malabarba
  • 22,878
  • 6
  • 78
  • 163
  • 1
    Nice, did not know about `rich-minority` :) – itsjeyd Oct 17 '14 at 16:56
  • `rich-minority` and `smart-mode-line` are nice, but I have configured `defvar mode-line-cleaner-alist` to clean/rename the modes names and all other configurations like mode line color which are better with my Emacs color theme already in my init.el, so the above packages are basically unnecessary for me. – CodyChan Oct 18 '14 at 12:24
  • @CodyChan then the answer by itsjeyd should do what you want. He explains how to remap a face specifically in a buffer. Just use that to remap mode-line-buffer-id. – Malabarba Oct 18 '14 at 12:37
4

The following command toggles the dedicated status of a window and changes the color of the mode line:

(defun make-buffer-sticky ()
  "Make the current window always display this buffer."
  (interactive)
  (let* ((window (get-buffer-window (current-buffer)))
         (dedicated (window-dedicated-p window)))
    (if (not dedicated)
        (face-remap-add-relative 'mode-line '(:background "#0000FF"))
      (face-remap-add-relative 'mode-line '(:background "#FF0000")))
    (set-window-dedicated-p window (not dedicated))))

Bind it to a convenient key sequence:

(global-set-key (kbd "C-c s") 'make-buffer-sticky)

Currently, the command toggles between a red (#FF0000) and a blue (#0000FF) background for the mode line. You'll have to adjust the colors to your liking.


If you want to use the default mode line color (of your theme) for non-sticky buffers, you can do

M-x describe-face RET mode-line RET

to check the current background color of the mode line.

itsjeyd
  • 14,586
  • 3
  • 58
  • 87
1

I use make-buffer-sticky() function of @itsjeyd and change something. Here are i did:

I make new face by: (make-face 'mode-line-sticky-face) Then, in make-buffer-sticky() function i change to:

(defun make-buffer-sticky ()
  "Make the current window always display this buffer."
  (interactive)
  (let* ((window (get-buffer-window (current-buffer)))
         (dedicated? (window-dedicated-p window)))
    (if (not dedicated?)
        (progn
          (face-remap-add-relative 'mode-line-sticky-face
                                   '(:foreground "#8BE03C"))
          (message "Window '%s' is sticky now" (current-buffer))
          )
      (progn
        (face-remap-add-relative 'mode-line '(:background "#0D1011"))
        (message "window '%s' is normal" (current-buffer))
        ))
    (set-window-dedicated-p window (not dedicated?))))

I have a customization mode line:

(setq-default
 mode-line-format
 '(
   ;; Sticked mode line
   (:eval
    (let* ((window (get-buffer-window (current-buffer)))
           (sticky? (window-dedicated-p window)))
      (cond (sticky?
             (propertize "  ⚡" 'face 'mode-line-sticky-face))
            (t ""))))
   ;; Position, including warning for 78 columns
   (:propertize "%4l :" face mode-line-position-face)
   (:eval (propertize "%3c " 'face
                      (if (> (current-column) 78)
                          'mode-line-78col-face
                        'mode-line-position-face)))
   ;; emacsclient [default -- keep?]
   mode-line-client
   "  "
   ;; read-only or modified status
   (:eval
    (cond (buffer-read-only
           (propertize " RO " 'face 'mode-line-read-only-face))
          ((buffer-modified-p)
           (propertize " ** " 'face 'mode-line-modified-face))
          (t "      ")))
   "    "
   ;; directory and buffer/file name
   (:propertize (:eval (shorten-directory default-directory 30))
                face mode-line-folder-face)
   (:propertize "%b"
                face mode-line-filename-face)
   ;; narrow [default -- keep?]
   " %n "
   ;; mode indicators: vc, recursive edit, major mode, minor modes, process, global
   (vc-mode vc-mode)
   "  %["
   (:propertize mode-name
                face mode-line-mode-face)
   "%] "
   (:eval (propertize (format-mode-line minor-mode-alist)
                      'face 'mode-line-minor-mode-face))
   (:propertize mode-line-process
                face mode-line-process-face)
   (global-mode-string global-mode-string)
   "    "
   ))

You can see detail at the commit in my repo at here.

Screenshot

Not sticky: enter image description here Sticky: enter image description here

Hope it helped. :-)

NgaNguyenDuy
  • 111
  • 2