From: Hironori Ito (hito@rcf.rhic.bnl.gov)
Date: Fri Dec 27 2002 - 13:25:42 EST
Thanks. I will try it later. (Shortly after I finish BRAHMS elog before the real run starts.) Hiro Christian Holm Christensen wrote: > Hi Hiro, > > Hironori Ito <hito@rcf.rhic.bnl.gov> wrote concerning > how to use etags and xemacs [Mon, 23 Dec 2002 15:50:14 -0500] > ---------------------------------------------------------------------- > >>Hello. I have a question for xemacs (or emacs) expart for use of tags. >>(I think.) For example, if I want to replace every "Br" character with >>"Brahms" in every file under brat directory, how can I do that easily? >>I heard that I can use "etags" or something, but I do not know how to >>use it. If someone know how to do it, please let me know. (Don't worry >>I am not changing Br to Brahms in brat =) ) > > > It's quite easy, so don't be scared by the length of this mail - I'm > simply pinning things out a bit. > > First you need to make a TAGS file, which is a sort of index over the > files you're interested in. Suppose you want to index all files in a > directory, simply do > > > etags * > > However, that'll include files like README, INSTALL, Makefile.am, and > so on. So maybe you'd want to make the index over a more restricted > set of file - well, use the shell glob patterns to do that: > > > etags *.h *.cxx Makefile.am > > (It's not a bad idea to index the Makefile.am too, as you'll probably > want to change filenames too). > > If your source tree isn't flat (in one single directory) but is nested > (a tree of directories), you'd do better using `find' to help you out > with the actual file names: > > > find . -name "*.h" -or -name "*.cxx" -or -name "Makefile.am" > > That'll give you a list of source files + Makefile.am's. However, > suppose your source uses ROOT - then there's a distinct possibility > that you will have `rootcint' generated files like `FooCint.cxx' and > `FooCint.h'. We really don't want to index those files, as they are > automatically generated, and it's a bloody waste of time doing > anything on those files. Hence, a better search will be > > > find . -not -name "*Cint.*" -and \( -name "*.cxx" -or -name "*.h" \ > -or -name "Makefile.am" \) > > (Note that the '(' and ')' must be escaped, or the shell will expand > them - that is, try to evaluate the expression with the parentheses). > > That'll give you a list of the relevant files. Now, we need to put > that list to `etags' to make it index those files. That's easy too. > We use the utility `xargs' to pass multiple arguments to `etags': > > > find . -not -name "*Cint.*" -and \( -name "*.cxx" -or -name "*.h" \ > -or -name "Makefile.am" \) | xargs etags > > That's it. You should have a file called `TAGS' in the current > directory. `cat' it if you like - it's not clear text. > > The next thing is to use the `TAGS' file in (X)Emacs (it's the same of > both). > > Start Emacs, and figure out what you want to do. Suppose we have > loads of classes, named something like `My...', and we've decided that > we should really rename them all to some thing like `Foo...' as we're > about to ready make a release of our `foo' package. Hence, we'd like > to substitute all occurrences of `My...' with `Foo...'. However, we > know that the `...' part should start with a capital letter or a > digit, so we'd actually like to substitute the regular expression > `My[A-Z0-9]...' with `Foo\1...' (where \1 refers to the matched > capital letter or digit). That's easily done using the `TAGS' file. > > In Emacs, type > > M-x tags-query-replace > > (that's the `Alt'-key down and an `x', followed by the literal > `tags-query-replace' - actually, you need only write `tags-q[TAB]' and > Emacs will complete it for you). > > Emacs will then prompt you for a regular expression, so let's enter > that: > > My\([A-Z0-9]\)[ENTER] > > The `\(...\)' construct saves away the match in `\1'. The `[ENTER]' > makes Emacs prompt us for a replacement string, so let's enter that, > using the saved-away match on a capital letter or digit: > > Foo\1[ENTER] > > Here we're using the `\1' to get the matched part in `\(...\)'. The > `[ENTER]' makes Emacs prompt us for a `TAGS' file. Assuming you're > standing in the directory where you created the `TAGS' file using > `etags', you can almost certainly just press `[ENTER]'. If you're > not, or the for some reason the default value suggested by Emacs is > wrong, you need to specify it (use the `[TAB]'-completion!), and press > `[ENTER]'. > > Having specified the regular expression, the replacement string, and > the `TAGS' file, Emacs will start asking you whether you want to > replace a specific occurrence of the regular expression. > > To accept a replacement, type `y'; to reject a replacement, type `n', > to cancel the replacements all together, type `q'; to see a > replacement with out actually performing it, type `,'; to replace all > occurrences of the regular expression in the current buffer, type `!'; > and finally, to get some more help, type `?'. Note, that if you type > `!' it will only do the replacements in the current buffer - not in > all the files you've indexed. Hence, you need to type `!' for each > file you've index if you want to replace all occurrences of the > regular expression. > > Having done what ever replacements you like, you have most probably > modified several buffers. To save them all, simply type > > C-x s > > (that's the `Control'-key down and an `x', and the literal `s'). > Emacs will prompt you for each modified buffer. Pressing `y' saves the > buffer, `n' skips it, `q' stops, and `!' saves all remaining buffers. > > You can of course do a lot more with the `TAGS' file, like searching > for a regular expression: > > M-x tags-search <regular-expression> [ENTER] > > (`M-,' repeats the search), and ladida. > > > Anyway, I strongly suggest you refer to the following documentation > available via the info system (`C-h i m <topic>' in Emacs): > > find > (`C-h i m find [ENTER]') > > xargs > (`C-h i m find [ENTER] m Actions [ENTER] m Run [ENTER] m Multi [ENTER]') > > etags > (`C-h i m Emacs [ENTER] m Tags [ENTER] m Create [ENTER]') > > tags-query-replace > tags-search > (`C-h i m Emacs [ENTER] m Tags Search [ENTER]') > > Emacs Regular Expression > (`C-h i m Emacs [ENTER] m Regexps [ENTER]') > > There's probably also man(1) pages for `find', `xargs' and `etags' on > your system. > > Note, that there's a similar thing for <shudder>Vi</shudder>, but I > don't know it, so you have to Read The F...... Manual :-) > > He, it took a pretty long mail to say (politely) RTFM :-) > > A nice thing about `Autotools', is that it recognises `TAGS' files, > and can even recreate them for you as things changes in the source > code. Also, they are removed when you do `make maintainer-clean' (or > is it `make dist-clean'?). > > <rant> > As you can see, there's quite a wealth of utilities available on Un*x > that can really help the programmer a lot. Sometimes people complain, > saying: `Why isn't there a Developer Studio on Un*x, like on MacOS, > Windoze or Solaris?' - Well, the answer is - there is! In fact > there's more than just one. However, in the true Un*x style of > things, these studios are made up of small components that does each > job well, and nothing more. However, when you start combining these > small tools, the result is so much more powerful than the mere sum of > the individual features (witness the use of `find', `xargs' and > `etags' above). > > Why is this good compared to large monolithic `Developer Studios?' > Well, each tool does it's thing in it's own right - and it does it > well. Also, if a particular programmer doesn't like a particular > tool, she can easily substitute another tool - say Emacs with > <shudder>Vi</shudder> - all in all, the programmer has some _freedom_ > in how to work best (remember `Free as in speech, not beer'). With > big monolithic suits, you simply do not have that freedom of choice - > some system designer is some dark corner of a cellar in Silicon Vally > or Redmond made the choice for you, and if you don't like it - touch > luck buster. > > The studios that _does_ exist on Un*x (in particular GNU/Linux) does > the Right Thing(tm) and provide GUI _wrappers_ around the smaller > tools. > </rant> > > I hope all this helps you do the job nice and easy (being > what-ever-FUD-term-M$-may-use), and with the basic freedom of choice > that comes from using a proper OS. > > <aside> > There was an posting somewhere recently, that explain why DOS, and by > extension Windows 3.x, and 9x, wasn't really operating systems, but a > program launcher, much like the `loader-tape' on an old Gier machine. > The posting also recognised that WinNT, and by extension Windows 2000 > and XP, _are_ operating systems, but that the basic design was all > messed up when they added the GUI. > </aside> > > Yours, > > ___ | Christian Holm Christensen > |_| | ------------------------------------------------------------- > | | Address: Sankt Hansgade 23, 1. th. Phone: (+45) 35 35 96 91 > _| DK-2200 Copenhagen N Cell: (+45) 24 61 85 91 > _| Denmark Office: (+45) 353 25 305 > ____| Email: cholm@nbi.dk Web: www.nbi.dk/~cholm > | |
This archive was generated by hypermail 2.1.5 : Fri Dec 27 2002 - 13:24:01 EST