unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
* Doing things only in a particular mode
@ 2015-08-24 14:49 Colin Yates
  0 siblings, 0 replies; 14+ messages in thread
From: Colin Yates @ 2015-08-24 14:49 UTC (permalink / raw)
  To: help-gnu-emacs

(newbie warning).

So I understand about (add-hook...) but I can't find the hook I
want. Basically, I have visual-line-mode turned on globally, but I want
to disable it when I view the headers in mu4e.

The buffer is called *mu4e-headers* and I can see the major mode is
mu4e-headers but the following code has no effect:

(add-hook 'mu4e-headers-hook
  (lambda ()
    (visual-line-mode 0)))

I am not sure how 'hooks' are created - I searched through the source
code for my4e-headers-hook but couldn't find it.

Assuming this is the right approach, how can I say 'when the major mode
is X then do this'. What is the idiomatic Emacs way?

Thanks!

Sent with my mu4e



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Doing things only in a particular mode
       [not found] <mailman.0.1440427806.19573.help-gnu-emacs@gnu.org>
@ 2015-08-24 15:18 ` Dan Espen
  2015-08-24 16:28   ` Colin Yates
  2015-08-24 17:18 ` Joost Kremers
  1 sibling, 1 reply; 14+ messages in thread
From: Dan Espen @ 2015-08-24 15:18 UTC (permalink / raw)
  To: help-gnu-emacs

Colin Yates <colin.yates@gmail.com> writes:

> (newbie warning).
>
> So I understand about (add-hook...) but I can't find the hook I
> want. Basically, I have visual-line-mode turned on globally, but I want
> to disable it when I view the headers in mu4e.
>
> The buffer is called *mu4e-headers* and I can see the major mode is
> mu4e-headers but the following code has no effect:
>
> (add-hook 'mu4e-headers-hook
>   (lambda ()
>     (visual-line-mode 0)))
>
> I am not sure how 'hooks' are created - I searched through the source
> code for my4e-headers-hook but couldn't find it.
>
> Assuming this is the right approach, how can I say 'when the major mode
> is X then do this'. What is the idiomatic Emacs way?

Sorry, I know nothing about mu4e, but the docs seem pretty good.
Here's where they describe the compose mode hook:

http://www.djcbsoftware.nl/code/mu/mu4e/Compose-hooks.html#Compose-hooks

Usually I do ^h m (help mode), and the help text mentions the hooks.


-- 
Dan Espen


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Doing things only in a particular mode
  2015-08-24 15:18 ` Dan Espen
@ 2015-08-24 16:28   ` Colin Yates
  2015-08-24 17:32     ` John Mastro
  2015-08-25  1:30     ` Emanuel Berg
  0 siblings, 2 replies; 14+ messages in thread
From: Colin Yates @ 2015-08-24 16:28 UTC (permalink / raw)
  To: Dan Espen; +Cc: help-gnu-emacs

Thanks Dan. I did look at those sources, specifiying looking for
something like =mu4e-headers-hook= but couldn't find one.

Do you have any idea about the more generic emacs question?
Specifically, how do I achieve the following:

(when (= MAJOR_MODE "mu4e-headers")
  (do this)
  (and do that))

Thanks.

Dan Espen writes:

> Colin Yates <colin.yates@gmail.com> writes:
>
>> (newbie warning).
>>
>> So I understand about (add-hook...) but I can't find the hook I
>> want. Basically, I have visual-line-mode turned on globally, but I want
>> to disable it when I view the headers in mu4e.
>>
>> The buffer is called *mu4e-headers* and I can see the major mode is
>> mu4e-headers but the following code has no effect:
>>
>> (add-hook 'mu4e-headers-hook
>>   (lambda ()
>>     (visual-line-mode 0)))
>>
>> I am not sure how 'hooks' are created - I searched through the source
>> code for my4e-headers-hook but couldn't find it.
>>
>> Assuming this is the right approach, how can I say 'when the major mode
>> is X then do this'. What is the idiomatic Emacs way?
>
> Sorry, I know nothing about mu4e, but the docs seem pretty good.
> Here's where they describe the compose mode hook:
>
> http://www.djcbsoftware.nl/code/mu/mu4e/Compose-hooks.html#Compose-hooks
>
> Usually I do ^h m (help mode), and the help text mentions the hooks.

-- 
Sent with my mu4e



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Doing things only in a particular mode
       [not found] <mailman.0.1440427806.19573.help-gnu-emacs@gnu.org>
  2015-08-24 15:18 ` Dan Espen
