From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Mike Mattie Newsgroups: gmane.emacs.help Subject: Re: finding tags files based on location Date: Wed, 27 Feb 2008 02:19:14 -0800 Message-ID: <20080227021914.1c54cfd6@reforged> References: <8433d21a-3b4e-48b1-a88a-f5639d8e2f2d@i7g2000prf.googlegroups.com> <38795075-7c18-4e8e-b9a4-ba42fc3f5119@e6g2000prf.googlegroups.com> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/signed; boundary="Sig_/1Wyg9H4FbDU6D2rDvqV7.XI"; protocol="application/pgp-signature"; micalg=PGP-SHA1 X-Trace: ger.gmane.org 1204108012 23510 80.91.229.12 (27 Feb 2008 10:26:52 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Wed, 27 Feb 2008 10:26:52 +0000 (UTC) To: help-gnu-emacs@gnu.org Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Wed Feb 27 11:27:18 2008 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1JUJVH-0003yA-Jv for geh-help-gnu-emacs@m.gmane.org; Wed, 27 Feb 2008 11:27:11 +0100 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1JUJUl-0005mh-Gh for geh-help-gnu-emacs@m.gmane.org; Wed, 27 Feb 2008 05:26:39 -0500 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1JUJSD-0004zs-CI for help-gnu-emacs@gnu.org; Wed, 27 Feb 2008 05:24:01 -0500 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1JUJSC-0004zV-8l for help-gnu-emacs@gnu.org; Wed, 27 Feb 2008 05:24:00 -0500 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1JUJSB-0004zP-T0 for help-gnu-emacs@gnu.org; Wed, 27 Feb 2008 05:23:59 -0500 Original-Received: from wr-out-0506.google.com ([64.233.184.226]) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1JUJSB-0006ft-2z for help-gnu-emacs@gnu.org; Wed, 27 Feb 2008 05:23:59 -0500 Original-Received: by wr-out-0506.google.com with SMTP id 50so2362019wri.10 for ; Wed, 27 Feb 2008 02:23:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:date:from:to:subject:message-id:in-reply-to:references:x-mailer:mime-version:content-type; bh=d96bXyu6QMEN1FBAR6dPWmvbCrbRpD8xHjIQy9HQSHk=; b=gRhgIU32iiPRC/mRIFFoCbf9RikQA6jerr0qhP90meGGquk2CSzD5k2WOm/aBuMz3i98PJhdElIx6GuM43g6QZyOqqwHxI8REvx2xDP1KBoKW3vaZNiXNNutUWqSfH7gRsIJH6F6oSlQSk4eUuC9NTjb8XI0Df+PkdVMQbQBwC0= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=date:from:to:subject:message-id:in-reply-to:references:x-mailer:mime-version:content-type; b=TiTdoIWoNTiMkPuUvUj0ZIo5xtobnd8AS8On/mQI0Cle9xXLDsjqjnxolJaV+e/MX0UF1oK27klT77qZDHgPVbthx4EdnhwAO0jzWg5RfgnV8WKfIXqtBAKM867tEUwklvIKYKR4vMFaJJqPvCFDjCD0omsYgR2fbwYS2o59fD8= Original-Received: by 10.140.82.40 with SMTP id f40mr4329014rvb.16.1204107836696; Wed, 27 Feb 2008 02:23:56 -0800 (PST) Original-Received: from reforged ( [71.217.206.83]) by mx.google.com with ESMTPS id z15sm12946572pod.11.2008.02.27.02.23.55 (version=SSLv3 cipher=OTHER); Wed, 27 Feb 2008 02:23:55 -0800 (PST) In-Reply-To: X-Mailer: Claws Mail 3.0.2 (GTK+ 2.12.5; i686-pc-linux-gnu) X-detected-kernel: by monty-python.gnu.org: Linux 2.4-2.6 (Google crawlbot) X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.help:51908 Archived-At: --Sig_/1Wyg9H4FbDU6D2rDvqV7.XI Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable On Tue, 26 Feb 2008 21:31:28 -0700 Kevin Rodgers wrote: > gamename wrote: > > On Feb 25, 8:08 pm, Kevin Rodgers wrote: > >> gamename wrote: > >>> I often have to checkout multiple copies of the same source tree > >>> from cvs. For example, if I have a source tree 'foo' in cvs, I > >>> may have 2 copies like ~/foo0/bar and ~/foo1/bar in my home > >>> directory at the same time. Each copy of the foo tree will have > >>> a tags file in 'foo/tags'. Does anyone have code that will enable > >>> emacs to determine which tags file to use based on the tree i'm > >>> currently using? For example, if I'm in foo1/bar, I would be > >>> using the tags file in foo1/tags, not foo0/ tags. Is there code > >>> to dynamically determine that? > >> > >> Is it enough to make tags-file-name a buffer local variable, set > >> appropriately for each file? If so: > >> > >> (defun set-local-tags-file-name () > >> (when (file-exists-p "tags") > >> (set (make-local-variable 'tags-file-name) > >> (expand-file-name "tags")))) > >> > >> (add-hook 'find-file-hook 'set-local-tags-file-name) > >=20 > > Thanks Kevin, but I don't think that scales very well. If I have > > thousands of files, that wouldn't be workable. >=20 > Actually, it scales perfectly well: No matter how many files you have, > the hook is only run once for each file that you actually visit. >=20 > The question is: Does it actually work? I see now that > vist-tags-table explicitly provides a way to do the same thing, so > perhaps this is better: >=20 > (defun set-local-tags-file-name () > (when (file-exists-p "tags") > (visit-tags-table (expand-file-name "tags") t))) >=20 Actually that won't be all that useful as it will scope the tags table to t= he directory of the file, instead of the entire source tree. If you use version control = alot you can find a good location for the tags table by ascending the FS tree lookin= g for the highest directory that is writable and under version control. The code below will give you a sketch of the algorithm. It's all recursive = so it will hit the stack limit with valid inputs. But it might help you. If your hook used a global structure that paired the loaded tags tables wit= h their directory you could cheaply determine a best table from the list to associate with a = buffer. If you know the root of the tree it's pretty easy to make up the commands t= o generate the table when it is missing as well. (defun prefix-strings (prefix list) "prefix all the strings of the list concatenating the result." (mapcar (lambda ( string ) (concat prefix string)) list)) (defun strip-list-last ( list ) "strip the last element from a list" (if (consp (cdr list)) (cons (car list) (strip-list-last (cdr list))) nil)) (defun ascend-to-checkout-root ( dir ) "The recursive core of find-checkout-root. use that entry point instead." (if (and (file-accessible-directory-p dir) (file-writable-p (concat dir "/_"))) ;; vc-backend is not robust with inputs. If a directory is given withou= t a trailing ;; slash a nil value will be returned incorrectly for directories under= version ;; control. (if (vc-backend dir) (lexical-let ((traverse (strip-list-last (split-string dir "/" t)))) (if traverse (lexical-let ((found (ascend-to-checkout-root (prefix-strings "/" traverse))= )) (if (eq 't found) dir found)) t)) ;; halt when list is exhausted t) ;; halt when the directory is no longer under version contr= ol. t)) ;; halt when we don't have read and write permission for th= e directory. (defun find-checkout-root ( dir ) "Find the ancestor directory that is the root of the checkout containing = DIR. Recursion halts on these conditions: * exhausted path. * directory is not: accesible,readable, and writable. * directory is not under version control according to vc-backend. " (lexical-let ((found (ascend-to-checkout-root dir))) (if (eq 't found) dir found))) Cheers, Mike Mattie --Sig_/1Wyg9H4FbDU6D2rDvqV7.XI Content-Type: application/pgp-signature; name=signature.asc Content-Disposition: attachment; filename=signature.asc -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.7 (GNU/Linux) iD8DBQFHxTkidfRchrkBInkRAlZBAJ9j04Zzv2ihOTXFvFBhJA/qSGn3GwCfZb82 yjKc8iSgxH6+nAuqfzo0LRQ= =ktn9 -----END PGP SIGNATURE----- --Sig_/1Wyg9H4FbDU6D2rDvqV7.XI--