org-bars-mode
is a minor mode for org-mode
. It adds bars to the
virtual indentation provided by the built-in package org-indent
.
Be sure to read the limitations before trying
org-bars
.
Put org-bars.el in your load path and add this to your init file:
(require 'org-bars)
(add-hook 'org-mode-hook #'org-bars-mode)
org-bars
will respect the following org options you've already set:
org-indent-indentation-per-level
,org-cycle-level-faces
,org-n-level-faces
,org-level-faces
.If you want all the bars to have the same color, for instance
the color #8c8c8c
, set the variable org-bars-color-options
like this:
(setq org-bars-color-options '(:only-one-color t
:bar-color "#8c8c8c"))
If you want the bars to have the same colors as the headlines
depending of outline levels (this is the default), set the
variable org-bars-color-options
like this:
(setq org-bars-color-options nil)
You can add saturation and darkness to the bar's colors (when they
inherit the headline color) by setting the properties
:desaturate-level-faces
and :darken-level-faces
of the variable
org-bars-color-options
. For instance like this:
(setq org-bars-color-options '(:desaturate-level-faces 30
:darken-level-faces 15))
If org-bars-with-dynamic-stars-p
is set to t
(which is the
default value) the heading stars are dynamicaly replaced by the
stars defined in org-bars-stars
depending on the state of the
subtree.
The default heading stars are ◉
for empty headlines (:empty
), ▶
for folded headlines (:invisible
) and ▼
for open headlines
(:visible
).
If you want to modify the heading stars you can do it by modifying the
variable org-bars-stars
as follow:
(setq org-bars-stars '(:empty "*"
:invisible "+"
:visible "-"))
If you prefer the stars to have different faces than the headlines
faces, you can do it by setting the faces org-bars-star-empty
,
org-bars-star-invisible
and org-bars-star-visible
as shown below:
(custom-set-faces
'(org-bars-star-empty ((t (:foreground "#8c8c8c"))))
'(org-bars-star-invisible ((t (:foreground "#8c8c8c"))))
'(org-bars-star-visible ((t (:foreground "#8c8c8c")))))
If you use other commands than org-cycle
to modify the visibility of
the org tree, the stars won't be refreshed automatically. To make
those commands refreshed the stars, you can advise them with
the function org-bars-refresh-stars
.
If you are a user of org-superstar
or org-bullets
and you prefer
to keep using one of those packages over the dynamic stars of
org-bars
, this is possible.
You just have to set org-bars-with-dynamic-stars-p
to nil
like this:
(setq org-bars-with-dynamic-stars-p nil)
The tweak proposed here has the disadvantage to make org-cycle
not work correctly on items list (see: issue #5).
This is not specific to org-bars-mode
, but since org-bars-mode
update the heading stars when the visibility changes (if
org-bars-with-dynamic-stars-p
is set to t
), you might want to not
use the ellipsis ...
at the end of the folded headlines.
You can do this by adding this code snippet to your init file:
(defun org-no-ellipsis-in-headlines ()
"Remove use of ellipsis in headlines.
See `buffer-invisibility-spec'."
(remove-from-invisibility-spec '(outline . t))
(add-to-invisibility-spec 'outline))
(add-hook 'org-mode-hook 'org-no-ellipsis-in-headlines)
ps: note that you can't remove the ellipsis by setting org-ellipsis
variable to the empty string ""
.
If the font size of the headlines faces (org-level-1
, ...,
org-level-8
) are differents from the default font size, the bars
might not be continuous.
If headlines faces are set with face-remap-add-relative
, org-bars
offers no solution (see: limitations).
If headlines faces are defined by your theme or with
custom-set-faces
, you can use the variable
org-bars-extra-pixels-height
to fill the gaps between headlines and
regular lines.
For instance, you can set org-bars-extra-pixels-height
to 6
like
this:
(setq org-bars-extra-pixels-height 6)
This will make the bars on headlines 6
pixels taller. It seems to
fill the gaps.
The drawback is that this also increases the line height of all the headlines but not those of the level 1 that have no added bars.
This is far for being a perfect solution. But so far, I don't know how to do it better.
The default value of org-bars-extra-pixels-height
is 0
(modified
at commit: 762f6bb
).
If your value of line-spacing
is non-nil, the bars won't be
continuous. org-bars
offers no solution for this case (see:
limitations).
If you want to use org-bars-mode
and you are using company-mode
to
get inbuffer code completion, you must use company-posframe.
Indeed, org-bars-mode
uses images on the line-prefix
properties
and this makes the text in the company tooltip not aligned.
company-mode
doesn't cover this unusual case but as
company-posframe
uses child frame as tooltip (and not overlay)
everything is ok.
org-bars-mode
doesn't work on display that can't display images.line-spacing
is non-nil, the bars won't be
continuous. You'll have a gap of line-spacing
pixels between
each bar. In org-bars
, the bars are added modifying the text
properties line-prefix
and wrap-prefix
on the lines of the
buffer. But org-bars
doesn't touch the additional space
(controled by line-spacing
) put between lines when displaying
buffer. And I don't know how to modify/customize this space.
Please let me know if you know how to "control" this extra
space.face-remap-add-relative
to set the faces of the
headlines (org-level-1
, ..., org-level-8
), due to how the
height of those faces is calculated to produce the XPM images put
in the line-prefix
and wrap-prefix
text properties of the
buffer, this won't work correctly, and the bars might not be
continuous.org-inlinetask
seems to work but has not yet been covered properly.