Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time


Build status MELPA MELPA Stable

A tiny library for working with textual checkboxes in Emacs buffers. Use it to keep grocery lists in text files, feature requests in source files, or task lists on GitHub PRs.


The recommended method of installation is via package.el. If you haven't previously added MELPA (or Marmalade) as a package source, add the following to your .emacs and either evaluate it or restart Emacs:

(require 'package)
(add-to-list 'package-archives
             '("melpa" . "") t)

With that in place you can simply run M-x package-install RET checkbox RET to download and install the package.

I'd recommend globally binding checkbox-toggle to a convenient keystroke. For example:

(global-set-key (kbd "C-c C-t") 'checkbox-toggle)


If you have a simple to-do list in a Markdown file like this:

- [ ] Buy gin<point>
- [ ] Buy tonic

And you invoke checkbox-toggle, you'll get the following:

- [x] Buy gin<point>
- [ ] Buy tonic

Invoke it again and you're back to the original unchecked version.

- [ ] Buy gin<point>
- [ ] Buy tonic

Next, if we add a line without a checkbox...

- [ ] Buy gin
- [ ] Buy tonic
- Buy limes<point>

We can invoke the command again to insert a new checkbox.

- [ ] Buy gin
- [ ] Buy tonic
- [ ] Buy limes<point>

If we want to remove a checkbox entirely we can do so by passing a prefix argument (C-u) to checkbox-toggle.

Finally, checkbox.el treats programming modes specially, wrapping inserted checkboxes in comments so we can quickly go from this:

  (let ((beg (point)))

To this:

  (beginning-of-line)                ; [ ] <point>
  (let ((beg (point)))

If you prefer to use an alternate set of checkboxes, you can do so by changing the value of checkbox-states, a buffer-local variable. Less advanced users may prefer to do this through the customize facility:

M-x customize-group RET checkbox RET

Advanced users may prefer to do so via their .emacs file:

(require 'checkbox)
(setq-default checkbox-states '("TODO" "DONE" "WAITING"))

Additionally, a convenient way to give a file a unique set of checkbox states is via File Variables (also see the handy add-file-local-variable function), allowing us to specify the state set we want to use via a small comment near the end of the file. For example, in a Markdown file:

<!-- Local Variables: -->
<!-- checkbox-states: ("TODO" "DONE" "WAITING") -->
<!-- End: -->

Passing a prefix argument to checkbox-toggle allows us to directly choose a checkbox to insert via its position in checkbox-states, which is useful when we have more than two states. For example, assuming the custom state set above and a buffer with the following contents:

- Review report<point>

C-u 2 C-c C-t will yield:

- WAITING Review report<point>

Note that the first state is 0.


For a more featureful alternative, check out the amazing org-mode. I love and use org-mode, but org-mode generally expects to be running as a major mode whereas checkbox.el will happily handle your checkbox needs inside of any mode.


To run the full test suite (unit + integration) simply run:

$ make


Copyright (C) 2014 Cameron Desautels

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

Author: Cameron Desautels <>


A tiny Emacs library for quick manipulation of textual checkboxes






No packages published