I'm a writer (non-programmer) using org-mode mainly for prose notes/planning and writing.

I'm trying to enable first-line paragraph indents for text under Org headings. I discovered paragraph-indent-mode, and after enabling it to no effect, I finally realized that it doesn't work, and Org's normal ability to first-line indent also doesn't work, when org-indent-mode is enabled. With the latter enabled, M-i indents the whole paragraph.

Are the two features incompatible? Ideally I would have my text body indented under the headline as per normal org-indent-mode, and then M-i would allow me to further indent the first line of a paragraph from the new margin (if I wanted to).


  * org heading
    a paragraph nicely indented and aligned to the heading text (thx org-indent, you're really great, i'd hate to have to lose you just to enable first-line paragraph indents!). sentence sentence blah blah waffle waffle
        a new first-line indented prose paragraph starting here.

    and back to non-indented new paragraph still possible if i wanted to.

The idea is just to have the two types of paragraph breaks available.

I also have variable-pitch-mode and org-bullets-mode enabled.

edit: * M-i is bound to tab-to-tab-stop.

  • i'm running emacs 26.1 and org latest from melpa (9.3)

  • if i first run org-fill-paragraph, then the indentation works, but i don't at all like the idea of using that for my writing.

  • (i also have indent-tools installed (but disabled by default in org buffers). if i run indent-tools-indent, i also get whole paragraph indenting.)

  • Paragraphs usually require an empty line between them. Try doing M-x forward-paragraph at various places in your buffer and see what you get. In particular, a new first-line indented paragraph is no such thing: it is still part of the first paragraph.
    – NickD
    Commented Mar 4, 2020 at 23:26
  • Other than that, I find that M-i, which is bound to tab-to-tab-stop in my case, indents the first line of a paragraph as you want and the indentation survives a M-q (org-fill-paragraph).
    – NickD
    Commented Mar 4, 2020 at 23:29
  • thanks for the tip. i wouldn’t mind it not “really” being a paragraph if i could actually still insert it. with org-indent-mode enabled, i cannot do anything but indent an entire paragraph, which is a feature i never actually need. it’s more the visual flexibility that i’m after.
    – martian
    Commented Mar 5, 2020 at 21:46
  • Is M-i bound to tab-to-tab-stop in your case as it is in my case? I cannot reproduce the problem you are seeing. You might also add the org version (and possibly the emacs version) to your question: it might depend on the version.
    – NickD
    Commented Mar 5, 2020 at 22:06
  • it is indeed. with org-ident-mode enabled that command indents a whole paragraph (or actually, seeing as you definied an emacs paragraph for me: technically it indents all text until a newline). only with org-indent-mode disable does it indent only the first line of text. i take it by your comment that what i'm trying to achieve is possible and even normal... maybe i have some other half-baked config messing it up.
    – martian
    Commented Mar 6, 2020 at 2:50

1 Answer 1


What you're trying to do is not possible with org-indent-mode turned on. Maybe you can trick the mode by inserting some invisible character before inserting the space/tab:

(defun org-indent-paragraph ()
  (forward-line 0)
  (if (looking-at "^¶")
      (while (looking-at "^¶\\|[ \t]")
        (delete-char 1))
    (insert (propertize "¶" 'font-lock-face 'org-hide))
    (insert "\t")))

(add-to-list 'org-export-filter-plain-text-functions
             (lambda (text _backend _info)
               (replace-regexp-in-string "¶" "" text)))
  • hm nice. this is fine for my needs. the only thing is that my init errors on org-export-filter-plain-list-functions. i gather that part of the function is to remove the invisible characters on export?
    – martian
    Commented Mar 6, 2020 at 14:05
  • What is the error you're seeing?
    – jagrg
    Commented Mar 6, 2020 at 15:03
  • "Symbol's value as variable is void: org-export-filter-plain-text-functions"
    – martian
    Commented Mar 7, 2020 at 14:48
  • You may have to require ox.el: (require 'ox).
    – jagrg
    Commented Mar 8, 2020 at 0:06
  • still same issue with that. i'm unsure what's wrong there. i use org-export to various formats.... :/
    – martian
    Commented Mar 9, 2020 at 2:09

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.