why not have a separate command rather than shell aliases?
i.e.
$ tag func # returns e1..e4, e5, e6 and dumps them in .tag-locations
$ tagopen e4 # uses .tag-locations to open $EDITOR
you still have scary global state, but at least it's limited to the `tag/opentag` command.
Plus, you can do `tagopen` without arguments and show a menu :)