branch: elpa/casual
commit db9e647b8d71b1d13d02a063ac7c7a36e229862d
Merge: e330177f9f 6847308bdc
Author: Charles Choi <[email protected]>
Commit: GitHub <[email protected]>

    Merge pull request #382 from kickingvegas/371-build-casual-org
    
    Add Casual Org Support
---
 docs/casual.info                                   | Bin 164640 -> 172951 bytes
 docs/casual.org                                    |   6 +
 docs/images/casual-org-block-src-screenshot.png    | Bin 0 -> 97916 bytes
 docs/images/casual-org-body-screenshot.png         | Bin 0 -> 162419 bytes
 docs/images/casual-org-checkbox-screenshot.png     | Bin 0 -> 117084 bytes
 docs/images/casual-org-heading2-screenshot.png     | Bin 0 -> 169924 bytes
 docs/images/casual-org-headline-screenshot.png     | Bin 0 -> 185739 bytes
 docs/images/casual-org-item-screenshot.png         | Bin 0 -> 113578 bytes
 docs/images/casual-org-keyword-screenshot.png      | Bin 0 -> 106788 bytes
 docs/images/casual-org-settings-screenshot.png     | Bin 0 -> 62177 bytes
 docs/images/casual-org-table-fedit-screenshot.png  | Bin 0 -> 116320 bytes
 docs/images/casual-org-table-layout-screenshot.png | Bin 0 -> 60143 bytes
 docs/images/casual-org-table-screenshot.png        | Bin 0 -> 132595 bytes
 docs/images/casual-org-tblfm-screenshot.png        | Bin 0 -> 103599 bytes
 docs/org.org                                       | 183 +++++
 lisp/Makefile                                      |   6 +-
 lisp/Makefile-dired.make                           |   8 +-
 lisp/Makefile-info.make                            |   8 +-
 lisp/Makefile-lib.make                             |   8 +-
 lisp/{Makefile-info.make => Makefile-org.make}     |  18 +-
 lisp/casual-lib.el                                 |  22 +
 lisp/casual-org-settings.el                        | 250 ++++++
 lisp/casual-org-utils.el                           | 846 +++++++++++++++++++++
 lisp/casual-org.el                                 | 116 +++
 lisp/casual.el                                     |   3 +
 tests/Makefile                                     |   5 +
 tests/casual-org-test-utils.el                     |  41 +
 tests/test-casual-org-settings.el                  | 156 ++++
 tests/test-casual-org-utils.el                     |  42 +
 tests/test-casual-org.el                           | 445 +++++++++++
 tests/test-casual-org.org                          |  81 ++
 31 files changed, 2234 insertions(+), 10 deletions(-)

diff --git a/docs/casual.info b/docs/casual.info
index 9d22640a80..9bfac06ff7 100644
Binary files a/docs/casual.info and b/docs/casual.info differ
diff --git a/docs/casual.org b/docs/casual.org
index 048c6ead06..60f7be4239 100644
--- a/docs/casual.org
+++ b/docs/casual.org
@@ -55,6 +55,10 @@ Copyright © 2024-2025 Charles Y. Choi
 * Introduction
 #+CINDEX: Introduction
 ** Motivations
+:PROPERTIES:
+:CUSTOM_ID: motivations
+:END:
+
 #+CINDEX: Motivations
 
 #+TEXINFO: @subheading Goals
