Re: [Patch] Refine listed tags with regex
On 29-Mar-2013 Cody Cutler ccut...@csail.mit.edu wrote: Hello list. The attached patch allows optional regexs to be passed to :tj and friends. these regexs is then used to further refine available tags before they are printed. This patch is useful when you have many tags for a single identifier. For example, suppose a large C++ project has initialize() methods for 100s of classes. Going through the list of tags printed by :tj is tedious. Most of the time I know additional information about the identifier I am looking for like the containing object type or source filename. The text after the '/' in the argument is used as a regex (unless a '/' is the first character of the tag identifier, then the text after the second '/' is used) to match against the other tag fields (which often contains the containing type name). If a '!' is present, text after it is used to match against filenames. With this patch you can type: :tj initialize/SomeClass to list all tags that also contain SomeClass in their other fields or :ts initialize/!arch/amd64 to list all tags matching initialize that contain arch/amd64 in the containing file's pathname. Or a mix: :ts initialize/SomeClass!arch/amd64 The '/' and '!' characters were chosen somewhat arbitrarily--I'm not sure if they are a safe choice. Any comments are appreciated. I've been thinking about your proposed patch and I would have one problem with it: it doesn't seem intuitive and although I do work with software projects with quite large amounts of source code, I don't think I would use it much (because I wouldn't be able to remember all the quirks of the command). However, I think that there is a very simple solution to your problem which does not require changing the behaviour of Vim itself: create a command in VimL which will do everything you need. For this command I would use the following: - input() – for getting the name of the tag to jump to, - taglist() – to get a list of tags matching what the user chose to view, - input() – to get the name of the class, - input() – to get the file name pattern, - match() – to filter the tag list returned by taglist() with the criteria based on the values input by the user, - setqflist(), setloclist() – to create a list displayed in the quickfix window (:copen, :lopen), - inputlist() – perhaps instead of using setqflist() to make the experience akin to using :tselect. I believe that using such a command should be much more pleasant than poring through hundreds of lines of output generated by grep. And it has the potential of being more user-friendly – whenever you use input(), you can help the user by providing a hint in the prompt. What do you think? I'll be happy to hear from you. -- Cheers, Lech -- -- You received this message from the vim_dev maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups vim_dev group. To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.
Re: [Patch] Refine listed tags with regex
lech.lor...@gmail.com (Lech Lorens) - Sun, Apr 14, 2013 at 11:04:33PM +0200 On 29-Mar-2013 Cody Cutler ccut...@csail.mit.edu wrote: Hello list. The attached patch allows optional regexs to be passed to :tj and friends. these regexs is then used to further refine available tags before they are printed. This patch is useful when you have many tags for a single identifier. For example, suppose a large C++ project has initialize() methods for 100s of classes. Going through the list of tags printed by :tj is tedious. Most of the time I know additional information about the identifier I am looking for like the containing object type or source filename. The text after the '/' in the argument is used as a regex (unless a '/' is the first character of the tag identifier, then the text after the second '/' is used) to match against the other tag fields (which often contains the containing type name). If a '!' is present, text after it is used to match against filenames. With this patch you can type: :tj initialize/SomeClass to list all tags that also contain SomeClass in their other fields or :ts initialize/!arch/amd64 to list all tags matching initialize that contain arch/amd64 in the containing file's pathname. Or a mix: :ts initialize/SomeClass!arch/amd64 The '/' and '!' characters were chosen somewhat arbitrarily--I'm not sure if they are a safe choice. Any comments are appreciated. I've been thinking about your proposed patch and I would have one problem with it: it doesn't seem intuitive and although I do work with software projects with quite large amounts of source code, I don't think I would use it much (because I wouldn't be able to remember all the quirks of the command). I agree that appending a '/' followed by a regex is not a very intuitive way to specify the info for the search but I don't think it is less intuitive than the current state since :tj and company already treat '/' specially if it is the first character of search string (which is why the paragraph explaining my patch's usage is so long -- I wanted to be clear that the original functionality was preserved). There's really not much to remember! If :tj generates a huge list of tags, just append a / with a search pattern. If you haven't tried the patch yet, you should give it a whirl! However, I think that there is a very simple solution to your problem which does not require changing the behaviour of Vim itself: create a command in VimL which will do everything you need. For this command I would use the following: - input() ??? for getting the name of the tag to jump to, - taglist() ??? to get a list of tags matching what the user chose to view, - input() ??? to get the name of the class, - input() ??? to get the file name pattern, - match() ??? to filter the tag list returned by taglist() with the criteria based on the values input by the user, - setqflist(), setloclist() ??? to create a list displayed in the quickfix window (:copen, :lopen), - inputlist() ??? perhaps instead of using setqflist() to make the experience akin to using :tselect. Cool, thanks for this. One reason I submitted the patch was to see what other ways people deal with this situation -- I've had a hard time finding other solutions. I would love a solution in base though. Thanks Lech. -- -- You received this message from the vim_dev maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups vim_dev group. To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.
Re: [Patch] Refine listed tags with regex
On 29-Mar-2013 Cody Cutler ccut...@csail.mit.edu wrote: Hello list. The attached patch allows optional regexs to be passed to :tj and friends. these regexs is then used to further refine available tags before they are printed. This patch is useful when you have many tags for a single identifier. For example, suppose a large C++ project has initialize() methods for 100s of classes. Going through the list of tags printed by :tj is tedious. Most of the time I know additional information about the identifier I am looking for like the containing object type or source filename. The text after the '/' in the argument is used as a regex (unless a '/' is the first character of the tag identifier, then the text after the second '/' is used) to match against the other tag fields (which often contains the containing type name). If a '!' is present, text after it is used to match against filenames. With this patch you can type: :tj initialize/SomeClass to list all tags that also contain SomeClass in their other fields or :ts initialize/!arch/amd64 to list all tags matching initialize that contain arch/amd64 in the containing file's pathname. Or a mix: :ts initialize/SomeClass!arch/amd64 The '/' and '!' characters were chosen somewhat arbitrarily--I'm not sure if they are a safe choice. Any comments are appreciated. I haven't tested your patch but it reminds me of a patch I prepared some 2 years ago. You could search the list archives for a feature called 'tagfunc' which with the awesome SmartTag vim script by Robert Webb I've been happily using ever since. Cheers, Lech -- -- You received this message from the vim_dev maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups vim_dev group. To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.
Re: [Patch] Refine listed tags with regex
lech.lor...@gmail.com (Lech Lorens) - Fri, Mar 29, 2013 at 10:35:41AM +0100 On 29-Mar-2013 Cody Cutler ccut...@csail.mit.edu wrote: [ snip ] I haven't tested your patch but it reminds me of a patch I prepared some 2 years ago. You could search the list archives for a feature called 'tagfunc' which with the awesome SmartTag vim script by Robert Webb I've been happily using ever since. Hello Lech. Thank you, I missed that thread in my search for different solutions. I think this patch is different in two important aspects though: 1) it requires no configuration or additional work (besides typing a regex, something all vim power users are quite comfortably with!) and 2) it is more general in that it is language agnostic (but depends on the tags). For years, my solution to the 100s-of-tags-for-one-identifier problem was grep. This patch makes finding the right tag take one or two seconds instead of 10s of seconds or longer. -- -- You received this message from the vim_dev maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups vim_dev group. To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.