Emacs -- how to consolidate :lighter(s) for minor modes - emacs

Is it possible to consolidate :lighters on the mode-line when a certain combination of active minor modes exists? If so, then how please?
Example:
Minor mode number one has a :lighter of " -"
Minor mode number two has a :lighter of " +"
If both minor modes are active in the buffer, then consolidate lighters: " ±"

You can dynamically alter the lighter value for any minor MODE by modifying minor-mode-alist:
(setcar (cdr (assq 'MODE minor-mode-alist)) VALUE)
When either of your modes is activated or deactivated, check the status of the other, and set the lighter text accordingly. When both are active you can make one an empty string, and the other your 'combined' lighter.
Or, better, take advantage of the fact that any mode-line construct is valid, and make it automatic. Using delight.el as a wrapper for the above, and assuming both modes are defined by mylibrary.el you might say:
(delight '((mode+ (mode- " ±" " +") "mylibrary")
(mode- (mode+ "" " -") "mylibrary")))
That's not perfect -- if you want the associated pop-up menus to also combine the details of both modes, there's rather more to do; but I would recommend that you don't worry about that if you don't need to. The appearance of the mode line is the low-hanging fruit here.

Related

Key binding to change the face of a character

I'm curious as to whether or not there's a simple way to edit the face of a block of text using a function.
Specifically, I'm working on a calendar major mode that I created, and I want to define a function that will be bound to a keystroke within this major mode. I want to be able to mark a group of text, and then change its face using this keybinding to mark it as "done", etc.
I did some research and wasn't able to find this exact issue. Also, I know I can basically do this exact thing in org-mode, but I really want to create my own mode to enable more flexibility on my end.
If you are using the 3-month mini-calendar as a basis to create your major-mode, then there is already a facility to do this. To see how this looks like, type M-x calendar and then M-x calendar-mark-holidays. To see how this works, you can type M-x find-function RET calendar-mark-holidays RET and see that it uses the function calendar-mark-visible-date -- so there you have it, that is your function of interest. Drew Adams has a fancier calendar mark date that has some additional options: https://www.emacswiki.org/emacs/calendar%2B.el . These markings are overlays and can be controlled with priorities to have one supersede another so that it is not actually necessary to remove a color unless you want to.
Here is a quick example of a keyboard shortcut/function that uses the F5 key: (define-key calendar-mode-map [f5] (lambda () (interactive) (calendar-mark-visible-date (calendar-cursor-to-date 'signal-error) '(:background "yellow" :foreground "black"))))
Sounds like ad hoc, not syntax, highlighting: You want to manually choose specific arbitrary text to highlight, and you want to choose the highlighting face to use for this or that chosen bit of text.
You can use library Highlight (highlight.el) to do that.
Command hlt-choose-default-face chooses the face to use for subsequent highlighting (it reads a face name or a color name, with completion).
Another way to choose the highlighting face is to use command
hlt-next-face or hlt-previous-face. These cycle among a
smaller set of faces and background colors, the elements in the
list value of option hlt-auto-face-backgrounds. You can use a
numeric prefix argument with these commands to choose any of the
elements by its absolute position in the list.
There are commands (e.g., hlt-highlight) to highlight or unhighlight the active region, or you can drag the mouse to highlight (or unhighlight). By default they use the last default face you chose.
For persistent highlighting, see Temporary or Permanent Highlighting.

Some questions about emacs mode

As we know, mode is very important in emacs. But I feel I am not very clear about how to set it. For example, I often see something like (***-mode 1) or (***-mode) in .emacs file. And some tutorials also say that a mode can be set by M-x ***-mode. Could you tell me what's the differences between them and how to use them? Thanks!
A Lisp function is a piece of code which declares a name for another piece of code to be executed later.
(defun hello ()
(message "Hiya!"))
Now, you can invoke the named code from anywhere else in Lisp.
(hello)
Only at this point does the message form get executed.
Many Lisp functions contain an interactive form which specifies how they should behave when called interactively (for example, should it prompt for an argument, or use the cursor or mouse position as the argument, etc). Those which do can be invoked with M-x and the function name.
A major mode specifies a function which sets up some variables to exclusively control the behavior of Emacs. For example, M-x text-mode sets a (very basic) regime for word wrapping and cursor movement which is suitable for text files. When you are in text mode, you cannot be in C++ mode, or Lisp mode, or fundamental mode. These are other major modes which define different or additional functionality suitable for editing other types of text.
Because a major mode is exclusive, it is usually a function which doesn't take any arguments. So to put the current buffer in text mode, the Lisp code is simply
(text-mode)
Minor modes, by contrast, specify additional behavior which is independent from the major mode. For example, Overwrite mode specifies a different behavior when inserting text before some other text -- normally, Emacs pushes any existing text ahead, but when overwrite mode is active, existing text in front of the cursor will be replaced as you type.
You can have multiple minor modes active at any time -- you could have flyspell (spell checking as you type), tool bar mode, menu bar mode, and line number mode active at the same time as you are in text mode and overwrite mode.
Because of this, a common (though not universal) convention for minor modes is to perform a toggle. When you are already in toolbar mode, M-x toolbar-mode will disable this minor mode. To unambiguously disable the mode, pass it a negative numeric argument;
(toolbar-mode -1)
Without the argument, the code will toggle -- the result will depend on whether the mode was already active, or not.
(As noted in a comment, this changed in Emacs 24; I'm describing the historical behavior.)

Return to previous mode in Emacs

Is there a key binding to quit a mode and return to the previous mode in emacs?
For example suppose I entered line number mode using the following command:
Alt+x linum-mode
How can I quickly disable this mode and return to the mode which I was in before (not using the same command again)?
Why wouldn't you want to use the same command again?
M-xM-pRET
It doesn't get much simpler than that.
Edit: You can repeat M-p in that sequence to step back further in the command history, and you can search the command history with M-xC-r.
Also, when you disable a minor mode you're not "returning to the mode you were in before"; you're just disabling one (of many) minor modes which are all active at the same time.
Tangentially, the concept of "returning to the mode you were in before" could apply to major modes (as there's only ever one active major mode in a given buffer), but strictly speaking there's no notion of 'disabling' a major mode -- only of 'enabling' the one you wish to change to -- so to 'toggle' between two major modes, you would need to call them alternately.
Just repeat the same command: M-x linum-mode. Such minor-mode commands are toggles: on/off.
C-x z calls repeat - repeat last command.
Repeatedly calling a minor-mode enables/disables it.
One more way to do it is with smex: the last command
that you called with M-x kinda sticks around.
So you can enable linum-mode with smex, do a bunch of editing
with usual shortcuts and then disable linum-mode with
M-x RET.
A solution might follow the path kill-ring-save works: store the modes being active as current-modes-listing in a previous-modes-ring.
The code needed therefor exists basically inside describe-mode, see upward from "Enabled minor modes" - respective for the major mode.
Then a hook should check if this-command has "-mode" in it's name. If yes, check, if current modes-listing equals car of previous-modes-ring. If not, add new setting.
Finally write a command which sets current modes according to selected listing from previous-modes-ring.

Emacs: font-lock explanation

I'm using Emacs since a long time and I've customized it quite a lot. I've even written simple ELisp functions and now I'm starting to use macros more and more. I'm not anywhere near a knowledgable Emacs user but I'm not either a complete beginner.
I'm using nxhtml, mumamo, dired, ido, custom keybindings and so many things I added throughout the years that I don't remember all of them ; )
But there's something I really never understood: what is the "font-lock" mode and why should I care?
For example, I've read that nxhtml and nxml, if I recall correctly, do not use font-locking. Maybe I didn't understand that part well but in either way: what does it change for me, as a user?
Or take for example this description about WhiteSpace:
Note that when WhiteSpace is turned on, WhiteSpace saves the
font-lock state, that is, if font-lock is on or off. And WhiteSpace
restores the font-lock state when it is turned off. So, if WhiteSpace
is turned on and font-lock is off, WhiteSpace also turns on the
font-lock to highlight blanks, but the font-lock will be turned off
when WhiteSpace is turned off. Thus, turn on font-lock before
WhiteSpace is on, if you want that font-lock continues on after
WhiteSpace is turned off.
OK, fine. I understand that. But what does it change if font-lock continues after or not?
Basically I just don't "get it", no matter how much I read about the subject.
Any example/explanation as to what "font-lock" is under Emacs and why it concerns me would be most welcome!
font-lock-mode == colorful syntax highligthing. global-font-lock-mode enables font-locking for each and every mode in Emacs. Older Emacs version required you to enable it manually, newer version (23+ I think) enable this by default. I can't imagine that many people would want to turn off this feature, since it makes some type of content (like source code) immensely more readable. Every mode that uses font-lock relies on a certain set of faces - a combination of font properties like size, bold, underline, italic and color. The basic faces that most modes use are:
font-lock-builtin-face
font-lock-comment-face
font-lock-comment-delimiter-face
font-lock-constant-face
font-lock-doc-face
font-lock-doc-string-face
font-lock-function-name-face
font-lock-keyword-face
font-lock-negation-char-face
font-lock-preprocessor-face
font-lock-string-face
font-lock-type-face
font-lock-variable-name-face
font-lock-warning-face
You can easily override their values if you'd like them (or use a different color-theme). Some modes happen to define additional faces as well.
It displays your code with all the different colors (red for comments, green for class names, etc). If it's off, you get black-and-white code instead. Open up some code and execute M-x font-lock-mode a couple times to watch it switch on and off.

Why might my Emacs use spaces instead of tabs?

I am trying to diagnose this problem. TAB creates 4 spaces instead of a 4 col TAB like I want. But I don't think it should because C-h v indent-tabs-mode on the buffer in question says it is set to t. When I check my keybindings, TAB is set to c-indent-line-or-region. Does this function ignore my tabs-mode?
Tabs and indentation in Emacs is a considerably more complex subject than most people anticipate. I highly recommend spending some time reading about it -- it will almost certainly save you some confusion in the long run.
The following page at the Emacs Wiki groups together most of the relevant discussion:
http://www.emacswiki.org/emacs/CategoryIndentation
There's quite a lot there, but it's worth looking through.
One or other of the TabsAreEvil and SmartTabs configurations is quite likely to be appealing to you, btw, depending on your personal opinions on the subject!
Make sure you read the page on the tab-stop-list variable. It's tucked away near the bottom of that list of links, but it's critical to understanding the behaviour of tabs in the absence of automated-indentation rules, along with things like 'tabify'.
ruler-mode is useful here as well. I enable it automatically with text-mode:
;; Use ruler in text-mode
(add-hook 'text-mode-hook
(function (lambda ()
(setq ruler-mode-show-tab-stops t)
(ruler-mode 1))))
I figured out the problem. It was inserting a tab character after all. It turns out I thought it wasn't because when I hit backspace that key is bound to c-electric-backspace, which looks at the variable c-backspace-function which was set to backward-delete-char-untabify, which IMO defeats the purpose of having tabs.
Check tab-width variable. If it is 8 (the default), then Emacs of course has to insert four spaces since a tab would be "too much".
Check of the file for Emacs "File Local Variables". These specially formatted lines can override your settings when that file is loaded.
Here is an example from the bottom of a bit of Ruby code, forcing indent to 2 spaces, and tabs converted to spaces:
# Local Variables:
# tab-width: 2
# ruby-indent-level: 2
# indent-tabs-mode: nil
# End:
Be sure to take a look at the first line of the file as well. If you see something like
// -- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil --
This line will override any global or mode settings.