* Re: use Elisp to improve your Elisp - some code issues [not found] <mailman.7671.1438302261.904.help-gnu-emacs@gnu.org> @ 2015-07-31 2:39 ` Pascal J. Bourguignon 2015-08-01 4:09 ` Emanuel Berg [not found] ` <mailman.7712.1438402251.904.help-gnu-emacs@gnu.org> 2015-07-31 20:24 ` Sam Halliday 1 sibling, 2 replies; 30+ messages in thread From: Pascal J. Bourguignon @ 2015-07-31 2:39 UTC (permalink / raw) To: help-gnu-emacs Emanuel Berg <embe8573@student.uu.se> writes: > I just wrote some Elisp which can be used on a set of > files to identify for example the construct > > (if a a b) > > if you want to replace those for > > (or a b) > > See the comments for the issues! > > Issue one is how to best create a temporary buffer to > display the results. It's not so much a temporary buffer than a buffer that is not backed by a file, that you want. A temporary buffer, created by with-temporary-buffer would be deleted right away, and not visible to the user. You want your buffer to be visible by the user. The convention for this type of buffer is to name it with stars around "*Results*". If you want such a buffer but not visible to the user, add a prefix space: " *PrivateResults*" You can see the current "invisible" buffer with C-x b SPC TAB or all the buffers with (buffer-list) > Issue two is to not kill buffers that were already > open at invocation - I can solve that by checking if > there is such a buffer, but I suspect there is > a better way to do these kind of things all in the > background, rather than the `find-file' and then > conditionally `kill-buffer' combo. I don't think there's another way. In my opinion, it's not too important a feature; in my own with-file macro (used by with-files), I didn't check for pre-existing buffers. > Third (minor) issue is the annoying message that > `downcase' does. Isn't there a (shut-up (do-stuff))? I never noted any message from downcase; what do you get? Perhaps you'd want to use: (defun what-line-message () "Return a formated string containing the current buffer line number and narrowed line number of point." (let ((start (point-min)) (n (line-number-at-pos))) (if (= start 1) (format "Line %d" n) (save-excursion (save-restriction (widen) (format "line %d (narrowed line %d)" (+ n (line-number-at-pos start) -1) n)))))) (what-line-message) --> "line 79 (narrowed line 72)" instead of what-line? You could send a patch to emacs to replace what-line with: (defun what-line () (interactive) (message "%s" (what-line-message))) and the what-line-message function. In anycase, it is a basic precept to never mix I/O with computing in a single function. -- __Pascal Bourguignon__ http://www.informatimago.com/ “The factory of the future will have only two employees, a man and a dog. The man will be there to feed the dog. The dog will be there to keep the man from touching the equipment.” -- Carl Bass CEO Autodesk ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: use Elisp to improve your Elisp - some code issues 2015-07-31 2:39 ` use Elisp to improve your Elisp - some code issues Pascal J. Bourguignon @ 2015-08-01 4:09 ` Emanuel Berg [not found] ` <mailman.7712.1438402251.904.help-gnu-emacs@gnu.org> 1 sibling, 0 replies; 30+ messages in thread From: Emanuel Berg @ 2015-08-01 4:09 UTC (permalink / raw) To: help-gnu-emacs "Pascal J. Bourguignon" <pjb@informatimago.com> writes: > It's not so much a temporary buffer than a buffer > that is not backed by a file, that you want. Indeed, good clarification. > You want your buffer to be visible by the user. > The convention for this type of buffer is to name it > with stars around "*Results*". OK, done. > If you want such a buffer but not visible to the > user, add a prefix space: > > " *PrivateResults*" > > You can see the current "invisible" buffer with C-x > b SPC TAB or all the buffers with (buffer-list) Interesting, but of course the buffer should be accessible the ordinary way as you might fix one occurence, get back to the hit list, examine the next hit, and so on. >> Issue two is to not kill buffers that were already >> open at invocation - I can solve that by checking >> if there is such a buffer, but I suspect there is >> a better way to do these kind of things all in the >> background, rather than the `find-file' and then >> conditionally `kill-buffer' combo. > > I don't think there's another way. > > In my opinion, it's not too important a feature; in > my own with-file macro (used by with-files), > I didn't check for pre-existing buffers. Here it is very important! Because say that you have a couple of Elisp files open. Then it strikes you you can do (or a b) instead of (if a a b) while working on one of them. So you think, did I do that in any of my other Elisp files? You apply the tool - boom, all buffers killed! See the code (last) for how the situation can be solved (?). > I never noted any message from downcase; what do > you get? Messages :) In the form of: "Line X". But it wasn't `downcase' but `what-line'! > In anycase, it is a basic precept to never mix I/O > with computing in a single function. Indeed, and I want data, not I/O. `line-number-at-pos' did it as mentioned by anther poster. The code: ;; This file: http://user.it.uu.se/~embe8573/conf/emacs-init/search-regexp-in-files.el (defun files-as-list (file-regexp) (split-string (with-temp-buffer (call-process-shell-command (format "ls %s" file-regexp) nil t) ; no INFILE, temp BUFFER (buffer-substring (point-min) (point-max)) ))) (require 'cl) (defalias 'cl-set-xor 'cl-set-exclusive-or) (defun search-regexp-in-files (file-regexp regexp) (let ((paths (files-as-list file-regexp)) (regexp-hits "*regexp-hits*") (hits nil) ) (get-buffer-create regexp-hits) (let ((buffers (buffer-list))) ; get list to see if we opened the file - (with-current-buffer regexp-hits (erase-buffer)) (dolist (p paths) (let ((buffer (find-file p)) ; here - (kill-later (cl-set-xor buffers (buffer-list))) ) ; by comparing! (with-current-buffer buffer (goto-char (point-min)) (while (re-search-forward regexp nil t) ; no BOUND, NOERROR (setq hits t) (let ((hit-line (line-number-at-pos))) (with-current-buffer regexp-hits (insert (format "%s (%s)\n" p hit-line))))) (when kill-later (kill-buffer buffer) )))) (if hits (progn (switch-to-buffer regexp-hits) (set-buffer-modified-p nil) (goto-char (point-min)) ) (message "No hits!") )))) ;; use this to test (when nil ;; find "kill" - should be some hits even for pacifists (search-regexp-in-files "~/.emacs.d/emacs-init/*.el" "kill") ;; find the construct (if a a b) if you want to replace it with (or a b) ;; if it works, when applied to this file, it should find the example above! (search-regexp-in-files (buffer-file-name) "([[:space:]\n]*if[[:space:]\n]+\\(.*\\)[[:space:]\n]+\\1[[:space:]\n]+\\(.*\\))" ) ) (provide 'search-regexp-in-files) -- underground experts united http://user.it.uu.se/~embe8573 ^ permalink raw reply [flat|nested] 30+ messages in thread
[parent not found: <mailman.7712.1438402251.904.help-gnu-emacs@gnu.org>]
* Re: use Elisp to improve your Elisp - some code issues [not found] ` <mailman.7712.1438402251.904.help-gnu-emacs@gnu.org> @ 2015-08-01 8:54 ` Pascal J. Bourguignon 2015-08-01 12:41 ` Emanuel Berg ` (2 more replies) 0 siblings, 3 replies; 30+ messages in thread From: Pascal J. Bourguignon @ 2015-08-01 8:54 UTC (permalink / raw) To: help-gnu-emacs Emanuel Berg <embe8573@student.uu.se> writes: > ;; find the construct (if a a b) if you want to replace it with (or a b) > ;; if it works, when applied to this file, it should find the example above! > (search-regexp-in-files (buffer-file-name) > "([[:space:]\n]*if[[:space:]\n]+\\(.*\\)[[:space:]\n]+\\1[[:space:]\n]+\\(.*\\))" Perhaps you have notied some discrepancy here. Check: https://en.wikipedia.org/wiki/Chomsky_hierarchy You may use read, or forward-sexp / backward-sexp and down-lisp / up-list, to walk the sexps of the buffer in such a way that now you can check for source patterns instead of text patterns. Not that in this case you may want to use it, but it might still be better to write: (map-sexp-in-files (lambda (form) (cond ((atom form) form) ((and (eql (first form) 'if) (eql (second form) (third form))) ; eql ensures we don't ;; substitute expressions that may have side effects. `(or ,(second form) ,@(cdddr form))) (t form))) (list (buffer-file-name))) or: (require 'pjb-pmatch) (map-sexp-in-files (lambda (form) (match-case form ((if (!v a) (!v a) (!! (!x e))) `(or ,a ,e)) (otherwise form))) (list (buffer-file-name))) -- __Pascal Bourguignon__ http://www.informatimago.com/ “The factory of the future will have only two employees, a man and a dog. The man will be there to feed the dog. The dog will be there to keep the man from touching the equipment.” -- Carl Bass CEO Autodesk ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: use Elisp to improve your Elisp - some code issues 2015-08-01 8:54 ` Pascal J. Bourguignon @ 2015-08-01 12:41 ` Emanuel Berg [not found] ` <mailman.7727.1438432975.904.help-gnu-emacs@gnu.org> 2015-08-01 16:13 ` Michael Heerdegen 2 siblings, 0 replies; 30+ messages in thread From: Emanuel Berg @ 2015-08-01 12:41 UTC (permalink / raw) To: help-gnu-emacs "Pascal J. Bourguignon" <pjb@informatimago.com> writes: > Perhaps you have notied some discrepancy here. > Check: > https://en.wikipedia.org/wiki/Chomsky_hierarchy It would be more illustrative if you provide a counterexample of the same construct which cannot be caught by that or another regexp. It will be interesting to see if that example is anything I would put in my code, ever. But it works. That regexp did identify several such occurrences in my Elisp, which I have changed since. It is yet to be found, if it failed to find any - if that indeed happened. Either case, the code still got better. Perhaps the discrepancy gets smaller the better you know your own style? Gnothi seauton - always a good thing. -- underground experts united http://user.it.uu.se/~embe8573 ^ permalink raw reply [flat|nested] 30+ messages in thread
[parent not found: <mailman.7727.1438432975.904.help-gnu-emacs@gnu.org>]
* Re: use Elisp to improve your Elisp - some code issues [not found] ` <mailman.7727.1438432975.904.help-gnu-emacs@gnu.org> @ 2015-08-01 15:59 ` Pascal J. Bourguignon 2015-08-02 0:06 ` Emanuel Berg [not found] ` <mailman.7751.1438474104.904.help-gnu-emacs@gnu.org> 0 siblings, 2 replies; 30+ messages in thread From: Pascal J. Bourguignon @ 2015-08-01 15:59 UTC (permalink / raw) To: help-gnu-emacs Emanuel Berg <embe8573@student.uu.se> writes: > "Pascal J. Bourguignon" <pjb@informatimago.com> > writes: > >> Perhaps you have notied some discrepancy here. >> Check: >> https://en.wikipedia.org/wiki/Chomsky_hierarchy > > It would be more illustrative if you provide > a counterexample of the same construct which cannot be > caught by that or another regexp. It will be > interesting to see if that example is anything I would > put in my code, ever. It's easy. Try to simplify (- x x) for any sexp x, (assuming x doesn't side effect. Just something like (+ 2 y) or (+ (* a x x) (* b x) c). -- __Pascal Bourguignon__ http://www.informatimago.com/ “The factory of the future will have only two employees, a man and a dog. The man will be there to feed the dog. The dog will be there to keep the man from touching the equipment.” -- Carl Bass CEO Autodesk ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: use Elisp to improve your Elisp - some code issues 2015-08-01 15:59 ` Pascal J. Bourguignon @ 2015-08-02 0:06 ` Emanuel Berg 2015-08-03 1:23 ` Ian Zimmerman [not found] ` <mailman.7751.1438474104.904.help-gnu-emacs@gnu.org> 1 sibling, 1 reply; 30+ messages in thread From: Emanuel Berg @ 2015-08-02 0:06 UTC (permalink / raw) To: help-gnu-emacs "Pascal J. Bourguignon" <pjb@informatimago.com> writes: >> It would be more illustrative if you provide >> a counterexample of the same construct which cannot >> be caught by that or another regexp. It will be >> interesting to see if that example is anything >> I would put in my code, ever. > > It's easy. Try to simplify (- x x) for any sexp x, > (assuming x doesn't side effect. Just something like > (+ 2 y) or (+ (* a x x) (* b x) c). ...? The example was finding (if a a b). Didn't you say regexps couldn't identify all such cases because of lack of expressiveness with respect to the more expressive Lisp? Finding (- x x) should be very easy! And ;; find (- x x) - this is line 64 (search-regexp-in-files "~/.emacs.d/emacs-init/**/*.el" "(- \\(.*\\) \\1)") indeed shows the result: /home/incal/.emacs.d/emacs-init/search-regexp-in-files.el (64) (By the way, is there a less bulky way to get the equivalence of [[:space:]\n]* (and ditto +) at all places where the punctuation and whitespaces now serve as delimiters?) If you mean post-evaluation obviously regexps don't evaluate anything and they don't know Lisp. But if you or anyone else do this is Lisp - why not in the byte-compiler? - and it is an improvement either with respect to finding all occurrences *or* doing this post-evaluation (I don't know which you mean) then I'd use that in an instant rather than my stuff for analyzing Elisp. I don't see how such things can be identified post-evaluation because that depends on evaluation, but perhaps if you only use calculation with fixed digits it works, tho how many people do how much of that I wonder. -- underground experts united http://user.it.uu.se/~embe8573 ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: use Elisp to improve your Elisp - some code issues 2015-08-02 0:06 ` Emanuel Berg @ 2015-08-03 1:23 ` Ian Zimmerman 0 siblings, 0 replies; 30+ messages in thread From: Ian Zimmerman @ 2015-08-03 1:23 UTC (permalink / raw) To: help-gnu-emacs On 2015-08-02 02:06 +0200, Emanuel Berg wrote: > (By the way, is there a less bulky way to get the equivalence of > [[:space:]\n]* (and ditto +) at all places where the punctuation and > whitespaces now serve as delimiters?) Look at the sregex module. -- Please *no* private copies of mailing list or newsgroup messages. Rule 420: All persons more than eight miles high to leave the court. ^ permalink raw reply [flat|nested] 30+ messages in thread
[parent not found: <mailman.7751.1438474104.904.help-gnu-emacs@gnu.org>]
* Re: use Elisp to improve your Elisp - some code issues [not found] ` <mailman.7751.1438474104.904.help-gnu-emacs@gnu.org> @ 2015-08-02 0:44 ` Pascal J. Bourguignon 2015-08-02 1:29 ` Emanuel Berg 0 siblings, 1 reply; 30+ messages in thread From: Pascal J. Bourguignon @ 2015-08-02 0:44 UTC (permalink / raw) To: help-gnu-emacs Emanuel Berg <embe8573@student.uu.se> writes: > "Pascal J. Bourguignon" <pjb@informatimago.com> > writes: > >>> It would be more illustrative if you provide >>> a counterexample of the same construct which cannot >>> be caught by that or another regexp. It will be >>> interesting to see if that example is anything >>> I would put in my code, ever. >> >> It's easy. Try to simplify (- x x) for any sexp x, >> (assuming x doesn't side effect. Just something like >> (+ 2 y) or (+ (* a x x) (* b x) c). > > ...? > > The example was finding (if a a b). Didn't you say > regexps couldn't identify all such cases because of > lack of expressiveness with respect to the more > expressive Lisp? No. I said that if you went beyond those simple case, your regexp solution would break lamentably. -- __Pascal Bourguignon__ http://www.informatimago.com/ “The factory of the future will have only two employees, a man and a dog. The man will be there to feed the dog. The dog will be there to keep the man from touching the equipment.” -- Carl Bass CEO Autodesk ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: use Elisp to improve your Elisp - some code issues 2015-08-02 0:44 ` Pascal J. Bourguignon @ 2015-08-02 1:29 ` Emanuel Berg 2015-08-02 15:36 ` Robert Thorpe [not found] ` <mailman.7758.1438529790.904.help-gnu-emacs@gnu.org> 0 siblings, 2 replies; 30+ messages in thread From: Emanuel Berg @ 2015-08-02 1:29 UTC (permalink / raw) To: help-gnu-emacs "Pascal J. Bourguignon" <pjb@informatimago.com> writes: > No. > > I said that if you went beyond those simple case, > your regexp solution would break lamentably. This is an interface to regexps so it sure doesn't go anywhere beyond what can be expressed by regexps. -- underground experts united http://user.it.uu.se/~embe8573 ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: use Elisp to improve your Elisp - some code issues 2015-08-02 1:29 ` Emanuel Berg @ 2015-08-02 15:36 ` Robert Thorpe 2015-08-02 16:44 ` Pascal J. Bourguignon 2015-08-05 23:40 ` Emanuel Berg [not found] ` <mailman.7758.1438529790.904.help-gnu-emacs@gnu.org> 1 sibling, 2 replies; 30+ messages in thread From: Robert Thorpe @ 2015-08-02 15:36 UTC (permalink / raw) To: Emanuel Berg; +Cc: help-gnu-emacs Emanuel Berg <embe8573@student.uu.se> writes: > "Pascal J. Bourguignon" <pjb@informatimago.com> > writes: > >> No. >> >> I said that if you went beyond those simple case, >> your regexp solution would break lamentably. > > This is an interface to regexps so it sure doesn't go > anywhere beyond what can be expressed by regexps. I agree with Pascal & Marcin. Why not use the "read" function to read in the code of the file. Then you have everything as a tree. You can use car and cdr to walk the tree and find the relevant function calls. Then you're in the right place in the Chomsky heirachy. > (if a a b) Suppose "a" and "b" are expressions rather than variables. Suppose that the two instances of "a" have different whitespace and comments between them. In that case they can't be differentiated by regex. Regex can't count parenthesis either. Another possibility is editing the byte-compiler source to provide more warnings. BR, Robert Thorpe ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: use Elisp to improve your Elisp - some code issues 2015-08-02 15:36 ` Robert Thorpe @ 2015-08-02 16:44 ` Pascal J. Bourguignon 2015-08-05 23:40 ` Emanuel Berg 1 sibling, 0 replies; 30+ messages in thread From: Pascal J. Bourguignon @ 2015-08-02 16:44 UTC (permalink / raw) To: help-gnu-emacs Robert Thorpe <rt@robertthorpeconsulting.com> writes: > Emanuel Berg <embe8573@student.uu.se> writes: > >> "Pascal J. Bourguignon" <pjb@informatimago.com> >> writes: >> >>> No. >>> >>> I said that if you went beyond those simple case, >>> your regexp solution would break lamentably. >> >> This is an interface to regexps so it sure doesn't go >> anywhere beyond what can be expressed by regexps. > > I agree with Pascal & Marcin. > > Why not use the "read" function to read in the code of the file. Then > you have everything as a tree. You can use car and cdr to walk the tree > and find the relevant function calls. Then you're in the right place in > the Chomsky heirachy. Careful, there's a reason why not to use read and instead to use forward-sexp and other emacs editing function. read will drop comments, newlines, indentation, etc. Since most of the case, you will transform only some form or subform, you may want to keep the rest of the source file intact. Therefore using primarily forward-sexp/down-list/up-list to navigate the source is better. You may then use read-from-string+buffer-substring to transform a sexp identified with forward-sexp, to process it, and insert+pp to format it back into the buffer. On the other hand, you may consider that comments have nothing to do in source databases, and that pp is authoritative, and therefore use read and pp to build an editor that will maintain the source database automatically for yourself. Then you always work at the sexp level. It's probably to be able to work at the sexp level that docstrings were invented, since even in LISP 1.5, comments existed (in the form of comment cards). -- __Pascal Bourguignon__ http://www.informatimago.com/ “The factory of the future will have only two employees, a man and a dog. The man will be there to feed the dog. The dog will be there to keep the man from touching the equipment.” -- Carl Bass CEO Autodesk ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: use Elisp to improve your Elisp - some code issues 2015-08-02 15:36 ` Robert Thorpe 2015-08-02 16:44 ` Pascal J. Bourguignon @ 2015-08-05 23:40 ` Emanuel Berg 2015-08-06 0:59 ` John Mastro 1 sibling, 1 reply; 30+ messages in thread From: Emanuel Berg @ 2015-08-05 23:40 UTC (permalink / raw) To: help-gnu-emacs Robert Thorpe <rt@robertthorpeconsulting.com> writes: > I agree with Pascal & Marcin. > > Why not use the "read" function to read in the code > of the file. Then you have everything as a tree. > You can use car and cdr to walk the tree and find > the relevant function calls. Then you're in the > right place in the Chomsky heirachy. > > Suppose "a" and "b" are expressions rather than > variables. Suppose that the two instances of "a" > have different whitespace and comments between them. > In that case they can't be differentiated by regex. > Regex can't count parenthesis either. > > Another possibility is editing the byte-compiler > source to provide more warnings. If you read the code, you find the two most important functions are `regexp-hits-find-hit' and `search-regexp-in-files'. regexp means regexps! That there are examples - which work - applied on Lisp files don't change that. Now, it doesn't say *one word* about re-parsing or otherwise analyzing the code with respect imbecile, ten million times accursed computer science theory. If you want to do that - just do it! See if I will come and have 42 degrees of expedition fever and purposely misunderstand and be all negativistic. Of course, I will not - and why do you think that is? -- underground experts united http://user.it.uu.se/~embe8573 ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: use Elisp to improve your Elisp - some code issues 2015-08-05 23:40 ` Emanuel Berg @ 2015-08-06 0:59 ` John Mastro 0 siblings, 0 replies; 30+ messages in thread From: John Mastro @ 2015-08-06 0:59 UTC (permalink / raw) To: help-gnu-emacs@gnu.org > If you read the code, you find the two most important > functions are `regexp-hits-find-hit' and > `search-regexp-in-files'. regexp means regexps! > That there are examples - which work - applied on Lisp > files don't change that. > > Now, it doesn't say *one word* about re-parsing or > otherwise analyzing the code with respect imbecile, > ten million times accursed computer science theory. > > If you want to do that - just do it! See if I will > come and have 42 degrees of expedition fever and > purposely misunderstand and be all negativistic. > Of course, I will not - and why do you think that is? Where you see negativity I think you could also see people who found your idea interesting and are discussing ways it could be taken further. There's no slight in that - on the contrary, I'd say it's a compliment! -- john ^ permalink raw reply [flat|nested] 30+ messages in thread
[parent not found: <mailman.7758.1438529790.904.help-gnu-emacs@gnu.org>]
* Re: use Elisp to improve your Elisp - some code issues [not found] ` <mailman.7758.1438529790.904.help-gnu-emacs@gnu.org> @ 2015-08-02 16:25 ` Rusi 0 siblings, 0 replies; 30+ messages in thread From: Rusi @ 2015-08-02 16:25 UTC (permalink / raw) To: help-gnu-emacs On Sunday, August 2, 2015 at 9:06:33 PM UTC+5:30, Robert Thorpe wrote: > Emanuel Berg writes: > > > "Pascal J. Bourguignon" > > writes: > > > >> No. > >> > >> I said that if you went beyond those simple case, > >> your regexp solution would break lamentably. > > > > This is an interface to regexps so it sure doesn't go > > anywhere beyond what can be expressed by regexps. > > I agree with Pascal & Marcin. > > Why not use the "read" function to read in the code of the file. Then > you have everything as a tree. You can use car and cdr to walk the tree If something like this https://common-lisp.net/project/cl-match/doc/clmatch.htm is there it sure makes life more pleasant than car/cdr. [Disclaimer: I dont know much about common-lisp nor about whether these things are there in elisp. Talking from (ancient) scheme experience ] ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: use Elisp to improve your Elisp - some code issues 2015-08-01 8:54 ` Pascal J. Bourguignon 2015-08-01 12:41 ` Emanuel Berg [not found] ` <mailman.7727.1438432975.904.help-gnu-emacs@gnu.org> @ 2015-08-01 16:13 ` Michael Heerdegen 2 siblings, 0 replies; 30+ messages in thread From: Michael Heerdegen @ 2015-08-01 16:13 UTC (permalink / raw) To: help-gnu-emacs "Pascal J. Bourguignon" <pjb@informatimago.com> writes: > You may use read, or forward-sexp / backward-sexp and down-lisp / > up-list, to walk the sexps of the buffer in such a way that now you can > check for source patterns instead of text patterns. I had the same idea some time ago. Of course such an approach is then limited to Elisp. Anyway, by coincidence I've been implementing exactly that the last days, using `pcase' patterns (see emacs-dev thread "Search Elisp buffers with pcase patterns" - comments very welcome!). Michael. ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: use Elisp to improve your Elisp - some code issues [not found] <mailman.7671.1438302261.904.help-gnu-emacs@gnu.org> 2015-07-31 2:39 ` use Elisp to improve your Elisp - some code issues Pascal J. Bourguignon @ 2015-07-31 20:24 ` Sam Halliday 2015-08-01 4:20 ` Emanuel Berg [not found] ` <mailman.7713.1438402953.904.help-gnu-emacs@gnu.org> 1 sibling, 2 replies; 30+ messages in thread From: Sam Halliday @ 2015-07-31 20:24 UTC (permalink / raw) To: help-gnu-emacs On Friday, 31 July 2015 01:24:24 UTC+1, Emanuel Berg wrote: > I just wrote some Elisp which can be used on a set of > files to identify for example the construct > > (if a a b) > > if you want to replace those for > > (or a b) > > See the comments for the issues! This is really great! We have plans to do something similar in ENSIME (for Scala, and soon Java, development). The Scala/Java support is of no relevance to this group, so I shall just say that we have an external process that we communicate with and it can provide async suggestions of code that can be changed. It sounds like what you're doing here and we aim to achieve (albeit it a long burn) would benefit from a common interface of "code suggestion" --- both a format for the changes (universal diff?) and the method to show and accept the changes. FYI we're tracking this on our github issue tracker https://github.com/ensime/ensime-server/issues/848 so please keep us updated if you come up with anything reusable. This issue is for the server side support, but the data that is returned is going to have to be driven by the text editor requirements. Best regards, Sam ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: use Elisp to improve your Elisp - some code issues 2015-07-31 20:24 ` Sam Halliday @ 2015-08-01 4:20 ` Emanuel Berg 2015-08-01 6:26 ` Marcin Borkowski [not found] ` <mailman.7714.1438410426.904.help-gnu-emacs@gnu.org> [not found] ` <mailman.7713.1438402953.904.help-gnu-emacs@gnu.org> 1 sibling, 2 replies; 30+ messages in thread From: Emanuel Berg @ 2015-08-01 4:20 UTC (permalink / raw) To: help-gnu-emacs Sam Halliday <sam.halliday@gmail.com> writes: > This is really great! We have plans to do something > similar in ENSIME (for Scala, and soon Java, > development). Well, thank you :) The idea is great, however it is not a new one since it is basically find + egrep, with find here being a zsh pattern matching ls (I'm unsure bash has "**/*", so that example may not work work tho many others will), and egrep being `re-search-forward'. But yeah, it is a nice little thing :) > The Scala/Java support is of no relevance to this > group, so I shall just say that we have an external > process that we communicate with and it can provide > async suggestions of code that can be changed. > > It sounds like what you're doing here and we aim to > achieve (albeit it a long burn) would benefit from > a common interface of "code suggestion" --- both > a format for the changes (universal diff?) and the > method to show and accept the changes. More or less. The tool (code) just searches for regexps in the files whose names match another regexp. So it is just a tool to find things in files. However if you express style things you don't like as regexps, it can be used as to improve the code (if you change them as well). See the examples last in the file - if I come up with more, I'll add them to the same file. One example would be what we have mentioned a couple of times by now and that is (if a b) (if (not a) b) which should be (when a b) (unless a b) Anyone has an regexp for that? -- underground experts united http://user.it.uu.se/~embe8573 ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: use Elisp to improve your Elisp - some code issues 2015-08-01 4:20 ` Emanuel Berg @ 2015-08-01 6:26 ` Marcin Borkowski [not found] ` <mailman.7714.1438410426.904.help-gnu-emacs@gnu.org> 1 sibling, 0 replies; 30+ messages in thread From: Marcin Borkowski @ 2015-08-01 6:26 UTC (permalink / raw) To: help-gnu-emacs On 2015-08-01, at 06:20, Emanuel Berg <embe8573@student.uu.se> wrote: > One example would be what we have mentioned a couple > of times by now and that is > > (if a b) > (if (not a) b) > > which should be > > (when a b) > (unless a b) > > Anyone has an regexp for that? Well, since s-expressions and XML are (more or less) isomorphic, and parsing XML and HTML is (more or less) the same thing, I guess the Most Famous StackOverflow Answer applies. ;-P http://stackoverflow.com/a/1732454/1181665 Best, -- Marcin Borkowski http://octd.wmi.amu.edu.pl/en/Marcin_Borkowski Faculty of Mathematics and Computer Science Adam Mickiewicz University ^ permalink raw reply [flat|nested] 30+ messages in thread
[parent not found: <mailman.7714.1438410426.904.help-gnu-emacs@gnu.org>]
* Re: use Elisp to improve your Elisp - some code issues [not found] ` <mailman.7714.1438410426.904.help-gnu-emacs@gnu.org> @ 2015-08-01 8:57 ` Pascal J. Bourguignon 2015-08-01 12:48 ` Emanuel Berg 0 siblings, 1 reply; 30+ messages in thread From: Pascal J. Bourguignon @ 2015-08-01 8:57 UTC (permalink / raw) To: help-gnu-emacs Marcin Borkowski <mbork@mbork.pl> writes: > On 2015-08-01, at 06:20, Emanuel Berg <embe8573@student.uu.se> wrote: > >> One example would be what we have mentioned a couple >> of times by now and that is >> >> (if a b) >> (if (not a) b) >> >> which should be >> >> (when a b) >> (unless a b) >> >> Anyone has an regexp for that? > > Well, since s-expressions and XML are (more or less) isomorphic, and > parsing XML and HTML is (more or less) the same thing, I guess the Most > Famous StackOverflow Answer applies. ;-P > > http://stackoverflow.com/a/1732454/1181665 Indeed. This is Compiler 101. If you didn't have that lecture at your university, you should request a refund, because you've been swindled. -- __Pascal Bourguignon__ http://www.informatimago.com/ “The factory of the future will have only two employees, a man and a dog. The man will be there to feed the dog. The dog will be there to keep the man from touching the equipment.” -- Carl Bass CEO Autodesk ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: use Elisp to improve your Elisp - some code issues 2015-08-01 8:57 ` Pascal J. Bourguignon @ 2015-08-01 12:48 ` Emanuel Berg 2015-08-01 13:05 ` Marcin Borkowski 0 siblings, 1 reply; 30+ messages in thread From: Emanuel Berg @ 2015-08-01 12:48 UTC (permalink / raw) To: help-gnu-emacs "Pascal J. Bourguignon" <pjb@informatimago.com> writes: > Indeed. This is Compiler 101. If you didn't have > that lecture at your university, you should request > a refund, because you've been swindled. This is the difference between blue-collar engineering and white-collar science: All the while the white-collar people are letting themself be incapacitated by absolutist ideas and ideals which teaches them what they can't do, the blue-collar people are pushing the envelope every day doing new things which little by little improve their game. -- underground experts united http://user.it.uu.se/~embe8573 ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: use Elisp to improve your Elisp - some code issues 2015-08-01 12:48 ` Emanuel Berg @ 2015-08-01 13:05 ` Marcin Borkowski 2015-08-01 13:14 ` Emanuel Berg 2015-08-01 13:21 ` Emanuel Berg 0 siblings, 2 replies; 30+ messages in thread From: Marcin Borkowski @ 2015-08-01 13:05 UTC (permalink / raw) To: help-gnu-emacs On 2015-08-01, at 14:48, Emanuel Berg <embe8573@student.uu.se> wrote: > incapacitated by absolutist ideas and ideals which > teaches them what they can't do, [...] Like, "keyboard macros are wrong, Lisp is good"? ;-) -- Marcin Borkowski http://octd.wmi.amu.edu.pl/en/Marcin_Borkowski Faculty of Mathematics and Computer Science Adam Mickiewicz University ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: use Elisp to improve your Elisp - some code issues 2015-08-01 13:05 ` Marcin Borkowski @ 2015-08-01 13:14 ` Emanuel Berg 2015-08-01 13:21 ` Emanuel Berg 1 sibling, 0 replies; 30+ messages in thread From: Emanuel Berg @ 2015-08-01 13:14 UTC (permalink / raw) To: help-gnu-emacs Now the code is even better. Now you can go to a hit with one keystroke - RET - and iterate with the favorites "i" and "k". ;; This file: http://user.it.uu.se/~embe8573/conf/emacs-init/search-regexp-in-files.el (require 'cl) (defalias 'cl-set-xor 'cl-set-exclusive-or) (defun files-as-list (file-regexp) (split-string (with-temp-buffer (call-process-shell-command (format "ls %s" file-regexp) nil t) ; no INFILE, temp BUFFER (buffer-substring (point-min) (point-max)) ))) (defun find-file-goto-line (file line) (interactive) (find-file file) (goto-char (point-min)) (forward-line (1- line)) ) (defun regexp-hits-find-hit () (interactive) (beginning-of-line) (let ((file (thing-at-point 'filename nil))) ; NO-PROPERTIES (end-of-line) (search-backward "(") (forward-char 1) (let ((line (thing-at-point 'number nil))) (find-file-goto-line file line) ))) (defun set-regexp-hits-keys () (local-set-key "\r" 'regexp-hits-find-hit) (local-set-key "i" 'previous-line) (local-set-key "k" 'forward-line) ) (defun search-regexp-in-files (file-regexp regexp) (let ((paths (files-as-list file-regexp)) (regexp-hits "*regexp-hits*") (hits nil) ) (get-buffer-create regexp-hits) (let ((buffers (buffer-list))) ; get list to see if we opened the file - (with-current-buffer regexp-hits (erase-buffer) (set-regexp-hits-keys) ) (dolist (p paths) (let ((buffer (find-file p)) ; here - (kill-later (cl-set-xor buffers (buffer-list))) ) ; by comparing! (with-current-buffer buffer (goto-char (point-min)) (while (re-search-forward regexp nil t) ; no BOUND, NOERROR (setq hits t) (let ((hit-line (line-number-at-pos))) (with-current-buffer regexp-hits (insert (format "%s (%s)\n" p hit-line))))) (when kill-later (kill-buffer buffer) )))) (if hits (progn (switch-to-buffer regexp-hits) (set-buffer-modified-p nil) (goto-char (point-min)) ) (message "No hits!") )))) ;; use this to test (when nil ;; find "kill" - should be some hits even for pacifists (search-regexp-in-files "~/.emacs.d/emacs-init/*.el" "kill") ;; find the construct (if a a b) if you want to replace it with (or a b) ;; if it works, when applied to this file, it should find the example above! (search-regexp-in-files (buffer-file-name) "([[:space:]\n]*if[[:space:]\n]+\\(.*\\)[[:space:]\n]+\\1[[:space:]\n]+\\(.*\\))" ) ) (provide 'search-regexp-in-files) -- underground experts united http://user.it.uu.se/~embe8573 ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: use Elisp to improve your Elisp - some code issues 2015-08-01 13:05 ` Marcin Borkowski 2015-08-01 13:14 ` Emanuel Berg @ 2015-08-01 13:21 ` Emanuel Berg 1 sibling, 0 replies; 30+ messages in thread From: Emanuel Berg @ 2015-08-01 13:21 UTC (permalink / raw) To: help-gnu-emacs Marcin Borkowski <mbork@mbork.pl> writes: >> incapacitated by absolutist ideas and ideals which >> teaches them what they can't do, [...] > > Like, "keyboard macros are wrong, Lisp is good"? How did those two entities ever end up in the same, short sentence? -- underground experts united http://user.it.uu.se/~embe8573 ^ permalink raw reply [flat|nested] 30+ messages in thread
[parent not found: <mailman.7713.1438402953.904.help-gnu-emacs@gnu.org>]
* Re: use Elisp to improve your Elisp - some code issues [not found] ` <mailman.7713.1438402953.904.help-gnu-emacs@gnu.org> @ 2015-08-02 10:42 ` Sam Halliday 2015-08-05 23:21 ` Emanuel Berg 0 siblings, 1 reply; 30+ messages in thread From: Sam Halliday @ 2015-08-02 10:42 UTC (permalink / raw) To: help-gnu-emacs On Saturday, 1 August 2015 05:22:35 UTC+1, Emanuel Berg wrote: > The tool (code) just searches for regexps in the files whose names match another regexp. OK, I don't think that would extend itself to use elsewhere unfortunately. I'd imagined that you had a "detector phase" and then a "suggestion phase" whereas it sounds like it's all in one go with a regex replace. If there was a way to factor out the suggestion phase into a standalone component (which provided a diff and some metadata) then we could definitely make use of that in ENSIME in many places. e.g. Something non-intrusive like just add a symbol to the gutter and require some further user action before showing the diff (which might be multi-file) and allowing the user to accept or reject. ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: use Elisp to improve your Elisp - some code issues 2015-08-02 10:42 ` Sam Halliday @ 2015-08-05 23:21 ` Emanuel Berg 0 siblings, 0 replies; 30+ messages in thread From: Emanuel Berg @ 2015-08-05 23:21 UTC (permalink / raw) To: help-gnu-emacs Sam Halliday <sam.halliday@gmail.com> writes: > OK, I don't think that would extend itself to use > elsewhere unfortunately. The program is an interface to regexps, using one such on the filesystem to delimit the search area files, then applying another on those files' contents - and last, reporting the result. It is find + grep in another form, as said. The use cases for such a tool are virtually countless and there are many such implementations and interfaces around. -- underground experts united http://user.it.uu.se/~embe8573 ^ permalink raw reply [flat|nested] 30+ messages in thread
* use Elisp to improve your Elisp - some code issues @ 2015-07-31 0:22 Emanuel Berg 2015-07-31 2:30 ` Marcin Borkowski 2015-08-03 7:56 ` Tassilo Horn 0 siblings, 2 replies; 30+ messages in thread From: Emanuel Berg @ 2015-07-31 0:22 UTC (permalink / raw) To: help-gnu-emacs I just wrote some Elisp which can be used on a set of files to identify for example the construct (if a a b) if you want to replace those for (or a b) See the comments for the issues! Issue one is how to best create a temporary buffer to display the results. Issue two is to not kill buffers that were already open at invocation - I can solve that by checking if there is such a buffer, but I suspect there is a better way to do these kind of things all in the background, rather than the `find-file' and then conditionally `kill-buffer' combo. Third (minor) issue is the annoying message that `downcase' does. Isn't there a (shut-up (do-stuff))? Other comments also appreciated, as always. ;; This file: http://user.it.uu.se/~embe8573/conf/emacs-init/search-regexp-in-files.el (defun files-as-list (file-regexp) (split-string (with-temp-buffer (call-process-shell-command (format "ls %s" file-regexp) nil t) ; no INFILE, temp BUFFER (buffer-substring (point-min) (point-max)) ))) (defun search-regexp-in-files (file-regexp regexp) (let ((paths (files-as-list file-regexp)) (regexp-hits "regexp-hits") ; unlikely, but if there is another such buffer (hits nil)) (with-current-buffer regexp-hits (erase-buffer)) ; then we can't have this (dolist (p paths) (let ((buffer (find-file p))) (with-current-buffer buffer (goto-char (point-min)) (while (re-search-forward regexp nil t) ; no BOUND, NOERROR (setq hits t) (let ((hit-line (downcase (what-line)))) (with-current-buffer regexp-hits (insert (format "file: %s (%s)\n" p hit-line))))) (kill-buffer buffer) ))) ; what if the buffer was open already? ; we only want to kill buffers that we opened (if hits (switch-to-buffer regexp-hits) (message "No hits!") ))) ;; use this to test (when nil ;; find "kill" - should be some hits even for pacifists (search-regexp-in-files "~/.emacs.d/emacs-init/*.el" "kill") ;; find the construct (if a a b) if you want to replace it with (or a b) ;; if it works, when applied to this file, it should find the example above! (search-regexp-in-files (buffer-file-name) "([[:space:]\n]*if[[:space:]\n]+\\(.*\\)[[:space:]\n]+\\1[[:space:]\n]+\\(.*\\))" ) ) (provide 'search-regexp-in-files) -- underground experts united http://user.it.uu.se/~embe8573 ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: use Elisp to improve your Elisp - some code issues 2015-07-31 0:22 Emanuel Berg @ 2015-07-31 2:30 ` Marcin Borkowski 2015-07-31 7:42 ` Stefan Monnier 2015-07-31 12:11 ` Navy Cheng 2015-08-03 7:56 ` Tassilo Horn 1 sibling, 2 replies; 30+ messages in thread From: Marcin Borkowski @ 2015-07-31 2:30 UTC (permalink / raw) To: help-gnu-emacs On 2015-07-31, at 02:22, Emanuel Berg <embe8573@student.uu.se> wrote: > I just wrote some Elisp which can be used on a set of > files to identify for example the construct > > (if a a b) > > if you want to replace those for > > (or a b) I like the idea! Even though basically the % m Q combo in Dired already does this (well, more or less). Or multi-occur. Or multi-occur-in-matching-buffers. (These two operate on buffers, not files, OTOH.) (Projectile has similar things, too, I guess, though I don't se it. And Icicles takes that idea to the next level.) > See the comments for the issues! Well, I also glanced at the code itself;-). > Issue one is how to best create a temporary buffer to > display the results. `pop-to-buffer'? Also, why not name the buffer with earmuffs? > Issue two is to not kill buffers that were already > open at invocation - I can solve that by checking if > there is such a buffer, but I suspect there is > a better way to do these kind of things all in the > background, rather than the `find-file' and then > conditionally `kill-buffer' combo. I wouldn't use find-file in Lisp programs. Related: http://emacs.stackexchange.com/questions/2868/whats-wrong-with-find-file-noselect (the solution given there would also solve your problem, I guess - the downside being that if the file is already visited, you get "data duplication"). I'd write a macro (with-file-visited file &rest body) which checks whether `file' is visited by some buffer or not. If yes, it would just use `with-current-buffer', and if not, it would use the `with-temp-buffer' / `insert-file-contents' combo. This way, you would both be efficient and have a decent level of abstraction at the same time. > Third (minor) issue is the annoying message that > `downcase' does. Isn't there a (shut-up (do-stuff))? What about `line-number-at-pos' instead of `what-line'? Also, (require 'cl) (cl-flet ((message (&rest args))) ...). > Other comments also appreciated, as always. Why use regexen for that? It is not, ekhm, the best solution. ;-P Shouldn't you use some kind of pattern-matching/destructuring thingy? In fact, I wanted to write a similar thing, and that was exactly when I decided that I absolutely *have* to understand precisely how the backtick works. (Now I think I do, but not before I implemented a subset of Elisp in Elisp...) (I haven't written that thing yet, but it's somewhere on the agenda.) Best, -- Marcin Borkowski http://octd.wmi.amu.edu.pl/en/Marcin_Borkowski Faculty of Mathematics and Computer Science Adam Mickiewicz University ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: use Elisp to improve your Elisp - some code issues 2015-07-31 2:30 ` Marcin Borkowski @ 2015-07-31 7:42 ` Stefan Monnier 2015-07-31 12:11 ` Navy Cheng 1 sibling, 0 replies; 30+ messages in thread From: Stefan Monnier @ 2015-07-31 7:42 UTC (permalink / raw) To: help-gnu-emacs > (require 'cl) > (cl-flet ((message (&rest args))) ...). `cl' does not provide cl-flet. `cl-lib' does. Stefan ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: use Elisp to improve your Elisp - some code issues 2015-07-31 2:30 ` Marcin Borkowski 2015-07-31 7:42 ` Stefan Monnier @ 2015-07-31 12:11 ` Navy Cheng 1 sibling, 0 replies; 30+ messages in thread From: Navy Cheng @ 2015-07-31 12:11 UTC (permalink / raw) To: Emanuel Berg; +Cc: help-gnu-emacs This is my code after your discuss. (defun search-regexp-in-files (wildcards regexp) "Search for regular expression REGEXP in files whose name matches WILDCARDS. The results will be print to buffer *PrivateResults*." (let ((result (or (get-buffer "*PrivateResults*") ; There will be only one result buffer (generate-new-buffer "*PrivateResults*"))) (file-list (file-expand-wildcards wildcards)) ; All matched files (buffer-to-kill nil)) ; Record the buffer to be killed (if (eq file-list nil) (with-current-buffer result (insert "Wrong file name!")) (dolist (file-path file-list) (setq file (file-name-nondirectory file-path)) ; Get the buffer name (let ((buffer (or (progn ; File buffer is exist (setq buffer-to-kill nil) (get-buffer file)) (progn ; Create buffer for a file (setq buffer-to-kill file) (find-file-noselect file))))) (with-current-buffer buffer (goto-char (point-min)) (while (re-search-forward regexp nil t) ; no BOUND, NOERROR (let ((hit-line (downcase (what-line)))) (with-current-buffer result (insert (format "file: %s (%s)\n" buffer hit-line)))))) (with-current-buffer result (if (eq (buffer-size result) 0) (insert "No hits!")))) (if buffer-to-kill (kill-buffer buffer-to-kill)))) ; Kill the buffer-to-kill (switch-to-buffer result))) On Fri, Jul 31, 2015 at 04:30:20AM +0200, Marcin Borkowski wrote: > > On 2015-07-31, at 02:22, Emanuel Berg <embe8573@student.uu.se> wrote: > > > I just wrote some Elisp which can be used on a set of > > files to identify for example the construct > > > > (if a a b) > > > > if you want to replace those for > > ^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: use Elisp to improve your Elisp - some code issues 2015-07-31 0:22 Emanuel Berg 2015-07-31 2:30 ` Marcin Borkowski @ 2015-08-03 7:56 ` Tassilo Horn 1 sibling, 0 replies; 30+ messages in thread From: Tassilo Horn @ 2015-08-03 7:56 UTC (permalink / raw) To: help-gnu-emacs Hi, just on Saturday, Michael Heerdegen announced his el-search.el on emacs-devel: https://lists.gnu.org/archive/html/emacs-devel/2015-08/msg00022.html That doesn't work with regexes on strings but instead the Lisp code is properly read, and then you can use pattern matching in terms of `pcase' patterns for searching and replacing. Bye, Tassilo ^ permalink raw reply [flat|nested] 30+ messages in thread
end of thread, other threads:[~2015-08-06 0:59 UTC | newest] Thread overview: 30+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <mailman.7671.1438302261.904.help-gnu-emacs@gnu.org> 2015-07-31 2:39 ` use Elisp to improve your Elisp - some code issues Pascal J. Bourguignon 2015-08-01 4:09 ` Emanuel Berg [not found] ` <mailman.7712.1438402251.904.help-gnu-emacs@gnu.org> 2015-08-01 8:54 ` Pascal J. Bourguignon 2015-08-01 12:41 ` Emanuel Berg [not found] ` <mailman.7727.1438432975.904.help-gnu-emacs@gnu.org> 2015-08-01 15:59 ` Pascal J. Bourguignon 2015-08-02 0:06 ` Emanuel Berg 2015-08-03 1:23 ` Ian Zimmerman [not found] ` <mailman.7751.1438474104.904.help-gnu-emacs@gnu.org> 2015-08-02 0:44 ` Pascal J. Bourguignon 2015-08-02 1:29 ` Emanuel Berg 2015-08-02 15:36 ` Robert Thorpe 2015-08-02 16:44 ` Pascal J. Bourguignon 2015-08-05 23:40 ` Emanuel Berg 2015-08-06 0:59 ` John Mastro [not found] ` <mailman.7758.1438529790.904.help-gnu-emacs@gnu.org> 2015-08-02 16:25 ` Rusi 2015-08-01 16:13 ` Michael Heerdegen 2015-07-31 20:24 ` Sam Halliday 2015-08-01 4:20 ` Emanuel Berg 2015-08-01 6:26 ` Marcin Borkowski [not found] ` <mailman.7714.1438410426.904.help-gnu-emacs@gnu.org> 2015-08-01 8:57 ` Pascal J. Bourguignon 2015-08-01 12:48 ` Emanuel Berg 2015-08-01 13:05 ` Marcin Borkowski 2015-08-01 13:14 ` Emanuel Berg 2015-08-01 13:21 ` Emanuel Berg [not found] ` <mailman.7713.1438402953.904.help-gnu-emacs@gnu.org> 2015-08-02 10:42 ` Sam Halliday 2015-08-05 23:21 ` Emanuel Berg 2015-07-31 0:22 Emanuel Berg 2015-07-31 2:30 ` Marcin Borkowski 2015-07-31 7:42 ` Stefan Monnier 2015-07-31 12:11 ` Navy Cheng 2015-08-03 7:56 ` Tassilo Horn
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).