From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Cao Subject: Re: Special alignment in org-mode Date: Thu, 28 Apr 2016 02:56:52 +0000 Message-ID: References: Mime-Version: 1.0 Content-Type: multipart/alternative; boundary=001a113b1b76301075053182ae4e Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:46408) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1avc8V-0007Zx-FF for emacs-orgmode@gnu.org; Wed, 27 Apr 2016 22:57:04 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1avc8U-0001I0-8p for emacs-orgmode@gnu.org; Wed, 27 Apr 2016 22:57:03 -0400 Received: from mail-oi0-x231.google.com ([2607:f8b0:4003:c06::231]:34059) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1avc8U-0001Hw-1M for emacs-orgmode@gnu.org; Wed, 27 Apr 2016 22:57:02 -0400 Received: by mail-oi0-x231.google.com with SMTP id k142so70144152oib.1 for ; Wed, 27 Apr 2016 19:57:01 -0700 (PDT) In-Reply-To: List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: "Emacs-orgmode" To: John Kitchin Cc: emacs-orgmode@gnu.org --001a113b1b76301075053182ae4e Content-Type: text/plain; charset=UTF-8 Hi! This solution works fairly well with the headers themselves, but the actual content beneath the headers stays to the side of the buffer (as pictured: http://i.imgur.com/nGv8XBI.png). Would there be any way to fix this? David On Wed, Apr 27, 2016 at 9:47 AM John Kitchin wrote: > I think this does approximately what you want: > > #+BEGIN_SRC emacs-lisp :results none > (require 'ov) > > (defun org-max-heading-depth () > "Get maximum depth of a heading." > (let ((max-depth 0) > depth) > (org-map-entries (lambda () > (when (> (setq depth (car > (org-heading-components))) max-depth) > (setq max-depth depth)))) > max-depth)) > > > (defun org-right-align-overlay () > "Put an overlay on headline * to right align to maximum depth. > Should be run while on the headline." > (interactive) > (let* ((diff (- (org-max-heading-depth) (car (org-heading-components)))) > ov) > (while (and (setq ov (ov-at (match-beginning 1))) > (overlay-get ov 'right-align)) > (delete-overlay ov)) > > ;; (setq ov (make-overlay (line-beginning-position) (+ 1 > (line-beginning-position)))) > (setq ov (make-overlay (match-beginning 1) (+ 1 (match-beginning 1)))) > (overlay-put ov 'before-string (make-string diff ? )) > (overlay-put ov 'right-align t))) > > (defun org-right-align-clear () > (interactive) > (ov-clear 'right-align)) > > (defun align-matcher (&optional limit) > (while (re-search-forward org-heading-regexp limit t) > (org-right-align-overlay))) > > (add-to-list 'org-font-lock-hook 'align-matcher) > #+END_SRC > > Its only light tested, and may be slow on a long document because it is > checking the maximum depth each time. You could set this to a constant, > e.g. 8 if it is too slow. > > David Cao writes: > > > Hello, > > > > I was wondering if there is any way to right-align the header indicators > > while left-aligning the actual content. Unfortunately I haven't been able > > to find any mention of such a feature online. > > > > For example: > > > > * My fancy org file > > ** Header 2 > > Some content here > > *** Header 3 > > > > Thanks in advance! > > David > > > -- > Professor John Kitchin > Doherty Hall A207F > Department of Chemical Engineering > Carnegie Mellon University > Pittsburgh, PA 15213 > 412-268-7803 > @johnkitchin > http://kitchingroup.cheme.cmu.edu > --001a113b1b76301075053182ae4e Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Hi!

This solution works fairly well wit= h the headers themselves, but the actual content beneath the headers stays = to the side of the buffer (as pictured: http://i.imgur.com/nGv8XBI.png).
Would there be any w= ay to fix this?

David

On Wed, Apr 27, 2016 at 9:47 AM John Kitchin= <jkitchin@andrew.cmu.edu= > wrote:
I think this does appro= ximately what you want:

#+BEGIN_SRC emacs-lisp :results none
(require 'ov)

(defun org-max-heading-depth ()
=C2=A0 "Get maximum depth of a heading."
=C2=A0 (let ((max-depth 0)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 depth)
=C2=A0 =C2=A0 (org-map-entries (lambda ()
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0(when (> (setq depth (car (org-heading-components))) max-depth= )
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0(setq max-depth depth))))
=C2=A0 =C2=A0 max-depth))


(defun org-right-align-overlay ()
=C2=A0 "Put an overlay on headline * to right align to maximum depth.<= br> Should be run while on the headline."
=C2=A0 (interactive)
=C2=A0 (let* ((diff (- (org-max-heading-depth) (car (org-heading-components= ))))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ov)
=C2=A0 =C2=A0 (while (and (setq ov (ov-at (match-beginning 1)))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(overlay-get ov '= ;right-align))
=C2=A0 =C2=A0 =C2=A0 (delete-overlay ov))

=C2=A0 =C2=A0 ;; (setq ov (make-overlay (line-beginning-position) (+ 1 (lin= e-beginning-position))))
=C2=A0 =C2=A0 (setq ov (make-overlay (match-beginning 1) (+ 1 (match-beginn= ing 1))))
=C2=A0 =C2=A0 (overlay-put ov 'before-string (make-string diff ? ))
=C2=A0 =C2=A0 (overlay-put ov 'right-align t)))

(defun org-right-align-clear ()
=C2=A0 (interactive)
=C2=A0 (ov-clear 'right-align))

(defun align-matcher (&optional limit)
=C2=A0 (while (re-search-forward org-heading-regexp limit t)
=C2=A0 =C2=A0 (org-right-align-overlay)))

(add-to-list 'org-font-lock-hook 'align-matcher)
#+END_SRC

Its only light tested, and may be slow on a long document because it is
checking the maximum depth each time. You could set this to a constant,
e.g. 8 if it is too slow.

David Cao writes:

> Hello,
>
> I was wondering if there is any way to right-align the header indicato= rs
> while left-aligning the actual content. Unfortunately I haven't be= en able
> to find any mention of such a feature online.
>
> For example:
>
>=C2=A0 =C2=A0* My fancy org file
>=C2=A0 ** Header 2
>=C2=A0 =C2=A0 =C2=A0Some content here
> *** Header 3
>
> Thanks in advance!
> David


--
Professor John Kitchin
Doherty Hall A207F
Department of Chemical Engineering
Carnegie Mellon University
Pittsburgh, PA 15213
412-268-7803
@johnkitchin
http://kitchingroup.cheme.cmu.edu
--001a113b1b76301075053182ae4e--