0

I'm trying to create a shortcut (C-c c) regardless of what kind of file is currently opened (it could be a .pl file or a .txt file or an extension less file) pressing C-c c should turn on org mode if its not turned on already. pressing it again and again toggles it off and on....

Here's what I have

(global-set-key (kbd "C-c c") (lambda () (interactive)
  (org-mode))))

Any help? It's important that when turning off org mode, whatever the "native" mode the file was originally on comes back on.

1
  • The canonical "toggle" in Elisp is called a minor mode, so you can use define-minor-mode for that.
    – Stefan
    Oct 8, 2019 at 22:42

1 Answer 1

2

This seems to work on a few examples I have tried:

(defvar-local last-mode nil
  "Buffer-local variable to store last mode in.")

(defun toggle-org-mode ()
  "Toggle the mode between the current mode and `org-mode'."
  (interactive)
  (make-local-variable 'last-mode)
  (put 'last-mode 'permanent-local t)
  (if (eq major-mode 'org-mode)
      (progn
        (message "switch back to %s" last-mode)
        (funcall last-mode)
        (setq last-mode nil))
    ;; This means you are in the native mode you started in and now want to
    ;; switch to org-mode
    (message "switch to org from %s" major-mode)
    (setq last-mode major-mode)
    (org-mode)))

This is more subtle than it seemed. You have to mark the buffer-local variable as permanent, or it can get wiped out by changing the major mode.

8
  • ahh my neighbor from ucla! Oct 8, 2019 at 0:58
  • 1
    This does not work: what happens if I have two buffers (different major modes), call the function in the first buffer, call it in the second buffer and then call it again in the first buffer? Maybe making last-mode buffer-local might work.
    – NickD
    Oct 8, 2019 at 4:18
  • that is a good catch. I have modified the solution to make last-mode buffer local. Oct 8, 2019 at 10:59
  • I had to comment out the defvar statements, otherwise I got 'Symbol’s function definition is void: nil' when reverting. I believe the value of last-mode is nil Oct 8, 2019 at 12:56
  • see the new edit. It is trickier than I thought to use local variables. Oct 8, 2019 at 20:29

Your Answer

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

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