[comp.emacs] Find-Tags for uEMACS

ram@altger.UUCP (Reimer A. Mellin) (11/04/88)

Hello,

After beginning of using the uEMACS, I missed one feature  of  VI
very soon: the Find-tags command.

At the end of this Article there is now my  solution,  consisting
basicly  of  a  short  macro,  which  can  be added to the uEMACS
startup-file.

Now you can simply move to the beginning of an identifier and ac-
tivate the macro (I bound it on my system to M-TAB, please change
this as you like).

After finding the 'TAGS'-file (created by  the  program  'ctags')
and  the specified identifier, the macro splits your current win-
dow and displays the start of the definition (Always in the lower
window).   In  the  upper window you will still see your old con-
text.

BUGS: the macro doesn't prompt for a name
      the TAGS file is loaded after the first search (running out of
      memory?)
      if your current window is 2 lines high, it can't be split
      the default search-pattern will be overwritten ...
      maybe unlimited .. :-)

I hope it will be useful for some of you ....

Greetings
	Reimer Mellin

PS: This was my first uEMACS-Macro, I am sure it can be made better :-)

----------------------CUT HERE-------------------------------------------
; Find-Tags Macro for uEMACS 3.8i and higher ....
; simply add to your '.emacsrc'-file
; Author: Reimer Mellin
; Date: 13.apr.88
; You can copy, modify, use, abuse this stuff as you wish
;
; If you use this Macro please send a small contribution to GreenPeace
; or to some organisation against famine in the third world !!!!!!!!

21      store-macro
	!if &not &band $cmode 2
		!return
	!endif			; only allowed in CMODE 
	set $discmd FALSE
	set %tmp01 $cwline	; remember line
	add-mode "magic"
	set-mark
!force  search-forward "[^0-9A-Za-z_]"	; search for end of identifier
        delete-mode "magic"
	backward-character
	copy-region		; get identifier
        !if &seq $kill ""
           set %var1 "no identifier specified"
          !goto error2
        !endif
        set %var1 &sub $wline $cwline
        %var1 next-line		; go to last line of window
        split-current-window	; so the new window will be the lower one
        previous-window
        %var1 previous-line
        exchange-point-and-mark
	set %tmp02 %tmp01
	!if &gre %tmp02 $wline
		set %tmp02 $wline
	!endif
	!if &les $cwline %tmp02
		&sub %tmp02 $cwline move-window-up
	!endif			; complicate calculation for restoring the
				; old context
	next-window
	!if &exist TAGS		; the TAGS-file ...
		find-file TAGS
	!else
                set %var1 "tags-file not found"
                previous-window
		!goto error1
	!endif
	add-mode "exact"	; for speed ....
	beginning-of-file	; rewind tags-file
!force  search-forward $kill
	!if &not $status
            set %var1 &cat $kill " not in tags-file"
*error1
!force 		delete-window
*error2
		write-message &cat "Fatal error: " %var1
		set $discmd TRUE
		!return
	!endif
        forward-character	; we were at end of identifier ...
	set-mark		; extract filename ..
	search-forward &chr 9
	backward-character
	copy-region
	set %var1 $kill
	3 forward-character	; extract pattern without '^' and '$' !!
	set-mark
	end-of-line
	2 backward-character
	copy-region
	set %pattern $kill
!force  find-file %var1		; look for filename
	!if &not $status
                set %var1 &cat %var1 " not found"
		!goto error1
	!endif
        beginning-of-file
        add-mode "exact"
!force  search-forward %pattern
	!if &not $status
                set %var1 &cat %var1 " is not as I remember (run ctags again)"
		!goto error1
	!endif
        delete-mode "exact"
        beginning-of-line	; found it ....
	set-mark
	set $discmd TRUE
!endm					;DONE

bind-to-key execute-macro-21 M-^I	; whatever you like ...
----------------------CUT HERE-------------------------------------------

/* E O F */
-- 
Reimer A. Mellin          UUCP : unido!altger!ram
Germany->Bavaria->Munich  VOICE: 49-89-791 36 68
"Real programmers don't write in any language, they patch ......"

DMasterson@cup.portal.com (David Scott Masterson) (11/10/88)

Has anyone tried these find-tags macros?  I've tried the original and the
cleaned up version that someone else posted and have had trouble with them
on Sun 3s running SunOS 3.5.  As close as I can come to figuring it out,
there might be a bug in expression processing within macros and the $kill
buffer.  The following code does some strange things:

	copy-region
	!if &sequal $kill ""
		write...
	!endif
	set %indent $kill

After this code runs twice (like finding the tag of two different identifiers),
the kill buffer ($kill) seems to have left over data from the last kill command
attached to the end of the new kill string ("position" -> "ident" =
"idention").  Has anyone else run into this type of problem?  Find-tags seems
great (from what I can see), if I can just get it to work consistently.

David Masterson
DMasterson@cup.portal.com