@@ -164,6 +168,7 @@ Configuration of a particular Casual user interface is 
performed per mode. Go to
 - [[#i-search-install][I-Search]]
 - [[#make-mode-install][Make]]
 - [[#man-install][Man]]
+- [[#org-install][Org]]
 - [[#re-builder-install][Re-Builder]]
 - [[#timezone-install][Timezone]]
 
@@ -291,6 +296,7 @@ The following modes are supported by Casual:
 #+INCLUDE: "./isearch.org" :minlevel 2
 #+INCLUDE: "./make-mode.org" :minlevel 2
 #+INCLUDE: "./man.org" :minlevel 2
+#+INCLUDE: "./org.org" :minlevel 2
 #+INCLUDE: "./re-builder.org" :minlevel 2
 #+INCLUDE: "./timezone.org" :minlevel 2
   
diff --git a/docs/images/casual-org-block-src-screenshot.png 
b/docs/images/casual-org-block-src-screenshot.png
new file mode 100644
index 0000000000..f5a857de02
Binary files /dev/null and b/docs/images/casual-org-block-src-screenshot.png 
differ
diff --git a/docs/images/casual-org-body-screenshot.png 
b/docs/images/casual-org-body-screenshot.png
new file mode 100644
index 0000000000..c98bf11b7e
Binary files /dev/null and b/docs/images/casual-org-body-screenshot.png differ
diff --git a/docs/images/casual-org-checkbox-screenshot.png 
b/docs/images/casual-org-checkbox-screenshot.png
new file mode 100644
index 0000000000..2441a32f4c
Binary files /dev/null and b/docs/images/casual-org-checkbox-screenshot.png 
differ
diff --git a/docs/images/casual-org-heading2-screenshot.png 
b/docs/images/casual-org-heading2-screenshot.png
new file mode 100644
index 0000000000..3ec7d22564
Binary files /dev/null and b/docs/images/casual-org-heading2-screenshot.png 
differ
diff --git a/docs/images/casual-org-headline-screenshot.png 
b/docs/images/casual-org-headline-screenshot.png
new file mode 100644
index 0000000000..1d592ad055
Binary files /dev/null and b/docs/images/casual-org-headline-screenshot.png 
differ
diff --git a/docs/images/casual-org-item-screenshot.png 
b/docs/images/casual-org-item-screenshot.png
new file mode 100644
index 0000000000..73fe57b522
Binary files /dev/null and b/docs/images/casual-org-item-screenshot.png differ
diff --git a/docs/images/casual-org-keyword-screenshot.png 
b/docs/images/casual-org-keyword-screenshot.png
new file mode 100644
index 0000000000..e3d054e25a
Binary files /dev/null and b/docs/images/casual-org-keyword-screenshot.png 
differ
diff --git a/docs/images/casual-org-settings-screenshot.png 
b/docs/images/casual-org-settings-screenshot.png
new file mode 100644
index 0000000000..ba16a47e84
Binary files /dev/null and b/docs/images/casual-org-settings-screenshot.png 
differ
diff --git a/docs/images/casual-org-table-fedit-screenshot.png 
b/docs/images/casual-org-table-fedit-screenshot.png
new file mode 100644
index 0000000000..95b5693088
Binary files /dev/null and b/docs/images/casual-org-table-fedit-screenshot.png 
differ
diff --git a/docs/images/casual-org-table-layout-screenshot.png 
b/docs/images/casual-org-table-layout-screenshot.png
new file mode 100644
index 0000000000..7fa2486e29
Binary files /dev/null and b/docs/images/casual-org-table-layout-screenshot.png 
differ
diff --git a/docs/images/casual-org-table-screenshot.png 
b/docs/images/casual-org-table-screenshot.png
new file mode 100644
index 0000000000..bbb3081cd6
Binary files /dev/null and b/docs/images/casual-org-table-screenshot.png differ
diff --git a/docs/images/casual-org-tblfm-screenshot.png 
b/docs/images/casual-org-tblfm-screenshot.png
new file mode 100644
index 0000000000..b5c7fc5636
Binary files /dev/null and b/docs/images/casual-org-tblfm-screenshot.png differ
diff --git a/docs/org.org b/docs/org.org
new file mode 100644
index 0000000000..94bf314200
--- /dev/null
+++ b/docs/org.org
@@ -0,0 +1,183 @@
+* Org
+#+CINDEX: Org
+#+VINDEX: casual-org-tmenu
+
+Casual Org is a keyboard-driven user interface for Org mode 
([[info:org#Top][org#Top]]). It endeavors to provide /context-sensitive/ 
assistance by providing structure-related commands based on where the point 
(cursor) is in an Org document.
+
+The Casual Org main menu (~casual-org-tmenu~) supports basic Emacs-style point 
navigation ([[info:emacs#Moving Point][emacs#Moving Point]]) in the buffer 
while the menu is still raised. As the point is moved, the menu will adjust to 
provide structure-related commands.
+
+For example, if the point is in an Org headline, the following menu is shown 
with headline-related commands at the top of the menu.
+
+[[file:images/casual-org-headline-screenshot.png]]
+
+If the point is moved to a table section, the upper part of the menu adjusts 
to provide table-related commands.
+
+[[file:images/casual-org-table-screenshot.png]]
+
+Casual Org has no intent to [[#motivations][exhaustively support all Org 
commands]]. Rather, Casual Org is an opinionated UX design exercise in 
providing a curated set of context-sensitive commands to a user.
+
+# TODO: Add Design Assumptions
+
+** Org Install
+:PROPERTIES:
+:CUSTOM_ID: org-install
+:END:
+
+#+CINDEX: Org Install
+
+In your initialization file, bind the Transient menus ~casual-org-tmenu~ and 
~casual-org-table-fedit-tmenu~ to your key binding of preference.
+
+#+begin_src elisp :lexical no
+  (keymap-set org-mode-map "M-m" #'casual-org-tmenu)
+  (keymap-set org-table-fedit-map "M-m" #'casual-org-table-fedit-tmenu)
+#+end_src
+
+The binding {{{kbd(M-m)}}} is intended to complement the binding 
{{{kbd(C-o)}}} used by [[#editkit-install][EditKit]].
+
+** Org Usage
+#+CINDEX: Org Usage
+
+The primary Org menu ~casual-org-tmenu~ dynamically configures itself with 
respect to the type of Org structure ([[info:org#Document 
Structure][org#Document Structure]]) the point is in. More detail on what menu 
variants are available for each structure are described in the links below.
+
+Most of the menu variants have a common set of sections as shown below. These 
sections are:
+
+- Link :: Commands related to Org links and citation.
+- Timestamp :: Timestamp-related commands.
+- Clock :: Clock-related commands.
+- Display :: Display-related commands.
+- Navigation :: Navigation-related commands using basic Emacs-style key 
bindings.
+- Mark :: Structural-marking commands.
+- Org :: Miscellaneous Org commands.
+
+Depending on the Org structure the point is in, some subset of the above 
sections are made available.
+
+[[file:images/casual-org-body-screenshot.png]]
+
+*** Org Headline
+:PROPERTIES:
+:CUSTOM_ID: org-usage-headline
+:END:
+
+[[file:images/casual-org-headline-screenshot.png]]
+
+When the point is in a headline ([[info:org#Headlines][org#Headlines]]) the 
following sections are displayed in ~casual-org-tmenu~:
+
+- Headline :: Commands that operate on a headline.
+- Add :: Commands that add a headline.
+- Annotate :: Commands that add annotations (metadata) to a headline.
+- Date :: Date-related commands.
+- Priority :: Prioritization-related commands.
+- Misc :: Miscellaneous commands.
+  
+  
+*** Org Body
+:PROPERTIES:
+:CUSTOM_ID: org-usage-body
+:END:
+
+When the point is not in any Org structure it is considered "body" text and 
the following variant of ~casual-org-tmenu~ is shown.
+
+[[file:images/casual-org-body-screenshot.png]]
+
+*** Org List
+:PROPERTIES:
+:CUSTOM_ID: org-usage-list
+:END:
+
+When the point is in a list item ([[info:org#Plain Lists][org#Plain Lists]]) 
the following sections are displayed in ~casual-org-tmenu~:
+
+- Item :: List item related commands.
+- Checkbox :: Checkbox related commands.
+  
+[[file:images/casual-org-item-screenshot.png]]
+
+
+#+TEXINFO: @subheading Checkbox
+
+A list item can be converted to and from a checkbox using the “{{{kbd(b)}}} 
Toggle Checkbox” command. Note that the *Checkbox* section in the menu is 
enabled when the point is on a checkbox item.
+
+[[file:images/casual-org-checkbox-screenshot.png]]
+
+
+*** Org Table
+:PROPERTIES:
+:CUSTOM_ID: org-usage-table
+:END:
+
+When the point is in a table ([[info:org#Tables][org#Tables]]) the following 
sections are displayed in ~casual-org-tmenu~:
+
+- Table :: Miscellaneous table-related commands.
+- Edit :: Table-specific editing commands.
+- Region :: Region-specific editing commands.
+- Compute :: Table-specific compute commands.
+- Display :: Table-specific display commands.
+  
+  
+[[file:images/casual-org-table-screenshot.png]]
+
+#+TEXINFO: @subheading Table Formulas (TBLFM)
+
+If the point is on a ~TBLFM~ keyword ([[info:org#Field and range 
formulas][org#Field and range formulas]]), then the following menu variant of 
~casual-org-tmenu~ is displayed.
+
+[[file:images/casual-org-tblfm-screenshot.png]]
+
+#+TEXINFO: @subheading Org Table Layout
+#+VINDEX: casual-org-table-structure-tmenu
+
+From the *Table* section in ~casual-org-tmenu~, selecting “{{{kbd(l)}}} 
Layout” will raise the table layout menu (~casual-org-table-structure-tmenu~). 
Use this menu to make structural edits to the table.
+
+
+[[file:images/casual-org-table-layout-screenshot.png]]
+
+
+#+TEXINFO: @subheading Org Table Formula Edit
+#+VINDEX: casual-org-table-fedit-tmenu
+
+When editing formulas for a table, the menu ~casual-org-table-fedit-tmenu~ can 
be raised to provide assistance with table references.
+
+[[file:images/casual-org-table-fedit-screenshot.png]]
+
+
+*** Org Block
+:PROPERTIES:
+:CUSTOM_ID: org-usage-block
+:END:
+
+When the point is in a block ([[info:org#Blocks][org#Blocks]]) the following 
variant is displayed in ~casual-org-tmenu~:
+
+[[file:images/casual-org-block-src-screenshot.png]]
+
+Numerous different block types are recognized by ~casual-org-tmenu~. They are:
+
+- Source (~#+BEGIN_SRC~)
+- Example (~#+BEGIN_EXAMPLE~)
+- Quote (~#+BEGIN_QUOTE~)
+- Export (~#+BEGIN_EXPORT~)
+- Center (~#+BEGIN_CENTER~)
+- Verse (~#+BEGIN_VERSE~)
+
+*** Org Keyword
+:PROPERTIES:
+:CUSTOM_ID: org-usage-keyword
+:END:
+
+When the point is in an Org keyword the following variant is displayed in 
~casual-org-tmenu~:
+[[file:images/casual-org-keyword-screenshot.png]]
+
+
+*** Org Settings
+:PROPERTIES:
+:CUSTOM_ID: org-usage-settings
+:END:
+
+Use the Casual Org Settings menu to gain access to commonly customized Org 
settings.
+
+[[file:images/casual-org-settings-screenshot.png]]
+
+*** Org Unicode Symbol Support
+:PROPERTIES:
+:CUSTOM_ID: org-unicode-symbol-support
+:END:
+
+By enabling “{{{kbd(u)}}} Use Unicode Symbols” from the Settings menu, Casual 
org will use Unicode symbols as appropriate in its menus.
+
diff --git a/lisp/Makefile b/lisp/Makefile
index 555678feb4..ea409b4a49 100644
--- a/lisp/Makefile
+++ b/lisp/Makefile
@@ -40,6 +40,7 @@ info-tests                                    \
 isearch-tests                                  \
 make-mode-tests                                        \
 man-tests                                      \
+org-tests                                      \
 re-builder-tests                               \
 timezone-tests
 
@@ -111,7 +112,6 @@ help-tests:
 html-tests:
        $(MAKE) -C $(SRC_DIR) -f Makefile-html.make tests
 
-
 .PHONY: image-tests
 image-tests:
        $(MAKE) -C $(SRC_DIR) -f Makefile-image.make tests
@@ -136,6 +136,10 @@ make-mode-tests:
 man-tests:
        $(MAKE) -C $(SRC_DIR) -f Makefile-man.make tests
 
+.PHONY: org-tests
+org-tests:
+       $(MAKE) -C $(SRC_DIR) -f Makefile-org.make tests
+
 .PHONY: re-builder-tests
 re-builder-tests:
        $(MAKE) -C $(SRC_DIR) -f Makefile-re-builder.make tests
diff --git a/lisp/Makefile-dired.make b/lisp/Makefile-dired.make
index 3b0ee8b9bf..94bcfd9f65 100644
--- a/lisp/Makefile-dired.make
+++ b/lisp/Makefile-dired.make
@@ -19,6 +19,12 @@ PACKAGE_NAME=casual-dired
 ELISP_INCLUDES=casual-dired-variables.el casual-dired-utils.el
 ELISP_PACKAGES=casual-dired-settings.el casual-dired-sort-by.el
 ELISP_TEST_INCLUDES=casual-dired-test-utils.el
-PACKAGE_PATHS=-L $(CASUAL_LIB_LISP_DIR)
+PACKAGE_PATHS=                                 \
+-L $(EMACS_ELPA_DIR)/compat-current            \
+-L $(EMACS_ELPA_DIR)/seq-current               \
+-L $(EMACS_ELPA_DIR)/transient-current         \
+-L $(EMACS_ELPA_DIR)/cond-let-current          \
+-L $(CASUAL_LIB_LISP_DIR)
+
 
 include Makefile--rules.make
diff --git a/lisp/Makefile-info.make b/lisp/Makefile-info.make
index 03ce350481..3b8c343ca5 100644
--- a/lisp/Makefile-info.make
+++ b/lisp/Makefile-info.make
@@ -20,6 +20,12 @@ PACKAGE_NAME=casual-info
 ELISP_INCLUDES=casual-info-variables.el casual-info-utils.el
 ELISP_PACKAGES=casual-info-settings.el
 ELISP_TEST_INCLUDES=casual-info-test-utils.el
-PACKAGE_PATHS=-L $(CASUAL_LIB_LISP_DIR)
+PACKAGE_PATHS=                                 \
+-L $(EMACS_ELPA_DIR)/compat-current            \
+-L $(EMACS_ELPA_DIR)/seq-current               \
+-L $(EMACS_ELPA_DIR)/transient-current         \
+-L $(EMACS_ELPA_DIR)/cond-let-current          \
+-L $(CASUAL_LIB_LISP_DIR)
+
 
 include Makefile--rules.make
diff --git a/lisp/Makefile-lib.make b/lisp/Makefile-lib.make
index dd67fbb56a..c26f3fc6e3 100644
--- a/lisp/Makefile-lib.make
+++ b/lisp/Makefile-lib.make
@@ -20,7 +20,13 @@ ELISP_INCLUDES=
 ELISP_PACKAGES=
 ELISP_TEST_INCLUDES=casual-lib-test-utils.el
 PACKAGE_NAME=casual-lib
-PACKAGE_PATHS=
+PACKAGE_PATHS=                                 \
+-L $(EMACS_ELPA_DIR)/compat-current            \
+-L $(EMACS_ELPA_DIR)/seq-current               \
+-L $(EMACS_ELPA_DIR)/transient-current         \
+-L $(EMACS_ELPA_DIR)/cond-let-current          \
+-L $(CASUAL_LIB_LISP_DIR)
+
 
 .PHONY: tests compile regression
 
diff --git a/lisp/Makefile-info.make b/lisp/Makefile-org.make
similarity index 64%
copy from lisp/Makefile-info.make
copy to lisp/Makefile-org.make
index 03ce350481..cd53a0caff 100644
--- a/lisp/Makefile-info.make
+++ b/lisp/Makefile-org.make
@@ -1,5 +1,5 @@
 ##
-# Copyright (C) 2024-2025 Charles Y. Choi
+# Copyright (C) 2026 Charles Y. Choi
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -16,10 +16,16 @@
 
 include Makefile--defines.make
 
-PACKAGE_NAME=casual-info
-ELISP_INCLUDES=casual-info-variables.el casual-info-utils.el
-ELISP_PACKAGES=casual-info-settings.el
-ELISP_TEST_INCLUDES=casual-info-test-utils.el
-PACKAGE_PATHS=-L $(CASUAL_LIB_LISP_DIR)
+PACKAGE_NAME=casual-org
+ELISP_INCLUDES=casual-org-utils.el     \
+casual-org-settings.el
+ELISP_PACKAGES=
+ELISP_TEST_INCLUDES=casual-org-test-utils.el
+PACKAGE_PATHS=                                 \
+-L $(EMACS_ELPA_DIR)/compat-current            \
+-L $(EMACS_ELPA_DIR)/seq-current               \
+-L $(EMACS_ELPA_DIR)/transient-current         \
+-L $(EMACS_ELPA_DIR)/cond-let-current          \
+-L $(CASUAL_LIB_LISP_DIR)
 
 include Makefile--rules.make
diff --git a/lisp/casual-lib.el b/lisp/casual-lib.el
index d7000235d4..04afde08aa 100644
--- a/lisp/casual-lib.el
+++ b/lisp/casual-lib.el
@@ -170,6 +170,10 @@ new buffer. This can be avoided if a prefix ARG is 
provided."
       (if (not arg)
           (find-file target)))))
 
+(defun casual-lib-buffer-read-only-p ()
+  "Predicate if buffer is read-only."
+  (if buffer-read-only t nil))
+
 ;; Transients
 (transient-define-suffix casual-lib-quit-all ()
   "Casual suffix to call `transient-quit-all'."
@@ -189,6 +193,24 @@ new buffer. This can be avoided if a prefix ARG is 
provided."
   (interactive)
   (transient-quit-one))
 
+(transient-define-group casual-lib-navigation-group-plain
+  [:class transient-row
+   (casual-lib-quit-one)
+   (casual-lib-quit-all)])
+
+(transient-define-group casual-lib-navigation-group-with-return
+  [:class transient-row
+   (casual-lib-quit-one)
+   ("RET" "Done" transient-quit-all)
+   (casual-lib-quit-all)])
+
+(transient-define-group casual-lib-navigation-group-with-undo-and-return
+  [:class transient-row
+   (casual-lib-quit-one)
+   ("U" "Undo" undo :transient t)
+   ("RET" "Done" transient-quit-all)
+   (casual-lib-quit-all)])
+
 (transient-define-suffix casual-lib-customize-unicode ()
   "Customize Casual to use Unicode symbols.
 
diff --git a/lisp/casual-org-settings.el b/lisp/casual-org-settings.el
new file mode 100644
index 0000000000..1db2ea0ee6
--- /dev/null
+++ b/lisp/casual-org-settings.el
@@ -0,0 +1,250 @@
+;;; casual-org-settings.el --- Casual Org Settings -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2026 Charles Y. Choi
+
+;; Author: Charles Choi <[email protected]>
+;; Keywords: tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; Code:
+(require 'org)
+(require 'casual-lib)
+
+
+;; -------------------------------------------------------------------
+;; Customize Functions
+
+;; Groups
+(defun casual-org--customize-group ()
+  "Customize Org group."
+  (interactive)
+  (customize-group "org"))
+
+(defun casual-org--customize-group-priorities ()
+  "Customize Org Priorities group."
+  (interactive)
+  (customize-group "Org Priorities"))
+
+(defun casual-org--customize-group-goto ()
+  "Customize Org Goto group."
+  (interactive)
+  (customize-group "Org Goto"))
+
+
+;; Customize Variables
+(defun casual-org--customize-directory ()
+  "Customize variable `org-directory'."
+  (interactive)
+  (customize-variable 'org-directory))
+
+(defun casual-org--customize-default-notes-file ()
+  "Customize variable `org-default-notes-file'."
+  (interactive)
+  (customize-variable 'org-default-notes-file))
+
+(defun casual-org--customize-todo-keywords ()
+  "Customize variable `org-todo-keywords'."
+  (interactive)
+  (customize-variable 'org-todo-keywords))
+
+(defun casual-org--customize-refile-targets ()
+  "Customize variable `org-refile-targets'."
+  (interactive)
+  (customize-variable 'org-refile-targets))
+
+(defun casual-org--customize-imenu-depth ()
+  "Customize variable `org-imenu-depth'."
+  (interactive)
+  (customize-variable 'org-imenu-depth))
+
+(defun casual-org--customize-support-shift-select ()
+  "Customize variable `org-support-shift-select'."
+  (interactive)
+  (customize-variable 'org-support-shift-select))
+
+(defun casual-org--customize-startup-folded ()
+  "Customize variable `org-startup-folded'."
+  (interactive)
+  (customize-variable 'org-startup-folded))
+
+(defun casual-org--customize-startup-indented ()
+  "Customize variable `org-startup-indented'."
+  (interactive)
+  (customize-variable 'org-startup-indented))
+
+(defun casual-org--customize-show-notification-handler ()
+  "Customize variable `org-show-notification-handler'."
+  (interactive)
+  (customize-variable 'org-show-notification-handler))
+
+(defun casual-org--customize-log-done ()
+  "Customize variable `org-log-done'."
+  (interactive)
+  (customize-variable 'org-log-done))
+
+(defun casual-org--customize-insert-heading-respect-content ()
+  "Customize variable `org-insert-heading-respect-content'."
+  (interactive)
+  (customize-variable 'org-insert-heading-respect-content))
+
+(defun casual-org--customize-hide-leading-stars ()
+  "Customize variable `casual-org-hide-leading-stars'."
+  (interactive)
+  (customize-variable 'org-hide-leading-stars))
+
+(defun casual-org--customize-hide-emphasis-markers ()
+  "Customize variable `org-hide-emphasis-markers'."
+  (interactive)
+  (customize-variable 'org-hide-emphasis-markers))
+
+(defun casual-org--customize-use-speed-commands ()
+  "Customize variable `org-use-speed-commands'."
+  (interactive)
+  (customize-variable 'org-use-speed-commands))
+
+(defun casual-org--customize-yank-image-save-method ()
+  "Customize variable `org-yank-image-save-method'."
+  (interactive)
+  (customize-variable 'org-yank-image-save-method))
+
+(defun casual-org-about-org ()
+  "Casual Org is a Transient menu for Org mode (`org-mode').
+
+Learn more about using Casual Org at our discussion group on GitHub.
+Any questions or comments about it should be made there.
+URL `https://github.com/kickingvegas/casual/discussions'
+
+If you find a bug or have an enhancement request, please file an issue.
+Our best effort will be made to answer it.
+URL `https://github.com/kickingvegas/casual/issues'
+
+If you enjoy using Casual Org, consider making a modest financial
+contribution to help support its development and maintenance.
+URL `https://www.buymeacoffee.com/kickingvegas'
+
+Casual Org was conceived and crafted by Charles Choi in San Francisco,
+California.
+
+Thank you for using Casual Org.
+
+Always choose love."
+  (ignore))
+
+(defun casual-org-about ()
+  "About information for Casual Org."
+  (interactive)
+  (describe-function #'casual-org-about-org))
+
+
+;; -------------------------------------------------------------------
+;; Transients
+(transient-define-prefix casual-org-settings-tmenu ()
+  "Casual Org settings menu."
+  ["Casual Org Settings"
+
+   [("h" "Heading & TODO›" casual-org-settings-heading-tmenu)
+    ("f" "Files & Directories›" casual-org-settings-files-tmenu)
+    ("d" "Display›" casual-org-settings-display-tmenu)]
+
+   [("k" "Keyboard›" casual-org-settings-keyboard-tmenu)
+    ("c" "Clocks›" casual-org-settings-clock-tmenu)
+    ("y" "Copy & Paste›" casual-org-settings-killyank-tmenu)]
+
+   [("G" "Org Group" casual-org--customize-group)]]
+
+  ["General"
+   :class transient-row
+   (casual-lib-customize-unicode)
+   (casual-lib-customize-hide-navigation)]
+
+  [:class transient-row
+   (casual-lib-quit-one)
+   ("a" "About" casual-org-about :transient nil)
+   ("RET" "Done" transient-quit-all)
+   (casual-lib-quit-all)])
+
+(transient-define-prefix casual-org-settings-heading-tmenu ()
+  "Customize Org heading settings."
+  ["Casual Org Settings: Heading"
+   ["TODO"
+    ("k" "TODO Keywords" casual-org--customize-todo-keywords)
+    ("l" "Log Done" casual-org--customize-log-done)
+    ("p" "Priorities" casual-org--customize-group-priorities)]
+
+   ["Heading"
+    ("i" "Index Menu Depth" casual-org--customize-imenu-depth
+     :description (lambda () (format "imenu Depth (%d)" org-imenu-depth)))
+    ("r" "Insertion Style" 
casual-org--customize-insert-heading-respect-content)]
+
+   ["Goto"
+    ("g" "Goto" casual-org--customize-group-goto)]]
+
+  casual-lib-navigation-group-with-return)
+
+(transient-define-prefix casual-org-settings-files-tmenu ()
+  "Customize Org file and directory settings."
+  ["Casual Org Settings: Files & Directories"
+   ("o" "Default Directory" casual-org--customize-directory
+    :description (lambda () (format "Default Directory (%s)" org-directory)))
+   ("n" "Default Notes File" casual-org--customize-default-notes-file
+    :description (lambda () (format "Default Notes File (%s)" 
org-default-notes-file)))
+   ("r" "Refile Targets" casual-org--customize-refile-targets)]
+  casual-lib-navigation-group-with-return)
+
+(transient-define-prefix casual-org-settings-display-tmenu ()
+  "Customize Org display settings. ."
+  ["Casual Org Settings: Display"
+   ["Hide"
+    ("s" "Leading Stars" casual-org--customize-hide-leading-stars
+     :description (lambda () (casual-lib-checkbox-label org-hide-leading-stars
+                                                   "Hide Leading Stars")))
+    ("e" "Emphasis Markers" casual-org--customize-hide-emphasis-markers
+     :description (lambda () (casual-lib-checkbox-label 
org-hide-emphasis-markers
+                                                   "Hide Emphasis Markers")))]
+   ["Startup"
+    ("f" "Folded" casual-org--customize-startup-folded
+     :description (lambda () (format "Startup Folded (%s)" 
org-startup-folded)))
+
+    ("i" "Indented" casual-org--customize-startup-indented
+     :description (lambda () (format "Startup Indented (%s)" 
org-startup-indented)))]]
+  casual-lib-navigation-group-with-return)
+
+(transient-define-prefix casual-org-settings-keyboard-tmenu ()
+  "Customize Org keyboard settings."
+  ["Casual Org Settings: Keyboard"
+   ("s" "Support Shift Select" casual-org--customize-support-shift-select
+    :description (lambda () (casual-lib-checkbox-label org-support-shift-select
+                                                  "Shift Select")))
+   ("S" "Use Speed Commands" casual-org--customize-use-speed-commands
+    :description (lambda () (casual-lib-checkbox-label org-use-speed-commands
+                                                  "Speed Commands")))]
+  casual-lib-navigation-group-with-return)
+
+(transient-define-prefix casual-org-settings-clock-tmenu ()
+  "Customize Org clock settings."
+  ["Casual Org Settings: Clock"
+   ("n" "Notification Handler" 
casual-org--customize-show-notification-handler)]
+  casual-lib-navigation-group-with-return)
+
+(transient-define-prefix casual-org-settings-killyank-tmenu ()
+  "Customize Org copy & paste (kill & yank) settings."
+  ["Casual Org Settings: Copy & Paste (Kill & Yank)"
+   ("y" "Yank Image Save Method" casual-org--customize-yank-image-save-method)]
+  casual-lib-navigation-group-with-return)
+
+(provide 'casual-org-settings)
+;;; casual-org-settings.el ends here
diff --git a/lisp/casual-org-utils.el b/lisp/casual-org-utils.el
new file mode 100644
index 0000000000..003f12784b
--- /dev/null
+++ b/lisp/casual-org-utils.el
@@ -0,0 +1,846 @@
+;;; casual-org-utils.el --- Casual Org Utils -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2026 Charles Y. Choi
+
+;; Author: Charles Choi <[email protected]>
+;; Keywords: tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+
+;;; Code:
+(require 'rect)
+(require 'org)
+(require 'casual-lib)
+
+(defconst casual-org-unicode-db
+  '((:previous . '("↑" "Previous"))
+    (:next . '("↓" "Next"))
+    (:cycle . '("⥅" "Cycle"))
+    (:shift-cycle . '("⥆" "S-Cycle"))
+    (:up . '("↑" "Up"))
+    (:down . '("↓" "Down"))
+    (:left . '("←" "Left"))
+    (:right . '("→" "Right"))
+    (:beginning-of-line . '("⇤" "BoL"))
+    (:end-of-line . '("⇥" "EoL"))
+    (:beginning-of-line-table . '("⇤" "Begin"))
+    (:end-of-line-table . '("⇥" "End"))
+    (:beginning-of-field . '("⇤" "Begin"))
+    (:end-of-field . '("⇥" "End"))
+    (:beginning-of-buffer . '("⇱" "Beginning"))
+    (:end-of-buffer . '("⇲" "End"))
+    (:info-functions . '("ⓘ 𝑓(𝑥)" "Info f(x)"))
+    (:info . '("ⓘ" "Info"))
+    (:clock-in . '("🕘 in" "In"))
+    (:clock-out . '("🕔 out" "Out"))
+    (:clock-report . '("🕒 🧾" "Report"))
+    (:paragraph . '("¶" "Paragraph"))
+    (:update . '("⟳" "Update"))
+    (:kill . '("×" "Close"))
+    (:see-also . '("👀" "See Also")))
+
+  "Unicode symbol DB to use for org Transient menus.")
+
+(defun casual-org-unicode-get (key)
+  "Lookup Unicode symbol for KEY in DB.
+
+- KEY symbol used to lookup Unicode symbol in DB.
+
+If the value of customizable variable `casual-lib-use-unicode'
+is non-nil, then the Unicode symbol is returned, otherwise a
+plain ASCII-range string."
+  (casual-lib-unicode-db-get key casual-org-unicode-db))
+
+(defun casual-org-info ()
+  "Open Info for Org manual based on context.
+
+Depending on where the point is, this command will open the point for
+Org documentation on the type of section it is in. Sections supported include:
+
+- Headlines
+- Plain Lists
+- Tables
+- Blocks
+- Drawers
+- Property Syntax
+- Timestamps
+
+If none of the above sections are determined at point, then the top
+level of the Org manual is opened."
+  (interactive)
+  (let ((node (cond
+               ((org-at-heading-p) "(org) Headlines")
+               ((org-at-item-p) "(org) Plain Lists")
+               ((or (org-at-table-p) (org-at-TBLFM-p)) "(org) Tables")
+               ((org-at-block-p) "(org) Blocks")
+               ((org-at-drawer-p) "(org) Drawers")
+               ((org-at-property-p) "(org) Property Syntax")
+               ((org-at-timestamp-p) "(org) Timestamps")
+               (t "(org) Top"))))
+    (info node)))
+
+;; TODO: not clear why this is need to get the Transient invocation to work.
+(defun casual-org-deactivate-mark ()
+  "Deactivate mark using function `deactivate-mark'."
+  (interactive)
+  (deactivate-mark))
+
+
+;; -------------------------------------------------------------------
+;; Org List Functions
+
+(defun casual-org-checkbox-in-progress ()
+  "If point is on an Org list item, set it to be a checkbox in-progress."
+  (interactive)
+  (if (org-at-item-checkbox-p)
+      (org-ctrl-c-ctrl-c '(16))
+    (org-ctrl-c-ctrl-c '(4))))
+
+(defun casual-org-toggle-list-to-checkbox ()
+  "If point is on an Org list item, toggle if the list item is also a checkbox.
+Note that this function does not toggle the actual value of a checkbox,
+which is done with `org-ctrl-c-ctrl-c'."
+  (interactive)
+  (org-ctrl-c-ctrl-c '(4)))
+
+
+;; -------------------------------------------------------------------
+;; Org Block & Table Functions
+
+(defun casual-org-assign-name (name)
+  "Insert Org NAME keyword for block or table."
+  (interactive "sName: ")
+  (unless (or (org-at-table-p) (org-at-block-p))
+    (error "Not in a block or table"))
+
+  (org-backward-paragraph)
+  (org-end-of-line)
+  (insert (format "\n#+NAME: %s" name)))
+
+
+
+;; -------------------------------------------------------------------
+;; Org Section Descriptions
+
+(defun casual-org--block-description ()
+  "Description string for an Org block."
+  (let* ((context (org-element-context))
+         (context-type (org-element-type context)))
+    (cond
+     ((eq context-type 'src-block)
+      (format "Org Source (%s)"
+              (org-element-property
+               :language
+               context)))
+
+     ((eq context-type 'example-block)
+      "Org Example Block")
+
+     ((eq context-type 'export-block)
+      (format "Org Export (%s)"
+              (org-element-property
+               :type
+               context)))
+
+     ((eq context-type 'center-block)
+      "Org Center Block")
+
+     ((eq context-type 'quote-block)
+      "Org Quote Block")
+
+     ((eq context-type 'verse-block)
+      "Org Verse Block")
+
+     ((eq context-type 'dynamic-block)
+      "Org Dynamic Block")
+
+     (t "Org Block: Unknown"))))
+
+(defun casual-org--body-description ()
+  "Description string for Org body."
+  (let ((heading (org-get-heading t nil t t)))
+    (if heading
+        (format "Org Body: %s" (substring-no-properties heading))
+      (format "Org Body: %s" (buffer-name)))))
+
+(defun casual-org--keyword-description ()
+  "Description string for Org keyword."
+  ;; TODO: deal with affiliate keywords like PLOT.
+
+  (cond
+   ((org-at-TBLFM-p) "Org Table Formula (TBLFM)")
+   (t (let* ((context (org-element-context))
+             (key (org-element-property :key context)))
+        (if key
+            (format "Org Keyword: %s" key)
+          "Org Keyword")))))
+
+(defun casual-org--heading-description ()
+  "Description string for Org heading."
+  (let ((heading (org-get-heading t nil t t)))
+    (if heading
+        (format "Org Headline: %s" (substring-no-properties heading))
+      (format "Org: %s" (buffer-name)))))
+
+(defun casual-org--item-description ()
+  "Description string for Org item."
+  ;; TODO: Figure out how to item content.
+  ;; (buffer-substring-no-properties
+  ;;  (org-element-contents-begin (org-element-context))
+  ;;  (org-element-contents-end (org-element-context)))
+  (let ((heading (org-get-heading t nil t t)))
+    (if heading
+        (format "Org List: %s" (substring-no-properties heading))
+      (format "Org List: %s" (buffer-name)))))
+
+
+;; -------------------------------------------------------------------
+;; Org Table Functions
+
+(defun casual-org-table--cell-at-point ()
+  "At point, return the cell object from an Org table.
+
+A cell object is defined to be a list containing the row and the
+column, successively."
+  (if (not (org-at-table-p))
+      (error "Not in a table"))
+
+  (let* ((row (org-table-current-dline))
+         (col (org-table-current-column)))
+    (list row col)))
+
+(defun casual-org-table--format-field-reference (cell)
+  "Format CELL object into @r$c format.
+
+CELL object obtained via `casual-org-table--cell-at-point'.
+
+See Info node `(org) References' for more on Org table field
+reference format."
+  (let ((row (nth 0 cell))
+        (col (nth 1 cell)))
+    (format "@%d$%d" row col)))
+
+(defun casual-org-table--range ()
+  "Return range object from a region defined within an Org table.
+
+A range object is a list of two cells computed via
+`casual-org-table--cell-at-point', the first being the cell at the
+start of the region and the last being the cell at the end of the
+region."
+  (if (not (and (org-at-table-p) (use-region-p)))
+      (error "Not in an Org table"))
+
+  (let* ((end-cell (casual-org-table--cell-at-point))
+         (start (region-beginning))
+         (end (region-end)))
+      (exchange-point-and-mark)
+      (let ((start-cell (casual-org-table--cell-at-point)))
+        (push-mark start nil t)
+        (goto-char end)
+        (list start-cell end-cell))))
+
+(defvar casual-org-table--last-reference nil
+  "Last stored Org table reference.
+
+State variable to store an Org table reference (field or range)
+to be used in an Org table formula. This variable is set via
+`casual-org-table--reference-dwim'
+
+NOTE: This state variable to work-around my lack of clarity on
+region and mouse menu interaction.")
+
+(defun casual-org-table--reference-dwim ()
+  "Org table reference given point or region is defined.
+
+Return Org table reference (field or range) depending on whether
+a point or region is defined in an Org table.
+
+If the region is defined over multiple columns, then a Calc
+vector matrix is returned. See Info node `(org) Formula syntax
+for Calc' for more.
+
+Calling this function will set `casual-org-table--last-reference'.
+
+See Info node `(org) References' for more on Org table field
+reference format."
+  (if (not (org-at-table-p))
+      (error "Not in an Org table"))
+
+  (cond
+   ((use-region-p)
+
+    (let* ((range (casual-org-table--range))
+           (start (nth 0 range))
+           (end (nth 1 range))
+           (msg (format "%s..%s"
+                        (casual-org-table--format-field-reference start)
+                        (casual-org-table--format-field-reference end))))
+      (setq casual-org-table--last-reference 
(casual-org-table--range-to-reference range))
+      msg))
+
+   (t
+    (let ((msg (casual-org-table--format-field-reference 
(casual-org-table--cell-at-point))))
+      (setq casual-org-table--last-reference msg)
+      msg))))
+
+(defun casual-org-table-copy-reference-dwim ()
+  "Copy Org table reference (field or range) into kill ring.
+
+Given a point or region defined in an Org table, add to the
+`kill-ring' an Org table field or range reference.
+
+If the region is defined over multiple columns, then a Calc vector
+matrix is returned. See Info node `(org) Formula syntax for Calc' and
+Info node `(calc) Vectors and Matrices' for more.
+
+If the buffer *Edit Formulas* is available (usually via
+`org-table-edit-formulas'), the reference will be inserted into
+it.
+
+See Info node `(org) References' for more on Org table field
+reference format."
+  (interactive)
+  (if (not (org-at-table-p))
+      (error "Not in an Org table"))
+
+  (let ((msg (casual-org-table--reference-dwim))
+        (formulas-buffer (get-buffer "*Edit Formulas*")))
+    (if formulas-buffer
+        (with-current-buffer formulas-buffer
+          (insert casual-org-table--last-reference)))
+    (message "Range: %s, Copied %s" msg casual-org-table--last-reference)
+    (kill-new casual-org-table--last-reference)))
+
+(defun casual-org-table-copy-reference-and-deactivate-dwim ()
+  "Copy Org table reference (field or range) into kill ring and deactivate 
mark.
+
+Given a point or region defined in an Org table, add to the `kill-ring'
+an Org table field or range reference.
+
+If the region is defined over multiple columns, then a Calc vector
+matrix is returned. See Info node `(org) Formula syntax for Calc' and
+Info node `(calc) Vectors and Matrices' for more.
+
+If the buffer *Edit Formulas* is available (usually via
+`org-table-edit-formulas'), the reference will be inserted into it.
+
+See Info node `(org) References' for more on Org table field
+reference format."
+  (interactive)
+  (casual-org-table-copy-reference-dwim)
+  (if mark-active
+      (deactivate-mark)))
+
+(defun casual-org-table--range-to-reference (range)
+  "Convert RANGE object to Org table reference (field or range).
+
+If the region is defined over multiple columns, then a Calc
+vector matrix is returned. See Info node `(org) Formula syntax
+for Calc' for more.
+
+See `casual-org-table--range' for more on RANGE object."
+  (let* ((start (nth 0 range))
+         (end (nth 1 range))
+         (a (nth 0 start))
+         (b (nth 1 start))
+         (c (nth 0 end))
+         (d (nth 1 end))
+
+         (r1 (apply #'min (list a c)))
+         (c1 (apply #'min (list b d)))
+
+         (r2 (apply #'max (list a c)))
+         (c2 (apply #'max (list b d)))
+
+         (rowrange (number-sequence r1 r2))
+         (buflist (list)))
+
+
+    (cond
+     ((and (= r1 r2) (= c1 c2))
+      (format "@%d$%d" r1 c1 ))
+
+     ((or (= c1 c2) (= r1 r2))
+      (format "@%d$%d..@%d$%d" r1 c1 r2 c2))
+
+     (t
+      (mapc (lambda (r)
+              (push (format "@%d$%d..@%d$%d" r c1 r c2) buflist))
+            rowrange)
+
+      (format "vec(%s)"
+              (string-join (reverse buflist) ", "))))))
+
+
+(defun casual-org-table-fill-down (rows)
+  "Fill table down with count of ROWS."
+  (interactive "nRows: ")
+  (while (> rows 0)
+      ;;(message "%d" rows)
+      (call-interactively #'org-table-copy-down)
+      (setq rows (1- rows))))
+
+(defun casual-org-table-kill-field-as-copy ()
+  "Kill field as copy."
+  (interactive)
+  (let ((value (string-trim (org-table-get-field))))
+    (message "Copied '%s' to kill ring." value)
+    (kill-new value)))
+
+
+;; -------------------------------------------------------------------
+;; fedit functions
+
+(defun casual-org-table-fedit-first-row-reference ()
+  "First row reference."
+  (interactive)
+  (insert "@<"))
+
+(defun casual-org-table-fedit-last-row-reference ()
+  "Last row reference."
+  (interactive)
+  (insert "@<"))
+
+(defun casual-org-table-fedit-first-column-reference ()
+  "First column reference."
+  (interactive)
+  (insert "$<"))
+
+(defun casual-org-table-fedit-last-column-reference ()
+  "Last column reference."
+  (interactive)
+  (insert "$>"))
+
+(defun casual-org-table-fedit-first-hline-reference ()
+  "First hline reference."
+  (interactive)
+  (insert "@I"))
+
+(defun casual-org-table-fedit-second-hline-reference ()
+  "Second hline reference."
+  (interactive)
+  (insert "@II"))
+
+(defun casual-org-table-fedit-hline-range-reference ()
+  "Horizontal range reference."
+  (interactive)
+  (insert "@I..@II"))
+
+(defun casual-org-table-info-references ()
+  "Info for Org table references."
+  (interactive) (info "(org) References" ))
+
+(defun casual-org-table-info-calc-functions ()
+  "Info for Calc functions."
+  (interactive)
+  (info "(calc) Function Index"))
+
+
+;; -------------------------------------------------------------------
+;; Transients
+
+;; Transient Groups
+(transient-define-group casual-org-table-group
+  ["Org Table"
+   :if org-at-table-p
+   :description (lambda () (format "Org Table: %s" 
(casual-org-table--reference-dwim)))
+   ["Table"
+    :inapt-if casual-lib-buffer-read-only-p
+    ("w" "Copy Field" casual-org-table-kill-field-as-copy
+     :inapt-if use-region-p
+     :transient t)
+    ("r" "Copy Reference" casual-org-table-copy-reference-and-deactivate-dwim
+     :transient t)
+    ("m" "Mark Rectangle" rectangle-mark-mode :transient t)
+    ;; ("{" "Toggle Debugger" org-table-toggle-formula-debugger :transient t)
+    ("d" "Fill Down…" casual-org-table-fill-down :transient nil)
+    ("l" "Layout›" casual-org-table-structure-tmenu )
+    ("n" "Assign Name…" casual-org-assign-name)
+    ("E" "Export…" org-table-export)
+    ("p" "Plot" org-plot/gnuplot :transient t)]
+
+   ["Edit"
+    :pad-keys t
+    ("C-SPC" "Mark" set-mark-command :transient t)
+    ("SPC" "Unmark" casual-org-deactivate-mark
+     :inapt-if (lambda () (if mark-active nil t))
+     :transient t)
+    ("`" "Field" org-table-edit-field
+     :inapt-if casual-lib-buffer-read-only-p
+     :transient nil)
+    ("C-y" "Paste (yank)" org-yank
+     :inapt-if casual-lib-buffer-read-only-p
+     :transient t)
+    ("=" "Formula*" org-table-eval-formula
+     :inapt-if casual-lib-buffer-read-only-p
+     :transient t
+     :description (lambda () (if prefix-arg "Field Formula" "Column 
Formula✦")))
+    ("DEL" "Blank" org-table-blank-field
+     :inapt-if casual-lib-buffer-read-only-p
+     :transient t)
+    ("F" "Formulas" org-table-edit-formulas
+     :inapt-if casual-lib-buffer-read-only-p
+     :transient nil)]
+
+   ;; !!! these commands alter the region selected which breaks reading a table
+   ;; !!! cell. As such they can not be supported until these commands are
+   ;; !!! fixed.
+
+   ["Region"
+    ("W" "Copy" org-table-copy-region :transient t)
+    ("C" "Cut" org-table-cut-region
+     :inapt-if casual-lib-buffer-read-only-p
+     :transient t)
+    ("Y" "Paste" org-table-paste-rectangle
+     :inapt-if casual-lib-buffer-read-only-p
+     :transient t)]
+
+   ["Compute"
+    :inapt-if casual-lib-buffer-read-only-p
+    ("c" "Row" org-table-recalculate :transient t)
+    ("g" "All" org-table-recalculate-buffer-tables :transient t)
+    ("s" "Sum" org-table-sum :transient t)
+    ("S" "Sort" org-table-sort-lines :transient t)
+    ("T" "Transpose" org-table-transpose-table-at-point :transient t)
+    ("f" "ⓘ 𝑓(𝑥)" casual-org-table-info-calc-functions
+     :description (lambda () (format "%s 𝑓(𝑥)" (casual-org-unicode-get 
:info))))]
+
+   ["Display"
+    ("z" "Shrink Column" org-table-toggle-column-width :transient t)
+    ("Z" "Shrink Table" org-table-shrink :transient t)
+    ("t" "Toggle Coordinates" org-table-toggle-coordinate-overlays
+     :description (lambda () (casual-lib-checkbox-label
+                         org-table-overlay-coordinates
+                         "@𝑟$𝑐"))
+     :transient t)
+    ("h" "Header Mode" org-table-header-line-mode
+     :description (lambda () (casual-lib-checkbox-label
+                         org-table-header-line-mode
+                         "Header"))
+     :transient t)
+    ("V" "Line Wrap" visual-line-mode
+     :description (lambda () (casual-lib-checkbox-label
+                         visual-line-mode
+                         "Line Wrap"))
+     :transient t)]])
+
+
+;; TODO: ("c" "Capture…" org-capture)
+(transient-define-group casual-org-heading-group
+  ["Org Heading"
+   :if org-at-heading-p
+   :inapt-if casual-lib-buffer-read-only-p
+   :description casual-org--heading-description
+
+   ["Headline"
+    :pad-keys t
+    ("t" "TODO State…" org-todo)
+    ("s" "Sort…" org-sort)
+    ("c" "Clone…" org-clone-subtree-with-time-shift)]
+
+   ["Add"
+    ("a" "Headline" org-insert-heading)
+    ("T" "TODO" org-insert-todo-heading)]
+
+   ["Annotate"
+    ("p" "Property…" org-set-property)
+    (":" "Tags…" org-set-tags-command)]
+
+   ["Date"
+    ("C-s" "Schedule…" org-schedule)
+    ("C-d" "Deadline…" org-deadline)]
+
+   ["Priority"
+    :pad-keys t
+    ("S-<up>" "↑" org-priority-up
+     :description (lambda () (casual-org-unicode-get :up))
+     :transient t)
+    ("S-<down>" "↓" org-priority-down
+     :description (lambda () (casual-org-unicode-get :down))
+     :transient t)]
+
+   ["Misc"
+    ("n" "Note…" org-add-note)
+    ("w" "Refile…" org-refile)]])
+
+
+(transient-define-group casual-org-item-group
+  ["Org Item"
+   :if org-at-item-p
+   :description casual-org--item-description
+
+   ["Item"
+    :pad-keys t
+    :inapt-if casual-lib-buffer-read-only-p
+    ("a" "Add" org-insert-todo-heading :transient t)
+    ("c" "Cycle" org-cycle-list-bullet :transient t)
+    ("b" "Toggle Checkbox" casual-org-toggle-list-to-checkbox :transient t)]
+
+   ["Checkbox"
+    :pad-keys t
+    :inapt-if-not (lambda () (and (org-at-item-checkbox-p)
+                             (not (casual-lib-buffer-read-only-p))))
+    ("C-c" "Toggle" org-ctrl-c-ctrl-c
+     :transient nil)
+    ("-" "In Progress" casual-org-checkbox-in-progress :transient nil)]
+
+   [""
+    :inapt-if casual-lib-buffer-read-only-p
+    ("s" "Sort…" org-sort)]])
+
+
+(transient-define-group casual-org-TBLFM-group
+  ["Org Table Formula"
+   :if org-at-TBLFM-p
+   :inapt-if casual-lib-buffer-read-only-p
+   :description (lambda () (let ((heading (org-get-heading t nil t t)))
+                        (if heading
+                            (format "Org TBLFM: %s" (substring-no-properties 
heading))
+                          (format "Org TBLFM: %s" (buffer-name)))))
+   ["Table Formula"
+    ("F" "Edit Formulas" org-table-edit-formulas
+     :inapt-if casual-lib-buffer-read-only-p
+     :transient nil)]
+
+   [""
+    ("C-c" "Recalculate" org-table-recalculate-buffer-tables :transient t)]])
+
+
+(transient-define-group casual-org-block-group
+  ["Org Block"
+   :if org-at-block-p
+   :inapt-if casual-lib-buffer-read-only-p
+   :description casual-org--block-description
+   [("'" "Edit" org-edit-src-code :transient nil)]
+   [("n" "Assign Name…" casual-org-assign-name)]
+   [("C-c" "Eval" org-ctrl-c-ctrl-c
+     :if (lambda () (or (eq (org-element-type (org-element-context)) 
'src-block)
+                   (eq (org-element-type (org-element-context)) 
'dynamic-block)))
+     :transient t)]])
+
+
+(transient-define-group casual-org-body-group
+  ["Org Body"
+   :if-not (lambda () (or (org-at-heading-or-item-p)
+                     (org-at-table-p)
+                     (org-at-block-p)
+                     (org-at-keyword-p)))
+   :description casual-org--body-description
+   :inapt-if casual-lib-buffer-read-only-p
+
+   [:if-not org-at-keyword-p
+    ("*" "To Heading" org-ctrl-c-star :transient t)
+    ("-" "To Item" org-ctrl-c-minus :transient t)]
+   [("b" "Add Block…" org-insert-structure-template)]])
+
+
+(transient-define-group casual-org-keyword-group
+  ["Org Keyword"
+   :if org-at-keyword-p
+   :description casual-org--keyword-description
+   :inapt-if casual-lib-buffer-read-only-p
+   [:if org-at-TBLFM-p
+    ("F" "Edit Formulas" org-table-edit-formulas :transient nil)]
+
+   [:if org-at-TBLFM-p
+    ("C-c" "Eval" org-table-recalculate-buffer-tables :transient nil)]
+
+   ;; TODO: Does this apply to all affiliate keywords?
+   [:if-not org-at-TBLFM-p
+    :inapt-if (lambda () (org-element-property :key (org-element-context)))
+    ("C-c" "Eval" org-ctrl-c-ctrl-c :transient nil)]])
+
+
+(transient-define-group casual-org-navigation-group
+  [:pad-keys t
+   ["Navigation"
+    ("TAB" "⥅" org-cycle
+     :description (lambda () (casual-org-unicode-get :cycle))
+     :transient t)
+    ("S-TAB" "⥆" org-shifttab
+     :description (lambda () (casual-org-unicode-get :shift-cycle))
+     :transient t)]
+   [""
+    ("C-p" "↑" previous-line
+     :description (lambda () (casual-org-unicode-get :up))
+     :transient t)
+    ("C-n" "↓" next-line
+     :description (lambda () (casual-org-unicode-get :down))
+     :transient t)]
+   [""
+    ("C-b" "←" backward-char
+     :description (lambda () (casual-org-unicode-get :left))
+     :transient t)
+    ("C-f" "→" forward-char
+     :description (lambda () (casual-org-unicode-get :right))
+     :transient t)]
+   ["Field"
+    :if org-at-table-p
+    ("M-a" "⇤" org-table-beginning-of-field
+     :description (lambda () (casual-org-unicode-get :beginning-of-field))
+     :transient t)
+    ("M-e" "⇥" org-table-end-of-field
+     :description (lambda () (casual-org-unicode-get :end-of-field))
+     :transient t)]
+   ["Line"
+    :description (lambda () (if (org-at-table-p) "Line" ""))
+    ("C-a" "⇤" org-beginning-of-line
+     :description (lambda () (casual-org-unicode-get :beginning-of-line-table))
+     :transient t)
+    ("C-e" "⇥" org-end-of-line
+     :description (lambda () (casual-org-unicode-get :end-of-line-table))
+     :transient t)]
+   ["Mark"
+    :if-not (lambda () (or (org-at-keyword-p)
+                      (org-at-table-p)
+                      (org-at-block-p)))
+    ("ms" "Subtree" org-mark-subtree)
+    ("me" "Element" org-mark-element)]
+
+   ["Org"
+    ("v" "Copy Visible"
+     org-copy-visible
+     :inapt-if-not (lambda () (use-region-p)))
+    ("e" "Export…" org-export-dispatch)]])
+
+
+(transient-define-group casual-org-table-fedit-navigation-group
+  [:pad-keys t
+   ["Navigation"
+    ("C-p" "↑" previous-line
+     :description (lambda () (casual-org-unicode-get :up))
+     :transient t)
+    ("C-n" "↓" next-line
+     :description (lambda () (casual-org-unicode-get :down))
+     :transient t)]
+   [""
+    ("C-b" "←" backward-char
+     :description (lambda () (casual-org-unicode-get :left))
+     :transient t)
+    ("C-f" "→" forward-char
+     :description (lambda () (casual-org-unicode-get :right))
+     :transient t)]
+   [""
+    ("C-a" "⇤" org-beginning-of-line
+     :description (lambda () (casual-org-unicode-get :beginning-of-line))
+     :transient t)
+    ("C-e" "⇥" org-end-of-line
+     :description (lambda () (casual-org-unicode-get :end-of-line))
+     :transient t)]])
+
+
+(transient-define-group casual-org-utility-group
+  [:if-not (lambda () (or (org-at-table-p)
+                     (org-at-TBLFM-p)
+                     (org-at-block-p)
+                     (org-at-keyword-p)))
+
+   ["Link"
+    :inapt-if casual-lib-buffer-read-only-p
+    ("l" "Insert…" org-insert-link)
+    ("L" "Last" org-insert-last-stored-link)
+    ("r" "Cite…" org-cite-insert)]
+
+   ["Timestamp"
+    :inapt-if casual-lib-buffer-read-only-p
+    ("." "Add…" org-timestamp)
+    ("i" "Inactive…" org-timestamp-inactive)]
+
+   ["Clock"
+    :pad-keys t
+    :inapt-if casual-lib-buffer-read-only-p
+    ("M-c" "🕘 in" org-clock-in
+     :description (lambda () (casual-org-unicode-get :clock-in))
+     :if-not org-clocking-p)
+    ("M-c" "🕔 out" org-clock-out
+     :description (lambda () (casual-org-unicode-get :clock-out))
+     :if org-clocking-p)
+    ("R" "🕒 🧾" org-clock-report
+     :description (lambda () (casual-org-unicode-get :clock-report))
+     :if (lambda () (not (org-at-heading-or-item-p))))]
+
+   ["Display"
+    ("M-i" "Toggle Images" org-toggle-inline-images
+     :transient nil)
+    ("M" "Show Markup" visible-mode
+     :description (lambda () (casual-lib-checkbox-label visible-mode "Show 
Markup"))
+     :transient nil)
+    ("P" "Toggle Prettify" prettify-symbols-mode
+     :description (lambda () (casual-lib-checkbox-label prettify-symbols-mode
+                                                   "Prettify"))
+     :transient nil)
+    ]
+   [""
+    ("V" "Line Wrap" visual-line-mode
+     :description (lambda () (casual-lib-checkbox-label visual-line-mode
+                                                   "Line Wrap"))
+     :transient t)
+    ("N" "Number" org-num-mode
+     :if org-at-heading-p
+     :description (lambda () (casual-lib-checkbox-label org-num-mode
+                                                   "Heading #"))
+     :transient t)]])
+
+
+(transient-define-prefix casual-org-table-structure-tmenu ()
+  "Menu for Org Table structure (layout) commands."
+  :refresh-suffixes t
+
+  ["Org Table Layout"
+   :pad-keys t
+   :inapt-if-not org-at-table-p
+   ["Insert"
+    :inapt-if casual-lib-buffer-read-only-p
+    ("r" "Row" org-table-insert-row :transient t)
+    ("c" "Column" org-table-insert-column :transient t)
+    ("-" "H Line" org-table-insert-hline :transient t)]
+
+   ["Delete"
+    :inapt-if casual-lib-buffer-read-only-p
+    ("DEL" "Row" org-table-kill-row :transient t)
+    ("M-DEL" "Column" org-table-delete-column :transient t)]
+
+   ["Move"
+    :inapt-if casual-lib-buffer-read-only-p
+    ("M-p" "Row ↑" org-table-move-row-up :transient t)
+    ("M-n" "Row ↓" org-table-move-row-down :transient t)]
+
+   [""
+    :inapt-if casual-lib-buffer-read-only-p
+    ("M-b" "Column ←" org-table-move-column-left :transient t)
+    ("M-f" "Column →" org-table-move-column-right :transient t)]]
+
+  ["Navigation"
+   :pad-keys t
+   [("TAB" "⥅" org-cycle :transient t)
+    ("S-TAB" "⥆" org-shifttab :transient t)]
+   [("C-p" "↑" previous-line :transient t)
+    ("C-n" "↓" next-line :transient t)]
+   [("C-b" "←" backward-char :transient t)
+    ("C-f" "→" forward-char :transient t)]
+
+   [:if org-at-table-p
+    ("M-a" "⇤" org-table-beginning-of-field :transient t)
+    ("M-e" "⇥" org-table-end-of-field :transient t)]
+
+   [("C-a" "⇤" org-beginning-of-line :transient t)
+    ("C-e" "⇥" org-end-of-line :transient t)]]
+
+  casual-lib-navigation-group-with-undo-and-return)
+
+(provide 'casual-org-utils)
+;;; casual-org-utils.el ends here
diff --git a/lisp/casual-org.el b/lisp/casual-org.el
new file mode 100644
index 0000000000..c258703835
--- /dev/null
+++ b/lisp/casual-org.el
@@ -0,0 +1,116 @@
+;;; casual-org.el --- Transient UI for Org mode -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2026 Charles Y. Choi
+
+;; Author: Charles Choi <[email protected]>
+;; Keywords: tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This library provides a Transient-based user interface for `org-mode'.
+
+;; INSTALLATION
+
+;; In your initialization file, bind the Transient `casual-org-tmenu' to your
+;; key binding of preference.
+
+;; (require 'casual-org) ; optional if using autoloaded menu
+;; (keymap-set org-mode-map "M-m" #'casual-org-tmenu)
+;; (keymap-set org-table-fedit-map "M-m" #'casual-org-table-fedit-tmenu)
+
+;;; Code:
+(require 'org)
+(require 'casual-org-settings)
+(require 'casual-org-utils)
+
+;;;###autoload (autoload 'casual-org-tmenu "casual-org" nil t)
+(transient-define-prefix casual-org-tmenu ()
+  "Main menu for Casual Org.
+
+Top level menu for Casual Org. The menu offering is context-dependent on
+where the point is located in an Org (`org-mode') document.
+
+Casual Org is opinionated in that it endeavors to provide an effective
+set of commands based on what type of Org section the point is in. Major
+sections supported by this menu include:
+
+- Heading
+- Item
+- Table
+- Block
+
+This menu does not make effort to provide exhaustive coverage of all
+possible Org commands.
+
+While this menu is raised, point navigation is supported using standard
+Emacs key bindings for movement."
+
+  :refresh-suffixes t
+
+  ;; Context-Specific
+  casual-org-heading-group
+  casual-org-item-group
+  casual-org-table-group
+  ;; casual-org-TBLFM-group
+  casual-org-keyword-group
+  casual-org-body-group
+  casual-org-block-group
+
+  ;; Common
+  casual-org-utility-group
+  casual-org-navigation-group
+
+
+  [:class transient-row
+   (casual-lib-quit-one)
+   ("," "Settings" casual-org-settings-tmenu)
+   ("I" "ⓘ" casual-org-info
+    :description (lambda () (casual-org-unicode-get :info)))
+   ("U" "Undo" undo :transient t)
+   ("RET" "Done" transient-quit-all)
+   (casual-lib-quit-all)])
+
+
+;;;###autoload (autoload 'casual-org-table-fedit-tmenu "casual-org" nil t)
+(transient-define-prefix casual-org-table-fedit-tmenu ()
+  "Menu for Org table formula editing.
+
+This menu provides commands for inserting formula references."
+  ["Org Table Formula Edit"
+   :pad-keys t
+   ["Row"
+    ("@<" "First Row" casual-org-table-fedit-first-row-reference)
+    ("@>" "Last Row" casual-org-table-fedit-last-row-reference)]
+
+   ["Column"
+    ("$<" "First" casual-org-table-fedit-first-column-reference)
+    ("$>" "Last" casual-org-table-fedit-last-column-reference)]
+
+   ["---"
+    ("1" "First (@I)" casual-org-table-fedit-first-hline-reference)
+    ("2" "Second (@II)" casual-org-table-fedit-second-hline-reference)
+    ("r" "Range (@I..@II)" casual-org-table-fedit-hline-range-reference)]
+
+   [""
+    ("I" "ⓘ References" casual-org-table-info-references
+     :description (lambda () (format "%s References"
+                                (casual-org-unicode-get :info))))]]
+
+  casual-org-table-fedit-navigation-group
+  casual-lib-navigation-group-with-undo-and-return)
+
+(provide 'casual-org)
+;;; casual-org.el ends here
diff --git a/lisp/casual.el b/lisp/casual.el
index 7615e89fce..3c529abaab 100644
--- a/lisp/casual.el
+++ b/lisp/casual.el
@@ -105,6 +105,9 @@
 ;; - Man (Elisp library: `casual-man.el')
 ;;   An interface to `Man-mode', the Emacs Man page reader.
 
+;; - Org (Elisp library: `casual-org.el')
+;;   An interface to `org-mode', an authoring tool for Org documents.
+
 ;; - Re-Builder (Elisp library: `casual-re-builder.el')
 ;;   An interface for the Emacs regular expression tool.
 
diff --git a/tests/Makefile b/tests/Makefile
index 4db64c8be5..e0fb7e8742 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -39,6 +39,7 @@ info-tests                                    \
 isearch-tests                                  \
 make-mode-tests                                        \
 man-tests                                      \
+org-tests                                      \
 re-builder-tests                               \
 timezone-tests
 
@@ -66,6 +67,7 @@ info-tests                                    \
 isearch-tests                                  \
 make-mode-tests                                        \
 man-tests                                      \
+org-tests                                      \
 re-builder-tests                               \
 timezone-tests
 
@@ -135,6 +137,9 @@ make-mode-tests:
 man-tests:
        $(MAKE) -C $(SRC_DIR) $@
 
+org-tests:
+       $(MAKE) -C $(SRC_DIR) $@
+
 re-builder-tests:
        $(MAKE) -C $(SRC_DIR) $@
 
diff --git a/tests/casual-org-test-utils.el b/tests/casual-org-test-utils.el
new file mode 100644
index 0000000000..50c9d59285
--- /dev/null
+++ b/tests/casual-org-test-utils.el
@@ -0,0 +1,41 @@
+;;; casual-org-test-utils.el --- Casual Test Utils       -*- lexical-binding: 
t; -*-
+
+;; Copyright (C) 2026  Charles Y. Choi
+
+;; Author: Charles Choi <[email protected]>
+;; Keywords: tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+(require 'ert)
+(require 'casual-lib)
+(require 'kmacro)
+
+(defun casualt-org-setup ()
+  "Casual Org setup."
+  ;;(message "Default Directory: %s" default-directory)
+  (switch-to-buffer (find-file "../tests/test-casual-org.org"))
+  (goto-char (point-min)))
+
+(defun casualt-org-breakdown ()
+  "Casual Org breakdown."
+  (kill-buffer "test-casual-org.org"))
+
+(provide 'casual-org-test-utils)
+;;; casual-org-test-utils.el ends here
diff --git a/tests/test-casual-org-settings.el 
b/tests/test-casual-org-settings.el
new file mode 100644
index 0000000000..b7ebe9e21c
--- /dev/null
+++ b/tests/test-casual-org-settings.el
@@ -0,0 +1,156 @@
+;;; test-casual-org-settings.el --- Casual Make Settings Tests  -*- 
lexical-binding: t; -*-
+
+;; Copyright (C) 2026  Charles Y. Choi
+
+;; Author: Charles Choi <[email protected]>
+;; Keywords: tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+
+(require 'ert)
+(require 'casual-org-test-utils)
+(require 'casual-org-settings)
+
+(ert-deftest test-casual-org-settings-tmenu ()
+  (cl-letf ((casualt-mock #'casual-org-settings-heading-tmenu)
+            (casualt-mock #'casual-org-settings-files-tmenu)
+            (casualt-mock #'casual-org-settings-display-tmenu)
+            (casualt-mock #'casual-org-settings-keyboard-tmenu)
+            (casualt-mock #'casual-org-settings-clock-tmenu)
+            (casualt-mock #'casual-org-settings-killyank-tmenu)
+            (casualt-mock #'casual-org--customize-group)
+            (casualt-mock #'casual-org-about))
+
+    (let ((test-vectors
+           '((:binding "h" :command casual-org-settings-heading-tmenu)
+             (:binding "f" :command casual-org-settings-files-tmenu)
+             (:binding "d" :command casual-org-settings-display-tmenu)
+             (:binding "k" :command casual-org-settings-keyboard-tmenu)
+             (:binding "c" :command casual-org-settings-clock-tmenu)
+             (:binding "y" :command casual-org-settings-killyank-tmenu)
+             (:binding "G" :command casual-org--customize-group)
+             (:binding "u" :command 
casual-lib-customize-casual-lib-use-unicode)
+             (:binding "n" :command 
casual-lib-customize-casual-lib-hide-navigation)
+             (:binding "a" :command casual-org-about))))
+
+      (casualt-suffix-testcase-runner test-vectors
+                                      #'casual-org-settings-tmenu
+                                      '(lambda () (random 5000))))))
+
+
+(ert-deftest test-casual-org-settings-heading-tmenu ()
+  (cl-letf (
+
+            (casualt-mock #'casual-org--customize-todo-keywords)
+            (casualt-mock #'casual-org--customize-log-done)
+            (casualt-mock #'casual-org--customize-group-priorities)
+            (casualt-mock #'casual-org--customize-imenu-depth)
+            (casualt-mock 
#'casual-org--customize-insert-heading-respect-content)
+            (casualt-mock #'casual-org--customize-group-goto)
+
+            )
+
+    (let ((test-vectors
+           '(
+            (:binding "k" :command casual-org--customize-todo-keywords)
+            (:binding "l" :command casual-org--customize-log-done)
+            (:binding "p" :command casual-org--customize-group-priorities)
+            (:binding "i" :command casual-org--customize-imenu-depth)
+            (:binding "r" :command 
casual-org--customize-insert-heading-respect-content)
+            (:binding "g" :command casual-org--customize-group-goto)
+
+             )))
+
+      (casualt-suffix-testcase-runner test-vectors
+                                      #'casual-org-settings-heading-tmenu
+                                      '(lambda () (random 5000))))))
+
+
+(ert-deftest test-casual-org-settings-files-tmenu ()
+  (cl-letf ((casualt-mock #'casual-org--customize-directory)
+            (casualt-mock #'casual-org--customize-default-notes-file)
+            (casualt-mock #'casual-org--customize-refile-targets))
+
+    (let ((test-vectors
+           '((:binding "o" :command casual-org--customize-directory)
+             (:binding "n" :command casual-org--customize-default-notes-file)
+             (:binding "r" :command casual-org--customize-refile-targets))))
+
+      (casualt-suffix-testcase-runner test-vectors
+                                      #'casual-org-settings-files-tmenu
+                                      '(lambda () (random 5000))))))
+
+
+(ert-deftest test-casual-org-settings-display-tmenu ()
+  (cl-letf ((casualt-mock #'casual-org--customize-hide-leading-stars)
+            (casualt-mock #'casual-org--customize-hide-emphasis-markers)
+            (casualt-mock #'casual-org--customize-startup-folded)
+            (casualt-mock #'casual-org--customize-startup-indented))
+
+    (let ((test-vectors
+           '((:binding "s" :command casual-org--customize-hide-leading-stars)
+             (:binding "e" :command 
casual-org--customize-hide-emphasis-markers)
+             (:binding "f" :command casual-org--customize-startup-folded)
+             (:binding "i" :command casual-org--customize-startup-indented))))
+
+      (casualt-suffix-testcase-runner test-vectors
+                                      #'casual-org-settings-display-tmenu
+                                      '(lambda () (random 5000))))))
+
+
+(ert-deftest test-casual-org-settings-keyboard-tmenu ()
+  (cl-letf ((casualt-mock #'casual-org--customize-support-shift-select)
+            (casualt-mock #'casual-org--customize-use-speed-commands))
+
+    (let ((test-vectors
+           '((:binding "s" :command casual-org--customize-support-shift-select)
+             (:binding "S" :command 
casual-org--customize-use-speed-commands))))
+
+      (casualt-suffix-testcase-runner test-vectors
+                                      #'casual-org-settings-keyboard-tmenu
+                                      '(lambda () (random 5000))))))
+
+(ert-deftest test-casual-org-settings-clock-tmenu ()
+  (cl-letf ((casualt-mock #'casual-org--customize-show-notification-handler))
+
+    (let ((test-vectors
+           '((:binding "n"
+              :command casual-org--customize-show-notification-handler))))
+
+      (casualt-suffix-testcase-runner test-vectors
+                                      #'casual-org-settings-clock-tmenu
+                                      '(lambda () (random 5000))))))
+
+(ert-deftest test-casual-org-settings-killyank-tmenu ()
+  (cl-letf ((casualt-mock #'casual-org--customize-yank-image-save-method))
+
+    (let ((test-vectors
+           '((:binding "y"
+              :command casual-org--customize-yank-image-save-method))))
+
+      (casualt-suffix-testcase-runner test-vectors
+                                      #'casual-org-settings-killyank-tmenu
+                                      '(lambda () (random 5000))))))
+
+(ert-deftest test-casual-org-about ()
+  (should (stringp (casual-org-about))))
+
+(provide 'test-casual-org-settings)
+;;; test-casual-org-setttings.el ends here
diff --git a/tests/test-casual-org-utils.el b/tests/test-casual-org-utils.el
new file mode 100644
index 0000000000..d22f60dda4
--- /dev/null
+++ b/tests/test-casual-org-utils.el
@@ -0,0 +1,42 @@
+;;; test-casual-org-utils.el --- Casual Make Utils Tests  -*- lexical-binding: 
t; -*-
+
+;; Copyright (C) 2026  Charles Y. Choi
+
+;; Author: Charles Choi <[email protected]>
+;; Keywords: tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+(require 'ert)
+(require 'casual-org-test-utils)
+(require 'casual-org-utils)
+
+(ert-deftest test-casual-org-unicode-get ()
+  (let ((casual-lib-use-unicode nil))
+    (should (string-equal (casual-org-unicode-get :previous) "Previous"))
+    (should (string-equal (casual-org-unicode-get :next) "Next")))
+
+  (let ((casual-lib-use-unicode t))
+    (should (string-equal (casual-org-unicode-get :previous) "↑"))
+    (should (string-equal (casual-org-unicode-get :next) "↓"))
+    ))
+
+
+(provide 'test-casual-org-utils)
+;;; test-casual-org-utils.el ends here
diff --git a/tests/test-casual-org.el b/tests/test-casual-org.el
new file mode 100644
index 0000000000..0e2f992e5f
--- /dev/null
+++ b/tests/test-casual-org.el
@@ -0,0 +1,445 @@
+;;; test-casual-org.el --- Casual Make Tests -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2026 Charles Y. Choi
+
+;; Author: Charles Choi <[email protected]>
+;; Keywords: tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+
+(require 'ert)
+(require 'casual-org-test-utils)
+(require 'casual-lib-test-utils)
+(require 'casual-org)
+
+(ert-deftest test-casual-org-tmenu-heading ()
+  (casualt-org-setup)
+  (search-forward "* Casual Org Test File" nil t)
+
+  (cl-letf ((casualt-mock #'org-todo)
+            (casualt-mock #'org-sort)
+            (casualt-mock #'org-clone-subtree-with-time-shift)
+            (casualt-mock #'org-insert-heading)
+            (casualt-mock #'org-insert-todo-heading)
+            (casualt-mock #'org-set-property)
+            (casualt-mock #'org-set-tags-command)
+            (casualt-mock #'org-schedule)
+            (casualt-mock #'org-deadline)
+            (casualt-mock #'org-priority-up)
+            (casualt-mock #'org-priority-down)
+            (casualt-mock #'org-add-note)
+            (casualt-mock #'org-refile)
+            (casualt-mock #'casual-org-settings-tmenu)
+            (casualt-mock #'casual-org-info)
+            (casualt-mock #'transient-quit-all))
+
+    (let ((test-vectors
+           '((:binding "t" :command org-todo)
+             (:binding "s" :command org-sort)
+             (:binding "c0" :command org-clone-subtree-with-time-shift)
+             (:binding "a" :command org-insert-heading)
+             (:binding "T" :command org-insert-todo-heading)
+             (:binding "p" :command org-set-property)
+             (:binding ":" :command org-set-tags-command)
+             (:binding "C-s" :command org-schedule)
+             (:binding "C-d" :command org-deadline)
+             (:binding "S-<up>" :command org-priority-up)
+             (:binding "S-<down>" :command org-priority-down)
+             (:binding "n" :command org-add-note)
+             (:binding "w" :command org-refile)
+
+             (:binding "," :command casual-org-settings-tmenu)
+             (:binding "I" :command casual-org-info)
+             (:binding "RET" :command transient-quit-all)
+             )))
+
+      (casualt-suffix-testcase-runner test-vectors
+                                      #'casual-org-tmenu
+                                      '(lambda () (random 5000)))))
+  (casualt-org-breakdown))
+
+
+(ert-deftest test-casual-org-tmenu-item ()
+  (casualt-org-setup)
+  (search-forward "- a" nil t)
+
+  (cl-letf ((casualt-mock #'org-insert-todo-heading)
+            (casualt-mock #'org-cycle-list-bullet)
+            (casualt-mock #'casual-org-toggle-list-to-checkbox)
+
+
+            (casualt-mock #'casual-org-settings-tmenu)
+            (casualt-mock #'casual-org-info)
+            (casualt-mock #'transient-quit-all))
+
+    (let ((test-vectors
+           '(
+             (:binding "a" :command org-insert-todo-heading)
+             (:binding "c" :command org-cycle-list-bullet)
+             (:binding "b" :command casual-org-toggle-list-to-checkbox)
+
+
+             (:binding "," :command casual-org-settings-tmenu)
+             (:binding "I" :command casual-org-info)
+             (:binding "RET" :command transient-quit-all)
+             )))
+
+      (casualt-suffix-testcase-runner test-vectors
+                                      #'casual-org-tmenu
+                                      '(lambda () (random 5000)))))
+  (casualt-org-breakdown))
+
+
+(ert-deftest test-casual-org-tmenu-item-checkbox ()
+  (casualt-org-setup)
+  (search-forward "- [ ] task 1" nil t)
+
+  (cl-letf ((casualt-mock #'org-ctrl-c-ctrl-c)
+            (casualt-mock #'casual-org-checkbox-in-progress))
+
+    (let ((test-vectors
+           '((:binding "C-c" :command org-ctrl-c-ctrl-c)
+             (:binding "-" :command casual-org-checkbox-in-progress))))
+
+      (casualt-suffix-testcase-runner test-vectors
+                                      #'casual-org-tmenu
+                                      '(lambda () (random 5000)))))
+  (casualt-org-breakdown))
+
+
+(ert-deftest test-casual-org-tmenu-TBLFM ()
+  (casualt-org-setup)
+  (search-forward "#+TBLFM" nil t)
+
+  (cl-letf ((casualt-mock #'org-table-recalculate-buffer-tables)
+            (casualt-mock #'org-table-edit-formulas))
+
+    (let ((test-vectors
+           '((:binding "C-c" :command org-table-recalculate-buffer-tables)
+             (:binding "F" :command org-table-edit-formulas))))
+
+      (casualt-suffix-testcase-runner test-vectors
+                                      #'casual-org-tmenu
+                                      '(lambda () (random 5000)))))
+  (casualt-org-breakdown))
+
+(ert-deftest test-casual-org-tmenu-body ()
+  (casualt-org-setup)
+  (search-forward "This is" nil t)
+
+  (cl-letf ((casualt-mock #'org-ctrl-c-star)
+            (casualt-mock #'org-ctrl-c-minus)
+            (casualt-mock #'org-insert-structure-template))
+
+    (let ((test-vectors
+           '((:binding "*" :command org-ctrl-c-star)
+             (:binding "-" :command org-ctrl-c-minus)
+             (:binding "bc" :command org-insert-structure-template))))
+
+      (casualt-suffix-testcase-runner test-vectors
+                                      #'casual-org-tmenu
+                                      '(lambda () (random 5000)))))
+  (casualt-org-breakdown))
+
+
+(ert-deftest test-casual-org-tmenu-body-keyword ()
+  (casualt-org-setup)
+  (search-forward "#+PLOT" nil t)
+
+  (cl-letf ((casualt-mock #'org-ctrl-c-ctrl-c))
+    (let ((test-vectors
+           '((:binding "C-c" :command org-ctrl-c-ctrl-c))))
+
+      (casualt-suffix-testcase-runner test-vectors
+                                      #'casual-org-tmenu
+                                      '(lambda () (random 5000)))))
+  (casualt-org-breakdown))
+
+(ert-deftest test-casual-org-tmenu-block ()
+  (casualt-org-setup)
+  (search-forward "#+BEGIN_SRC" nil t)
+
+  (cl-letf ((casualt-mock #'org-ctrl-c-ctrl-c)
+            (casualt-mock #'org-edit-src-code)
+            (casualt-mock #'casual-org-assign-name))
+    (let ((test-vectors
+           '((:binding "C-c" :command org-ctrl-c-ctrl-c)
+             (:binding "'" :command org-edit-src-code)
+             (:binding "n" :command casual-org-assign-name))))
+
+      (casualt-suffix-testcase-runner test-vectors
+                                      #'casual-org-tmenu
+                                      '(lambda () (random 5000)))))
+  (casualt-org-breakdown))
+
+
+(ert-deftest test-casual-org-tmenu-utility ()
+  (casualt-org-setup)
+  (search-forward "* Casual Org Test File" nil t)
+
+  (cl-letf ((casualt-mock #'org-insert-link)
+            (casualt-mock #'org-insert-last-stored-link)
+            (casualt-mock #'org-cite-insert)
+            (casualt-mock #'org-timestamp)
+            (casualt-mock #'org-timestamp-inactive)
+            (casualt-mock #'org-clock-in)
+            (casualt-mock #'org-clock-out)
+            (casualt-mock #'org-clock-report)
+            (casualt-mock #'org-toggle-inline-images)
+            (casualt-mock #'visible-mode)
+            (casualt-mock #'prettify-symbols-mode)
+            (casualt-mock #'visual-line-mode)
+            (casualt-mock #'org-num-mode))
+    (let ((test-vectors
+           '((:binding "l" :command org-insert-link)
+             (:binding "L" :command org-insert-last-stored-link)
+             (:binding "r" :command org-cite-insert)
+             (:binding "." :command org-timestamp)
+             (:binding "i" :command org-timestamp-inactive)
+             (:binding "M-c" :command org-clock-in)
+             ;; (:binding "M-c" :command org-clock-out) ; TODO test
+             ;; (:binding "R" :command org-clock-report) ; TODO test
+             (:binding "M-i" :command org-toggle-inline-images)
+             (:binding "M" :command visible-mode)
+             (:binding "P" :command prettify-symbols-mode)
+             (:binding "V" :command visual-line-mode)
+             (:binding "N" :command org-num-mode))))
+
+      (casualt-suffix-testcase-runner test-vectors
+                                      #'casual-org-tmenu
+                                      '(lambda () (random 5000)))))
+  (casualt-org-breakdown))
+
+(ert-deftest test-casual-org-tmenu-navigation ()
+  (casualt-org-setup)
+  (search-forward "* Casual Org Test File" nil t)
+
+  (cl-letf ((casualt-mock #'org-shifttab)
+            (casualt-mock #'previous-line)
+            (casualt-mock #'next-line)
+            (casualt-mock #'backward-char)
+            (casualt-mock #'forward-char)
+            (casualt-mock #'org-beginning-of-line)
+            (casualt-mock #'org-end-of-line)
+            (casualt-mock #'org-mark-subtree)
+            (casualt-mock #'org-mark-element)
+            ;; (casualt-mock #'org-copy-visible)
+            (casualt-mock #'org-export-dispatch))
+
+    (let ((test-vectors
+           '((:binding "TAB" :command org-cycle)
+             (:binding "S-TAB" :command org-shifttab)
+             (:binding "C-p" :command previous-line)
+             (:binding "C-n" :command next-line)
+             (:binding "C-b" :command backward-char)
+             (:binding "C-f" :command forward-char)
+             (:binding "C-a" :command org-beginning-of-line)
+             (:binding "C-e" :command org-end-of-line)
+             (:binding "ms" :command org-mark-subtree)
+             (:binding "me" :command org-mark-element)
+             ;; (:binding "v" :command org-copy-visible)
+             (:binding "e" :command org-export-dispatch))))
+
+      (casualt-suffix-testcase-runner test-vectors
+                                      #'casual-org-tmenu
+                                      '(lambda () (random 5000)))))
+  (casualt-org-breakdown))
+
+(ert-deftest test-casual-org-tmenu-navigation-table ()
+  (casualt-org-setup)
+  (search-forward "|" nil t)
+  (push-mark)
+  (forward-char 2)
+
+  (cl-letf ((casualt-mock #'org-table-beginning-of-field)
+            (casualt-mock #'org-table-end-of-field))
+
+    (let ((test-vectors
+           '((:binding "M-a" :command org-table-beginning-of-field)
+             (:binding "M-e" :command org-table-end-of-field))))
+
+      (casualt-suffix-testcase-runner test-vectors
+                                      #'casual-org-tmenu
+                                      '(lambda () (random 5000)))))
+  (casualt-org-breakdown))
+
+(ert-deftest test-casual-org-tmenu-table ()
+  (casualt-org-setup)
+  (search-forward "|" nil t)
+  (push-mark)
+  (forward-char 2)
+
+  (cl-letf ((casualt-mock #'casual-org-table-kill-field-as-copy)
+            (casualt-mock 
#'casual-org-table-copy-reference-and-deactivate-dwim)
+            (casualt-mock #'rectangle-mark-mode)
+            (casualt-mock #'casual-org-table-fill-down)
+            (casualt-mock #'casual-org-table-structure-tmenu)
+            (casualt-mock #'casual-org-assign-name)
+            (casualt-mock #'org-table-export)
+            (casualt-mock #'org-plot/gnuplot)
+            (casualt-mock #'set-mark-command)
+            (casualt-mock #'org-table-edit-field)
+            (casualt-mock #'org-yank)
+            (casualt-mock #'org-table-eval-formula)
+            (casualt-mock #'org-table-blank-field)
+            (casualt-mock #'org-table-edit-formulas)
+
+            (casualt-mock #'org-table-copy-region)
+            (casualt-mock #'org-table-cut-region)
+            (casualt-mock #'org-table-paste-rectangle)
+            (casualt-mock #'org-table-recalculate)
+            (casualt-mock #'org-table-recalculate-buffer-tables)
+            (casualt-mock #'org-table-sum)
+            (casualt-mock #'org-table-sort-lines)
+            (casualt-mock #'org-table-transpose-table-at-point)
+            (casualt-mock #'casual-org-table-info-calc-functions)
+            (casualt-mock #'org-table-toggle-column-width)
+            (casualt-mock #'org-table-shrink)
+            (casualt-mock #'org-table-toggle-coordinate-overlays)
+            (casualt-mock #'org-table-header-line-mode)
+            (casualt-mock #'visual-line-mode))
+
+    (let ((test-vectors
+           '((:binding "w" :command casual-org-table-kill-field-as-copy)
+             (:binding "r" :command 
casual-org-table-copy-reference-and-deactivate-dwim)
+             (:binding "m" :command rectangle-mark-mode)
+             (:binding "d1" :command casual-org-table-fill-down)
+             (:binding "l" :command casual-org-table-structure-tmenu )
+             (:binding "n" :command casual-org-assign-name)
+             (:binding "E" :command org-table-export)
+             (:binding "p" :command org-plot/gnuplot)
+
+             (:binding "C-SPC" :command set-mark-command)
+
+             ;; TODO: handle unmark
+             ;; ("SPC" "Unmark" (lambda () (interactive) (deactivate-mark)))
+             (:binding "`" :command org-table-edit-field)
+             (:binding "C-y" :command org-yank)
+             (:binding "=" :command org-table-eval-formula)
+             (:binding "DEL" :command org-table-blank-field)
+             (:binding "F" :command org-table-edit-formulas)
+
+             (:binding "W" :command org-table-copy-region)
+             (:binding "C" :command org-table-cut-region)
+             (:binding "Y" :command org-table-paste-rectangle)
+
+             (:binding "c" :command org-table-recalculate)
+             (:binding "g" :command org-table-recalculate-buffer-tables)
+             (:binding "s" :command org-table-sum)
+             (:binding "S" :command org-table-sort-lines)
+             (:binding "T" :command org-table-transpose-table-at-point)
+             (:binding "f" :command casual-org-table-info-calc-functions)
+
+             (:binding "z" :command org-table-toggle-column-width)
+             (:binding "Z" :command org-table-shrink)
+             (:binding "t" :command org-table-toggle-coordinate-overlays)
+             (:binding "h" :command org-table-header-line-mode)
+             (:binding "V" :command visual-line-mode))))
+
+      (casualt-suffix-testcase-runner test-vectors
+                                      #'casual-org-tmenu
+                                      '(lambda () (random 5000)))))
+  (casualt-org-breakdown))
+
+
+(ert-deftest test-casual-org-table-structure-tmenu ()
+  (casualt-org-setup)
+  (search-forward "|" nil t)
+  (push-mark)
+  (forward-char 2)
+
+  (cl-letf ((casualt-mock #'org-table-beginning-of-field)
+            (casualt-mock #'org-table-end-of-field)
+            (casualt-mock #'org-table-insert-row)
+            (casualt-mock #'org-table-insert-column)
+            (casualt-mock #'org-table-insert-hline)
+            (casualt-mock #'org-table-kill-row)
+            (casualt-mock #'org-table-delete-column)
+            (casualt-mock #'org-table-move-row-up)
+            (casualt-mock #'org-table-move-row-down)
+            (casualt-mock #'org-table-move-column-left)
+            (casualt-mock #'org-table-move-column-right))
+
+    (let ((test-vectors
+           '((:binding "M-a" :command org-table-beginning-of-field)
+             (:binding "M-e" :command org-table-end-of-field)
+             (:binding "r" :command org-table-insert-row)
+             (:binding "c" :command org-table-insert-column)
+             (:binding "-" :command org-table-insert-hline)
+             (:binding "DEL" :command org-table-kill-row)
+             (:binding "M-DEL" :command org-table-delete-column)
+             (:binding "M-p" :command org-table-move-row-up)
+             (:binding "M-n" :command org-table-move-row-down)
+             (:binding "M-b" :command org-table-move-column-left)
+             (:binding "M-f" :command org-table-move-column-right))))
+
+      (casualt-suffix-testcase-runner test-vectors
+                                      #'casual-org-table-structure-tmenu
+                                      '(lambda () (random 5000)))))
+  (casualt-org-breakdown))
+
+
+(ert-deftest test-casual-org-table-fedit-tmenu ()
+  (casualt-org-setup)
+  (cl-letf ((casualt-mock #'casual-org-table-fedit-first-row-reference)
+            (casualt-mock #'casual-org-table-fedit-last-row-reference)
+            (casualt-mock #'casual-org-table-fedit-first-column-reference)
+            (casualt-mock #'casual-org-table-fedit-last-column-reference)
+            (casualt-mock #'casual-org-table-fedit-first-hline-reference)
+            (casualt-mock #'casual-org-table-fedit-second-hline-reference)
+            (casualt-mock #'casual-org-table-fedit-hline-range-reference)
+            (casualt-mock #'casual-org-table-info-references)
+
+            (casualt-mock #'previous-line)
+            (casualt-mock #'next-line)
+            (casualt-mock #'backward-char)
+            (casualt-mock #'forward-char)
+            (casualt-mock #'org-beginning-of-line)
+            (casualt-mock #'org-end-of-line)
+
+            (casualt-mock #'undo)
+            (casualt-mock #'transient-quit-all))
+
+    (let ((test-vectors
+           '((:binding "@<" :command 
casual-org-table-fedit-first-row-reference)
+             (:binding "@>" :command casual-org-table-fedit-last-row-reference)
+             (:binding "$<" :command 
casual-org-table-fedit-first-column-reference)
+             (:binding "$>" :command 
casual-org-table-fedit-last-column-reference)
+             (:binding "1" :command 
casual-org-table-fedit-first-hline-reference)
+             (:binding "2" :command 
casual-org-table-fedit-second-hline-reference)
+             (:binding "r" :command 
casual-org-table-fedit-hline-range-reference)
+             (:binding "I" :command casual-org-table-info-references)
+             (:binding "C-p" :command previous-line)
+             (:binding "C-n" :command next-line)
+             (:binding "C-b" :command backward-char)
+             (:binding "C-f" :command forward-char)
+             (:binding "C-a" :command org-beginning-of-line)
+             (:binding "C-e" :command org-end-of-line)
+             (:binding "U" :command undo :transient t)
+             (:binding "RET" :command transient-quit-all))))
+
+      (casualt-suffix-testcase-runner test-vectors
+                                      #'casual-org-table-fedit-tmenu
+                                      '(lambda () (random 5000)))))
+  (casualt-org-breakdown))
+
+
+(provide 'test-casual-org)
+;;; test-casual-org.el ends here
diff --git a/tests/test-casual-org.org b/tests/test-casual-org.org
new file mode 100644
index 0000000000..830cc13110
--- /dev/null
+++ b/tests/test-casual-org.org
@@ -0,0 +1,81 @@
+#+TITLE: Casual Org Test File
+
+** Casual Org Test File
+
+This is body text.
+
+*** Table Test
+#+PLOT: title:"n growth"
+#+PLOT: set:"term aqua size 846, 594 font 'Futura,12'"
+#+PLOT: type:2d
+#+PLOT: set:"key right top"
+#+PLOT: set:"xlabel 'n'"
+#+PLOT: set:"ylabel 'n*3'"
+#+PLOT: set:"xtics font ',10'"
+#+PLOT: set:"ytics font ',10'"
+#+PLOT: set:"yrange [0:]"
+#+PLOT: ind:1 deps:(2)
+#+PLOT: with:"linespoints linewidth 3 pointsize 2.0"
+ | n | n*3 |
+ |---+-----|
+ | 1 |   3 |
+ | 2 |   6 |
+ | 3 |   9 |
+ | 4 |  12 |
+ |---+-----|
+ |   |  30 |
+#+TBLFM: $2=$1 *3::@6$2=vsum(@I..@II)
+
+*** Item Test
+
+- a
+- b
+- c
+
+Checkbox Test
+
+- [ ] task 1
+- [ ] task 2
+- [ ] task 3
+
+*** Block Tests
+
+#+begin_src elisp
+  (message "hi there")
+#+end_src
+  
+#+begin_example
+  hi there
+#+end_example
+
+#+begin_quote
+
+#+end_quote
+
+#+begin_export html
+
+#+end_export
+
+#+begin_export latex
+
+#+end_export
+
+#+begin_center
+
+#+end_center
+
+#+begin_verse
+
+#+end_verse
+
+
+* Heading 1
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas rhoncus 
felis ut erat semper mollis sed non turpis. Proin rutrum erat et nisi faucibus 
tincidunt. In a justo urna. Vivamus luctus, lectus sit amet pellentesque 
pulvinar, lorem urna vulputate sem, non molestie tortor nulla id ipsum. Mauris 
vitae ligula neque. Maecenas ac lorem augue.
+
+** Heading 2
+
+Nullam ut enim vitae leo molestie viverra non ac lectus. Phasellus volutpat, 
velit sit amet tempor suscipit, diam lectus vulputate sem, et pretium quam 
ligula vel augue. Mauris vitae ligula neque. Maecenas ac lorem augue.
+
+*** Heading 3
+ Donec feugiat ornare ornare. Aliquam hendrerit, elit id tempus iaculis, eros 
nisl scelerisque quam, ac posuere turpis felis vitae odio. Phasellus volutpat, 
velit sit amet tempor suscipit, diam lectus vulputate sem, et pretium quam 
ligula vel augue.


Reply via email to