eintr: Mode Line

 
 16.14 A Modified Mode Line
 ==========================
 
 Finally, a feature I really like: a modified mode line.
 
    When I work over a network, I forget which machine I am using.  Also,
 I tend to I lose track of where I am, and which line point is on.
 
    So I reset my mode line to look like this:
 
      -:-- foo.texi   rattlesnake:/home/bob/  Line 1  (Texinfo Fill) Top
 
    I am visiting a file called ‘foo.texi’, on my machine ‘rattlesnake’
 in my ‘/home/bob’ buffer.  I am on line 1, in Texinfo mode, and am at
 the top of the buffer.
 
    My ‘.emacs’ file has a section that looks like this:
 
      ;; Set a Mode Line that tells me which machine, which directory,
      ;; and which line I am on, plus the other customary information.
      (setq-default mode-line-format
       (quote
        (#("-" 0 1
           (help-echo
            "mouse-1: select window, mouse-2: delete others ..."))
         mode-line-mule-info
         mode-line-modified
         mode-line-frame-identification
         "    "
         mode-line-buffer-identification
         "    "
         (:eval (substring
                 (system-name) 0 (string-match "\\..+" (system-name))))
         ":"
         default-directory
         #(" " 0 1
           (help-echo
            "mouse-1: select window, mouse-2: delete others ..."))
         (line-number-mode " Line %l ")
         global-mode-string
         #("   %[(" 0 6
           (help-echo
            "mouse-1: select window, mouse-2: delete others ..."))
         (:eval (mode-line-mode-name))
         mode-line-process
         minor-mode-alist
         #("%n" 0 2 (help-echo "mouse-2: widen" local-map (keymap ...)))
         ")%] "
         (-3 . "%P")
         ;;   "-%-"
         )))
 
 Here, I redefine the default mode line.  Most of the parts are from the
 original; but I make a few changes.  I set the _default_ mode line
 format so as to permit various modes, such as Info, to override it.
 
    Many elements in the list are self-explanatory: ‘mode-line-modified’
 is a variable that tells whether the buffer has been modified,
 ‘mode-name’ tells the name of the mode, and so on.  However, the format
 looks complicated because of two features we have not discussed.
 
    The first string in the mode line is a dash or hyphen, ‘-’.  In the
 old days, it would have been specified simply as ‘"-"’.  But nowadays,
 Emacs can add properties to a string, such as highlighting or, as in
 this case, a help feature.  If you place your mouse cursor over the
 hyphen, some help information appears (By default, you must wait
 seven-tenths of a second before the information appears.  You can change
 that timing by changing the value of ‘tooltip-delay’.)
 
    The new string format has a special syntax:
 
      #("-" 0 1 (help-echo "mouse-1: select window, ..."))
 
 The ‘#(’ begins a list.  The first element of the list is the string
 itself, just one ‘-’.  The second and third elements specify the range
 over which the fourth element applies.  A range starts _after_ a
 character, so a zero means the range starts just before the first
 character; a 1 means that the range ends just after the first character.
 The third element is the property for the range.  It consists of a
 property list, a property name, in this case, ‘help-echo’, followed by a
 value, in this case, a string.  The second, third, and fourth elements
 of this new string format can be repeated.
 
DONTPRINTYET     SeeText Properties (elisp)Text Properties, and see *noteMode
DONTPRINTYET     SeeText Properties (elisp)Text Properties, and see SeeMode

 Line Format (elisp)Mode Line Format, for more information.
 
    ‘mode-line-buffer-identification’ displays the current buffer name.
 It is a list beginning ‘(#("%12b" 0 4 ...’.  The ‘#(’ begins the list.
 
    The ‘"%12b"’ displays the current buffer name, using the
 ‘buffer-name’ function with which we are familiar; the ‘12’ specifies
 the maximum number of characters that will be displayed.  When a name
 has fewer characters, whitespace is added to fill out to this number.
 (Buffer names can and often should be longer than 12 characters; this
 length works well in a typical 80 column wide window.)
 
    ‘:eval’ says to evaluate the following form and use the result as a
 string to display.  In this case, the expression displays the first
 component of the full system name.  The end of the first component is a
 ‘.’ (period), so I use the ‘string-match’ function to tell me the length
 of the first component.  The substring from the zeroth character to that
 length is the name of the machine.
 
    This is the expression:
 
      (:eval (substring
              (system-name) 0 (string-match "\\..+" (system-name))))
 
    ‘%[’ and ‘%]’ cause a pair of square brackets to appear for each
 recursive editing level.  ‘%n’ says “Narrow” when narrowing is in
 effect.  ‘%P’ tells you the percentage of the buffer that is above the
 bottom of the window, or “Top”, “Bottom”, or “All”.  (A lower case ‘p’
 tell you the percentage above the _top_ of the window.)  ‘%-’ inserts
 enough dashes to fill out the line.
 
    Remember, you don’t have to like Emacs to like it—your own Emacs can
 have different colors, different commands, and different keys than a
 default Emacs.
 
    On the other hand, if you want to bring up a plain out-of-the-box
 Emacs, with no customization, type:
 
      emacs -q
 
 This will start an Emacs that does _not_ load your ‘~/.emacs’
 initialization file.  A plain, default Emacs.  Nothing more.