* find-tag-default @ 2004-05-13 6:37 Juri Linkov 2004-05-16 13:21 ` find-tag-default Richard Stallman 0 siblings, 1 reply; 14+ messages in thread From: Juri Linkov @ 2004-05-13 6:37 UTC (permalink / raw) I noticed that grep.el has a copy of find-tag-default function from etags.el, for the reason not to load etags.el at run-time. The function find-tag-default is a quite general function, which is used by other Emacs Lisp files, so it could be moved from etags.el to simple.el (without renaming), thus allowing other files to use it without loading etags.el. find-tag-default could be used also as an additional attempt to find a function or variable name around point in functions describe-function, describe-variable. This is useful when a function or variable name is located in a buffer not in Emacs Lisp mode, such as message or article mode, where it is not quoted and has trailing punctuation. (For example, try to type C-h f on function names in this paragraph.) Index: emacs/lisp/help.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/help.el,v retrieving revision 1.264 diff -u -w -b -r1.264 help.el --- emacs/lisp/help.el 27 Apr 2004 06:35:25 -0000 1.264 +++ emacs/lisp/help.el 13 May 2004 06:11:20 -0000 @@ -237,7 +237,7 @@ (defun function-called-at-point () "Return a function around point or else called by the list containing point. If that doesn't give a function, return nil." - (with-syntax-table emacs-lisp-mode-syntax-table + (or (with-syntax-table emacs-lisp-mode-syntax-table (or (condition-case () (save-excursion (or (not (zerop (skip-syntax-backward "_w"))) @@ -262,7 +262,10 @@ (error "Probably not a Lisp function call")) (let ((obj (read (current-buffer)))) (and (symbolp obj) (fboundp obj) obj)))) - (error nil))))) + (error nil)))) + (let* ((str (find-tag-default)) + (obj (if str (intern str)))) + (and (symbolp obj) (fboundp obj) obj)))) \f ;;; `User' help functions Index: emacs/lisp/help-fns.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/help-fns.el,v retrieving revision 1.48 diff -u -w -b -r1.48 help-fns.el --- emacs/lisp/help-fns.el 11 May 2004 23:50:25 -0000 1.48 +++ emacs/lisp/help-fns.el 13 May 2004 06:11:21 -0000 @@ -456,7 +456,7 @@ (defun variable-at-point () "Return the bound variable symbol found around point. Return 0 if there is no such symbol." - (condition-case () + (or (condition-case () (with-syntax-table emacs-lisp-mode-syntax-table (save-excursion (or (not (zerop (skip-syntax-backward "_w"))) @@ -465,9 +465,12 @@ (forward-sexp -1)) (skip-chars-forward "'") (let ((obj (read (current-buffer)))) - (or (and (symbolp obj) (boundp obj) obj) - 0)))) - (error 0))) + (and (symbolp obj) (boundp obj) obj)))) + (error nil)) + (let* ((str (find-tag-default)) + (obj (if str (intern str)))) + (and (symbolp obj) (boundp obj) obj)) + 0)) ;;;###autoload (defun describe-variable (variable &optional buffer) -- Juri Linkov http://www.jurta.org/emacs/ ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: find-tag-default 2004-05-13 6:37 find-tag-default Juri Linkov @ 2004-05-16 13:21 ` Richard Stallman 2004-05-19 8:45 ` find-tag-default Juri Linkov 0 siblings, 1 reply; 14+ messages in thread From: Richard Stallman @ 2004-05-16 13:21 UTC (permalink / raw) Cc: emacs-devel It might make sense to move find-tag-default, but if we think it is no longer specifically about tags, we should change its name. Suggestions for the new name? ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: find-tag-default 2004-05-16 13:21 ` find-tag-default Richard Stallman @ 2004-05-19 8:45 ` Juri Linkov 2004-05-19 18:35 ` find-tag-default Kevin Rodgers 2004-05-19 19:01 ` find-tag-default Richard Stallman 0 siblings, 2 replies; 14+ messages in thread From: Juri Linkov @ 2004-05-19 8:45 UTC (permalink / raw) Cc: emacs-devel Richard Stallman <rms@gnu.org> writes: > It might make sense to move find-tag-default, but if we think it > is no longer specifically about tags, we should change its name. > Suggestions for the new name? It seems it can't be renamed because usually it is used in conjunction with the variable `find-tag-default-function' which is already used for purposes not related to the tags functionality. A typical example is: (funcall (or find-tag-default-function (get major-mode 'find-tag-default-function) 'find-tag-default)) -- Juri Linkov http://www.jurta.org/emacs/ ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: find-tag-default 2004-05-19 8:45 ` find-tag-default Juri Linkov @ 2004-05-19 18:35 ` Kevin Rodgers 2004-05-19 19:01 ` find-tag-default Richard Stallman 1 sibling, 0 replies; 14+ messages in thread From: Kevin Rodgers @ 2004-05-19 18:35 UTC (permalink / raw) Juri Linkov wrote: > Richard Stallman <rms@gnu.org> writes: >>It might make sense to move find-tag-default, but if we think it >>is no longer specifically about tags, we should change its name. >>Suggestions for the new name? > > It seems it can't be renamed because usually it is used in conjunction > with the variable `find-tag-default-function' which is already used > for purposes not related to the tags functionality. > > A typical example is: > > (funcall (or find-tag-default-function > (get major-mode 'find-tag-default-function) > 'find-tag-default)) (defalias 'find-tag-default 'the-new-name) -- Kevin Rodgers ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: find-tag-default 2004-05-19 8:45 ` find-tag-default Juri Linkov 2004-05-19 18:35 ` find-tag-default Kevin Rodgers @ 2004-05-19 19:01 ` Richard Stallman 2004-05-20 8:09 ` find-tag-default Juri Linkov 1 sibling, 1 reply; 14+ messages in thread From: Richard Stallman @ 2004-05-19 19:01 UTC (permalink / raw) Cc: emacs-devel > It might make sense to move find-tag-default, but if we think it > is no longer specifically about tags, we should change its name. > Suggestions for the new name? It seems it can't be renamed because usually it is used in conjunction with the variable `find-tag-default-function' which is already used for purposes not related to the tags functionality. This doesn't mean we cannot rename it. At most we need to keep the old name as an alias. But maybe we can change the name in the places that use it. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: find-tag-default 2004-05-19 19:01 ` find-tag-default Richard Stallman @ 2004-05-20 8:09 ` Juri Linkov 2004-05-20 9:14 ` find-tag-default Juri Linkov 2004-05-21 1:27 ` find-tag-default Richard Stallman 0 siblings, 2 replies; 14+ messages in thread From: Juri Linkov @ 2004-05-20 8:09 UTC (permalink / raw) Cc: emacs-devel I have a better idea: to left the function `find-tag-default' alone in its etags.el, and to add a new function (which is slightly extended version of `find-tag-default') to simple.el: (defun identifier-at-point () "Return a default identifier based on the text at point." (or (and (boundp 'find-tag-default-function) find-tag-default-function (funcall find-tag-default-function)) (and (get major-mode 'find-tag-default-function) (funcall (get major-mode 'find-tag-default-function))) (save-excursion (while (looking-at "\\sw\\|\\s_") (forward-char 1)) (when (or (re-search-backward "\\sw\\|\\s_" (save-excursion (beginning-of-line) (point)) t) (re-search-forward "\\(\\sw\\|\\s_\\)+" (save-excursion (end-of-line) (point)) t)) (goto-char (match-end 0)) (buffer-substring-no-properties (point) (progn (forward-sexp -1) (while (looking-at "\\s'") (forward-char 1)) (point))))))) There are several benefits: 1. no need to load etags.el; 2. a complicated construct (funcall (or find-tag-default-function (get major-mode 'find-tag-default-function) 'find-tag-default)) is replaced by a simple function call `(identifier-at-point)'. -- Juri Linkov http://www.jurta.org/emacs/ ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: find-tag-default 2004-05-20 8:09 ` find-tag-default Juri Linkov @ 2004-05-20 9:14 ` Juri Linkov 2004-05-21 1:27 ` find-tag-default Richard Stallman 1 sibling, 0 replies; 14+ messages in thread From: Juri Linkov @ 2004-05-20 9:14 UTC (permalink / raw) Cc: emacs-devel Juri Linkov <juri@jurta.org> writes: > I have a better idea: to left the function `find-tag-default' > alone in its etags.el, and to add a new function (which is I meant to _leave_ it alone in etags.el and create a new extended function. -- Juri Linkov http://www.jurta.org/emacs/ ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: find-tag-default 2004-05-20 8:09 ` find-tag-default Juri Linkov 2004-05-20 9:14 ` find-tag-default Juri Linkov @ 2004-05-21 1:27 ` Richard Stallman 2004-05-21 8:05 ` find-tag-default Juri Linkov 1 sibling, 1 reply; 14+ messages in thread From: Richard Stallman @ 2004-05-21 1:27 UTC (permalink / raw) Cc: emacs-devel If identifier-at-point is useful in a number of places, let's install that and use it. Is this function exactly the right thing? ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: find-tag-default 2004-05-21 1:27 ` find-tag-default Richard Stallman @ 2004-05-21 8:05 ` Juri Linkov 2004-05-22 21:44 ` find-tag-default Richard Stallman 0 siblings, 1 reply; 14+ messages in thread From: Juri Linkov @ 2004-05-21 8:05 UTC (permalink / raw) Cc: emacs-devel Richard Stallman <rms@gnu.org> writes: > If identifier-at-point is useful in a number of places, > let's install that and use it. > > Is this function exactly the right thing? The function name is right, but its contents is not too right. Currently there are different methods for obtaining an identifier at point: - `find-tag-default' and `find-tag-default-function' from etags.el - `symbol-at-point' from thingatpt.el - info-look.el which has the most advanced implementation since it defines regular expressions and parsing rules for guessing the default identifier for 20 major modes (and one special function `info-lookup-guess-c-symbol' for C mode). So to create right contents of `identifier-at-point' these packages could be generalized. Anyway, we could install this function now as a general method to get an identifier at point, with the identifier guessing method from etags.el, and improve its contents later. -- Juri Linkov http://www.jurta.org/emacs/ ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: find-tag-default 2004-05-21 8:05 ` find-tag-default Juri Linkov @ 2004-05-22 21:44 ` Richard Stallman 2004-05-24 16:49 ` find-tag-default Drew Adams 0 siblings, 1 reply; 14+ messages in thread From: Richard Stallman @ 2004-05-22 21:44 UTC (permalink / raw) Cc: emacs-devel Currently there are different methods for obtaining an identifier at point: - `find-tag-default' and `find-tag-default-function' from etags.el - `symbol-at-point' from thingatpt.el - info-look.el which has the most advanced implementation since it defines regular expressions and parsing rules for guessing the default identifier for 20 major modes (and one special function `info-lookup-guess-c-symbol' for C mode). So to create right contents of `identifier-at-point' these packages could be generalized. Is it clear that using the info-look code would be best for everything that uses the other two functions? If so, let's do that. ^ permalink raw reply [flat|nested] 14+ messages in thread
* RE: find-tag-default 2004-05-22 21:44 ` find-tag-default Richard Stallman @ 2004-05-24 16:49 ` Drew Adams 2004-05-29 1:44 ` find-tag-default Richard Stallman 0 siblings, 1 reply; 14+ messages in thread From: Drew Adams @ 2004-05-24 16:49 UTC (permalink / raw) Cc: emacs-devel Belated, and possibly irrelevant, but FYI - Library thingatpt+.el provides additions and enhancements to thingatpt.el: 1) An optional syntax-table argument is used to determine the bounds. 2) New functions (e.g. symbol-nearest-point) don't require point to be on the name you want. Here's how "nearest" is defined: The nearest symbol on the same line is returned, if there is any. Between two symbols equidistant from point on the same line, the leftmost is considered nearer. Otherwise, neighboring lines are tried in sequence: previous, next, 2nd previous, 2nd next, 3rd previous, 3rd next, etc. This means that between two symbols equidistant from point in lines above and below it, the symbol in the line above point (previous Nth) is considered nearer to it. The code is here: http://www.emacswiki.org/elisp/thingatpt-plus.el. You might consider using a similar "nearest" functionality in Emacs. In my own code, I use it in commands like describe-variable. I prefer to have a default value in the minibuffer for such commands (I use backward-kill-sexp, bound to C-M-backspace, to remove it if it's inappropriate). I find that "nearest" usually DTRT. - Drew -----Original Message----- From: Richard Stallman Currently there are different methods for obtaining an identifier at point: - `find-tag-default' and `find-tag-default-function' from etags.el - `symbol-at-point' from thingatpt.el - info-look.el which has the most advanced implementation since it defines regular expressions and parsing rules for guessing the default identifier for 20 major modes (and one special function `info-lookup-guess-c-symbol' for C mode). So to create right contents of `identifier-at-point' these packages could be generalized. Is it clear that using the info-look code would be best for everything that uses the other two functions? If so, let's do that. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: find-tag-default 2004-05-24 16:49 ` find-tag-default Drew Adams @ 2004-05-29 1:44 ` Richard Stallman 2004-05-29 17:43 ` find-tag-default Drew Adams 0 siblings, 1 reply; 14+ messages in thread From: Richard Stallman @ 2004-05-29 1:44 UTC (permalink / raw) Cc: juri, emacs-devel Library thingatpt+.el provides additions and enhancements to thingatpt.el: 1) An optional syntax-table argument is used to determine the bounds. When have you found that useful? 2) New functions (e.g. symbol-nearest-point) don't require point to be on the name you want. Here's how "nearest" is defined: Some kind of extension in this direction could be useful, I guess. However, I think this looks too far away from point: The nearest symbol on the same line is returned, if there is any. Between two symbols equidistant from point on the same line, the leftmost is considered nearer. Otherwise, neighboring lines are tried in sequence: previous, next, 2nd previous, 2nd next, 3rd previous, 3rd next, etc. This means that between two symbols equidistant from point in lines above and below it, the symbol in the line above point (previous Nth) is considered nearer to it. I think it would be a mistake to use a symbol very far away from point. The user would think, "Where in the world did that come from?" It's better to say "there's no default" than grasp at straws to find one. So I would recommend a new function along these lines but with some limits. ^ permalink raw reply [flat|nested] 14+ messages in thread
* RE: find-tag-default 2004-05-29 1:44 ` find-tag-default Richard Stallman @ 2004-05-29 17:43 ` Drew Adams 2004-05-30 19:41 ` find-tag-default Richard Stallman 0 siblings, 1 reply; 14+ messages in thread From: Drew Adams @ 2004-05-29 17:43 UTC (permalink / raw) Cc: juri, emacs-devel D> Library thingatpt+.el provides additions and enhancements to thingatpt.el: D> D> 1) An optional syntax-table argument is used to determine the bounds. RMS> When have you found that useful? To be honest, I don't remember well. I wrote this a decade ago. I believe it was in order to take into account different modes with different syntax; that is, so that the different "things" would have an appropriate syntax definition. The syntax-table is used to determine the bounds of the thing searched for. You can, for instance, look for the "word" nearest point, where you define "word" in a special way by passing in an explicit syntax-table arg. Likewise, with other kinds of things (defuns, whitespace, pages, ...). The syntax table will affect the exact definition of what constitutes a "word" etc. What makes such an entity usable as a "thing" here is of course that it has corresponding forward-THING (or beginning-of-THING) and end-of-THING operations. The two (syntax table and boundary-defining operations) work hand in hand. Remember that the "thing" functions are completely general: you can define your own forward-whazit and end-whazit commands and one or more syntax-tables that incorporate whazit syntax(es). Your forward-whazit function could behave differently with different syntax tables. This then gives you functions to pick whazits out of a buffer easily in different (syntax) situations. Consider, for instance, forward-symbol, which uses this regexp: "\\(\\sw\\|\\s_\\)+" to determine what a "symbol" is. This in turn depends on what \sw and \s mean. That is, forward-symbol depends on the syntax table: give it a different syntax table and you get different behavior. BTW, I note that I removed the syntax-table arg from the symbol-* functions because the mode of use (for me) was always emacs-lisp-mode; I just passed emacs-lisp-mode-syntax-table in as the syntax-table arg when defining the symbol-* functions. I kept the syntax-table arg for the other functions (form-*, thing-*, word-*, sentence-*, sexp-*, number-*, list-*), however. If used for other (e.g. other programming) modes, it might be good to reinstate the syntax-table arg for the symbol-* functions too. The syntax-table arg is in any case optional. D> 2) New functions (e.g. symbol-nearest-point) don't require point to be on D> the name you want. Here's how "nearest" is defined: RMS> Some kind of extension in this direction could be useful, I guess. RMS> However, I think this looks too far away from point: D> The nearest symbol on the same line is returned, if there is any. D> Between two symbols equidistant from point on the same line, the D> leftmost is considered nearer. D> Otherwise, neighboring lines are tried in sequence: D> previous, next, 2nd previous, 2nd next, 3rd previous, 3rd next, etc. D> This means that between two symbols equidistant from point in D> lines above and below it, the symbol in the line above point D> (previous Nth) is considered nearer to it. RMS> I think it would be a mistake to use a symbol very far away from point. RMS> The user would think, "Where in the world did that come from?" RMS> It's better to say "there's no default" than grasp at straws to RMS> find one. RMS> So I would recommend a new function along these lines but with RMS> some limits. It only picks up a thing (symbol, list, number, whatever) far from point if there is none closer. That is, it just picks the closest one. If there is a lot of blank space, for instance, this will ignore that. Or, if there is other stuff that should be ignored, then that is ignored. That is, if the type of "thing" searched for is surrounded by non-things, the non-things are ignored and the nearest thing is picked up. For instance, if the type is a number, then this ignores anything that is not a number. I think that an arbitrary limit would *not* be useful. In practice, there is something useful nearby. If there is none, nil is returned. If the only appropriate thing is pretty far away, it is still probably appropriate to return it. The notion of "nearby" is relative, in any case: it can be different for different situations. Only the calling code really knows what "nearby" means. Besides, a calling function can always choose to ignore something beyond a certain limit. The *-with-bounds functions all return the bounds of the found thing, and the bounds-of-* functions extract those bounds. The bounds can be tested to filter things too far away, if necessary. Of course it's possible that if this were executed on a humongous file, performance would suffer. For this reason, it might be good to limit the search beforehand, instead of waiting to filter out a result that is too far away. This is easily done by narrowing: these functions stop at the limits of the buffer - or of the narrowing restriction. Again, the calling function knows best whether such narrowing (and how much) is appropriate. You may be right that a user might think "whazzat?!" in some situations - I dunno. My personal preference is to always have Emacs serve me such a default value; if I don't like it I toss it from the minibuffer with a simple backward-kill-sexp (bound to C-M-backspace). In my own code, I use symbol-nearest-point in completing-read everywhere. Anyway, whether or not such functions (or similar) are used directly in interactive specs, I think they can serve as useful elisp building blocks. - Drew For reference, here's the code: http://www.emacswiki.org/elisp/thingatpt-plus.el ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: find-tag-default 2004-05-29 17:43 ` find-tag-default Drew Adams @ 2004-05-30 19:41 ` Richard Stallman 0 siblings, 0 replies; 14+ messages in thread From: Richard Stallman @ 2004-05-30 19:41 UTC (permalink / raw) Cc: juri, emacs-devel It only picks up a thing (symbol, list, number, whatever) far from point if there is none closer. That is, it just picks the closest one. If there is a lot of blank space, for instance, this will ignore that. What I'm saying is that ignoring too much whitespace would give a confusing result--it would be a mistake. If the only appropriate thing is pretty far away, it is still probably appropriate to return it. The notion of "nearby" is relative, in any case: I disagree with both of those points. 10 lines away is not nearby. ^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2004-05-30 19:41 UTC | newest] Thread overview: 14+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2004-05-13 6:37 find-tag-default Juri Linkov 2004-05-16 13:21 ` find-tag-default Richard Stallman 2004-05-19 8:45 ` find-tag-default Juri Linkov 2004-05-19 18:35 ` find-tag-default Kevin Rodgers 2004-05-19 19:01 ` find-tag-default Richard Stallman 2004-05-20 8:09 ` find-tag-default Juri Linkov 2004-05-20 9:14 ` find-tag-default Juri Linkov 2004-05-21 1:27 ` find-tag-default Richard Stallman 2004-05-21 8:05 ` find-tag-default Juri Linkov 2004-05-22 21:44 ` find-tag-default Richard Stallman 2004-05-24 16:49 ` find-tag-default Drew Adams 2004-05-29 1:44 ` find-tag-default Richard Stallman 2004-05-29 17:43 ` find-tag-default Drew Adams 2004-05-30 19:41 ` find-tag-default Richard Stallman
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.git 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).