@ 2015-08-24 17:18 ` Joost Kremers
  2015-08-24 17:30   ` Colin Yates
  2015-08-24 19:47   ` Jorge A. Alfaro-Murillo
  1 sibling, 2 replies; 14+ messages in thread
From: Joost Kremers @ 2015-08-24 17:18 UTC (permalink / raw)
  To: help-gnu-emacs

Colin Yates wrote:
> (newbie warning).
>
> So I understand about (add-hook...) but I can't find the hook I
> want. Basically, I have visual-line-mode turned on globally, but I want
> to disable it when I view the headers in mu4e.
>
> The buffer is called *mu4e-headers* and I can see the major mode is
> mu4e-headers but the following code has no effect:
>
> (add-hook 'mu4e-headers-hook
>   (lambda ()
>     (visual-line-mode 0)))

Well, the hook is actually called `mu4e-headers-mode-hook`, so if you
use that, it should work.

To check if a variable exists, or find one if you have some idea what it
might be called, you can use `C-h v`, type the name and hit RET. TAB
completion works, so typing e.g., `C-h v mu4e-headers-hook TAB` would
have found the right variable for you.

BTW, the general advice is to not use lambdas in hook variables, just
function names. You might not really care, but if you want to be
pedantically correct about things, you could write:

(defun my-mu4e-headers-function ()  ; use whatever name you see fit
  (visual-line-mode -1))
(add-hook 'my-mu4e-headers-function)

Note that I use `-1` as the argument to `visual-line-mode`. IIRC an
argument of 0 would actually activate the mode.

> I am not sure how 'hooks' are created - I searched through the source
> code for my4e-headers-hook but couldn't find it.

They are created automatically when you create a major or minor mode
with `define-derived-mode` or `define-minor-mode`, so that's why you
couldn't find it by grepping the source.

> Assuming this is the right approach, how can I say 'when the major mode
> is X then do this'. What is the idiomatic Emacs way?

Well, one can argue about the meaning of "idiomatic", but here's how one
could do it:

(when (eq major-mode 'mu4e-headers-mode)
  (do this)
  (and that))

Note, however, that in a mode major hook, there's no need to use this,
because if the mode were anything else, the hook wouldn't be run. It
could be useful in an Elisp program or in a (function called in a) minor
mode hook, though.

HTH


-- 
Joost Kremers                                   joostkremers@fastmail.fm
Selbst in die Unterwelt dringt durch Spalten Licht
EN:SiS(9)


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Doing things only in a particular mode
  2015-08-24 17:18 ` Joost Kremers
@ 2015-08-24 17:30   ` Colin Yates
  2015-08-24 19:47   ` Jorge A. Alfaro-Murillo
  1 sibling, 0 replies; 14+ messages in thread
From: Colin Yates @ 2015-08-24 17:30 UTC (permalink / raw)
  To: Joost Kremers; +Cc: help-gnu-emacs

Many thanks, this was exactly the type of info I was looking for. The
name of the hook was valuable but advice on how to find the name was
ever more appreciated.

Thanks Joost!

Joost Kremers writes:

