emacs lisp, how to get buffer major mode?
Asked Answered
C

7

60

I have tried to search Google and look in the manual, but still cannot find how to get major mode of a buffer object. Can you help me with an example or a reference. Thanks

only solution I could find was to query major-mode after changing the buffer and then changing back to original buffer. Is there a better way to do it?

Cinerator answered 10/2, 2010 at 16:22 Comment(0)
T
45

Is there a problem with that?

(defun buffer-mode (buffer-or-string)
  "Returns the major mode associated with a buffer."
  (with-current-buffer buffer-or-string
     major-mode))

with-current-buffer will restore your buffer when it returns.

Twitter answered 10/2, 2010 at 16:45 Comment(5)
You could also do this with (with-current-buffer buffer-or-string major-mode) instead of save-excursion.Alonaalone
@haxney: Using (save-excursion (set-buffer ..) ...) is indeed deprecated in favor of (with-current-buffer ...). The byte-compiler of Emacs-24 warns about such uses.Paraformaldehyde
@stefan: Where might an emacs noob see such deprecations?Frowsy
As noted, the byte-compiler warns about it: just byte-compile your files, it will give you useful advice.Paraformaldehyde
It works, but I'm curious if emacs can handle this straightforward? Why should we change the target buffer shortly to current, apply function, and change it back? Why isn't there a function that takes a buffer and return its major-mode directly? Is it for some historical convention? Or there are deeper facts in emacs that prevent us doing that?Stranglehold
M
41

For current buffer:

(message "%s" major-mode)
Musjid answered 16/2, 2013 at 10:37 Comment(0)
O
38

A simple way to do this is to use the buffer-local-value function since major-mode is a buffer-local variable:

(buffer-local-value 'major-mode (get-buffer "*scratch*"))
Oscan answered 15/7, 2012 at 0:49 Comment(1)
This actually answers the original asker's question. which is how to do this without switching buffers.Scrouge
U
8

Just extending from previous answers - call with no arguments to get the current buffer's mode:

(defun buffer-mode (&optional buffer-or-name)
  "Returns the major mode associated with a buffer.
If buffer-or-name is nil return current buffer's mode."
  (buffer-local-value 'major-mode
   (if buffer-or-name (get-buffer buffer-or-name) (current-buffer))))

E.g. in *scratch* buffer:

(buffer-mode) => 'lisp-interaction-mode

(buffer-mode "tasks.org") => 'org-mode
Uncork answered 17/3, 2014 at 16:52 Comment(1)
Thanks for offering a comprehensive solution!Haftarah
C
0

Well, describe-mode takes an optional buffer argument, but that displays the help... and I'm not exactly sure what it returns...

But that's the best I could find in a brief search... sorry...

Cowie answered 10/2, 2010 at 16:42 Comment(0)
I
0

Simply evaluate this:

(print major-mode)
Indicia answered 9/9, 2018 at 20:5 Comment(0)
P
0

Another way, apart from directly readind the major-mode variable would be by directly readind the mode-name variable.

Phalansterian answered 28/11, 2019 at 16:2 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.