* File modes facilities. @ 2005-10-19 20:09 Michael Cadilhac 2005-10-19 20:35 ` Stefan Monnier 2005-10-20 1:42 ` Kevin Ryde 0 siblings, 2 replies; 65+ messages in thread From: Michael Cadilhac @ 2005-10-19 20:09 UTC (permalink / raw) [-- Attachment #1.1.1: Type: text/plain, Size: 740 bytes --] I don't know any way to change the modes of a file, or even of the current file, within emacs. As I chmod quite often, and especially the file I work with, I've made up a small package that implements facilities for that. The main functions are : - file-modes-to-number: Convert "a=rwx,a+r,go-x,u+s,a+t" to 3574 (06766), "777" to 511 (0777) and 511 to 511. - buffer-file-modes: Return the file modes of the file visited by a buffer or the default modes. - set-current-file-modes: Set the modes of the file currently visited. - chmod: Change the mode of any file. If you're interested in this module, feel free to do whatever you want with it :-) Any comment appreciated ! Code attached. [-- Attachment #1.1.2: Change Modes Package --] [-- Type: application/emacs-lisp, Size: 7679 bytes --] [-- Attachment #1.1.3: Type: text/plain, Size: 246 bytes --] -- Michael Cadilhac, a.k.a. Micha [mika] | Epita/LRDE promo 2007 | Please note that you should 2 rue de la Convention | 08.70.65.13.14 | s/-@t-/@/ my mail address. 94270 Le Kremlin Bicetre | 06.23.20.31.30 | [-- Attachment #1.2: Type: application/pgp-signature, Size: 188 bytes --] [-- Attachment #2: Type: text/plain, Size: 142 bytes --] _______________________________________________ Emacs-devel mailing list Emacs-devel@gnu.org http://lists.gnu.org/mailman/listinfo/emacs-devel ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-19 20:09 File modes facilities Michael Cadilhac @ 2005-10-19 20:35 ` Stefan Monnier 2005-10-19 21:28 ` Michael Cadilhac 2005-10-20 1:42 ` Kevin Ryde 1 sibling, 1 reply; 65+ messages in thread From: Stefan Monnier @ 2005-10-19 20:35 UTC (permalink / raw) Cc: emacs-devel > I don't know any way to change the modes of a file, or even of the > current file, within emacs. C-h f set-file-modes RET Stefan ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-19 20:35 ` Stefan Monnier @ 2005-10-19 21:28 ` Michael Cadilhac 2005-10-19 22:19 ` Nick Roberts 0 siblings, 1 reply; 65+ messages in thread From: Michael Cadilhac @ 2005-10-19 21:28 UTC (permalink / raw) Cc: Michael Cadilhac, emacs-devel [-- Attachment #1.1: Type: text/plain, Size: 540 bytes --] Stefan Monnier <monnier@iro.umontreal.ca> writes: >> I don't know any way to change the modes of a file, or even of the >> current file, within emacs. > > C-h f set-file-modes RET I meant in an user-friendly way, that's to say, without M-:, and without calculating the mode. -- Michael Cadilhac, a.k.a. Micha [mika] | Epita/LRDE promo 2007 | Please note that you should 2 rue de la Convention | 08.70.65.13.14 | s/-@t-/@/ my mail address. 94270 Le Kremlin Bicetre | 06.23.20.31.30 | [-- Attachment #1.2: Type: application/pgp-signature, Size: 188 bytes --] [-- Attachment #2: Type: text/plain, Size: 142 bytes --] _______________________________________________ Emacs-devel mailing list Emacs-devel@gnu.org http://lists.gnu.org/mailman/listinfo/emacs-devel ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-19 21:28 ` Michael Cadilhac @ 2005-10-19 22:19 ` Nick Roberts 2005-10-19 22:44 ` Michael Cadilhac 0 siblings, 1 reply; 65+ messages in thread From: Nick Roberts @ 2005-10-19 22:19 UTC (permalink / raw) Cc: Stefan Monnier, emacs-devel > >> I don't know any way to change the modes of a file, or even of the > >> current file, within emacs. > > > > C-h f set-file-modes RET > > I meant in an user-friendly way, that's to say, without M-:, and > without calculating the mode. In Dired, type M (`dired-do-chmod')? Nick ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-19 22:19 ` Nick Roberts @ 2005-10-19 22:44 ` Michael Cadilhac 2005-10-19 22:48 ` Kim F. Storm 2005-10-20 9:04 ` Eli Zaretskii 0 siblings, 2 replies; 65+ messages in thread From: Michael Cadilhac @ 2005-10-19 22:44 UTC (permalink / raw) Cc: Stefan Monnier, emacs-devel [-- Attachment #1.1: Type: text/plain, Size: 1036 bytes --] Nick Roberts <nickrob@snap.net.nz> writes: > > >> I don't know any way to change the modes of a file, or even of the > > >> current file, within emacs. > > > > > > C-h f set-file-modes RET > > > > I meant in an user-friendly way, that's to say, without M-:, and > > without calculating the mode. > > In Dired, type M (`dired-do-chmod')? First, it uses dired, and I don't want to launch a dired of the current directory to modify current-file modes. Second, it uses the chmod(1) executable, which, beside the fact that another program is called, is not compatible with systems that don't have that kind of binary installed (like if one just downloaded a compiled version of emacs for Windows on http://www.crasseux.com) Nop ? -- Michael Cadilhac, a.k.a. Micha [mika] | Epita/LRDE promo 2007 | Please note that you should 2 rue de la Convention | 08.70.65.13.14 | s/-@t-/@/ my mail address. 94270 Le Kremlin Bicetre | 06.23.20.31.30 | [-- Attachment #1.2: Type: application/pgp-signature, Size: 188 bytes --] [-- Attachment #2: Type: text/plain, Size: 142 bytes --] _______________________________________________ Emacs-devel mailing list Emacs-devel@gnu.org http://lists.gnu.org/mailman/listinfo/emacs-devel ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-19 22:44 ` Michael Cadilhac @ 2005-10-19 22:48 ` Kim F. Storm 2005-10-19 22:57 ` Edward O'Connor 2005-10-19 23:00 ` Michael Cadilhac 2005-10-20 9:04 ` Eli Zaretskii 1 sibling, 2 replies; 65+ messages in thread From: Kim F. Storm @ 2005-10-19 22:48 UTC (permalink / raw) Cc: Nick Roberts, Stefan Monnier, emacs-devel Michael Cadilhac <michael.cadilhac-@t-lrde.epita.fr> writes: > Nick Roberts <nickrob@snap.net.nz> writes: > >> > >> I don't know any way to change the modes of a file, or even of the >> > >> current file, within emacs. >> > > >> > > C-h f set-file-modes RET >> > >> > I meant in an user-friendly way, that's to say, without M-:, and >> > without calculating the mode. >> >> In Dired, type M (`dired-do-chmod')? > > First, it uses dired, and I don't want to launch a dired of the > current directory to modify current-file modes. > > Second, it uses the chmod(1) executable, which, beside the fact that > another program is called, is not compatible with systems that don't > have that kind of binary installed (like if one just downloaded > a compiled version of emacs for Windows on http://www.crasseux.com) Isn't there something in eshell that can do this? It supports chmod. -- Kim F. Storm <storm@cua.dk> http://www.cua.dk ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-19 22:48 ` Kim F. Storm @ 2005-10-19 22:57 ` Edward O'Connor 2005-10-19 23:00 ` Michael Cadilhac 1 sibling, 0 replies; 65+ messages in thread From: Edward O'Connor @ 2005-10-19 22:57 UTC (permalink / raw) Kim F. Storm wrote: > Isn't there something in eshell that can do this? It supports chmod. Eshell uses the system's ch{mod,own}. Ted -- Edward O'Connor hober0@gmail.com Ense petit placidam sub libertate quietem. ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-19 22:48 ` Kim F. Storm 2005-10-19 22:57 ` Edward O'Connor @ 2005-10-19 23:00 ` Michael Cadilhac 1 sibling, 0 replies; 65+ messages in thread From: Michael Cadilhac @ 2005-10-19 23:00 UTC (permalink / raw) Cc: Nick Roberts, Stefan Monnier, emacs-devel storm@cua.dk (Kim F. Storm) writes: > Michael Cadilhac <michael.cadilhac-@t-lrde.epita.fr> writes: > >> Nick Roberts <nickrob@snap.net.nz> writes: >> >>> > >> I don't know any way to change the modes of a file, or even of the >>> > >> current file, within emacs. >>> > > >>> > > C-h f set-file-modes RET >>> > >>> > I meant in an user-friendly way, that's to say, without M-:, and >>> > without calculating the mode. >>> >>> In Dired, type M (`dired-do-chmod')? >> >> First, it uses dired, and I don't want to launch a dired of the >> current directory to modify current-file modes. >> >> Second, it uses the chmod(1) executable, which, beside the fact that >> another program is called, is not compatible with systems that don't >> have that kind of binary installed (like if one just downloaded >> a compiled version of emacs for Windows on http://www.crasseux.com) > > Isn't there something in eshell that can do this? It supports chmod. M-x eshell-command RET chmod =rwx /tmp/a RET Same thing: it uses the chmod(1) binary, the prompt is weirdly managed and error are reported only with the binary output. Well, it's more or less the same that M-! with a bogus (or at least not intuitive as it doesn't follow emacs conventions) file completion. -- Michael Cadilhac, a.k.a. Micha [mika] | Epita/LRDE promo 2007 | Please note that you should 2 rue de la Convention | 08.70.65.13.14 | s/-@t-/@/ my mail address. 94270 Le Kremlin Bicetre | 06.23.20.31.30 | ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-19 22:44 ` Michael Cadilhac 2005-10-19 22:48 ` Kim F. Storm @ 2005-10-20 9:04 ` Eli Zaretskii 2005-10-20 10:41 ` Michael Cadilhac 2005-10-20 16:15 ` Stefan Monnier 1 sibling, 2 replies; 65+ messages in thread From: Eli Zaretskii @ 2005-10-20 9:04 UTC (permalink / raw) Cc: emacs-devel > From: Michael Cadilhac <michael.cadilhac-@t-lrde.epita.fr> > Date: Thu, 20 Oct 2005 00:44:42 +0200 > Cc: Stefan Monnier <monnier@iro.umontreal.ca>, emacs-devel@gnu.org > > > > >> I don't know any way to change the modes of a file, or even of the > > > >> current file, within emacs. > > > > > > > > C-h f set-file-modes RET > > > > > > I meant in an user-friendly way, that's to say, without M-:, and > > > without calculating the mode. > > > > In Dired, type M (`dired-do-chmod')? > > First, it uses dired, and I don't want to launch a dired of the > current directory to modify current-file modes. > > Second, it uses the chmod(1) executable, which, beside the fact that > another program is called, is not compatible with systems that don't > have that kind of binary installed (like if one just downloaded > a compiled version of emacs for Windows on http://www.crasseux.com) It sounds like you won't accept any solution except your own ;-) FWIW, I think the natural place for changing files' modes is in Dired; a separate interactive command, while I don't object to it, will be used only by those who prefer command-line UI to GUI. And I don't see what's the big deal with ``launching Dired''. If we want dired-do-chmod to work on systems without an external chmod command, we can easily modify dired-do-chmod to use set-file-modes. That's a smaller and easier change than adding a whole new suite of commands with yet another UI. ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-20 9:04 ` Eli Zaretskii @ 2005-10-20 10:41 ` Michael Cadilhac 2005-10-20 11:51 ` Romain Francoise 2005-10-20 12:41 ` Eli Zaretskii 2005-10-20 16:15 ` Stefan Monnier 1 sibling, 2 replies; 65+ messages in thread From: Michael Cadilhac @ 2005-10-20 10:41 UTC (permalink / raw) Cc: emacs-devel Eli Zaretskii <eliz@gnu.org> writes: >> From: Michael Cadilhac <michael.cadilhac-@t-lrde.epita.fr> >> >> > > >> I don't know any way to change the modes of a file, or even of the >> > > >> current file, within emacs. >> > > > >> > > > C-h f set-file-modes RET >> > > >> > > I meant in an user-friendly way. >> > >> > In Dired, type M (`dired-do-chmod')? >> >> First, it uses dired. Second, it uses the chmod(1) executable >> > It sounds like you won't accept any solution except your own ;-) Hehe :-) The principal thing that keeps me up is that I don't have chmod(1) on my (poorly configured) Windows, and that I chmod quite often the file I work with (I chmod -w file I don't want to modify, but if I really have to, I chmod them back +w) :-) > FWIW, I think the natural place for changing files' modes is in > Dired; Yep, if I plan to work with files, I'll launch a dired, then use M. My point is that I'm most likely to change modes of one file, and search it in dired mode is not the most direct way I know. > a separate interactive command, while I don't object to it, will be > used only by those who prefer command-line UI to GUI. In that case, I see the GUI as a waste of time :-p > If we want dired-do-chmod to work on systems without an external chmod > command, we can easily modify dired-do-chmod to use set-file-modes. Yep, please do, but please do it with symbol parsing ([ugoa]*([+-=][rwxXstugo]+)+,...) too :-) I'll then make my own wrapper around newly coded functions to have the features I use ;-) Thanks :-) -- Michael Cadilhac, a.k.a. Micha [mika] | Epita/LRDE promo 2007 | Please note that you should 2 rue de la Convention | 08.70.65.13.14 | s/-@t-/@/ my mail address. 94270 Le Kremlin Bicetre | 06.23.20.31.30 | ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-20 10:41 ` Michael Cadilhac @ 2005-10-20 11:51 ` Romain Francoise 2005-10-20 12:41 ` Eli Zaretskii 1 sibling, 0 replies; 65+ messages in thread From: Romain Francoise @ 2005-10-20 11:51 UTC (permalink / raw) Michael Cadilhac <michael.cadilhac-@t-lrde.epita.fr> writes: > My point is that I'm most likely to change modes of one file, and > search it in dired mode is not the most direct way I know. M-: (load "dired-x") RET C-x C-j M <mode> RET -- Romain Francoise <romain@orebokech.com> | I like the streets when it's a miracle -- http://orebokech.com/ | they're empty, I can make the | rest up. ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-20 10:41 ` Michael Cadilhac 2005-10-20 11:51 ` Romain Francoise @ 2005-10-20 12:41 ` Eli Zaretskii 2005-10-20 14:18 ` Michael Cadilhac 1 sibling, 1 reply; 65+ messages in thread From: Eli Zaretskii @ 2005-10-20 12:41 UTC (permalink / raw) Cc: emacs-devel > Cc: emacs-devel@gnu.org > From: Michael Cadilhac <michael.cadilhac-@t-lrde.epita.fr> > Date: Thu, 20 Oct 2005 12:41:21 +0200 > > > If we want dired-do-chmod to work on systems without an external chmod > > command, we can easily modify dired-do-chmod to use set-file-modes. > > Yep, please do, but please do it with symbol parsing > ([ugoa]*([+-=][rwxXstugo]+)+,...) too :-) I rather hoped that you will do that, and submit the changes here ;-) ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-20 12:41 ` Eli Zaretskii @ 2005-10-20 14:18 ` Michael Cadilhac 0 siblings, 0 replies; 65+ messages in thread From: Michael Cadilhac @ 2005-10-20 14:18 UTC (permalink / raw) Cc: emacs-devel Eli Zaretskii <eliz@gnu.org> writes: >> Cc: emacs-devel@gnu.org >> From: Michael Cadilhac <michael.cadilhac-@t-lrde.epita.fr> >> Date: Thu, 20 Oct 2005 12:41:21 +0200 >> >> > If we want dired-do-chmod to work on systems without an external chmod >> > command, we can easily modify dired-do-chmod to use set-file-modes. >> >> Yep, please do, but please do it with symbol parsing >> ([ugoa]*([+-=][rwxXstugo]+)+,...) too :-) > > I rather hoped that you will do that, and submit the changes here ;-) Hehe ;-) Someone proposed to make set-file-modes interactive and to take modes as an integer or string (octal or symbolic) parameter. I would have preferred not to touch C code, but on the other hand, I don't see why chmod would be dired-mode specific. Any advice ? -- Michael Cadilhac, a.k.a. Micha [mika] | Epita/LRDE promo 2007 | Please note that you should 2 rue de la Convention | 08.70.65.13.14 | s/-@t-/@/ my mail address. 94270 Le Kremlin Bicetre | 06.23.20.31.30 | ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-20 9:04 ` Eli Zaretskii 2005-10-20 10:41 ` Michael Cadilhac @ 2005-10-20 16:15 ` Stefan Monnier 2005-10-20 22:16 ` Kim F. Storm 2005-10-20 23:38 ` Richard M. Stallman 1 sibling, 2 replies; 65+ messages in thread From: Stefan Monnier @ 2005-10-20 16:15 UTC (permalink / raw) Cc: Michael Cadilhac, emacs-devel > If we want dired-do-chmod to work on systems without an external chmod > command, we can easily modify dired-do-chmod to use set-file-modes. Yes, I think we should do that. It's also useful for the case where you use dired-do-chmod on a Tramp file. > That's a smaller and easier change than adding a whole new suite of > commands with yet another UI. AFAICT (now that I've looked at it more closely: sorry for replying too quickly before) all he's suggesting is to add an interactive command `chmod' and `set-current-file-modes'. I'm not sure about set-current-file-modes, but providing `chmod' (or making set-file-modes into a command) is a good idea. Stefan ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-20 16:15 ` Stefan Monnier @ 2005-10-20 22:16 ` Kim F. Storm 2005-10-21 3:21 ` Stefan Monnier 2005-10-20 23:38 ` Richard M. Stallman 1 sibling, 1 reply; 65+ messages in thread From: Kim F. Storm @ 2005-10-20 22:16 UTC (permalink / raw) Cc: Eli Zaretskii, Michael Cadilhac, emacs-devel Stefan Monnier <monnier@iro.umontreal.ca> writes: > but providing `chmod' (or making set-file-modes into a command) is > a good idea. set-file-modes is a nice simple function in C. IMHO, a more advanced chmod command should be implemented in Lisp. -- Kim F. Storm <storm@cua.dk> http://www.cua.dk ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-20 22:16 ` Kim F. Storm @ 2005-10-21 3:21 ` Stefan Monnier 2005-10-21 8:44 ` Andreas Schwab ` (3 more replies) 0 siblings, 4 replies; 65+ messages in thread From: Stefan Monnier @ 2005-10-21 3:21 UTC (permalink / raw) Cc: Eli Zaretskii, Michael Cadilhac, emacs-devel >> but providing `chmod' (or making set-file-modes into a command) is >> a good idea. > set-file-modes is a nice simple function in C. > IMHO, a more advanced chmod command should be implemented in Lisp. Agreed. I actually firmly believe that we should be able to provide elisp code for the interactive spec of a C function. This would also allow us to get rid of the load vs load-file distinction and to improve various other commands implemented in C where the minibuffer query only provides a fairly dull default. Stefan ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-21 3:21 ` Stefan Monnier @ 2005-10-21 8:44 ` Andreas Schwab 2005-10-21 12:59 ` Michael Cadilhac 2005-10-21 10:58 ` Kim F. Storm ` (2 subsequent siblings) 3 siblings, 1 reply; 65+ messages in thread From: Andreas Schwab @ 2005-10-21 8:44 UTC (permalink / raw) Cc: Eli Zaretskii, Michael Cadilhac, emacs-devel, Kim F. Storm Stefan Monnier <monnier@iro.umontreal.ca> writes: > Agreed. I actually firmly believe that we should be able to provide > elisp code for the interactive spec of a C function. I don't think that is needed. It is already possible and much easier to provide a lisp wrapper that implements any fancy interactive spec as needed. Andreas. -- Andreas Schwab, SuSE Labs, schwab@suse.de SuSE Linux Products GmbH, Maxfeldstraße 5, 90409 Nürnberg, Germany Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different." ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-21 8:44 ` Andreas Schwab @ 2005-10-21 12:59 ` Michael Cadilhac 2005-10-21 14:14 ` Miles Bader 0 siblings, 1 reply; 65+ messages in thread From: Michael Cadilhac @ 2005-10-21 12:59 UTC (permalink / raw) Cc: Eli Zaretskii, Michael Cadilhac, Stefan Monnier, Kim F. Storm, emacs-devel Andreas Schwab <schwab@suse.de> writes: > Stefan Monnier <monnier@iro.umontreal.ca> writes: > >> Agreed. I actually firmly believe that we should be able to provide >> elisp code for the interactive spec of a C function. > > I don't think that is needed. It is already possible and much easier to > provide a lisp wrapper that implements any fancy interactive spec as > needed. Yes, it is, but I don't see any interest of providing to the final user a function ``set-file-modes'' and another ``set-file-modes-that-really-works-as-you-expect'' when one could be sufficient, nop ? -- Michael Cadilhac, a.k.a. Micha [mika] | Epita/LRDE promo 2007 | Please note that you should 2 rue de la Convention | 08.70.65.13.14 | s/-@t-/@/ my mail address. 94270 Le Kremlin Bicetre | 06.23.20.31.30 | ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-21 12:59 ` Michael Cadilhac @ 2005-10-21 14:14 ` Miles Bader 2005-10-21 14:43 ` Kim F. Storm 0 siblings, 1 reply; 65+ messages in thread From: Miles Bader @ 2005-10-21 14:14 UTC (permalink / raw) Cc: Andreas Schwab, Eli Zaretskii, emacs-devel, Stefan Monnier, Kim F. Storm 2005/10/21, Michael Cadilhac <michael.cadilhac-@t-lrde.epita.fr>: > > I don't think that is needed. It is already possible and much easier to > > provide a lisp wrapper that implements any fancy interactive spec as > > needed. > > Yes, it is, but I don't see any interest of providing to the final > user a function ``set-file-modes'' and another > ``set-file-modes-that-really-works-as-you-expect'' when one could be > sufficient, nop ? Well having two "almost equivalent" entry points instead of one is bad, so it should be avoided when possible. But you can work around such ugliness to some degree by making the C function a non-advertised internal function, e.g., call the C function "set-file-modes-internal", and provide a lisp wrapper for the fancy stuff that everybody would call. Still, adding lisp interactive specs to C functions would be very useful, and much cleaner than having 2*n functions, especially if it's as simple as Kim suggested. -Miles -- Do not taunt Happy Fun Ball. ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-21 14:14 ` Miles Bader @ 2005-10-21 14:43 ` Kim F. Storm 2005-10-21 16:42 ` Michael Cadilhac 2005-10-21 22:19 ` Richard M. Stallman 0 siblings, 2 replies; 65+ messages in thread From: Kim F. Storm @ 2005-10-21 14:43 UTC (permalink / raw) Cc: Andreas Schwab, Michael Cadilhac, emacs-devel, Stefan Monnier, Eli Zaretskii, miles Miles Bader <snogglethorpe@gmail.com> writes: > Still, adding lisp interactive specs to C functions would be very > useful, and much cleaner than having 2*n functions, especially if it's > as simple as Kim suggested. Well almost..., I forgot about changing call-interactvely. Below is a complete patch (including the necessary patch to Fset_file_modes). Here is an example of how to set the interactive form. Of course, it should be changed to recognize octal and ascii forms, as the current base 10 form is useless for interactive use: (put 'set-file-modes 'interactive '(list (read-file-name "File: ") (read-number "Modes: "))) *** callint.c 14 Aug 2005 14:47:25 +0200 1.140 --- callint.c 21 Oct 2005 16:38:22 +0200 *************** *** 346,351 **** --- 346,356 ---- function = wrong_type_argument (Qcommandp, function); goto retry; } + else if (*string == '#') + { + string = 0; + goto get_interactive_form; + } } else if (COMPILEDP (fun)) { *************** *** 356,361 **** --- 361,367 ---- else { Lisp_Object form; + get_interactive_form: GCPRO2 (function, prefix_arg); form = Finteractive_form (function); UNGCPRO; *** data.c 19 Sep 2005 00:24:45 +0200 1.254 --- data.c 21 Oct 2005 13:04:24 +0200 *************** *** 787,793 **** if (SUBRP (fun)) { if (XSUBR (fun)->prompt) ! return list2 (Qinteractive, build_string (XSUBR (fun)->prompt)); } else if (COMPILEDP (fun)) { --- 787,801 ---- if (SUBRP (fun)) { if (XSUBR (fun)->prompt) ! { ! Lisp_Object spec; ! if (XSUBR (fun)->prompt[0] != '#') ! return list2 (Qinteractive, build_string (XSUBR (fun)->prompt)); ! ! if ((spec = Fget (intern (XSUBR (fun)->symbol_name), Qinteractive), ! !NILP (spec))) ! return list2 (Qinteractive, spec); ! } } else if (COMPILEDP (fun)) { *** fileio.c 20 Oct 2005 16:48:05 +0200 1.557 --- fileio.c 21 Oct 2005 16:21:25 +0200 *************** *** 3462,3468 **** return make_number (st.st_mode & 07777); } ! DEFUN ("set-file-modes", Fset_file_modes, Sset_file_modes, 2, 2, 0, doc: /* Set mode bits of file named FILENAME to MODE (an integer). Only the 12 low bits of MODE are used. */) (filename, mode) --- 3462,3468 ---- return make_number (st.st_mode & 07777); } ! DEFUN ("set-file-modes", Fset_file_modes, Sset_file_modes, 2, 2, "#", doc: /* Set mode bits of file named FILENAME to MODE (an integer). Only the 12 low bits of MODE are used. */) (filename, mode) -- Kim F. Storm <storm@cua.dk> http://www.cua.dk ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-21 14:43 ` Kim F. Storm @ 2005-10-21 16:42 ` Michael Cadilhac 2005-10-21 22:19 ` Richard M. Stallman 1 sibling, 0 replies; 65+ messages in thread From: Michael Cadilhac @ 2005-10-21 16:42 UTC (permalink / raw) Cc: Andreas Schwab, Michael Cadilhac, emacs-devel, Stefan Monnier, Eli Zaretskii, snogglethorpe, miles storm@cua.dk (Kim F. Storm) writes: > Miles Bader <snogglethorpe@gmail.com> writes: > >> Still, adding lisp interactive specs to C functions would be very >> useful, and much cleaner than having 2*n functions, especially if it's >> as simple as Kim suggested. > > Well almost..., I forgot about changing call-interactvely. > > Below is a complete patch (including the necessary patch to > Fset_file_modes). > > Here is an example of how to set the interactive form. > Of course, it should be changed to recognize octal and ascii forms, > as the current base 10 form is useless for interactive use: > > (put 'set-file-modes 'interactive '(list (read-file-name "File: ") > (read-number "Modes: "))) Very nice ! I really like it this way. Now, to return to the first point, the chmod function. The number needed as a mode needs to know the file-modes of the file being chmod'ed (for [Xugo]). So we still have to call a lisp function within set-file-modes. Or perhaps there's a way to avoid that ? -- Michael Cadilhac, a.k.a. Micha [mika] | Epita/LRDE promo 2007 | Please note that you should 2 rue de la Convention | 08.70.65.13.14 | s/-@t-/@/ my mail address. 94270 Le Kremlin Bicetre | 06.23.20.31.30 | ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-21 14:43 ` Kim F. Storm 2005-10-21 16:42 ` Michael Cadilhac @ 2005-10-21 22:19 ` Richard M. Stallman 2005-10-24 14:02 ` Kim F. Storm 1 sibling, 1 reply; 65+ messages in thread From: Richard M. Stallman @ 2005-10-21 22:19 UTC (permalink / raw) Cc: schwab, michael.cadilhac-, emacs-devel, monnier, eliz, snogglethorpe, miles *** callint.c 14 Aug 2005 14:47:25 +0200 1.140 --- callint.c 21 Oct 2005 16:38:22 +0200 *************** *** 346,351 **** --- 346,356 ---- function = wrong_type_argument (Qcommandp, function); goto retry; } + else if (*string == '#') + { + string = 0; + goto get_interactive_form; + } This would be much cleaner (and easier to use) if it read the Lisp expression out of the string itself, after the #. But as I said, I'd rather not install this now. The new feature for setting file modes should also wait till after the release. ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-21 22:19 ` Richard M. Stallman @ 2005-10-24 14:02 ` Kim F. Storm 2005-10-24 14:16 ` David Kastrup ` (2 more replies) 0 siblings, 3 replies; 65+ messages in thread From: Kim F. Storm @ 2005-10-24 14:02 UTC (permalink / raw) Cc: schwab, michael.cadilhac-, emacs-devel, monnier, eliz, snogglethorpe, miles "Richard M. Stallman" <rms@gnu.org> writes: > *** callint.c 14 Aug 2005 14:47:25 +0200 1.140 > --- callint.c 21 Oct 2005 16:38:22 +0200 > *************** > *** 346,351 **** > --- 346,356 ---- > function = wrong_type_argument (Qcommandp, function); > goto retry; > } > + else if (*string == '#') > + { > + string = 0; > + goto get_interactive_form; > + } > > This would be much cleaner (and easier to use) if it read the Lisp > expression out of the string itself, after the #. I did consider that, and we could do that as well, but IMO, the whole point of this to allow interactive specs for built-in functions to be written in Lisp, i.e. in a .el file, so people can improve on the code without modifying the base functionality. Also, doing it right in the string makes it much harder to edit and debug, and may cause problems on systems which has an upper limit on constant string size. > But as I said, I'd rather not install this now. Ok, as a strong advocate of focusing on the release, I have to accept that :-), although this change is really minor compared to some of the other recent changes to core functionality ... However, the patch is not the right approach in any case -- as it only allows creating an interactive spec for DEFUN's which explicitly allow it with the prompt = "#" marker. Below is a _much_better_ patch which allows ANY function to have its interactive specification overridden, and consequently you can make any function into a command. Here are some trivial examples: (put 'set-file-modes 'interactive '(list (read-file-name "Set modes on file: ") (read-number "New modes (decimal): "))) (put 'set-file-times 'interactive '(list (read-file-name "Set current time on file: ") (current-time))) (defun test (a b) (message "%d" (+ a b))) (put 'test 'interactive '(list (read-number "a: ") (read-number "b: "))) (put 'test 'interactive "nx: \nny: ") *** callint.c 14 Aug 2005 14:47:25 +0200 1.140 --- callint.c 24 Oct 2005 14:40:54 +0200 *************** *** 333,338 **** --- 333,348 ---- /* If k or K discard an up-event, save it here so it can be retrieved with U */ up_event = Qnil; + /* Allow overriding the interactive spec of any function + by placing an interactive property on the function name. */ + + if (SYMBOLP (function) + && (specs = Fget (function, Qinteractive), !NILP (specs))) + { + filter_specs = specs; + goto override_interactive_form; + } + /* Decode the kind of function. Either handle it and return, or go to `lose' if not interactive, or go to `retry' to specify a different function, or set either STRING or SPECS. */ *************** *** 357,363 **** { Lisp_Object form; GCPRO2 (function, prefix_arg); ! form = Finteractive_form (function); UNGCPRO; if (CONSP (form)) specs = filter_specs = Fcar (XCDR (form)); --- 367,373 ---- { Lisp_Object form; GCPRO2 (function, prefix_arg); ! form = Finteractive_form (function, Qt); UNGCPRO; if (CONSP (form)) specs = filter_specs = Fcar (XCDR (form)); *************** *** 365,370 **** --- 375,382 ---- goto lose; } + override_interactive_form: + /* If either SPECS or STRING is set to a string, use it. */ if (STRINGP (specs)) { *** data.c 19 Sep 2005 00:24:45 +0200 1.254 --- data.c 24 Oct 2005 14:40:32 +0200 *************** *** 775,788 **** return make_string (name, strlen (name)); } ! DEFUN ("interactive-form", Finteractive_form, Sinteractive_form, 1, 1, 0, doc: /* Return the interactive form of CMD or nil if none. If CMD is not a command, the return value is nil. Value, if non-nil, is a list \(interactive SPEC). */) ! (cmd) ! Lisp_Object cmd; { ! Lisp_Object fun = indirect_function (cmd); if (SUBRP (fun)) { --- 775,799 ---- return make_string (name, strlen (name)); } ! DEFUN ("interactive-form", Finteractive_form, Sinteractive_form, 1, 2, 0, doc: /* Return the interactive form of CMD or nil if none. If CMD is not a command, the return value is nil. + If optional second arg NO-OVERRIDE is non-nil, do not look for an + overriding `interactive' specification property on CMD. Value, if non-nil, is a list \(interactive SPEC). */) ! (cmd, no_override) ! Lisp_Object cmd, no_override; { ! Lisp_Object fun; ! Lisp_Object specs; ! ! retry: ! if (NILP (no_override) ! && SYMBOLP (cmd) ! && (specs = Fget (cmd, Qinteractive), !NILP (specs))) ! return list2 (Qinteractive, specs); ! ! fun = indirect_function (cmd); if (SUBRP (fun)) { *************** *** 797,811 **** else if (CONSP (fun)) { Lisp_Object funcar = XCAR (fun); if (EQ (funcar, Qlambda)) return Fassq (Qinteractive, Fcdr (XCDR (fun))); ! else if (EQ (funcar, Qautoload)) { struct gcpro gcpro1; GCPRO1 (cmd); do_autoload (fun, cmd); UNGCPRO; ! return Finteractive_form (cmd); } } return Qnil; --- 808,824 ---- else if (CONSP (fun)) { Lisp_Object funcar = XCAR (fun); + if (EQ (funcar, Qlambda)) return Fassq (Qinteractive, Fcdr (XCDR (fun))); ! ! if (EQ (funcar, Qautoload)) { struct gcpro gcpro1; GCPRO1 (cmd); do_autoload (fun, cmd); UNGCPRO; ! goto retry; } } return Qnil; *** eval.c 14 Aug 2005 14:47:28 +0200 1.256 --- eval.c 24 Oct 2005 14:48:31 +0200 *************** *** 1908,1913 **** --- 1908,1917 ---- register Lisp_Object fun; register Lisp_Object funcar; + if (SYMBOLP (function) + && !NILP (Fget (function, Qinteractive))) + return Qt; + fun = function; fun = indirect_function (fun); *** fileio.c 20 Oct 2005 16:48:05 +0200 1.557 --- fileio.c 21 Oct 2005 16:21:25 +0200 *************** *** 3462,3468 **** return make_number (st.st_mode & 07777); } ! DEFUN ("set-file-modes", Fset_file_modes, Sset_file_modes, 2, 2, 0, doc: /* Set mode bits of file named FILENAME to MODE (an integer). Only the 12 low bits of MODE are used. */) (filename, mode) --- 3462,3468 ---- return make_number (st.st_mode & 07777); } ! DEFUN ("set-file-modes", Fset_file_modes, Sset_file_modes, 2, 2, "#", doc: /* Set mode bits of file named FILENAME to MODE (an integer). Only the 12 low bits of MODE are used. */) (filename, mode) *** lisp.h 02 Oct 2005 21:08:17 +0200 1.542 --- lisp.h 24 Oct 2005 14:41:07 +0200 *************** *** 2117,2123 **** extern Lisp_Object Qinteger; extern void circular_list_error P_ ((Lisp_Object)); ! EXFUN (Finteractive_form, 1); /* Defined in frame.c */ extern Lisp_Object Qframep; --- 2117,2123 ---- extern Lisp_Object Qinteger; extern void circular_list_error P_ ((Lisp_Object)); ! EXFUN (Finteractive_form, 2); /* Defined in frame.c */ extern Lisp_Object Qframep; -- Kim F. Storm <storm@cua.dk> http://www.cua.dk ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-24 14:02 ` Kim F. Storm @ 2005-10-24 14:16 ` David Kastrup 2005-10-24 16:02 ` Andreas Schwab 2005-10-24 21:00 ` Kim F. Storm 2005-10-24 14:46 ` Stefan Monnier 2005-10-25 15:58 ` Richard M. Stallman 2 siblings, 2 replies; 65+ messages in thread From: David Kastrup @ 2005-10-24 14:16 UTC (permalink / raw) Cc: rms, schwab, michael.cadilhac-, emacs-devel, monnier, eliz, snogglethorpe, miles storm@cua.dk (Kim F. Storm) writes: > Below is a _much_better_ patch which allows ANY function to have its > interactive specification overridden, and consequently you can make > any function into a command. > > Here are some trivial examples: > > (put 'set-file-modes 'interactive > '(list (read-file-name "Set modes on file: ") > (read-number "New modes (decimal): "))) Would one not rather write (put 'set-file-modes 'interactive #'(list (read-file-name "Set modes on file: ") (read-number "New modes (decimal): "))) so that the byte compiler will do its job there? -- David Kastrup, Kriemhildstr. 15, 44793 Bochum ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-24 14:16 ` David Kastrup @ 2005-10-24 16:02 ` Andreas Schwab 2005-10-24 21:00 ` Kim F. Storm 1 sibling, 0 replies; 65+ messages in thread From: Andreas Schwab @ 2005-10-24 16:02 UTC (permalink / raw) Cc: rms, michael.cadilhac-, emacs-devel, monnier, Kim F. Storm, eliz, snogglethorpe, miles David Kastrup <dak@gnu.org> writes: > Would one not rather write > > (put 'set-file-modes 'interactive > #'(list (read-file-name "Set modes on file: ") > (read-number "New modes (decimal): "))) > > so that the byte compiler will do its job there? This is not a function. Andreas. -- Andreas Schwab, SuSE Labs, schwab@suse.de SuSE Linux Products GmbH, Maxfeldstraße 5, 90409 Nürnberg, Germany Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different." ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-24 14:16 ` David Kastrup 2005-10-24 16:02 ` Andreas Schwab @ 2005-10-24 21:00 ` Kim F. Storm 1 sibling, 0 replies; 65+ messages in thread From: Kim F. Storm @ 2005-10-24 21:00 UTC (permalink / raw) Cc: emacs-devel David Kastrup <dak@gnu.org> writes: > Would one not rather write > > (put 'set-file-modes 'interactive > #'(list (read-file-name "Set modes on file: ") > (read-number "New modes (decimal): "))) > > so that the byte compiler will do its job there? Yes, that works too. -- Kim F. Storm <storm@cua.dk> http://www.cua.dk ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-24 14:02 ` Kim F. Storm 2005-10-24 14:16 ` David Kastrup @ 2005-10-24 14:46 ` Stefan Monnier 2005-10-24 22:14 ` Kim F. Storm 2005-10-25 15:58 ` Richard M. Stallman 2 siblings, 1 reply; 65+ messages in thread From: Stefan Monnier @ 2005-10-24 14:46 UTC (permalink / raw) Cc: rms, schwab, michael.cadilhac-, emacs-devel, eliz, snogglethorpe, miles > Below is a _much_better_ patch which allows ANY function to have its > interactive specification overridden, and consequently you can make > any function into a command. Indeed, this is much better. The only problem I still see with it is that it interacts poorly with aliases. E.g. to take a concrete example: (put 'set-file-modes 'interactive '(list ...)) (defalias 'chmod 'set-file-modes) M-x chmod should work just like M-x set-file-modes, but AFAICT your code won't handle it right. Stefan PS: One of the funny things we can do, OTOH is: (defalias 'load-library 'load "docstring") (defalias 'load-file 'load "other docstring") (put 'load-library 'interactive '(...)) (put 'load-file 'interactive '(...)) ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-24 14:46 ` Stefan Monnier @ 2005-10-24 22:14 ` Kim F. Storm 2005-10-24 23:02 ` Stefan Monnier 0 siblings, 1 reply; 65+ messages in thread From: Kim F. Storm @ 2005-10-24 22:14 UTC (permalink / raw) Cc: rms, schwab, michael.cadilhac-, emacs-devel, eliz, snogglethorpe, miles Stefan Monnier <monnier@iro.umontreal.ca> writes: >> Below is a _much_better_ patch which allows ANY function to have its >> interactive specification overridden, and consequently you can make >> any function into a command. > > Indeed, this is much better. > The only problem I still see with it is that it interacts poorly > with aliases. Given your examples, I'd say that it's a feature rather than a bug :-) But admittedly, I didn't think about aliases. But there is a way to get the best of both approaches: Suppose A is an alias for C. Now, if A has overriding interactive spec, use that. Else if C has overriding interactive spec, use that. Else use original interactive spec for C (if any). So this would actually work: > (defalias 'load-library 'load "docstring") > (defalias 'load-file 'load "other docstring") > (put 'load-library 'interactive '(...)) > (put 'load-file 'interactive '(...)) -- Kim F. Storm <storm@cua.dk> http://www.cua.dk ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-24 22:14 ` Kim F. Storm @ 2005-10-24 23:02 ` Stefan Monnier 2005-10-25 8:51 ` Kim F. Storm 0 siblings, 1 reply; 65+ messages in thread From: Stefan Monnier @ 2005-10-24 23:02 UTC (permalink / raw) Cc: rms, schwab, michael.cadilhac-, emacs-devel, eliz, snogglethorpe, miles >>> Below is a _much_better_ patch which allows ANY function to have its >>> interactive specification overridden, and consequently you can make >>> any function into a command. >> >> Indeed, this is much better. >> The only problem I still see with it is that it interacts poorly >> with aliases. > Given your examples, I'd say that it's a feature rather than a bug :-) The example I care about is `chmod'. The ones in my PS were meant as things that should work any way, no matter what you do with aliases. > But admittedly, I didn't think about aliases. But there is a way to > get the best of both approaches: > Suppose A is an alias for C. > Now, if A has overriding interactive spec, use that. > Else if C has overriding interactive spec, use that. > Else use original interactive spec for C (if any). That's what I intended. That's what's done with usage info in docstrings (the (fn ARG1 ARG2) thingy at the end of some docstrings). Stefan ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-24 23:02 ` Stefan Monnier @ 2005-10-25 8:51 ` Kim F. Storm 2005-10-25 20:29 ` Richard M. Stallman 0 siblings, 1 reply; 65+ messages in thread From: Kim F. Storm @ 2005-10-25 8:51 UTC (permalink / raw) Cc: rms, schwab, michael.cadilhac-, emacs-devel, eliz, snogglethorpe, miles Stefan Monnier <monnier@iro.umontreal.ca> writes: >>>> Below is a _much_better_ patch which allows ANY function to have its >>>> interactive specification overridden, and consequently you can make >>>> any function into a command. >>> >>> Indeed, this is much better. >>> The only problem I still see with it is that it interacts poorly >>> with aliases. Here is a new patch which fully supports command aliases, optionally with different interactive specs: *** data.c 19 Sep 2005 00:24:45 +0200 1.254 --- data.c 25 Oct 2005 00:49:49 +0200 *************** *** 775,788 **** return make_string (name, strlen (name)); } ! DEFUN ("interactive-form", Finteractive_form, Sinteractive_form, 1, 1, 0, doc: /* Return the interactive form of CMD or nil if none. If CMD is not a command, the return value is nil. Value, if non-nil, is a list \(interactive SPEC). */) ! (cmd) ! Lisp_Object cmd; { ! Lisp_Object fun = indirect_function (cmd); if (SUBRP (fun)) { --- 775,801 ---- return make_string (name, strlen (name)); } ! DEFUN ("interactive-form", Finteractive_form, Sinteractive_form, 1, 2, 0, doc: /* Return the interactive form of CMD or nil if none. If CMD is not a command, the return value is nil. + If optional second arg NO-OVERRIDE is non-nil, do not look for an + overriding `interactive' specification property on CMD. Value, if non-nil, is a list \(interactive SPEC). */) ! (cmd, no_override) ! Lisp_Object cmd, no_override; { ! Lisp_Object fun; ! Lisp_Object specs; ! ! retry: ! if (NILP (no_override)) ! { ! fun = indirect_function_overriding_spec (cmd, &specs); ! if (!NILP (specs)) ! return list2 (Qinteractive, specs); ! } ! else ! fun = indirect_function (cmd); if (SUBRP (fun)) { *************** *** 797,811 **** else if (CONSP (fun)) { Lisp_Object funcar = XCAR (fun); if (EQ (funcar, Qlambda)) return Fassq (Qinteractive, Fcdr (XCDR (fun))); ! else if (EQ (funcar, Qautoload)) { struct gcpro gcpro1; GCPRO1 (cmd); do_autoload (fun, cmd); UNGCPRO; ! return Finteractive_form (cmd); } } return Qnil; --- 810,826 ---- else if (CONSP (fun)) { Lisp_Object funcar = XCAR (fun); + if (EQ (funcar, Qlambda)) return Fassq (Qinteractive, Fcdr (XCDR (fun))); ! ! if (EQ (funcar, Qautoload)) { struct gcpro gcpro1; GCPRO1 (cmd); do_autoload (fun, cmd); UNGCPRO; ! goto retry; } } return Qnil; *************** *** 1912,1917 **** --- 1927,1975 ---- return hare; } + /* If OBJECT is a symbol, find the end of its function chain and + return the value found there. If OBJECT is not a symbol, just + return it. If there is a cycle in the function chain, signal a + cyclic-function-indirection error. + + This is like indirect_function, except that it looks for an + overriding interactive specification on each symbol alias, and + it will return prematurely if found. */ + Lisp_Object + indirect_function_overriding_spec (object, specs) + register Lisp_Object object; + Lisp_Object *specs; + { + Lisp_Object tortoise, hare; + + *specs = Qnil; + hare = tortoise = object; + + for (;;) + { + if (!SYMBOLP (hare) || EQ (hare, Qunbound)) + break; + if ((*specs = Fget (hare, Qinteractive), !NILP (*specs))) + return hare; + hare = XSYMBOL (hare)->function; + + if (!SYMBOLP (hare) || EQ (hare, Qunbound)) + break; + if ((*specs = Fget (hare, Qinteractive), !NILP (*specs))) + return hare; + hare = XSYMBOL (hare)->function; + + tortoise = XSYMBOL (tortoise)->function; + + if (EQ (hare, tortoise)) + Fsignal (Qcyclic_function_indirection, Fcons (object, Qnil)); + } + + return hare; + } + + + DEFUN ("indirect-function", Findirect_function, Sindirect_function, 1, 1, 0, doc: /* Return the function at the end of OBJECT's function chain. If OBJECT is a symbol, follow all function indirections and return the final *** lisp.h 02 Oct 2005 21:08:17 +0200 1.542 --- lisp.h 25 Oct 2005 00:48:23 +0200 *************** *** 2117,2123 **** extern Lisp_Object Qinteger; extern void circular_list_error P_ ((Lisp_Object)); ! EXFUN (Finteractive_form, 1); /* Defined in frame.c */ extern Lisp_Object Qframep; --- 2117,2123 ---- extern Lisp_Object Qinteger; extern void circular_list_error P_ ((Lisp_Object)); ! EXFUN (Finteractive_form, 2); /* Defined in frame.c */ extern Lisp_Object Qframep; *************** *** 2159,2164 **** --- 2159,2166 ---- EXFUN (Fsymbol_plist, 1); EXFUN (Fsymbol_name, 1); extern Lisp_Object indirect_function P_ ((Lisp_Object)); + extern Lisp_Object indirect_function_overriding_spec P_ ((Lisp_Object, + Lisp_Object *)); EXFUN (Findirect_function, 1); EXFUN (Ffset, 2); EXFUN (Fsetplist, 2); *** callint.c 14 Aug 2005 14:47:25 +0200 1.140 --- callint.c 25 Oct 2005 10:47:36 +0200 *************** *** 321,328 **** else enable = Qnil; - fun = indirect_function (function); - specs = Qnil; string = 0; /* The idea of FILTER_SPECS is to provide away to --- 321,326 ---- *************** *** 333,343 **** /* If k or K discard an up-event, save it here so it can be retrieved with U */ up_event = Qnil; /* Decode the kind of function. Either handle it and return, or go to `lose' if not interactive, or go to `retry' to specify a different function, or set either STRING or SPECS. */ ! if (SUBRP (fun)) { string = (unsigned char *) XSUBR (fun)->prompt; if (!string) --- 331,347 ---- /* If k or K discard an up-event, save it here so it can be retrieved with U */ up_event = Qnil; + fun = indirect_function_overriding_spec (function, &specs); + /* Decode the kind of function. Either handle it and return, or go to `lose' if not interactive, or go to `retry' to specify a different function, or set either STRING or SPECS. */ ! if (!NILP (specs)) ! { ! filter_specs = specs; ! } ! else if (SUBRP (fun)) { string = (unsigned char *) XSUBR (fun)->prompt; if (!string) *************** *** 357,363 **** { Lisp_Object form; GCPRO2 (function, prefix_arg); ! form = Finteractive_form (function); UNGCPRO; if (CONSP (form)) specs = filter_specs = Fcar (XCDR (form)); --- 361,367 ---- { Lisp_Object form; GCPRO2 (function, prefix_arg); ! form = Finteractive_form (function, Qt); UNGCPRO; if (CONSP (form)) specs = filter_specs = Fcar (XCDR (form)); *** eval.c 14 Aug 2005 14:47:28 +0200 1.256 --- eval.c 25 Oct 2005 00:52:49 +0200 *************** *** 1907,1916 **** { register Lisp_Object fun; register Lisp_Object funcar; ! fun = function; ! ! fun = indirect_function (fun); if (EQ (fun, Qunbound)) return Qnil; --- 1907,1917 ---- { register Lisp_Object fun; register Lisp_Object funcar; + Lisp_Object specs; ! fun = indirect_function_overriding_spec (function, &specs); ! if (!NILP (specs)) ! return Qt; if (EQ (fun, Qunbound)) return Qnil; -- Kim F. Storm <storm@cua.dk> http://www.cua.dk ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-25 8:51 ` Kim F. Storm @ 2005-10-25 20:29 ` Richard M. Stallman 0 siblings, 0 replies; 65+ messages in thread From: Richard M. Stallman @ 2005-10-25 20:29 UTC (permalink / raw) Cc: schwab, michael.cadilhac-, emacs-devel, monnier, eliz, snogglethorpe, miles Here is a new patch which fully supports command aliases, optionally with different interactive specs: As already explained, that's not the direction I think we should go. It is not clean for interactive specs to be separated in the sources from the rest of the function definition. ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-24 14:02 ` Kim F. Storm 2005-10-24 14:16 ` David Kastrup 2005-10-24 14:46 ` Stefan Monnier @ 2005-10-25 15:58 ` Richard M. Stallman 2005-10-25 21:34 ` Kim F. Storm 2 siblings, 1 reply; 65+ messages in thread From: Richard M. Stallman @ 2005-10-25 15:58 UTC (permalink / raw) Cc: schwab, michael.cadilhac-, emacs-devel, monnier, eliz, snogglethorpe, miles I did consider that, and we could do that as well, but IMO, the whole point of this to allow interactive specs for built-in functions to be written in Lisp, i.e. in a .el file, so people can improve on the code without modifying the base functionality. The idea is to write it in Lisp, but that doesn't mean putting it in a different file, which is undesirable. It is cleaner to keep the interactive spec in the function definition, not separate it. If you want to put the code in a separate file, you can put it in a function and make the interactive spec call that function. So that option will still exist. But I don't want to make that the only option. Below is a _much_better_ patch which allows ANY function to have its interactive specification overridden, and consequently you can make any function into a command. I don't know if I want to make functions into commands except by editing their definitions in the standard way. ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-25 15:58 ` Richard M. Stallman @ 2005-10-25 21:34 ` Kim F. Storm 2005-10-26 8:52 ` Kim F. Storm 2005-10-27 1:29 ` Richard M. Stallman 0 siblings, 2 replies; 65+ messages in thread From: Kim F. Storm @ 2005-10-25 21:34 UTC (permalink / raw) Cc: schwab, michael.cadilhac-, emacs-devel, monnier, eliz, snogglethorpe, miles "Richard M. Stallman" <rms@gnu.org> writes: > I did consider that, and we could do that as well, but IMO, the whole > point of this to allow interactive specs for built-in functions to be > written in Lisp, i.e. in a .el file, so people can improve on the code > without modifying the base functionality. > > The idea is to write it in Lisp, but that doesn't mean putting > it in a different file, which is undesirable. I don't see why it is undesirable--quite the contrary. In many other situations, we aim at minimizing the "core functionality in C" and write the "hard parts" in Lisp. IMO, it is no less desireable than putting a defcustom for built-in variables or key bindings for built-in commands into a separate file. Having to maintain pieces of Lisp code as static C strings sounds rather tedious and inflexible to me, so IMHO the usefulness of this will be limited. > It is cleaner > to keep the interactive spec in the function definition, not > separate it. I don't argue that it should be impossible to specify the interactive spec as part of the current string, e.g. as "#(list (read-string ...))", but that functionality is another functionality, so the two approaches may supplement each other. However, my approach covers all aspects of your approach, whereas your appoach only addresses one aspect of my approach, and in a rather inflexible way. > If you want to put the code in a separate file, you can put > it in a function and make the interactive spec call that function. But this still has the MAJOR drawback that this will only apply to built-in functions that have already been instrumented to do that (which in practice means: none). My trivial changes provide a simple, efficient, flexible, user-extensible solution which can be applied to all existing functions and commands. > I don't know if I want to make functions into commands > except by editing their definitions in the standard way. That works only for Lisp code, not for built-in functions (unless you edit the relevant C files and rebuild emacs -- not the normal approach to extensibility :-). But even for Lisp code, why copy all the code just to be able to change the way a command reads its arguments? One idea just occurred to me -- my approach could be used as a way to localize emacs by providing e.g. Danish prompts for the most common commands. Not that I would do that personally :-) -- Kim F. Storm <storm@cua.dk> http://www.cua.dk ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-25 21:34 ` Kim F. Storm @ 2005-10-26 8:52 ` Kim F. Storm 2005-10-27 1:31 ` Richard M. Stallman 2005-10-27 1:29 ` Richard M. Stallman 1 sibling, 1 reply; 65+ messages in thread From: Kim F. Storm @ 2005-10-26 8:52 UTC (permalink / raw) Cc: schwab, michael.cadilhac-, emacs-devel, monnier, eliz, snogglethorpe, miles storm@cua.dk (Kim F. Storm) writes: > My trivial changes provide a simple, efficient, flexible, > user-extensible solution which can be applied to all existing > functions and commands. .. and it easily forms the foundation for implementing your preferred approach, i.e. include the lisp form directly in the C source file like this: DEFUN ("set-file-modes", Fset_file_modes, Sset_file_modes, 2, 2, "(list" " (read-file-name \"File: \")" " (read-number \"Modes: \"))", doc: /* Set mode bits of file named FILENAME to MODE (an integer). My approach also allow aliases to be defined with a different interactive spec like this: (defalias 'chmod 'set-file-modes "Interactive frontend to `set-file-modes'." "fFile: \nnModes: ") So besides being simple, efficient, flexible, and user-extensible, it is also a clean solution (with the additional patches below). Here are the necessary additions to my previous patch to implement these two features: *** lread.c 23 Oct 2005 23:02:21 +0200 1.341 --- lread.c 26 Oct 2005 10:19:02 +0200 *************** *** 3450,3455 **** --- 3450,3465 ---- read_buffer = (char *) xmalloc (read_buffer_size); } \f + + static Lisp_Object + defsubr_error_handler (data) + Lisp_Object data; + { + + return Qerror; + } + + void defsubr (sname) struct Lisp_Subr *sname; *************** *** 3457,3462 **** --- 3467,3487 ---- Lisp_Object sym; sym = intern (sname->symbol_name); XSETSUBR (XSYMBOL (sym)->function, sname); + if (sname->prompt && sname->prompt[0] == '(') + { + /* Parse inline interactive Lisp expression. */ + int len = strlen (sname->prompt); + if (sname->prompt[len - 1] == ')') + { + Lisp_Object specs; + specs = internal_condition_case_1 (Fread, + make_string (sname->prompt, len), + Qt, defsubr_error_handler); + if (EQ (specs, Qerror)) + fatal ("invalid interactive spec for `%s'", sname->symbol_name); + Fput (sym, Qinteractive, specs); + } + } } #ifdef NOTDEF /* use fset in subr.el now */ *** data.c 19 Sep 2005 00:24:45 +0200 1.254 --- data.c 26 Oct 2005 09:27:17 +0200 *************** *** 710,723 **** extern Lisp_Object Qfunction_documentation; ! DEFUN ("defalias", Fdefalias, Sdefalias, 2, 3, 0, doc: /* Set SYMBOL's function definition to DEFINITION, and return DEFINITION. Associates the function with the current load file, if any. The optional third argument DOCSTRING specifies the documentation string for SYMBOL; if it is omitted or nil, SYMBOL uses the documentation string ! determined by DEFINITION. */) ! (symbol, definition, docstring) ! register Lisp_Object symbol, definition, docstring; { CHECK_SYMBOL (symbol); if (CONSP (XSYMBOL (symbol)->function) --- 710,725 ---- extern Lisp_Object Qfunction_documentation; ! DEFUN ("defalias", Fdefalias, Sdefalias, 2, 4, 0, doc: /* Set SYMBOL's function definition to DEFINITION, and return DEFINITION. Associates the function with the current load file, if any. The optional third argument DOCSTRING specifies the documentation string for SYMBOL; if it is omitted or nil, SYMBOL uses the documentation string ! determined by DEFINITION. ! The optional fourth argument INTERACTIVE-FORM specifies how to read the ! arguments for command SYMBOL when called interactively. See `interactive'. */) ! (symbol, definition, docstring, interactive_form) ! register Lisp_Object symbol, definition, docstring, interactive_form; { CHECK_SYMBOL (symbol); if (CONSP (XSYMBOL (symbol)->function) *************** *** 727,732 **** --- 729,742 ---- LOADHIST_ATTACH (Fcons (Qdefun, symbol)); if (!NILP (docstring)) Fput (symbol, Qfunction_documentation, docstring); + if (!NILP (interactive_form)) + { + /* Accept (interactive ARGS) as well as just ARGS. */ + if (CONSP (interactive_form) + && EQ (XCAR (interactive_form), Qinteractive)) + interactive_form = Fcar (XCDR (interactive_form)); + Fput (symbol, Qinteractive, interactive_form); + } return definition; } -- Kim F. Storm <storm@cua.dk> http://www.cua.dk ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-26 8:52 ` Kim F. Storm @ 2005-10-27 1:31 ` Richard M. Stallman 0 siblings, 0 replies; 65+ messages in thread From: Richard M. Stallman @ 2005-10-27 1:31 UTC (permalink / raw) Cc: schwab, michael.cadilhac-, emacs-devel, monnier, eliz, snogglethorpe, miles .. and it easily forms the foundation for implementing your preferred approach, i.e. include the lisp form directly in the C source file like this: DEFUN ("set-file-modes", Fset_file_modes, Sset_file_modes, 2, 2, "(list" " (read-file-name \"File: \")" " (read-number \"Modes: \"))", doc: /* Set mode bits of file named FILENAME to MODE (an integer). That is what I would like to implement. My approach also allow aliases to be defined with a different interactive spec like this: (defalias 'chmod 'set-file-modes "Interactive frontend to `set-file-modes'." "fFile: \nnModes: ") I don't like the idea of defining aliases with different interactive specs, because it distorts the meaning of "alias". Aliases should be equivalent to the original function. It is cleaner if people define that chmod function thus: (defun chmod (file mode) "Interactive frontend to `set-file-modes'." (interactive "fFile: \nnModes: ") (set-file-modes file mode)) Defining a new function in this way is better than defining an alias which isn't really an alias. ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-25 21:34 ` Kim F. Storm 2005-10-26 8:52 ` Kim F. Storm @ 2005-10-27 1:29 ` Richard M. Stallman 1 sibling, 0 replies; 65+ messages in thread From: Richard M. Stallman @ 2005-10-27 1:29 UTC (permalink / raw) Cc: schwab, michael.cadilhac-, emacs-devel, monnier, eliz, snogglethorpe, miles IMO, it is no less desireable than putting a defcustom for built-in variables or key bindings for built-in commands into a separate file. The key bindings for primitive commands are mostly in the same file as the commands: cmds.c. As for cus-start.el, that is a kludge, and we keep forgetting to update it. > If you want to put the code in a separate file, you can put > it in a function and make the interactive spec call that function. But this still has the MAJOR drawback that this will only apply to built-in functions that have already been instrumented to do that (which in practice means: none). Right now, no primitive commands use Lisp to read their arguments. Once we add a mechanism for them to to do so, we can start changing some of these commands, one by one, to do so. I want to keep the arg-reading code with the function definition, not separate. My trivial changes provide a simple, efficient, flexible, user-extensible solution which can be applied to all existing functions and commands. We don't want to apply it to very many. And in the cases where we do, it will be cleaner to keep the arg-reading code in the function definition. But even for Lisp code, why copy all the code just to be able to change the way a command reads its arguments? There is no need to copy the code. You can simply call the original function. I do not like the idea of defining a different interactive spec for an alias. The alias should be equivalent to the original. Likewise, I don't like the idea of being able to change a function's interactive spec from a place remote from the function definition. ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-21 3:21 ` Stefan Monnier 2005-10-21 8:44 ` Andreas Schwab @ 2005-10-21 10:58 ` Kim F. Storm 2005-10-21 11:05 ` Kim F. Storm 2005-10-21 17:51 ` Richard M. Stallman 3 siblings, 0 replies; 65+ messages in thread From: Kim F. Storm @ 2005-10-21 10:58 UTC (permalink / raw) Cc: Eli Zaretskii, Michael Cadilhac, emacs-devel Stefan Monnier <monnier@iro.umontreal.ca> writes: >>> but providing `chmod' (or making set-file-modes into a command) is >>> a good idea. > >> set-file-modes is a nice simple function in C. >> IMHO, a more advanced chmod command should be implemented in Lisp. > > Agreed. I actually firmly believe that we should be able to provide > elisp code for the interactive spec of a C function. > This would also allow us to get rid of the load vs load-file distinction > and to improve various other commands implemented in C where the minibuffer > query only provides a fairly dull default. Like this? *** data.c 19 Sep 2005 00:24:45 +0200 1.254 --- data.c 21 Oct 2005 12:54:00 +0200 *************** *** 786,791 **** --- 786,794 ---- if (SUBRP (fun)) { + Lisp_Object spec; + if ((spec = Fget (fun, Qinteractive))) + return list2 (Qinteractive, spec); if (XSUBR (fun)->prompt) return list2 (Qinteractive, build_string (XSUBR (fun)->prompt)); } -- Kim F. Storm <storm@cua.dk> http://www.cua.dk ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-21 3:21 ` Stefan Monnier 2005-10-21 8:44 ` Andreas Schwab 2005-10-21 10:58 ` Kim F. Storm @ 2005-10-21 11:05 ` Kim F. Storm 2005-10-21 15:07 ` Stefan Monnier 2005-10-21 17:51 ` Richard M. Stallman 3 siblings, 1 reply; 65+ messages in thread From: Kim F. Storm @ 2005-10-21 11:05 UTC (permalink / raw) Cc: Eli Zaretskii, Michael Cadilhac, emacs-devel Stefan Monnier <monnier@iro.umontreal.ca> writes: > Agreed. I actually firmly believe that we should be able to provide > elisp code for the interactive spec of a C function. The previous patch I posted was completely untested, and didn't compile. Here is a better patch: *** data.c 19 Sep 2005 00:24:45 +0200 1.254 --- data.c 21 Oct 2005 13:04:24 +0200 *************** *** 787,793 **** if (SUBRP (fun)) { if (XSUBR (fun)->prompt) ! return list2 (Qinteractive, build_string (XSUBR (fun)->prompt)); } else if (COMPILEDP (fun)) { --- 787,801 ---- if (SUBRP (fun)) { if (XSUBR (fun)->prompt) ! { ! Lisp_Object spec; ! if (XSUBR (fun)->prompt[0] != '#') ! return list2 (Qinteractive, build_string (XSUBR (fun)->prompt)); ! ! if ((spec = Fget (intern (XSUBR (fun)->symbol_name), Qinteractive), ! !NILP (spec))) ! return list2 (Qinteractive, spec); ! } } else if (COMPILEDP (fun)) { -- Kim F. Storm <storm@cua.dk> http://www.cua.dk ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-21 11:05 ` Kim F. Storm @ 2005-10-21 15:07 ` Stefan Monnier 0 siblings, 0 replies; 65+ messages in thread From: Stefan Monnier @ 2005-10-21 15:07 UTC (permalink / raw) Cc: Eli Zaretskii, Michael Cadilhac, emacs-devel >> Agreed. I actually firmly believe that we should be able to provide >> elisp code for the interactive spec of a C function. > The previous patch I posted was completely untested, and didn't compile. > Here is a better patch: > *** data.c 19 Sep 2005 00:24:45 +0200 1.254 > --- data.c 21 Oct 2005 13:04:24 +0200 > *************** > *** 787,793 **** > if (SUBRP (fun)) > { > if (XSUBR (fun)->prompt) > ! return list2 (Qinteractive, build_string (XSUBR (fun)->prompt)); > } > else if (COMPILEDP (fun)) > { > --- 787,801 ---- > if (SUBRP (fun)) > { > if (XSUBR (fun)->prompt) > ! { > ! Lisp_Object spec; > ! if (XSUBR (fun)->prompt[0] != '#') > ! return list2 (Qinteractive, build_string (XSUBR (fun)->prompt)); > ! > ! if ((spec = Fget (intern (XSUBR (fun)->symbol_name), Qinteractive), > ! !NILP (spec))) > ! return list2 (Qinteractive, spec); > ! } > } > else if (COMPILEDP (fun)) > { That sounds great, except I think it's important to be able to override in elisp a previous interactive spec provided by C code. Stefan PS: Also I'd move the "spec = ..." out of the if. ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-21 3:21 ` Stefan Monnier ` (2 preceding siblings ...) 2005-10-21 11:05 ` Kim F. Storm @ 2005-10-21 17:51 ` Richard M. Stallman 2005-10-21 18:43 ` Stefan Monnier 3 siblings, 1 reply; 65+ messages in thread From: Richard M. Stallman @ 2005-10-21 17:51 UTC (permalink / raw) Cc: eliz, michael.cadilhac-, emacs-devel, storm Agreed. I actually firmly believe that we should be able to provide elisp code for the interactive spec of a C function. This would also allow us to get rid of the load vs load-file distinction and to improve various other commands implemented in C where the minibuffer query only provides a fairly dull default. It is a good idea for sometime later. It would be possible to make one of load-file and load-library be the same as `load', but we would still need two commands for loading, since the motive for them is to have two different ways of reading the argument. ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-21 17:51 ` Richard M. Stallman @ 2005-10-21 18:43 ` Stefan Monnier 2005-10-22 4:18 ` Richard M. Stallman 0 siblings, 1 reply; 65+ messages in thread From: Stefan Monnier @ 2005-10-21 18:43 UTC (permalink / raw) Cc: eliz, michael.cadilhac-, emacs-devel, storm > It would be possible to make one of load-file and load-library > be the same as `load', but we would still need two commands > for loading, since the motive for them is to have two different > ways of reading the argument. AFAIK M-x load-library accepts and properly completes both kinds of arguments. The only difference is the initial content of the minibuffer (empty in one case and default-directory in the other). Stefan ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-21 18:43 ` Stefan Monnier @ 2005-10-22 4:18 ` Richard M. Stallman 2005-10-22 5:39 ` Drew Adams 0 siblings, 1 reply; 65+ messages in thread From: Richard M. Stallman @ 2005-10-22 4:18 UTC (permalink / raw) Cc: eliz, michael.cadilhac-, emacs-devel, storm AFAIK M-x load-library accepts and properly completes both kinds of arguments. Yes, it seems to. That's a change I had forgotten about. (In the old days, load-library did no completion at all.) However, load-file only reads file names, and only completes file names. Could load-file now be an alias to load-library? ^ permalink raw reply [flat|nested] 65+ messages in thread
* RE: File modes facilities. 2005-10-22 4:18 ` Richard M. Stallman @ 2005-10-22 5:39 ` Drew Adams 2005-10-22 6:17 ` Miles Bader 2005-10-23 18:05 ` Stefan Monnier 0 siblings, 2 replies; 65+ messages in thread From: Drew Adams @ 2005-10-22 5:39 UTC (permalink / raw) AFAIK M-x load-library accepts and properly completes both kinds of arguments. Yes, it seems to. That's a change I had forgotten about. (In the old days, load-library did no completion at all.) However, load-file only reads file names, and only completes file names. Could load-file now be an alias to load-library? Don't load-file and load-library complete the file name differently? Doesn't load-library expect the library to be in the load-path, while load-file is content to load a file even if it is not in the load-path? (defun load-library (library) (interactive (list (completing-read "Load library: " 'locate-file-completion (cons load-path load-suffixes)))) (load library)) The (cons load-path load-suffixes) makes me think this only works for load-path files. (defun load-file (file) (interactive (list (let ((completion-ignored-extensions (remove ".elc" completion-ignored-extensions))) (read-file-name "Load file: ")))) (load (expand-file-name file) nil nil t)) This one has no connection with load-path. Or am I misunderstanding the issue? ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-22 5:39 ` Drew Adams @ 2005-10-22 6:17 ` Miles Bader 2005-10-22 6:32 ` Drew Adams 2005-10-23 18:05 ` Stefan Monnier 1 sibling, 1 reply; 65+ messages in thread From: Miles Bader @ 2005-10-22 6:17 UTC (permalink / raw) Cc: emacs-devel 2005/10/22, Drew Adams <drew.adams@oracle.com>: > Don't load-file and load-library complete the file name differently? Doesn't > load-library expect the library to be in the load-path, while load-file is > content to load a file even if it is not in the load-path? ... > The (cons load-path load-suffixes) makes me think this only works for > load-path files. Did you try it? load-library seems to handle both load-path names and explicitly-specified pathnames. [The completion help is kind of screwy though -- tons of duplicate entries are show] -Miles -- Do not taunt Happy Fun Ball. ^ permalink raw reply [flat|nested] 65+ messages in thread
* RE: File modes facilities. 2005-10-22 6:17 ` Miles Bader @ 2005-10-22 6:32 ` Drew Adams 2005-10-22 7:33 ` Miles Bader 0 siblings, 1 reply; 65+ messages in thread From: Drew Adams @ 2005-10-22 6:32 UTC (permalink / raw) > Don't load-file and load-library complete the file name > differently? Doesn't > load-library expect the library to be in the load-path, while > load-file is > content to load a file even if it is not in the load-path? > The (cons load-path load-suffixes) makes me think this only works for > load-path files. load-library seems to handle both load-path names and explicitly-specified pathnames. [The completion help is kind of screwy though -- tons of duplicate entries are show] Right - both load-library and load-file just call `load'. I was speaking only of the completion, responding to Richard, who mentioned that they both did completion now. It looks like they complete differently: `load-library' completes libraries (as Richard said), wrt your load-path; `load-file' completes file names, wrt the default-directory. I think it's good to have these two different kinds of completion (that is, two different commands), even though the aim in both cases is to load a Lisp file, and both will accept an absolute file name as argument. ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-22 6:32 ` Drew Adams @ 2005-10-22 7:33 ` Miles Bader 2005-10-22 7:45 ` Drew Adams 0 siblings, 1 reply; 65+ messages in thread From: Miles Bader @ 2005-10-22 7:33 UTC (permalink / raw) Cc: emacs-devel 2005/10/22, Drew Adams <drew.adams@oracle.com>: > load-library seems to handle both load-path names and > explicitly-specified pathnames. [The completion help is kind > of screwy though -- tons of duplicate entries are show] > > It looks like they complete differently: `load-library' completes libraries > (as Richard said), wrt your load-path; `load-file' completes file names, wrt > the default-directory. load-library completes both (simultaneously). Try it. -Miles -- Do not taunt Happy Fun Ball. ^ permalink raw reply [flat|nested] 65+ messages in thread
* RE: File modes facilities. 2005-10-22 7:33 ` Miles Bader @ 2005-10-22 7:45 ` Drew Adams 0 siblings, 0 replies; 65+ messages in thread From: Drew Adams @ 2005-10-22 7:45 UTC (permalink / raw) > load-library seems to handle both load-path names and > explicitly-specified pathnames. [The completion help is kind > of screwy though -- tons of duplicate entries are show] > > It looks like they complete differently: `load-library' > completes libraries (as Richard said), wrt your load-path; > `load-file' completes file names, wrt the default-directory. load-library completes both (simultaneously). Try it. I did try it. But maybe we're talking about different things. (And I don't know what you mean by "simultaneously" completing both.) Go to a directory that is not in your load-path. M-x load-library will not complete the name of an Emacs-Lisp file in that directory - at least it doesn't for me. M-x load-file will complete its name - at least it does for me. I'm using a CVS snapshot from July, if that makes a difference (I quoted the code). I still see two different kinds of completion: one wrt your load-path, the other wrt the default-directory. And that's what I read in the code, too. But it's late here - perhaps I'm missing something you're saying because I'm tired; I'm not _trying_ to be obtuse. ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-22 5:39 ` Drew Adams 2005-10-22 6:17 ` Miles Bader @ 2005-10-23 18:05 ` Stefan Monnier 2005-10-23 18:27 ` Drew Adams 1 sibling, 1 reply; 65+ messages in thread From: Stefan Monnier @ 2005-10-23 18:05 UTC (permalink / raw) Cc: emacs-devel > AFAIK M-x load-library accepts and properly completes both kinds > of arguments. > Yes, it seems to. That's a change I had forgotten about. (In the old > days, load-library did no completion at all.) However, load-file only > reads file names, and only completes file names. > Could load-file now be an alias to load-library? > Don't load-file and load-library complete the file name differently? Yes, slightly. But if your file name starts with / or ~ (i.e. is an absolute file name, as is the default for `load-file' because of its default initial value) then the difference is minimal. Stefan ^ permalink raw reply [flat|nested] 65+ messages in thread
* RE: File modes facilities. 2005-10-23 18:05 ` Stefan Monnier @ 2005-10-23 18:27 ` Drew Adams 2005-10-24 13:37 ` Richard M. Stallman 2005-10-24 13:40 ` Stefan Monnier 0 siblings, 2 replies; 65+ messages in thread From: Drew Adams @ 2005-10-23 18:27 UTC (permalink / raw) > Could load-file now be an alias to load-library? > Don't load-file and load-library complete the file name differently? Yes, slightly. But if your file name starts with / or ~ (i.e. is an absolute file name, as is the default for `load-file' because of its default initial value) then the difference is minimal. I guess I still don't understand. I see this difference in completion behavior - do you not? Go to a directory that is not in your load-path. M-x load-library will not complete the name of an Emacs-Lisp file in that directory... M-x load-file will complete its name. I see the default for `load-file' being an absolute file name that is in the default-directory. I see it completing to any file in that directory. I don't see `load-library' doing that at all - I see `load-library' completing only wrt the `load-path'. Are we talking about the same thing and seeing different behaviors? Am I seeing different behavior from you because I'm using a old (July) CVS snapshot? IOW, has this behavior changed? ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-23 18:27 ` Drew Adams @ 2005-10-24 13:37 ` Richard M. Stallman 2005-10-24 13:40 ` Stefan Monnier 1 sibling, 0 replies; 65+ messages in thread From: Richard M. Stallman @ 2005-10-24 13:37 UTC (permalink / raw) Cc: emacs-devel I guess I still don't understand. I see this difference in completion behavior - do you not? Could you describe precisely the two different behaviors? ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-23 18:27 ` Drew Adams 2005-10-24 13:37 ` Richard M. Stallman @ 2005-10-24 13:40 ` Stefan Monnier 2005-10-24 16:41 ` Drew Adams 1 sibling, 1 reply; 65+ messages in thread From: Stefan Monnier @ 2005-10-24 13:40 UTC (permalink / raw) Cc: emacs-devel > Yes, slightly. But if your file name starts with / or ~ (i.e. is an > absolute file name, as is the default for `load-file' because > of its default initial value) then the difference is minimal. > I guess I still don't understand. I see this difference in completion > behavior - do you not? > Go to a directory that is not in your load-path. M-x load-library > will not complete the name of an Emacs-Lisp file in that directory... > M-x load-file will complete its name. Which part of "starts with / or ~" don't you understand? > I see the default for `load-file' being an absolute file name that is in the > default-directory. I see it completing to any file in that directory. I > don't see `load-library' doing that at all - I see `load-library' completing > only wrt the `load-path'. As I said, the initial value (empty string for load-library, default-directory for load-file) is the main difference. But if you type in the default directory manually in load-library the completion facilities will then work pretty much as they do in load-file. Stefan ^ permalink raw reply [flat|nested] 65+ messages in thread
* RE: File modes facilities. 2005-10-24 13:40 ` Stefan Monnier @ 2005-10-24 16:41 ` Drew Adams 2005-10-24 16:59 ` Stefan Monnier 0 siblings, 1 reply; 65+ messages in thread From: Drew Adams @ 2005-10-24 16:41 UTC (permalink / raw) > Yes, slightly. But if your file name starts with / or ~ > (i.e. is an absolute file name, as is the default for `load-file' > because of its default initial value) then the difference is minimal. > I guess I still don't understand. I see this difference in completion > behavior - do you not? > Go to a directory that is not in your load-path. M-x load-library > will not complete the name of an Emacs-Lisp file in that > directory... M-x load-file will complete its name. Which part of "starts with / or ~" don't you understand? I didn't understand that you meant for the user to _type_ the absolute file name. I thought you were somehow speaking of the default path used for completion. Sorry. Yes, if you type the directory explicitly and absolutely (no `../', `./', `~/'), then `load-library' will complete in that directory. My point was that, without doing that, they complete differently - they use different paths (directories). It's like saying that we can do without the use of relative file names (chic!), because one can always type an absolute file name - IIUC. > I see the default for `load-file' being an absolute file name > that is in the default-directory. I see it completing to any > file in that directory. I don't see `load-library' doing that > at all - I see `load-library' completing only wrt the `load-path'. As I said, the initial value (empty string for load-library, default-directory for load-file) is the main difference. But if you type in the default directory manually in load-library the completion facilities will then work pretty much as they do in load-file. Coming back to the initial suggestion by RMS of making `load-file' just an alias to `load-library', I repeat my preference: I think it's good to have these two different kinds of completion (that is, two different commands), even though the aim in both cases is to load a Lisp file, and both will accept an absolute file name as argument. IOW, `load-file' offers the convenience of using the `default-directory', by default, and inputting a relative filename. Why give up that convenience? Why make people type an absolute filename? It's a lot easier to navigate a directory tree using relative file names (with, e.g., `../' and `~/'). If the user's intent is to load a file, then the `load-file' UI is made to order, and the `load-library' UI presents an unnecessary obstacle (= entering an absolute name). Imagine if you had no `cd' command in shell, and had to type (even with completion, from `/') an absolute path for each file name - that's what it would be like, IIUC. ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-24 16:41 ` Drew Adams @ 2005-10-24 16:59 ` Stefan Monnier 2005-10-24 17:13 ` Drew Adams 0 siblings, 1 reply; 65+ messages in thread From: Stefan Monnier @ 2005-10-24 16:59 UTC (permalink / raw) Cc: emacs-devel > Yes, if you type the directory explicitly and absolutely (no `../', `./', > `~/'), then `load-library' will complete in that directory. My point was > that, without doing that, they complete differently - they use different > paths (directories). Yes, they do work differently. I haven't advocated to remove load-file and/or merge it into load-library for precisely this reason. But we could get rid of load-library if we could just add an interactive spec to `load'. As for getting rid of load-file, maybe you could make load-library's completion understand a leading "./" as meaning "relative to current dir" (similarly to what is done in most shells), or maybe make a C-u prefix tell load-library that the initial minibuffer content should be default-directory. Then maybe we could imagine getting rid of load-file. Stefan ^ permalink raw reply [flat|nested] 65+ messages in thread
* RE: File modes facilities. 2005-10-24 16:59 ` Stefan Monnier @ 2005-10-24 17:13 ` Drew Adams 0 siblings, 0 replies; 65+ messages in thread From: Drew Adams @ 2005-10-24 17:13 UTC (permalink / raw) > Yes, if you type the directory explicitly and absolutely (no > `../', `./', `~/'), then `load-library' will complete in that > directory. My point was that, without doing that, they complete > differently - they use different paths (directories). Yes, they do work differently. I haven't advocated to remove load-file and/or merge it into load-library for precisely this reason. But we could get rid of load-library if we could just add an interactive spec to `load'. As for getting rid of load-file, maybe you could make load-library's completion understand a leading "./" as meaning "relative to current dir" (similarly to what is done in most shells), or maybe make a C-u prefix tell load-library that the initial minibuffer content should be default-directory. Then maybe we could imagine getting rid of load-file. I almost wrote something similar (the "./" part) in my previous message, but I think that 1) it would be confusing and somewhat hidden functionality, and 2) people would also miss "../", "~/" etc. - IOW, they would miss completion from the `default-directory'. Yes, a C-u could signal a change from the completing behavior of `load-library' (absolute file name) to that of `load-file' (relative file name, default-directory). But why do that? What is the advantage of getting rid of `load-file', with its handy UI for file-name completion? ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-20 16:15 ` Stefan Monnier 2005-10-20 22:16 ` Kim F. Storm @ 2005-10-20 23:38 ` Richard M. Stallman 2005-10-21 0:58 ` Michael Cadilhac 1 sibling, 1 reply; 65+ messages in thread From: Richard M. Stallman @ 2005-10-20 23:38 UTC (permalink / raw) Cc: eliz, michael.cadilhac-, emacs-devel I'm not sure about set-current-file-modes, but providing `chmod' (or making set-file-modes into a command) is a good idea. I would like to make set-file-modes into a command, using his code to parse the modes if they are specified non-numerically. ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-20 23:38 ` Richard M. Stallman @ 2005-10-21 0:58 ` Michael Cadilhac 2005-10-21 1:06 ` Miles Bader 0 siblings, 1 reply; 65+ messages in thread From: Michael Cadilhac @ 2005-10-21 0:58 UTC (permalink / raw) Cc: eliz, Stefan Monnier, emacs-devel "Richard M. Stallman" <rms@gnu.org> writes: > I'm not sure about set-current-file-modes, > but providing `chmod' (or making set-file-modes into a command) is > a good idea. > > I would like to make set-file-modes into a command, using his code to > parse the modes if they are specified non-numerically. Do you mean making a function such as `change-file-modes' aliased to `chmod' ? Or you meant another thing by `making set-file-modes into a command' ? In the first case, I think the (naively named) `chmod' function of my proposal (<87hdbdxo94.fsf@mahaena.lrde>) can make the job. Feel free to do anything you want with it, and if you want some modifications to be made, just ask. -- Michael Cadilhac, a.k.a. Micha [mika] | Epita/LRDE promo 2007 | Please note that you should 2 rue de la Convention | 08.70.65.13.14 | s/-@t-/@/ my mail address. 94270 Le Kremlin Bicetre | 06.23.20.31.30 | ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-21 0:58 ` Michael Cadilhac @ 2005-10-21 1:06 ` Miles Bader 2005-10-21 1:24 ` Michael Cadilhac 0 siblings, 1 reply; 65+ messages in thread From: Miles Bader @ 2005-10-21 1:06 UTC (permalink / raw) Cc: eliz, emacs-devel, rms, Stefan Monnier 2005/10/21, Michael Cadilhac <michael.cadilhac-@t-lrde.epita.fr>: > "Richard M. Stallman" <rms@gnu.org> writes: > > I would like to make set-file-modes into a command, using his code to > > parse the modes if they are specified non-numerically. > > Do you mean making a function such as `change-file-modes' aliased to > `chmod' ? Or you meant another thing by `making set-file-modes into > a command' ? "Make FOO into a command", where FOO is an existing function, usually means "Add an appropriate interactive spec to FOO (so that users can use it via M-x or bind it to a key)." -Miles -- Do not taunt Happy Fun Ball. ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-21 1:06 ` Miles Bader @ 2005-10-21 1:24 ` Michael Cadilhac 2005-10-21 17:51 ` Richard M. Stallman 0 siblings, 1 reply; 65+ messages in thread From: Michael Cadilhac @ 2005-10-21 1:24 UTC (permalink / raw) Cc: rms, Michael Cadilhac, emacs-devel, Stefan Monnier, eliz, miles Miles Bader <snogglethorpe@gmail.com> writes: > 2005/10/21, Michael Cadilhac <michael.cadilhac-@t-lrde.epita.fr>: >> "Richard M. Stallman" <rms@gnu.org> writes: >> > I would like to make set-file-modes into a command, using his code to >> > parse the modes if they are specified non-numerically. >> >> Do you mean making a function such as `change-file-modes' aliased to >> `chmod' ? Or you meant another thing by `making set-file-modes into >> a command' ? > > "Make FOO into a command", where FOO is an existing function, usually > means "Add an appropriate interactive spec to FOO (so that users can > use it via M-x or bind it to a key)." That's what I feared, thanks ;-) So Richard meant to modify the C function, okey. I'll post a patch tomorrow if nobody does it within this time and if needed. Another question would be, where would be placed the code for symbolic modes parsing ? `lisp/files.el' sounds good to me, but I don't know if it's the right way to go. -- Michael Cadilhac, a.k.a. Micha [mika] | Epita/LRDE promo 2007 | Please note that you should 2 rue de la Convention | 08.70.65.13.14 | s/-@t-/@/ my mail address. 94270 Le Kremlin Bicetre | 06.23.20.31.30 | ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-21 1:24 ` Michael Cadilhac @ 2005-10-21 17:51 ` Richard M. Stallman 2005-10-23 23:42 ` Michael Cadilhac 0 siblings, 1 reply; 65+ messages in thread From: Richard M. Stallman @ 2005-10-21 17:51 UTC (permalink / raw) Cc: michael.cadilhac-, emacs-devel, monnier, eliz, snogglethorpe, miles That's what I feared, thanks ;-) So Richard meant to modify the C function, okey. Here's what I sent you before, but it bounced because the address in your message is not the real one. Part of this package would be good to install. I don't see a need for the special feature for changing the current file's modes on the next save. Why wait for that? I would like a function to set the modes of a file--what you've called chmod, but I think it should be called set-file-modes. There IS a function called set-file-modes. It is not interactive. My idea is to rename that to set-file-modes-internal, and use your chmod command under the name set-file-modes. It should accept a numeric mode argument too; that way, existing callers will still work. It would use file-modes-to-number. Would you like to work on such a patch? Have we got legal papers from you for Emacs? (defvar file-modes 0 "File modes of the file visited in the current buffer. Do not rely on this variable to know current file modes, use `buffer-file-modes' instead.") Please note the rule that the first line of a doc string must always stand on its own. ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-21 17:51 ` Richard M. Stallman @ 2005-10-23 23:42 ` Michael Cadilhac 2005-10-24 14:09 ` Kim F. Storm 0 siblings, 1 reply; 65+ messages in thread From: Michael Cadilhac @ 2005-10-23 23:42 UTC (permalink / raw) Cc: eliz, snogglethorpe, emacs-devel, monnier, miles [-- Attachment #1.1.1: Type: text/plain, Size: 849 bytes --] "Richard M. Stallman" <rms@gnu.org> writes: > There IS a function called set-file-modes. It is not interactive. My > idea is to rename that to set-file-modes-internal, and use your chmod > command under the name set-file-modes. It should accept a numeric > mode argument too; that way, existing callers will still work. It > would use file-modes-to-number. > > Would you like to work on such a patch? Of course, here's attached ! > Have we got legal papers from you for Emacs? Nop, what's the procedure ? Patch follows. lisp/ChangeLog | 5 + lisp/file-modes.el | 148 +++++++++++++++++++++++++++++++++++++++++++++++++++++ lispref/ChangeLog | 6 ++ lispref/files.texi | 25 -!!!!!!! src/ChangeLog | 5 + src/fileio.c | 18 !!!!!! 6 files changed, 164 insertions(+), 5 deletions(-), 38 modifications(!) [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1.1.2: file-modes.patch --] [-- Type: text/x-patch, Size: 14716 bytes --] Index: lisp/ChangeLog =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/ChangeLog,v retrieving revision 1.8422 diff -c -r1.8422 ChangeLog *** lisp/ChangeLog 23 Oct 2005 13:30:15 -0000 1.8422 --- lisp/ChangeLog 23 Oct 2005 23:25:27 -0000 *************** *** 1,3 **** --- 1,8 ---- + 2005-10-24 Michael Cadilhac <michael.cadilhac@lrde.org> + + * file-modes.el: New. Implement file modes relative functions + with symbolic modes notation parsing. + 2005-10-23 Thien-Thi Nguyen <ttn@gnu.org> * whitespace.el (whitespace-cleanup): Doc fix. Index: lispref/ChangeLog =================================================================== RCS file: /cvsroot/emacs/emacs/lispref/ChangeLog,v retrieving revision 1.509 diff -c -r1.509 ChangeLog *** lispref/ChangeLog 22 Oct 2005 16:41:55 -0000 1.509 --- lispref/ChangeLog 23 Oct 2005 23:25:27 -0000 *************** *** 1,3 **** --- 1,9 ---- + 2005-10-24 Michael Cadilhac <michael.cadilhac@lrde.org> + + * files.texi (Changing Files): Document the fact that + `set-file-modes' could take its mode argument as a + string. Document `file-modes-to-number'. + 2005-10-22 Eli Zaretskii <eliz@gnu.org> * internals.texi (Building Emacs): Fix last change. Index: lispref/files.texi =================================================================== RCS file: /cvsroot/emacs/emacs/lispref/files.texi,v retrieving revision 1.87 diff -c -r1.87 files.texi *** lispref/files.texi 17 Oct 2005 06:47:26 -0000 1.87 --- lispref/files.texi 23 Oct 2005 23:25:27 -0000 *************** *** 1083,1098 **** @end group @group ! (set-file-modes "~/junk/diffs" 438) @result{} nil @end group @group - (format "%o" 438) - @result{} "666" ; @r{Convert to octal.} - @end group - - @group % ls -l diffs -rw-rw-rw- 1 lewis 0 3063 Oct 30 16:00 diffs @end group --- 1083,1093 ---- @end group @group ! (set-file-modes "~/junk/diffs" "a=rw") ; @r{Use symbolic notation.} @result{} nil @end group @group % ls -l diffs -rw-rw-rw- 1 lewis 0 3063 Oct 30 16:00 diffs @end group *************** *** 1480,1490 **** @var{string}. It is available only on VMS. @end defun ! @defun set-file-modes filename mode ! This function sets mode bits of @var{filename} to @var{mode} (which ! must be an integer). Only the low 12 bits of @var{mode} are used. ! This function recursively follows symbolic links at all levels for ! @var{filename}. @end defun @c Emacs 19 feature --- 1475,1493 ---- @var{string}. It is available only on VMS. @end defun ! @defun file-modes-to-number modes &optional from ! This function returns the numerical mode denoted by @var{modes}. ! @var{modes} could be a string (that represents the mode either in ! symbolic or octal representation) or an integer. @var{from} is used to ! compute relative rights ``X'', ``u'', ``g'', ``o''. ! @end defun ! ! @defun set-file-modes filename modes ! This function sets mode bits of @var{filename} to @var{modes}. ! @var{modes} could be a string (that represents the mode either in ! symbolic or octal representation) or an integer. Only the low 12 bits ! of the numerical representation of @var{modes} are used. This function ! recursively follows symbolic links at all levels for @var{filename}. @end defun @c Emacs 19 feature Index: src/ChangeLog =================================================================== RCS file: /cvsroot/emacs/emacs/src/ChangeLog,v retrieving revision 1.4669 diff -c -r1.4669 ChangeLog *** src/ChangeLog 21 Oct 2005 16:54:37 -0000 1.4669 --- src/ChangeLog 23 Oct 2005 23:25:29 -0000 *************** *** 1,3 **** --- 1,8 ---- + 2005-10-24 Michael Cadilhac <michael.cadilhac@lrde.org> + + * fileio.c: Rename `set-file-modes' to `set-file-modes-internal'. + `set-file-modes' is now a Lisp function. + 2005-10-21 Richard M. Stallman <rms@gnu.org> * lread.c (Fload): Simplify gcpro structure. Index: src/fileio.c =================================================================== RCS file: /cvsroot/emacs/emacs/src/fileio.c,v retrieving revision 1.557 diff -c -r1.557 fileio.c *** src/fileio.c 20 Oct 2005 15:03:10 -0000 1.557 --- src/fileio.c 23 Oct 2005 23:25:30 -0000 *************** *** 336,342 **** Lisp_Object Qfile_regular_p; Lisp_Object Qfile_accessible_directory_p; Lisp_Object Qfile_modes; ! Lisp_Object Qset_file_modes; Lisp_Object Qset_file_times; Lisp_Object Qfile_newer_than_file_p; Lisp_Object Qinsert_file_contents; --- 336,342 ---- Lisp_Object Qfile_regular_p; Lisp_Object Qfile_accessible_directory_p; Lisp_Object Qfile_modes; ! Lisp_Object Qset_file_modes_internal; Lisp_Object Qset_file_times; Lisp_Object Qfile_newer_than_file_p; Lisp_Object Qinsert_file_contents; *************** *** 3462,3469 **** return make_number (st.st_mode & 07777); } ! DEFUN ("set-file-modes", Fset_file_modes, Sset_file_modes, 2, 2, 0, ! doc: /* Set mode bits of file named FILENAME to MODE (an integer). Only the 12 low bits of MODE are used. */) (filename, mode) Lisp_Object filename, mode; --- 3462,3471 ---- return make_number (st.st_mode & 07777); } ! DEFUN ("set-file-modes-internal", Fset_file_modes_internal, Sset_file_modes_internal, ! 2, 2, 0, ! doc: /* Internal use only. ! Set mode bits of file named FILENAME to MODE (an integer). Only the 12 low bits of MODE are used. */) (filename, mode) Lisp_Object filename, mode; *************** *** 3476,3484 **** /* If the file name has special constructs in it, call the corresponding file handler. */ ! handler = Ffind_file_name_handler (absname, Qset_file_modes); if (!NILP (handler)) ! return call3 (handler, Qset_file_modes, absname, mode); encoded_absname = ENCODE_FILE (absname); --- 3478,3486 ---- /* If the file name has special constructs in it, call the corresponding file handler. */ ! handler = Ffind_file_name_handler (absname, Qset_file_modes_internal); if (!NILP (handler)) ! return call3 (handler, Qset_file_modes_internal, absname, mode); encoded_absname = ENCODE_FILE (absname); *************** *** 6523,6529 **** Qfile_regular_p = intern ("file-regular-p"); Qfile_accessible_directory_p = intern ("file-accessible-directory-p"); Qfile_modes = intern ("file-modes"); ! Qset_file_modes = intern ("set-file-modes"); Qset_file_times = intern ("set-file-times"); Qfile_newer_than_file_p = intern ("file-newer-than-file-p"); Qinsert_file_contents = intern ("insert-file-contents"); --- 6525,6531 ---- Qfile_regular_p = intern ("file-regular-p"); Qfile_accessible_directory_p = intern ("file-accessible-directory-p"); Qfile_modes = intern ("file-modes"); ! Qset_file_modes_internal = intern ("set-file-modes-internal"); Qset_file_times = intern ("set-file-times"); Qfile_newer_than_file_p = intern ("file-newer-than-file-p"); Qinsert_file_contents = intern ("insert-file-contents"); *************** *** 6558,6564 **** staticpro (&Qfile_regular_p); staticpro (&Qfile_accessible_directory_p); staticpro (&Qfile_modes); ! staticpro (&Qset_file_modes); staticpro (&Qset_file_times); staticpro (&Qfile_newer_than_file_p); staticpro (&Qinsert_file_contents); --- 6560,6566 ---- staticpro (&Qfile_regular_p); staticpro (&Qfile_accessible_directory_p); staticpro (&Qfile_modes); ! staticpro (&Qset_file_modes_internal); staticpro (&Qset_file_times); staticpro (&Qfile_newer_than_file_p); staticpro (&Qinsert_file_contents); *************** *** 6791,6797 **** defsubr (&Sfile_accessible_directory_p); defsubr (&Sfile_regular_p); defsubr (&Sfile_modes); ! defsubr (&Sset_file_modes); defsubr (&Sset_file_times); defsubr (&Sset_default_file_modes); defsubr (&Sdefault_file_modes); --- 6793,6799 ---- defsubr (&Sfile_accessible_directory_p); defsubr (&Sfile_regular_p); defsubr (&Sfile_modes); ! defsubr (&Sset_file_modes_internal); defsubr (&Sset_file_times); defsubr (&Sset_default_file_modes); defsubr (&Sdefault_file_modes); Index: lisp/file-modes.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/file-modes.c,v retrieving revision 1.557 diff -c -r1.557 file-modes.el *** lisp/file-modes.el 2005-10-24 01:20:20.000000000 +0200 --- lisp/file-modes.el 2005-10-24 01:16:28.000000000 +0200 *************** *** 0 **** --- 1,148 ---- + ;;; file-modes.el --- Facilities for file modes. + + ;; Copyright (C) 2005 Free Software Foundation + + ;; Author: Michael Cadilhac <michael.cadilhac@lrde.org> + ;; Keywords: file modes + ;; Version: 0.1 + + ;; This program is free software; you can redistribute it and/or + ;; modify it under the terms of the GNU General Public License as + ;; published by the Free Software Foundation; either version 2, or (at + ;; your option) any later version. + + ;; This program is distributed in the hope that it will be useful, but + ;; WITHOUT ANY WARRANTY; without even the implied warranty of + ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ;; General Public License for more details. + + ;; You should have received a copy of the GNU General Public License + ;; along with GNU Emacs; see the file COPYING. If not, write to the + ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + ;; Boston, MA 02110-1301, USA. + + ;;; Commentary: + + ;; This package implements functions related to file modes + ;; modification and symbolic notation modes parsing. + + ;; For more information about file modes notations see (info + ;; "(coreutils)File permissions"). + + \f + ;;; Code: + + ;; Specialized functions + + (defun char-to-who (c) + "Convert a char to a who-mask for symbolic modes notation. + C is in [ugoa] and represents users on which rights will apply." + (cond ((= c ?u) #o4700) + ((= c ?g) #o2070) + ((= c ?o) #o1007) + ((= c ?a) #o7777) + (t (error "%c: bad `who' character" c)))) + + (defun char-to-right (c &optional from) + "Convert a char to a right-mask for symbolic modes notation. + C is in [rwxXstugo] and represents a right. + FROM (0 if non set) is the current numeric mode to process + relative rights [Xugo]." + (unless from + (setq from 0)) + (cond ((= c ?r) #o0444) + ((= c ?w) #o0222) + ((= c ?x) #o0111) + ((= c ?s) #o1000) + ((= c ?t) #o6000) + ;; Original file-modes relative rights: + ((= c ?X) (if (= (logand from #o111) 0) 0 #o0111)) + ((= c ?u) (let ((uright (logand #o4700 from))) + (+ uright (/ uright #o10) (/ uright #o100)))) + ((= c ?g) (let ((gright (logand #o2070 from))) + (+ gright (/ gright #o10) (* gright #o10)))) + ((= c ?o) (let ((oright (logand #o1007 from))) + (+ oright (* oright #o10) (* oright #o100)))) + (t (error "%c: bad right character" c)))) + + + (defun rights-str-to-number (rights who-mask &optional from) + "Convert rights string to rights-mask for symbolic modes notation. + RIGHTS is the rights string, it should match \"([+=-][rwxXstugo]*)+\". + WHO-MASK is the mask returned by `char-to-who'. + FROM (0 if non set) is the current numeric modes considered." + (save-match-data + (let ((case-fold-search nil) + (num-rights (if from from 0)) + op) + (while (memq (setq op (string-to-char rights)) '(?+ ?- ?=)) + (if (string-match "^.\\([rwxXstugo]*\\)" rights) + (let* ((right (string-to-list (substring rights (match-beginning 1) (match-end 1)))) + (num-right (apply 'logior 0 + (mapcar (lambda (c) (char-to-right c num-rights)) right)))) + (setq num-right (logand who-mask num-right) + num-rights (cond ((= op ?+) (logior num-rights num-right)) + ((= op ?-) (logand num-rights (lognot num-right))) + (t (logior (logand num-rights (lognot who-mask)) + num-right))) + rights (substring rights (match-end 1)))) + (error "Parse error in rights string near `%s'" rights))) + num-rights))) + + (defun symbolic-modes-to-number (modes &optional from) + "Convert file modes denoted by symbolic notation to numeric modes. + MODES is the string to convert, it should match + \"[ugoa]*([+-=][rwxXstugo]*)+,...\". Look at + `(info \"(coreutils)File permissions\")' for more informations about this + notation. + FROM (0 if non set) is the current numeric modes considered." + (let ((case-fold-search nil) + (num-modes (if from from 0))) + (while (not (string= modes "")) + (if (string-match "^\\([ugoa]*\\)[^,]*\\(,\\|\\)" modes) + (let* ((who (string-to-list (substring modes (match-beginning 1) (match-end 1)))) + (num-who (apply 'logior 0 (mapcar 'char-to-who who)))) + (when (= num-who 0) + (setq num-who (default-file-modes))) + (setq num-modes + (rights-str-to-number (substring modes (match-end 1)) + num-who num-modes) + modes (substring modes (match-end 2)))) + (error "Parse error in modes near %s" modes))) + num-modes)) + + \f + ;; Main functions + + ;;;###autoload + (defun file-modes-to-number (modes &optional from) + "Convert file modes denoted by MODES to numeric modes. + MODES is either a string representing the modes in octal or in symbolic + notation, or a number. + FROM (0 if non set) is the numeric modes to which modes will refer is + the symbolic notation is used." + (if (stringp modes) + (if (string-match "^[0-7]+$" modes) + (string-to-number modes 8) + (symbolic-modes-to-number modes from)) + modes)) + + ;;;###autoload + (defalias 'chmod 'set-file-modes) + ;;;###autoload + (defun set-file-modes (filename modes) + "Set MODES to be the file modes of FILENAME. + MODES is either a string (symbolic or octal representation) or a number." + (interactive (list (read-file-name "Change mode: " nil nil t) + (read-string "File modes (symbolic or octal): "))) + (unless (file-exists-p filename) + (error "File %s doesn't exist" filename)) + (unless (and (stringp modes) (string= modes "")) + (set-file-modes-internal filename (file-modes-to-number modes (file-modes filename))))) + + + + (provide 'file-modes) + + ;;; arch-tag: 3cabd295-7f8a-4674-beae-fbfef54cca10 + ;;; file-modes.el ends here [-- Attachment #1.1.3: Type: text/plain, Size: 187 bytes --] -- Michael Cadilhac, a.k.a. Micha [mika] | Epita/LRDE promo 2007 | 2 rue de la Convention | 08.70.65.13.14 | 94270 Le Kremlin Bicetre | 06.23.20.31.30 | [-- Attachment #1.2: Type: application/pgp-signature, Size: 188 bytes --] [-- Attachment #2: Type: text/plain, Size: 142 bytes --] _______________________________________________ Emacs-devel mailing list Emacs-devel@gnu.org http://lists.gnu.org/mailman/listinfo/emacs-devel ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-23 23:42 ` Michael Cadilhac @ 2005-10-24 14:09 ` Kim F. Storm 2005-10-25 15:58 ` Richard M. Stallman 0 siblings, 1 reply; 65+ messages in thread From: Kim F. Storm @ 2005-10-24 14:09 UTC (permalink / raw) Cc: rms, emacs-devel, monnier, eliz, snogglethorpe, miles Michael Cadilhac <michael.cadilhac@lrde.epita.fr> writes: > "Richard M. Stallman" <rms@gnu.org> writes: > >> There IS a function called set-file-modes. It is not interactive. My >> idea is to rename that to set-file-modes-internal, and use your chmod >> command under the name set-file-modes. It should accept a numeric >> mode argument too; that way, existing callers will still work. It >> would use file-modes-to-number. I still think my approach to make any command interactive is much, much better (and simpler) than this hotch-potch approach of renamingbuilt-in functions to COMMAND-internal and provide a wrapper in Lisp. BTW, I thought RMS said he didn't want to include this feature before the release!??!? That said, is it really safe to change the name of the file handler for set-file-modes? Will it break tramp and ange-ftp (and ???) > *************** > *** 3476,3484 **** > > /* If the file name has special constructs in it, > call the corresponding file handler. */ > ! handler = Ffind_file_name_handler (absname, Qset_file_modes); > if (!NILP (handler)) > ! return call3 (handler, Qset_file_modes, absname, mode); > > encoded_absname = ENCODE_FILE (absname); > > --- 3478,3486 ---- > > /* If the file name has special constructs in it, > call the corresponding file handler. */ > ! handler = Ffind_file_name_handler (absname, Qset_file_modes_internal); > if (!NILP (handler)) > ! return call3 (handler, Qset_file_modes_internal, absname, mode); > > encoded_absname = ENCODE_FILE (absname); -- Kim F. Storm <storm@cua.dk> http://www.cua.dk ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-24 14:09 ` Kim F. Storm @ 2005-10-25 15:58 ` Richard M. Stallman 0 siblings, 0 replies; 65+ messages in thread From: Richard M. Stallman @ 2005-10-25 15:58 UTC (permalink / raw) Cc: emacs-devel, monnier, eliz, snogglethorpe, michael.cadilhac, miles That said, is it really safe to change the name of the file handler for set-file-modes? Will it break tramp and ange-ftp (and ???) The name of the operation should not be changed. This is a change in the _implementation_ of set-file-modes. But we could just wait until after the release and then install a way to call Lisp from the interactive spec. Then the two separate functions won't be needed. ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-19 20:09 File modes facilities Michael Cadilhac 2005-10-19 20:35 ` Stefan Monnier @ 2005-10-20 1:42 ` Kevin Ryde 2005-10-20 2:01 ` Miles Bader 1 sibling, 1 reply; 65+ messages in thread From: Kevin Ryde @ 2005-10-20 1:42 UTC (permalink / raw) Michael Cadilhac <michael.cadilhac-@t-lrde.epita.fr> writes: > > - chmod: Change the mode of any file. I made myself M-x chmod below, to change the current visited file. I usually just want to make a script executable. I know there's an executable-chmod or something, but I can never remember and prefer typing 755 or 700. The save-buffer is in case it's a new file. (defun chmod (mode) "Set the mode of the current file, as per the chmod program." (interactive "sMode (3 or 4 octal digits): ") (if (string-match "[0-3]?[0-7][0-7][0-7]" mode) (progn (unless (file-exists-p (buffer-file-name)) (save-buffer)) (set-file-modes (buffer-file-name) (string-to-number mode 8))) (error "Invalid mode"))) ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-20 1:42 ` Kevin Ryde @ 2005-10-20 2:01 ` Miles Bader 2005-10-20 7:12 ` Michael Cadilhac 0 siblings, 1 reply; 65+ messages in thread From: Miles Bader @ 2005-10-20 2:01 UTC (permalink / raw) Cc: emacs-devel 2005/10/20, Kevin Ryde <user42@zip.com.au>: > I made myself M-x chmod below, to change the current visited file. I > usually just want to make a script executable. I know there's an > executable-chmod or something, but I can never remember and prefer > typing 755 or 700. The save-buffer is in case it's a new file. Why not (1) Give `set-file-modes' an interactive spec (defaulting to the current buffer's filename), and (2) make `set-file-modes' understand chmod-style strings as well as integer modes (I guess the interactive spec would have to decide how to parse integers -- would defaulting to octal be reasonable?). Then just add an alias chmod => set-file-modes (for those people who are used to unix), and everybody's happy! Er, I think. -miles -- Do not taunt Happy Fun Ball. ^ permalink raw reply [flat|nested] 65+ messages in thread
* Re: File modes facilities. 2005-10-20 2:01 ` Miles Bader @ 2005-10-20 7:12 ` Michael Cadilhac 0 siblings, 0 replies; 65+ messages in thread From: Michael Cadilhac @ 2005-10-20 7:12 UTC (permalink / raw) Cc: emacs-devel, Kevin Ryde, miles Miles Bader <snogglethorpe@gmail.com> writes: > 2005/10/20, Kevin Ryde <user42@zip.com.au>: >> I made myself M-x chmod below, to change the current visited file. I >> usually just want to make a script executable. I know there's an >> executable-chmod or something, but I can never remember and prefer >> typing 755 or 700. The save-buffer is in case it's a new file. > > Why not (1) Give `set-file-modes' an interactive spec (defaulting to > the current buffer's filename), and (2) make `set-file-modes' > understand chmod-style strings as well as integer modes (I guess the > interactive spec would have to decide how to parse integers -- would > defaulting to octal be reasonable?). Isn't that more or less what I proposed in my package proposal ? - A `chmod-style strings' parser, - A facility to have M-x chmod understand both octal and symbolic modes, - A way to change the current file modes without saving it. ? -- Michael Cadilhac, a.k.a. Micha [mika] | Epita/LRDE promo 2007 | Please note that you should 2 rue de la Convention | 08.70.65.13.14 | s/-@t-/@/ my mail address. 94270 Le Kremlin Bicetre | 06.23.20.31.30 | ^ permalink raw reply [flat|nested] 65+ messages in thread
end of thread, other threads:[~2005-10-27 1:31 UTC | newest] Thread overview: 65+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2005-10-19 20:09 File modes facilities Michael Cadilhac 2005-10-19 20:35 ` Stefan Monnier 2005-10-19 21:28 ` Michael Cadilhac 2005-10-19 22:19 ` Nick Roberts 2005-10-19 22:44 ` Michael Cadilhac 2005-10-19 22:48 ` Kim F. Storm 2005-10-19 22:57 ` Edward O'Connor 2005-10-19 23:00 ` Michael Cadilhac 2005-10-20 9:04 ` Eli Zaretskii 2005-10-20 10:41 ` Michael Cadilhac 2005-10-20 11:51 ` Romain Francoise 2005-10-20 12:41 ` Eli Zaretskii 2005-10-20 14:18 ` Michael Cadilhac 2005-10-20 16:15 ` Stefan Monnier 2005-10-20 22:16 ` Kim F. Storm 2005-10-21 3:21 ` Stefan Monnier 2005-10-21 8:44 ` Andreas Schwab 2005-10-21 12:59 ` Michael Cadilhac 2005-10-21 14:14 ` Miles Bader 2005-10-21 14:43 ` Kim F. Storm 2005-10-21 16:42 ` Michael Cadilhac 2005-10-21 22:19 ` Richard M. Stallman 2005-10-24 14:02 ` Kim F. Storm 2005-10-24 14:16 ` David Kastrup 2005-10-24 16:02 ` Andreas Schwab 2005-10-24 21:00 ` Kim F. Storm 2005-10-24 14:46 ` Stefan Monnier 2005-10-24 22:14 ` Kim F. Storm 2005-10-24 23:02 ` Stefan Monnier 2005-10-25 8:51 ` Kim F. Storm 2005-10-25 20:29 ` Richard M. Stallman 2005-10-25 15:58 ` Richard M. Stallman 2005-10-25 21:34 ` Kim F. Storm 2005-10-26 8:52 ` Kim F. Storm 2005-10-27 1:31 ` Richard M. Stallman 2005-10-27 1:29 ` Richard M. Stallman 2005-10-21 10:58 ` Kim F. Storm 2005-10-21 11:05 ` Kim F. Storm 2005-10-21 15:07 ` Stefan Monnier 2005-10-21 17:51 ` Richard M. Stallman 2005-10-21 18:43 ` Stefan Monnier 2005-10-22 4:18 ` Richard M. Stallman 2005-10-22 5:39 ` Drew Adams 2005-10-22 6:17 ` Miles Bader 2005-10-22 6:32 ` Drew Adams 2005-10-22 7:33 ` Miles Bader 2005-10-22 7:45 ` Drew Adams 2005-10-23 18:05 ` Stefan Monnier 2005-10-23 18:27 ` Drew Adams 2005-10-24 13:37 ` Richard M. Stallman 2005-10-24 13:40 ` Stefan Monnier 2005-10-24 16:41 ` Drew Adams 2005-10-24 16:59 ` Stefan Monnier 2005-10-24 17:13 ` Drew Adams 2005-10-20 23:38 ` Richard M. Stallman 2005-10-21 0:58 ` Michael Cadilhac 2005-10-21 1:06 ` Miles Bader 2005-10-21 1:24 ` Michael Cadilhac 2005-10-21 17:51 ` Richard M. Stallman 2005-10-23 23:42 ` Michael Cadilhac 2005-10-24 14:09 ` Kim F. Storm 2005-10-25 15:58 ` Richard M. Stallman 2005-10-20 1:42 ` Kevin Ryde 2005-10-20 2:01 ` Miles Bader 2005-10-20 7:12 ` Michael Cadilhac
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.