This page is about libraries that highlight the current line of characters, so you can find it easily.
Library hl-spotlight.el extends standard library `
hl-line.el’. It spotlights the current few lines using a different face from that used by `
hl-line.el’. It is designed to be used together with library centered-cursor-mode.el, so that the lines surrounding the cursor remain highlighted, and these spotlighted lines remain in the center of the window.
hl-spotlight.el’ separates its spotlighting from your normal use of
‘hl-line’ highlighting. It does this in these ways:
‘hl-spotlight’. Typically, you might make this only slightly different from your normal background, whereas you might want the face you use for normal
‘hl-line’highlighting to stand out more.
‘hl-line-range-function’locally. Library `
hl-line.el’ uses that variable to specify how many lines to highlight. The width you use for spotlight highlighting affects only the spotlight – you can still have `
hl-line.el’ highlight only one line.
Library hl-line+.el extends standard library `
hl-line.el’ in several ways. It provides these commands:
‘toggle-hl-line-when-idle’– Highlight the current line whenever Emacs is idle more than a certain number of seconds.
‘flash-line-highlight’– Highlight the current line for
The idea for both of these is to let
‘hl-line-mode’ help you find the current line, but not keep highlighting it after you’ve found it.
In addition, library
hl-line+.el provides local and global modes (commands
‘global-hl-spotlight-mode’) to highlight several lines surrounding the cursor using a different face,
‘hl-spotlight’. You can enlarge or shrink this spotlight highlighting using command
‘hl-spotlight-enlarge’. You can repeat, via `
C-x z z z z…’, to enlarge or shrink the spotlight incrementally.
Spotlight highlighting can be used together with library centered-cursor-mode.el, by AndreRiemann, which keeps the cursor (hence also the spotlight) centered in the window. This can be helpful when reading text (as opposed to code). This is controlled by user option
Question: I’ve some troubles installing hl-line+.el. I copied
/usr/local/share/emacs/site-lisp (debian box), byte-compiled to
/usr/local/share/emacs/site-lisp/hl-line+.elc (with message “
** The following functions are not known to be defined: global-hl-line-highlight, global-hl-line-unhighlight”), and added
(require 'hl-line+) and
(toggle-cursor-type-when-idle 1) to my InitFile, but I get the error “
Symbol's function definition is void: toggle-cursor-type-when-idle” while loading it. What do I miss? Thanks. – host-84-221-75-6.cust-adsl.tiscali.it
There was a typo in the Commentary.
‘toggle-cursor-type-when-idle’ should be
‘toggle-hl-line-when-idle’. I corrected this in the latest version. Thx – DrewAdams
Question: In ~/.emacs
(toggle-hl-line-when-idle 1) now works, but
(flash-line-highlight 1) gives “Symbol’s function definition is void: global-hl-line-highlight”.
(require 'hl-line) and
(global-hl-line-mode 1) both work: so I suppose I’m loading
hl-line.el well. I cannot see its content, because it’s an .elc installed by debian emacs21 package (21.4). Thanks a lot… maybe I’ll upgrade. Bye!
You are apparently using Emacs 21, not Emacs 22. As the
Compatibility: field in the header of hl-line+.el states, it works with GnuEmacs 22. It is an extension of
hl-line.el of Emacs 22, where
‘global-hl-line-highlight’ is defined. You can try to see if
hl-line+.el works at all with Emacs 21, but all bets are off. To try that, you’ll need to tweak things a bit, to at least suppress the error message. It is useless to
(setq global-hl-line-highlight 1) – it is a function (in Emacs 22), not a variable. Thx – DrewAdams
For some reason, it seems that having
'hl-line-unhighlight-now permanently in
'pre-command-hook results in some freezes when scrolling. So I slightly modified hl-line+ in the following way (all it does is to run
hl-line-unhighlight-now exactly when needed)
(defun hl-line-toggle-when-idle (&optional arg) "Turn on or off using `global-hl-line-mode' when Emacs is idle. When on, use `global-hl-line-mode' whenever Emacs is idle. With prefix argument, turn on if ARG > 0; else turn off." (interactive "P") (setq hl-line-when-idle-p (if arg (> (prefix-numeric-value arg) 0) (not hl-line-when-idle-p))) (cond (hl-line-when-idle-p (timer-activate-when-idle hl-line-idle-timer) (message "Turned ON using `global-hl-line-mode' when Emacs is idle.")) (t (cancel-timer hl-line-idle-timer) (message "Turned OFF using `global-hl-line-mode' when Emacs is idle.")))) (defun hl-line-highlight-now () "Turn on `global-hl-line-mode' and highlight current line now." (unless global-hl-line-mode (global-hl-line-mode 1) (global-hl-line-highlight) (add-hook 'pre-command-hook 'hl-line-unhighlight-now) )) (defun hl-line-unhighlight-now () "Turn off `global-hl-line-mode' and unhighlight current line now." (global-hl-line-mode -1) (global-hl-line-unhighlight) (remove-hook 'pre-command-hook 'hl-line-unhighlight-now))
Question:. In Customize Mode, for example, highlighting with
hl-line-mode doesn’t work properly. Usually, every highlighted line has the background and foreground color of the face called
customize-face RET highlight RET). This works fine for all modes I’m using (e.g. Python, Java, AUCTeX) but not in Customize Mode. Here, some faces keep their colors, for example
custom-link. Depending on the face, this makes parts of the buffer unreadable. I use the Robin Hood ColorTheme. Thanks. – ditch
Please provide a clear recipe to produce the problem, starting with
emacs -Q. State your Emacs version and platform. Are you using hl-line+.el or only
hl-line.el? If you are using
hl-line+.el, do you also have the problem with only
hl-line.el. What happens if you don’t use
color-theme. Provide any other info you think might be pertinent. Always start from scratch (
emacs -Q), and provide the minimum recipe needed to reproduce the problem completely. Thx – DrewAdams
hl-line.el and emacs 188.8.131.52. After
emacs -Q I say M-x
global-hl-line-mode. The highlighted line differs from an unhighlighted line in that the highlighted line’s background color is
darkseagreen2 (default setting for face
highlight). When I move the cursor up in the
*scratch* buffer, there’s some red text. Moving the cursor over one of those lines has the following effect: foreground color stays red, background color changes from white to darkseagreen2 – works as expected. The question that arises is what happens if you highlight text which has a foreground color that is very similar or even equal to the
color-theme – usually the Robin Hood theme. When I switch to this theme the highlighting behaviour is different. The
highlight face now defines foreground and background color. This means that no matter what colors are used in a buffer, a highlighted line always has the same two colors with good contrast, avoiding the aforementioned problem of the
highlight face interfering with text color. This works fine in all the modes I need except for Customize Mode. Here, some faces like
custom-link “don’t care” about the
highlight face. They remain the same color when they are in a highlighted line. My knowledege of Emacs limited but I assume that there is some face property that blocks highlighting. Buttons, checkboxes, text fields, etc. in Customize Mode do it too but in their case it makes sense. I apologize for this lenghty explanation. I’m beginning to think that
hl-line.el might not be the right place to tackle this problem. Thanks. – ditch
Not sure I followed all of that. Perhaps someone else can help more. My impression is that you might want to file an Emacs bug:
‘M-x report-emacs-bug’. – DrewAdams
As usual, I seem to have a weird problem that no one else has. I’ll try to make it clear in the bug report. – ditch.
Question:. I’m using (toggle-hl-line-when-idle 1) in my ~/.emacs. and I don’t want to highlight line when I’m in Info mode or Help mode etc. I try to use (add-hook ‘Info-mode-hook ‘(lambda () (toggle-hl-line-when-idle -1))) but after I trigger this it turn off highlight on other buffers too. Is there a way to turn on/off this mode only for current buffer and how? – [[Yuanle?]]
Good question. No, I’m sorry, there is no simple way to do that. hl-line+.el uses only global hl-line mode. There is a single idle timer for this, and it has no notion of the current mode.
You might try to change the definition of
‘hl-line-idle-timer’ to run not
‘hl-line-highlight-now’, but some new command
‘hl-line-highlight-local-now’, which is like the global version but uses
‘hl-line-mode’ etc. instead of
‘global-hl-line-mode’ etc. You will need an unhighlight version too, etc.
If you do that and like what you end up with, I could add it to the library, if you like. – DrewAdams
Hi Drew, I have a simple patch that allow user to define modes that should not be highlighted by hl-line+. It’s based on a older version, but you get the idea.
+(defcustom hl-line-disable-for-modes '(Info-mode help-mode view-mode Man-mode) + "hl-line+ will not hl anything on these modes." + :type 'list + :group 'hl-line) + ... (defun hl-line-highlight-now () "Turn on `global-hl-line-mode' and highlight current line now." - (unless global-hl-line-mode - (global-hl-line-mode 1) - (global-hl-line-highlight) - (add-hook 'pre-command-hook 'hl-line-unhighlight-now))) + (if (not (member major-mode hl-line-disable-for-modes)) + (unless global-hl-line-mode + (global-hl-line-mode 1) + (global-hl-line-highlight) + (add-hook 'pre-command-hook 'hl-line-unhighlight-now))))
OK, I’ve added that (assuming you agree). I set the default value to
‘nil’, however. It’s not clear to me that any given nonempty list of modes would be good by default, especially since
‘hl-line-highlight-now’ can be called from other code. Thx – DrewAdams
of course I agree Thanks Drew. --sylecn
There is also Lisp:highlight-current-line.el
At least Gentoo ships a library with this name written and maintained by ViniciusJoseLatorre.
See PulseRegion, function