On 1/14/09, Juanma Barranquero 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 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 wrote: > > > > On Jan 14, 3:32 am, Joff 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/ > > ☄ > >