I am configuring a CI/CD pipeline to process org-mode files into documentation, source code, and other file formats.

I would like to add a call to org-lint to do basic syntax checking against org files as part pipeline.

Unfortunately I haven't be able get the command line to work.

I've tried the following commands:

emacs --batch -l org -f org-lint org-lint-notes.org

emacs --batch -l org --eval '(org-lint)' org-lint-notes.org

But both return the error below:

Symbol’s function definition is void: org-lint

I'm not sure what I'm doing wrong.

Thanks for your help!

This code was tested using:
emacs version: GNU Emacs 25.2.1 (x86_64-unknown-cygwin, GTK+ Version 3.22.10)
org-mode version: 9.1.2

  • 1
    I am not sure but I doubt that org 9.1.2 was shipped with emacs 25.2.1. I think it was some 8.X version. Could it be that you installed org 9.1.2 with package-install? In that case you need to add -f package-initialize to use orgmode 9.1.2 with --batch. Further note that you should load the buffer you want to lint before you call -f org-lint. You can test which org version you are using with --batch and without package-initialize by emacs --batch -f org-version on the command line.
    – Tobias
    Jun 23, 2018 at 14:24
  • Note further that you should not need -l org since org-lint as well as org-versionare autoloaded.
    – Tobias
    Jun 23, 2018 at 14:28
  • @Tobias - Thank you! I completely forgot about loading package-initialize like publish.el does. I’ll do some research about loading buffer first and/or passing buffer name to org-lint. Thanks again!
    – Melioratus
    Jun 23, 2018 at 16:30

1 Answer 1


Calling org-lint against org-mode file from command-line

  1. Create an org-mode file

    • For example, create a new file named org-lint-ex1.org

      * Using =org-lint= to Check org-mode Syntax
      ** Inside emacs
      1. Open org-mode file in emacs.
      2. Invoke =org-lint= command
           M-x org-lint
          #+BEGIN_SR shell
           M-x org-lint
  2. Call org-lint from the command-line

    For example, to execute org-lint against the org-lint-ex1.org file use the following command:

    emacs --batch -f package-initialize --eval "(add-hook 'org-mode-hook 
          (lambda ()  
              (let* ((file-name (current-buffer))
                (Col1 'Line)
                (Col2 'Trust)
                (Col3 'Warning)
                (lint-report (org-lint))
              (princ (format \"file: %s\n%6s%6s%8s\n\" file-name Col1 Col2 Col3))
              (dolist (element lint-report)
               (setq report (car (cdr element)))
               (princ (format \"%6s%6s %7s\n\" (seq-elt report 0) (seq-elt report 1) (seq-elt report 2)))
          )))" org-lint-ex1.org 

    The output of the command should be similar to the following:

    file: org-lint-ex1.org
      Line Trust Warning
         8  high Missing language in source block
        12   low Possible incomplete block "#+BEGIN_SR shell"
        14   low Possible incomplete block "#+END_SRC"

Note: If using emacs version less than 25.x.x, update script code to call elt instead of seq-elt.

This code was tested using:
emacs version: GNU Emacs 25.2.1 (x86_64-unknown-cygwin, GTK+ Version 3.22.10)
org-mode version: 9.1.2

  • Say I want to use this in an automated manner, like a maybe a pre-commit hook or in a GitHub action for CI. How would I know if the command exited successfully or failed? Sep 6, 2023 at 7:46
  • @PauloPhagula if you grep the output for numbers you'll be able detect when the output contains warnings. No numbers means the org file passed the org-lint test. Does that help?
    – Melioratus
    Sep 7, 2023 at 17:06

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.