> Colin Yates wrote:
>> (newbie warning).
>>
>> So I understand about (add-hook...) but I can't find the hook I
>> want. Basically, I have visual-line-mode turned on globally, but I want
>> to disable it when I view the headers in mu4e.
>>
>> The buffer is called *mu4e-headers* and I can see the major mode is
>> mu4e-headers but the following code has no effect:
>>
>> (add-hook 'mu4e-headers-hook
>>   (lambda ()
>>     (visual-line-mode 0)))
>
> Well, the hook is actually called `mu4e-headers-mode-hook`, so if you
> use that, it should work.
>
> To check if a variable exists, or find one if you have some idea what it
> might be called, you can use `C-h v`, type the name and hit RET. TAB
> completion works, so typing e.g., `C-h v mu4e-headers-hook TAB` would
> have found the right variable for you.
>
> BTW, the general advice is to not use lambdas in hook variables, just
> function names. You might not really care, but if you want to be
> pedantically correct about things, you could write:
>
> (defun my-mu4e-headers-function ()  ; use whatever name you see fit
>   (visual-line-mode -1))
> (add-hook 'my-mu4e-headers-function)
>
> Note that I use `-1` as the argument to `visual-line-mode`. IIRC an
> argument of 0 would actually activate the mode.
>
>> I am not sure how 'hooks' are created - I searched through the source
>> code for my4e-headers-hook but couldn't find it.
>
> They are created automatically when you create a major or minor mode
> with `define-derived-mode` or `define-minor-mode`, so that's why you
> couldn't find it by grepping the source.
>
>> Assuming this is the right approach, how can I say 'when the major mode
>> is X then do this'. What is the idiomatic Emacs way?
>
> Well, one can argue about the meaning of "idiomatic", but here's how one
> could do it:
>
> (when (eq major-mode 'mu4e-headers-mode)
>   (do this)
>   (and that))
>
> Note, however, that in a mode major hook, there's no need to use this,
> because if the mode were anything else, the hook wouldn't be run. It
> could be useful in an Elisp program or in a (function called in a) minor
> mode hook, though.
>
> HTH

-- 
Sent with my mu4e



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Doing things only in a particular mode
  2015-08-24 16:28   ` Colin Yates
@ 2015-08-24 17:32     ` John Mastro
  2015-08-25  1:30     ` Emanuel Berg
  1 sibling, 0 replies; 14+ messages in thread
From: John Mastro @ 2015-08-24 17:32 UTC (permalink / raw)
  To: help-gnu-emacs@gnu.org; +Cc: Colin Yates

> Do you have any idea about the more generic emacs question?
> Specifically, how do I achieve the following:
>
> (when (= MAJOR_MODE "mu4e-headers")
>   (do this)
>   (and do that))

There will usually be a `foo-mode-hook' for any mode `foo', so you would
create a function to perform you configuration and add it to that hook.

There's also an `after-change-major-mode-hook', where you can add
functions that you want to be run after the major mode changes. However,
in practice I've never needed to use it.

As an aside, the value of `major-mode' is a symbol, so `=' won't work
for the equality comparison (unlike in Clojure, `=' isn't very
polymorphic; it can only compare numbers or markers). Either `eq'
(equivalent to Clojure's `identical?') or `equal' (the closest to
Clojure's `=', though not equivalent) would work.

-- 
john



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Doing things only in a particular mode
  2015-08-24 17:18 ` Joost Kremers
  2015-08-24 17:30   ` Colin Yates
@ 2015-08-24 19:47   ` Jorge A. Alfaro-Murillo
  2015-08-26 13:54     ` Stefan Monnier
  1 sibling, 1 reply; 14+ messages in thread
From: Jorge A. Alfaro-Murillo @ 2015-08-24 19:47 UTC (permalink / raw)
  To: help-gnu-emacs

Joost Kremers writes:
 
> Note that I use `-1` as the argument to `visual-line-mode`. IIRC 
> an argument of 0 would actually activate the mode.

That is wrong, for any mode, say "foo", calling the function 
foo-mode with a prefix argument ARG, should enable the mode if ARG 
is positive or nil, and disable it otherwise. 0 is not positive.

-- 
Jorge.




^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Doing things only in a particular mode
  2015-08-24 16:28   ` Colin Yates
  2015-08-24 17:32     ` John Mastro
@ 2015-08-25  1:30     ` Emanuel Berg
  2015-08-25  1:55       ` Emanuel Berg
  2015-08-27  5:17       ` Marcin Borkowski
  1 sibling, 2 replies; 14+ messages in thread
From: Emanuel Berg @ 2015-08-25  1:30 UTC (permalink / raw)
  To: help-gnu-emacs

Colin Yates <colin.yates@gmail.com> writes:

> Do you have any idea about the more generic emacs
> question? Specifically, how do I achieve the
> following:
>
> (when (= MAJOR_MODE "mu4e-headers") (do this) (and do
> that))

Pseudo-code that looks like real code but isn't -
run!!!

;; syntax for `if' with single-form branches

(if (eq major-mode 'mu4e-headers-mode) (do-something)
  (do-something-else) )

;; ditto multiple-form branches

(if (eq major-mode 'mu4e-headers-mode)
  (progn
    (do-something-step-1)
    (do-something-step-2) )
  (progn
    (else-do-this-step-1)
    ;; ...
    (else-do-this-step-n) ))

;; syntax for when

(when condition
   (do-this)
   (and-this)
   (including-this) )

;; group major modes

(unless (member major-mode '(makefile-gmake-mode
                             makefile-mode) ) ; exceptions
    (untabify (point-min) (point-max)))

-- 
underground experts united
http://user.it.uu.se/~embe8573




^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Doing things only in a particular mode
  2015-08-25  1:30     ` Emanuel Berg
@ 2015-08-25  1:55       ` Emanuel Berg
  2015-08-27  5:17       ` Marcin Borkowski
  1 sibling, 0 replies; 14+ messages in thread
From: Emanuel Berg @ 2015-08-25  1:55 UTC (permalink / raw)
  To: help-gnu-emacs

Emanuel Berg <embe8573@student.uu.se> writes:

> ;; syntax for `if' with single-form branches
>
> (if (eq major-mode 'mu4e-headers-mode) (do-something)
>   (do-something-else) )
>
> ;; ditto multiple-form branches
>
> (if (eq major-mode 'mu4e-headers-mode)
>   (progn
>     (do-something-step-1)
>     (do-something-step-2) )
>   (progn
>     (else-do-this-step-1)
>     ;; ...
>     (else-do-this-step-n) ))

Maybe "syntax" is stretching it for the last example.
Let's say it is one way of doing it, a way that is
common and not bad. But actually you can put whatever
you want there that makes sense.

-- 
underground experts united
http://user.it.uu.se/~embe8573




^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Doing things only in a particular mode
  2015-08-24 19:47   ` Jorge A. Alfaro-Murillo
@ 2015-08-26 13:54     ` Stefan Monnier
  2015-08-26 19:35       ` Jorge A. Alfaro-Murillo
  0 siblings, 1 reply; 14+ messages in thread
From: Stefan Monnier @ 2015-08-26 13:54 UTC (permalink / raw)
  To: help-gnu-emacs

>> Note that I use `-1` as the argument to `visual-line-mode`.

I do the same and recommend others do that as well.

>> IIRC an argument of 0 would actually activate the mode.
> That is wrong,

Indeed, it's wrong.  But whether 0 is negative or positive or both or
neither is a long discussion, so by using -1 you completely side step
the issue.


        Stefan




^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Doing things only in a particular mode
  2015-08-26 13:54     ` Stefan Monnier
@ 2015-08-26 19:35       ` Jorge A. Alfaro-Murillo
  2015-08-26 20:09         ` Jorge A. Alfaro-Murillo
  2015-08-27 13:53         ` Stefan Monnier
  0 siblings, 2 replies; 14+ messages in thread
From: Jorge A. Alfaro-Murillo @ 2015-08-26 19:35 UTC (permalink / raw)
  To: help-gnu-emacs

Stefan Monnier writes:

>>> Note that I use `-1` as the argument to `visual-line-mode`. 
> 
> I do the same and recommend others do that as well.

I like better:

(foo-mode 1) ; on

(foo-mode 0) ; off

It looks like a on/off switch.

>>> IIRC an argument of 0 would actually activate the mode. 
>> That is wrong, 
> 
> Indeed, it's wrong.  But whether 0 is negative or positive or 
> both or neither is a long discussion, so by using -1 you 
> completely side step the issue.

A positive number is a number bigger than zero. Zero is not bigger 
than zero, so it is not a positive number. It is also not a 
negative number, since it is not smaller than zero.

-- 
Jorge.




^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Doing things only in a particular mode
  2015-08-26 19:35       ` Jorge A. Alfaro-Murillo
@ 2015-08-26 20:09         ` Jorge A. Alfaro-Murillo
  2015-08-27 13:53         ` Stefan Monnier
  1 sibling, 0 replies; 14+ messages in thread
From: Jorge A. Alfaro-Murillo @ 2015-08-26 20:09 UTC (permalink / raw)
  To: help-gnu-emacs

Jorge A. Alfaro-Murillo writes:

> A positive number is a number bigger than zero. Zero is not 
> bigger than zero, so it is not a positive number. It is also not 
> a negative number, since it is not smaller than zero.

Although in French 0 is "positif" which is the equivalent of 
"non-negative" in English.

-- 
Jorge.




^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Doing things only in a particular mode
  2015-08-25  1:30     ` Emanuel Berg
  2015-08-25  1:55       ` Emanuel Berg
@ 2015-08-27  5:17       ` Marcin Borkowski
  1 sibling, 0 replies; 14+ messages in thread
From: Marcin Borkowski @ 2015-08-27  5:17 UTC (permalink / raw)
  To: help-gnu-emacs


On 2015-08-25, at 03:30, Emanuel Berg <embe8573@student.uu.se> wrote:

> ;; ditto multiple-form branches
>
> (if (eq major-mode 'mu4e-headers-mode)
>   (progn
>     (do-something-step-1)
>     (do-something-step-2) )
>   (progn
>     (else-do-this-step-1)
>     ;; ...
>     (else-do-this-step-n) ))

I guess you got the indentation wrong.  Also, you don't need progn for
else-branch.  Also, if you need progn for then-branch, I'd prefer cond
to if.

Best,

-- 
Marcin Borkowski
http://octd.wmi.amu.edu.pl/en/Marcin_Borkowski
Faculty of Mathematics and Computer Science
Adam Mickiewicz University



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: Doing things only in a particular mode
  2015-08-26 19:35       ` Jorge A. Alfaro-Murillo
  2015-08-26 20:09         ` Jorge A. Alfaro-Murillo
@ 2015-08-27 13:53         ` Stefan Monnier
  1 sibling, 0 replies; 14+ messages in thread
From: Stefan Monnier @ 2015-08-27 13:53 UTC (permalink / raw)
  To: help-gnu-emacs

> A positive number is a number bigger than zero.

That's one definition,


        Stefan




^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2015-08-27 13:53 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-08-24 14:49 Doing things only in a particular mode Colin Yates
     [not found] <mailman.0.1440427806.19573.help-gnu-emacs@gnu.org>
2015-08-24 15:18 ` Dan Espen
2015-08-24 16:28   ` Colin Yates
2015-08-24 17:32     ` John Mastro
2015-08-25  1:30     ` Emanuel Berg
2015-08-25  1:55       ` Emanuel Berg
2015-08-27  5:17       ` Marcin Borkowski
2015-08-24 17:18 ` Joost Kremers
2015-08-24 17:30   ` Colin Yates
2015-08-24 19:47   ` Jorge A. Alfaro-Murillo
2015-08-26 13:54     ` Stefan Monnier
2015-08-26 19:35       ` Jorge A. Alfaro-Murillo
2015-08-26 20:09         ` Jorge A. Alfaro-Murillo
2015-08-27 13:53         ` Stefan Monnier

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).