help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: changing a variable with a keystroke


From: Joff
Subject: Re: changing a variable with a keystroke
Date: Thu, 15 Jan 2009 08:48:46 +0000

 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/





reply via email to

[Prev in Thread] Current Thread [Next in Thread]