all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Joff <jack.joff@gmail.com>
To: help-gnu-emacs@gnu.org
Subject: Re: changing a variable with a keystroke
Date: Thu, 15 Jan 2009 08:48:46 +0000	[thread overview]
Message-ID: <50abee650901150048s341c0fb7p8eb8aacae40c3de6@mail.gmail.com> (raw)
In-Reply-To: <c3158ca2-a3a8-406d-a616-c5837fd81fbb@n33g2000pri.googlegroups.com>

[-- Attachment #1: Type: text/plain, Size: 6704 bytes --]

 On 1/14/09, Juanma Barranquero <lekktu@gmail.com> wrote:
>You are using (interactive "p"), which says that the function has an
>argument, but it has none. If you use just (interactive) it will work.
>See the documentation for function `interactive'.

This has solved it, thank you

 >However, it's a bit weird that you need a keybinding just to set
>switches for dired. Doesn't it work if you just add
>(setq dired-listing-switches "-lR")
>to your .emacs file? Unless you don't always want these switches, of
course.

I want to be able to turn it on and off at will. And also wanted to see if I
could make it work!

On Jan 14, 2009 10:05pm, Xah Lee <xahlee@gmail.com> wrote:
>
 On Jan 14, 3:32 am, Joff jack.j...@gmail.com> wrote:
> > (global-set-key (kbd "C-l C-r") '(setq dired-listing-switches -lR))  -->
> > Wrong type argument: commandp, (setq dired-listing-switches -lR) on
pressing
> > C-l C-r
>
>
> Here's what's wrong with your code. Using pseudo C-like code to
>
>
> illustrate, what you want is:
> setkey(keyCode, functionName)
>
> but what you are doing is:
> setkey(keyCode, diredswich = "lr")
>
> So, your second argument is supposed to be a function, but you give it
> a expression of what the function is supposed to do.
>
> To fix, you can define your function, then put the function name as
> the second arg to setkey. But since elisp has a function construct
> (aka lambda), so you don't need to define it separately.
> Here's the code:
> (global-set-key (kbd "C-l C-r")
>  (lambda () (setq dired-listing-switches "-lR"))
> ) ;; code not tested

This doesn't seem to work: it gives me:
Wrong type argument: commandp, (lambda nil (setq dired-listing-switches
"-lR"))

But I think I get what you are saying: I needed to define a function. Which
is why the "defun..." bit (almost) worked.


> Note that what you are doing is strange. Depending what you want to
> achieve, there are probably better ways.
>
What I want to be able to acheive is being able to switch to and from dired
recursive list 'mode' with a single key combination (rather than going
through M-x set-variable... etc or C-u s switch. Is there a better way to do
this? Secondly, my intention was to introduce myself to customising emacs
using elisp.

>
> > so then I tried
> > (defun set_recursive_dired () "Set dired mode to recursive view"
> >   (interactive "p")
> >   (setq dired-listing-switches "-lR"))
> > (global-set-key (kbd "C-l") nil)
> > (global-set-key (kbd "C-l C-r") 'set_recursive_dired)
> > because I thought setq might not be a command (?) which got me:
>
> if you want to define it separately, you can do it like this:
>
> (defun set_recursive_dired ()
>   "Set dired mode to recursive view"
>   (setq dired-listing-switches "-lR"))
>
without the 'interactive' line, I get this:
Wrong type argument: commandp, set_recursive_dired
(which is why I put it in in the first place)

>
>
> lisp syntax gets a bit used to, but partly also because it is
> irregular, and inconsistant in its eval/not-eval expectation in its
> various functions ...

> my website has a elisp tutorial you might be interested.

Thankyou, that looks useful.

For the record, what I eventually did was take the "p" out of (interactive
"p") which I did not realise meant that interactive takes an argument.
The following works for me (hooray!):

(defun set_recursive_dired ()
  "Set dired mode to recursive view"
  (interactive)
  (setq dired-listing-switches "-lR")
  (message "Switched to recursive dired view"))

(global-set-key (kbd "C-l") nil)
(global-set-key (kbd "C-l C-r") 'set_recursive_dired)

So thanks all of you who replied for your help! Elisp here I come....
Joff


On 1/14/09, Xah Lee <xahlee@gmail.com> wrote:
>
>
>
> On Jan 14, 3:32 am, Joff <jack.j...@gmail.com> wrote:
> > Dear all,
> >
> >  I'm having trouble trying to create a key combination to set a global
> > variable. I have tried putting the following in my .emacs file:
> >
> > (global-set-key (kbd "C-l") nil)
> > (global-set-key (kbd "C-l C-r") '(setq dired-listing-switches "-lR")
> >
> > and various permutions of the '(setq .. "-lR") part (with a single quote
> in
> > front of the -lR, without the intial single quote etc. This got me
> various
> > errors:
> >
> > (global-set-key (kbd "C-l C-r") (setq dired-listing-switches -lR))   -->
> > Symbol's value as variable is void: -lR
> >
> > (global-set-key (kbd "C-l C-r") '(setq dired-listing-switches -lR))  -->
> > Wrong type argument: commandp, (setq dired-listing-switches -lR) on
> pressing
> > C-l C-r
> >
> > (global-set-key (kbd "C-l C-r") (setq dired-listing-switches "-lR"))  -->
> > Printed -lR into my buffer when I pressed C-l C-r
> >
> > and so on...
>
> Here's what's wrong with your code. Using pseudo C-like code to
> illustrate, what you want is:
>
> setkey(keyCode, functionName)
>
> but what you are doing is:
>
> setkey(keyCode, diredswich = "lr")
>
> So, your second argument is supposed to be a function, but you give it
> a expression of what the function is supposed to do.
>
> To fix, you can define your function, then put the function name as
> the second arg to setkey. But since elisp has a function construct
> (aka lambda), so you don't need to define it separately.
>
> Here's the code:
>
> (global-set-key (kbd "C-l C-r")
> (lambda () (setq dired-listing-switches "-lR"))
> ) ;; code not tested
>
> -----------------
>
> Note that what you are doing is strange. Depending what you want to
> achieve, there are probably better ways.
>
>
> ---------------------
>
>
> > so then I tried
> >
> > (defun set_recursive_dired () "Set dired mode to recursive view"
> >   (interactive "p")
> >   (setq dired-listing-switches "-lR"))
> >
> > (global-set-key (kbd "C-l") nil)
> > (global-set-key (kbd "C-l C-r") 'set_recursive_dired)
> > because I thought setq might not be a command (?) which got me:
>
> if you want to define it separately, you can do it like this:
>
> (defun set_recursive_dired ()
> "Set dired mode to recursive view"
> (setq dired-listing-switches "-lR"))
>
> > as you can probably tell, I'm pretty new to lisp/elisp... I have tried
> > 'reading the error messages' and have done a lot of googling, which has
> got
> > me this far (and which suggested the above '(defun...set_recursive_dired)
> )
> >
> > so could anyone kindly shed some light on why the above don't work, and
> > perhaps suggest what I should be trying? Is it a syntax thing or am I
> > missing the point completely?
>
> lisp syntax gets a bit used to, but partly also because it is
> irregular, and inconsistant in its eval/not-eval expectation in its
> various functions ...
>
> my website has a elisp tutorial you might be interested.
>
> Xah
> ∑ http://xahlee.org/
>
> ☄
>
>

[-- Attachment #2: Type: text/html, Size: 8929 bytes --]

  reply	other threads:[~2009-01-15  8:48 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <mailman.4829.1231934186.26697.help-gnu-emacs@gnu.org>
2009-01-14 22:05 ` changing a variable with a keystroke Xah Lee
2009-01-15  8:48   ` Joff [this message]
2009-01-15 18:51     ` Tassilo Horn
     [not found]     ` <mailman.4960.1232045493.26697.help-gnu-emacs@gnu.org>
2009-01-16 11:19       ` Muurimäki Perttu
2009-01-14 11:32 Joff
2009-01-14 12:14 ` Juanma Barranquero

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=50abee650901150048s341c0fb7p8eb8aacae40c3de6@mail.gmail.com \
    --to=jack.joff@gmail.com \
    --cc=help-gnu-emacs@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.