Hi, ( Seems that my yesterday's mail is lost, so here it is again. ) Please find attached a new version of my MakeClass suite. It's divided into two pieces. The first piece ( this mail ) contains the MakeClass macro itself, and ... if you are using emacs, please find attached an emacs.rc.add ( some code to be placed in your private .emacs file ) which gives you outline/folding editor settings to be used with both the MakeClass.cxx itself, and with files generated by this macro ( try "EmacsMenu -> Hide -> Hide Body" or C-c @ C-t and enjoy ). The second part will contain example files and notes how to use them. Have fun, Jacek. // # MakeClass.cxx // # How to generate and use the skeleton analysis class for a Tree. // // The following files are produced: classname.hxx and classname.cxx // if classname is NULL, classname will be nameoftree. // // The generated code in classname.hxx includes the following: // - Identification of the original Tree and Input File Name // - Definition of analysis class (data and functions) // - the following class functions: // - classname(Char_t *filename = 0) to connect a file with Tree // - classname(TTree *tree) to connect a Tree // - ~classname() // - GetEntries() to get the number of events in Tree // - GetEvent(Int_t event) to prepare the filling of data from event // - Init(TTree *tree) to initialize with a new Tree // - Loop(Int_t (*analysis)(classname *)) which loops over all events // in Tree calling the given analysis function for every event, if // the analysis function returns a non zero value, breaks the loop // - Show(Int_t event) to read and dump event ( all branches ) // // The generated code in classname.cxx includes only the skeleton of the // main analysis function Loop(). // // To use the MakeClass function: // - connect your Tree file (eg: TFile f("myfile.root");) // - MakeClass(T,"MyClass"); // where T is the name of the Tree in the myfile.root file, and // MyClass.hxx, MyClass.cxx are names of files created by this function. // Then, in a Root session, you can do, for example: // Root > .L MyClass.cxx // Root > MyClass t // Root > t.GetEvent(12); // Prepare to fill t with event number 12 // Root > t.Show(); // Show values of event 12 // Root > t.Show(16); // Read and show values of event 16 // Root > t.Loop(); // Loop over all events // // # Int_t MakeClass(TTree *t, const char *classname = 0) Int_t MakeClass(TTree *t, const char *classname = 0) { // # Check against an invalid Tree pointer if (!t) return 1; if (!t->IsA()->InheritsFrom("TTree")) { printf("Attempt to MakeClass for a non-TTree object\n"); return 2; } // # Connect output files char *thead = new char[256]; if (!classname) classname = t->GetName(); sprintf(thead,"%s.hxx",classname); FILE *fp = fopen(thead,"w"); if (!fp) { printf("Cannot open output file:%s\n",thead); delete [] thead; return 3; } char *tcimp = new char[256]; sprintf(tcimp,"%s.cxx",classname); FILE *fpc = fopen(tcimp,"w"); if (!fpc) { printf("Cannot open output file:%s\n",tcimp); delete [] thead; delete [] tcimp; return 3; } char *treefile = new char[1000]; if (t->GetDirectory() && t->GetDirectory()->GetFile()) strcpy(treefile,t->GetDirectory()->GetFile()->GetName()); else strcpy(treefile,"Memory Directory"); // # *** Generate classname.hxx *** // # Print the header TObjArray *leaves = t->GetListOfLeaves(); Int_t nleaves = leaves->GetEntriesFast(); TDatime td; fprintf(fp,"// # \n"); fprintf(fp,"// # This class has been automatically generated \n"); fprintf(fp,"// # (%s by ROOT version%s) \n",td.AsString(),gROOT->GetVersion()); fprintf(fp,"// # from TTree %s/%s \n",t->GetName(),t->GetTitle()); fprintf(fp,"// # found on file: %s \n",treefile); fprintf(fp,"// # \n"); fprintf(fp,"\n"); fprintf(fp,"// # *** The %s class interface *** \n",classname); fprintf(fp,"#ifndef %s_hxx\n",classname); fprintf(fp,"#define %s_hxx\n",classname); fprintf(fp,"\n"); fprintf(fp,"// # Required includes \n"); fprintf(fp,"#ifndef __CINT__\n"); fprintf(fp,"#include <stdio.h>\n"); fprintf(fp,"#include <stream.h>\n"); fprintf(fp,"#include \"TROOT.h\"\n"); fprintf(fp,"#include \"TTree.h\"\n"); fprintf(fp,"#include \"TFile.h\"\n"); fprintf(fp,"#include \"Api.h\"\n"); fprintf(fp,"#else\n"); fprintf(fp,"class TBranch;\n"); fprintf(fp,"class TTree;\n"); fprintf(fp,"class TFile;\n"); fprintf(fp,"#endif\n"); fprintf(fp,"\n"); fprintf(fp,"// # class %s \n",classname); fprintf(fp,"class %s {\n",classname); fprintf(fp,"public:\n"); fprintf(fp," // # public variables \n"); fprintf(fp," TTree *fTree; // pointer to the analysed TTree\n"); fprintf(fp," Int_t fEvent; // current Event number\n"); // # First loop on all branches to generate branch declarations fprintf(fp," // # declaration of branches \n"); Int_t nb, i; nb = t->GetListOfBranches().GetEntriesFast(); for (i=0;i<nb;i++) { branch = (TBranch*)t->GetListOfBranches().UncheckedAt(i); fprintf(fp,"%s%-15s branch_%s;\n"," ","Int_t", branch->GetName()); fprintf(fp,"%s%-15s *branch_pointer_%s;\n"," ","TBranch", branch->GetName()); } // # First loop on all leaves to generate leaf declarations fprintf(fp," // # declaration of leaves \n"); Int_t len, l; TLeaf *leafcount; TLeafObject *leafobj; char *bname; const char *headOK = " "; const char *headcom = " // "; const char *head; char branchname[64]; for (l=0;l<nleaves;l++) { TLeaf *leaf = (TLeaf*)leaves->UncheckedAt(l); len = leaf->GetLen(); leafcount =leaf->GetLeafCount(); TBranch *branch = leaf->GetBranch(); if (leafcount) strcpy(branchname,branch->GetName()); else strcpy(branchname,leaf->GetTitle()); char *twodim = (char*)strstr(leaf->GetTitle(),"]["); bname = branchname; while (*bname) {if (*bname == '.') *bname='_'; bname++;} if (branch->IsA() == TBranchObject::Class()) { if (branch->GetListOfBranches()->GetEntriesFast()) continue; leafobj = (TLeafObject*)leaf; if (leafobj->GetClass()) head = headOK; else head = headcom; fprintf(fp,"%s%-15s *leaf_%s;\n",head,leafobj->GetTypeName(),leafobj->GetName()); fprintf(fp,"%s%-15s *%s() {",head,leafobj->GetTypeName(),leafobj->GetName()); fprintf(fp,"if (branch_%s) return leaf_%s;",branch->GetName(),leafobj->GetName()); fprintf(fp,"branch_pointer_%s->GetEvent(fEvent);",branch->GetName()); fprintf(fp,"branch_%s=1;return leaf_%s;}\n",branch->GetName(),leafobj->GetName()); continue; } if (leafcount) { len = leafcount->GetMaximum(); if (twodim) { fprintf(fp," %-15s leaf_%s[%d]%s;\n",leaf->GetTypeName(),branchname,len,(char*)(twodim+1)); // fprintf(fp," %-15s (&%s())[%d]%s {",leaf->GetTypeName(),branchname,len,(char*)(twodim+1)); fprintf(fp," %-15s (*%s())%s {",leaf->GetTypeName(),branchname,(char*)(twodim+1)); fprintf(fp,"if (branch_%s) return leaf_%s;",branch->GetName(),branchname); fprintf(fp,"branch_pointer_%s->GetEvent(fEvent);",branch->GetName()); fprintf(fp,"branch_%s=1;return leaf_%s;}\n",branch->GetName(),branchname); } else { fprintf(fp," %-15s leaf_%s[%d];\n",leaf->GetTypeName(),branchname,len); // fprintf(fp," %-15s (&%s())[%d] {",leaf->GetTypeName(),branchname,len); fprintf(fp," %-15s *s() {",leaf->GetTypeName(),branchname); fprintf(fp,"if (branch_%s) return leaf_%s;",branch->GetName(),branchname); fprintf(fp,"branch_pointer_%s->GetEvent(fEvent);",branch->GetName()); fprintf(fp,"branch_%s=1;return leaf_%s;}\n",branch->GetName(),branchname); } } else { fprintf(fp," %-15s leaf_%s;\n",leaf->GetTypeName(),branchname); fprintf(fp," %-15s &%s() {",leaf->GetTypeName(),branchname); fprintf(fp,"if (branch_%s) return leaf_%s;",branch->GetName(),branchname); fprintf(fp,"branch_pointer_%s->GetEvent(fEvent);",branch->GetName()); fprintf(fp,"branch_%s=1;return leaf_%s;}\n",branch->GetName(),branchname); } } // # Generate class member functions prototypes fprintf(fp," \n"); fprintf(fp," // # public functions \n"); fprintf(fp," %s(Char_t *filename = 0);\n",classname); fprintf(fp," %s(TTree *tree) {if (!tree) %s();else Init(tree);}\n",classname,classname); fprintf(fp," ~%s() {;}\n",classname); fprintf(fp," Stat_t GetEntries() {if (!fTree) return 0;return fTree->GetEntries();}\n"); fprintf(fp," Int_t GetEvent(Int_t event);\n"); fprintf(fp," void Init(TTree *tree);\n"); fprintf(fp," Int_t Loop();\n"); fprintf(fp," Int_t Loop(Int_t (*analysis)(%s *));\n",classname); fprintf(fp," void Show(Int_t event = -1);\n"); fprintf(fp,"};\n"); fprintf(fp,"\n"); fprintf(fp,"#endif\n"); fprintf(fp,"\n"); fprintf(fp,"// # *** The %s class implementation *** \n",classname); fprintf(fp,"#ifdef %s_cxx\n",classname); fprintf(fp,"\n"); // # Generate class constructor classname(Char_t *filename) fprintf(fp,"// # %s::%s(Char_t *filename) \n",classname,classname); fprintf(fp,"%s::%s(Char_t *filename)\n",classname,classname); fprintf(fp,"{\n"); fprintf(fp," // # If parameter filename is not specified (or zero), connect the file \n"); fprintf(fp," // # used to generate this class ( %s ). \n",treefile); fprintf(fp," if (!filename || !(*filename)) {\n"); fprintf(fp," filename = \"%s\";\n",treefile); fprintf(fp," }\n"); fprintf(fp," // # Find the required file in ROOT and, if not found, open it. \n"); fprintf(fp," TFile *f = (TFile*)gROOT->GetListOfFiles()->FindObject(filename);\n"); fprintf(fp," if (!f) {\n"); fprintf(fp," f = new TFile(filename);\n"); fprintf(fp," }\n"); fprintf(fp," // # Find the %s tree and initialize object. \n",t->GetName()); fprintf(fp," TTree *t = (TTree*)gDirectory->Get(\"%s\");\n",t->GetName()); fprintf(fp," Init(t);\n"); fprintf(fp,"}\n"); fprintf(fp,"\n"); // # Generate class member function GetEvent(Int_t event) fprintf(fp,"// # Int_t %s::GetEvent(Int_t event) \n",classname); fprintf(fp,"Int_t %s::GetEvent(Int_t event)\n",classname); fprintf(fp,"{\n"); fprintf(fp," // # Prepare to read specified event from the Tree. \n"); fprintf(fp," if (!fTree) return 0;\n"); // fprintf(fp," // if (fEvent==event) return 1;\n"); fprintf(fp," fEvent = event;\n"); fprintf(fp," // # Set branch statuses to 0 \n"); nb = t->GetListOfBranches().GetEntriesFast(); for (i=0;i<nb;i++) { branch = (TBranch*)t->GetListOfBranches().UncheckedAt(i); fprintf(fp," branch_%s = 0;\n",branch->GetName()); } fprintf(fp," return 1;\n"); fprintf(fp,"}\n"); fprintf(fp,"\n"); // # Generate class member function Init(TTree *tree) fprintf(fp,"// # void %s::Init(TTree *tree) \n",classname); fprintf(fp,"void %s::Init(TTree *tree)\n",classname); fprintf(fp,"{\n"); fprintf(fp," // # Initialize public variables. \n"); fprintf(fp," fTree = tree;\n"); fprintf(fp," fEvent = -1;\n"); fprintf(fp," if (!tree) return;\n"); fprintf(fp," // # Set branch addresses. \n"); for (l=0;l<nleaves;l++) { TLeaf *leaf = (TLeaf*)leaves->UncheckedAt(l); len = leaf->GetLen(); leafcount =leaf->GetLeafCount(); TBranch *branch = leaf->GetBranch(); if (leafcount) strcpy(branchname,branch->GetName()); else strcpy(branchname,leaf->GetTitle()); bname = branchname; while (*bname) {if (*bname == '.') *bname='_'; bname++;} char *brak = strstr(branchname,"["); if (brak) *brak = 0; head = headOK; if (branch->IsA() == TBranchObject::Class()) { if (branch->GetListOfBranches()->GetEntriesFast()) continue; leafobj = (TLeafObject*)leaf; if (!leafobj->GetClass()) head = headcom; strcpy(branchname,branch->GetName()); } if (leafcount) len = leafcount->GetMaximum()+1; if (len > 1) fprintf(fp,"%sfTree->SetBranchAddress(\"%s\",leaf_%s);\n",head,branch->GetName(),branchname); else fprintf(fp,"%sfTree->SetBranchAddress(\"%s\",&leaf_%s);\n",head,branch->GetName(),branchname); } fprintf(fp," // # Set branch statuses to 0, initialize branch pointers \n"); fprintf(fp," fTree->SetBranchStatus(\"*\",0); // disable all branches\n"); nb = t->GetListOfBranches().GetEntriesFast(); for (i=0;i<nb;i++) { branch = (TBranch*)t->GetListOfBranches().UncheckedAt(i); fprintf(fp," branch_%s = 0;\n",branch->GetName()); fprintf(fp," branch_pointer_%s = fTree->GetBranch(\"%s\");\n",branch->GetName(),branch->GetName()); } fprintf(fp,"}\n"); fprintf(fp,"\n"); // # Generate class member function Loop(Int_t (*analysis)(classname *)) fprintf(fp,"// # Int_t %s::Loop(Int_t (*analysis)(%s *)) \n",classname,classname); fprintf(fp,"Int_t %s::Loop(Int_t (*analysis)(%s *))\n",classname,classname); fprintf(fp,"{\n"); fprintf(fp," // # Execute the analysis function for every event. In case the \n"); fprintf(fp," // # analysis function returns a non zero value, break the loop. \n"); fprintf(fp," if (!fTree || !analysis) return 0;\n"); fprintf(fp," \n"); fprintf(fp," // # Local variables ( common to compiled and interpreted code ). \n"); fprintf(fp," Stat_t nentries = GetEntries(); // Number of entries in the Tree.\n"); fprintf(fp," Int_t nevents = 0; // How many events were analysed.\n"); fprintf(fp," \n"); fprintf(fp," // # This is the event loop in compiled code. \n"); fprintf(fp,"#ifndef __CINT__\n"); fprintf(fp," \n"); fprintf(fp," // # First define some local variables and objects. \n"); fprintf(fp," char temp[64]; // INTERPRETEDFUNC\n"); fprintf(fp," long offset = 0; // INTERPRETEDFUNC\n"); fprintf(fp," G__ClassInfo globalscope; // INTERPRETEDFUNC\n"); fprintf(fp," G__CallFunc func; // INTERPRETEDFUNC, COMPILEDINTERFACEMETHOD, BYTECODEFUNC\n"); fprintf(fp," \n"); fprintf(fp," // # Then execute the loop. \n"); fprintf(fp," switch(G__isinterpretedp2f(((void*)analysis))) {\n"); fprintf(fp," // # using function call as string \n"); fprintf(fp," case G__INTERPRETEDFUNC:\n"); fprintf(fp," sprintf(temp,\"(%s *)%%p\",(void*)this);\n",classname); fprintf(fp," func.SetFunc(&globalscope,(char*)analysis,temp,&offset);\n"); fprintf(fp," for (Int_t i=0; i<nentries; i++) {\n"); fprintf(fp," nevents += GetEvent(i);\n"); fprintf(fp," if (func.ExecInt((void*)NULL)) break;\n"); fprintf(fp," }\n"); fprintf(fp," break;\n"); fprintf(fp," // # using interface method \n"); fprintf(fp," case G__COMPILEDINTERFACEMETHOD:\n"); fprintf(fp," func.SetFunc((G__InterfaceMethod)analysis);\n"); fprintf(fp," func.SetArg(((long)this));\n"); fprintf(fp," for (Int_t i=0; i<nentries; i++) {\n"); fprintf(fp," nevents += GetEvent(i);\n"); fprintf(fp," if (func.ExecInt((void*)NULL)) break;\n"); fprintf(fp," }\n"); fprintf(fp," break;\n"); fprintf(fp," // # bytecode version of interpreted func \n"); fprintf(fp," case G__BYTECODEFUNC:\n"); fprintf(fp," func.SetBytecode((struct G__bytecodefunc*)analysis);\n"); fprintf(fp," func.SetArg(((long)this));\n"); fprintf(fp," for (Int_t i=0; i<nentries; i++) {\n"); fprintf(fp," nevents += GetEvent(i);\n"); fprintf(fp," if (func.ExecInt((void*)NULL)) break;\n"); fprintf(fp," }\n"); fprintf(fp," break;\n"); fprintf(fp," // # using true pointer to function \n"); fprintf(fp," case G__COMPILEDTRUEFUNC:\n"); fprintf(fp," // # pointer not in CINT global function table \n"); fprintf(fp," case G__UNKNOWNFUNC:\n"); fprintf(fp," for (Int_t i=0; i<nentries; i++) {\n"); fprintf(fp," nevents += GetEvent(i);\n"); fprintf(fp," if ((*analysis)(this)) break;\n"); fprintf(fp," }\n"); fprintf(fp," break;\n"); fprintf(fp," // # this should never happen ( unknown kind of pointer ) \n"); fprintf(fp," default:\n"); fprintf(fp," cerr << \"Error : Unknown kind of pointer to function\" << endl;\n"); fprintf(fp," break;\n"); fprintf(fp," }\n"); fprintf(fp," \n"); fprintf(fp," // # This is the event loop in interpreted code. \n"); fprintf(fp,"#else\n"); fprintf(fp," \n"); fprintf(fp," // # current CINT cannot deal with this \n"); fprintf(fp,"#if 0\n"); fprintf(fp," for (Int_t i=0; i<nentries; i++) {\n"); fprintf(fp," nevents += GetEvent(i);\n"); fprintf(fp," if ((*analysis)(this)) break; // current CINT cannot deal with it\n"); fprintf(fp," }\n"); fprintf(fp," // # so we need to use this \n"); fprintf(fp,"#else\n"); fprintf(fp," Int_t result;\n"); fprintf(fp," for (Int_t i=0; i<nentries; i++) {\n"); fprintf(fp," nevents += GetEvent(i);\n"); fprintf(fp," result = (*analysis)(this);\n"); fprintf(fp," if (result) break;\n"); fprintf(fp," }\n"); fprintf(fp,"#endif\n"); fprintf(fp," \n"); fprintf(fp,"#endif\n"); fprintf(fp," \n"); fprintf(fp," // # We are done, return. \n"); fprintf(fp," return nevents;\n"); fprintf(fp,"}\n"); fprintf(fp,"\n"); // # Generate class member function Show(Int_t event) fprintf(fp,"// # void %s::Show(Int_t event) \n",classname); fprintf(fp,"void %s::Show(Int_t event)\n",classname); fprintf(fp,"{\n"); fprintf(fp," // # Print contents of event ( all branches ). \n"); fprintf(fp," // # If event is not specified, print current event. \n"); fprintf(fp," if (!fTree) return;\n"); fprintf(fp," if (event>=0) fEvent = event; else event = fEvent;\n"); fprintf(fp," if (fEvent<0) return;\n"); fprintf(fp," fTree->SetBranchStatus(\"*\",1); // enable all branches\n"); fprintf(fp," fTree->Show(fEvent);\n"); fprintf(fp," fTree->SetBranchStatus(\"*\",0); // disable all branches\n"); fprintf(fp," // # Set branch statuses to 1 \n"); nb = t->GetListOfBranches().GetEntriesFast(); for (i=0;i<nb;i++) { branch = (TBranch*)t->GetListOfBranches().UncheckedAt(i); fprintf(fp," branch_%s = 1;\n",branch->GetName()); } fprintf(fp,"}\n"); fprintf(fp,"\n"); fprintf(fp,"#endif\n"); fprintf(fp,"\n"); fprintf(fp,"// # End of file %s \n",thead); // # *** Generate classname.cxx *** // # Generate class member function Loop() fprintf(fpc,"// # Include the %s class interface specification. \n",classname); fprintf(fpc,"#ifndef %s_cxx\n",classname); fprintf(fpc,"#define %s_cxx\n",classname); fprintf(fpc,"#endif\n"); fprintf(fpc,"#include \"%s\"\n",thead); fprintf(fpc,"#undef %s_cxx\n",classname); fprintf(fpc,"\n"); fprintf(fpc,"// # Place here all ROOT related includes that you need. \n"); fprintf(fpc,"#ifndef __CINT__\n\n"); fprintf(fpc,"#endif\n"); fprintf(fpc,"\n"); fprintf(fpc,"// # Int_t %s::Loop() \n",classname); fprintf(fpc,"Int_t %s::Loop()\n",classname); fprintf(fpc,"{\n"); // fprintf(fpc," if (!fTree) return;\n \n"); fprintf(fpc," // # Local variables. \n"); fprintf(fpc," Stat_t nentries = GetEntries(); // Number of entries in the Tree.\n"); fprintf(fpc," Int_t nevents = 0; // How many events were analysed.\n"); fprintf(fpc," \n"); fprintf(fpc," // # This is the loop skeleton. \n"); fprintf(fpc," for (Int_t i=0; i<nentries; i++) {\n"); fprintf(fpc," nevents += GetEvent(i);\n"); fprintf(fpc," \n"); fprintf(fpc," }\n"); fprintf(fpc," \n"); fprintf(fpc," // # We are done, return. \n"); fprintf(fpc," return nevents;\n"); fprintf(fpc,"}\n"); fprintf(fpc,"\n"); fprintf(fpc,"// # End of file %s \n",tcimp); printf("Files: %s and %s generated from Tree: %s\n",thead,tcimp,t->GetName()); delete [] thead; delete [] tcimp; delete [] treefile; fclose(fp); fclose(fpc); return 0; } // # End of file MakeClass.cxx ;;;; ;;;; minor mode: column (autoload 'display-column-mode "column" nil t) (display-column-mode 1) ;;;; (load "paren") ; automatic parenthesis matching library ;;;; ;;;; ... load the cc-mode mode ... (autoload 'c++-mode "cc-mode" "C++ Editing Mode" t) (autoload 'c-mode "cc-mode" "C Editing Mode" t) (autoload 'objc-mode "cc-mode" "Objective-C Editing Mode" t) ;;;; ... to be used with c++, c and objective-c files (setq auto-mode-alist (append '(("\\.C$" . c++-mode) ("\\.H$" . c++-mode) ("\\.cc$" . c++-mode) ("\\.hh$" . c++-mode) ("\\.c$" . c-mode) ("\\.h$" . c-mode) ("\\.m$" . objc-mode) ) auto-mode-alist)) ;;;; ;;;; My C and C++ outline-minor-mode settings ( Jacek M. Holeczek 1999 ). ;;;; ;;;; Outline mode headings are lines of C and C++ source code which contain, ;;;; at any position, C or C++ commentary headings ( that is `/*' or `//' ) ;;;; followed by one or more asterisk, hash or underscore characters ( mixing ;;;; of them is allowed ) : one character for major headings, two characters ;;;; for subheadings, etc., optionally followed by a (sub)heading description ;;;; ( see `my-c-c++-outline-regexp' and `my-c-c++-outline-level' below ). ;;;; All other C and C++ source code lines are body lines. ;;;; ;;(defvar my-c-c++-outline-regexp ;; "^.*/[\*/][ \t]*\\(\\)[\*#_]+\\([ \t]+.*$\\|$\\)") ;;(defun my-c-c++-outline-level () ;; (save-excursion ;; (looking-at outline-regexp) ;; (- (match-beginning 2) (match-end 1)))) ;;;; ;;;; Outline mode headings are lines of C and C++ source code which in the ;;;; beginning, not counting leading white space characters, contain C or ;;;; C++ commentary headings ( that is `/*' or `//' ) followed by one or ;;;; more asterisk, hash or underscore characters ( the count of these ;;;; characters does not matter, mixing of them is allowed ), optionally ;;;; followed by a (sub)heading description. The heading's nesting level is ;;;; calculated from the indentation of the C or C++ commentary ( see ;;;; `my-c-c++-outline-regexp' and `my-c-c++-outline-level' below ). ;;;; All other C and C++ source code lines are body lines. ;;;; (defvar my-c-c++-outline-regexp "^[ \t]*\\(\\)/[\*/][ \t]*[\*#_]+\\([ \t]+.*$\\|$\\)") (defun my-c-c++-outline-level () (save-excursion (looking-at outline-regexp) (string-width (buffer-substring (match-beginning 0) (match-end 1))))) ;;;; ;;;; Also the foldout.el is automatically loaded. It provides folding editor ;;;; extensions and mouse bindings for entering and exiting folds and for ;;;; showing and hiding text ( Meta-Control-Down-Mouse-{1,2,3} - see the ;;;; foldout.el source code for details ). ;;;; (add-hook 'c-mode-hook (function (lambda () (setq outline-regexp my-c-c++-outline-regexp) (setq outline-level 'my-c-c++-outline-level) (outline-minor-mode 1) (require 'foldout)))) (add-hook 'c++-mode-hook (function (lambda () (setq outline-regexp my-c-c++-outline-regexp) (setq outline-level 'my-c-c++-outline-level) (outline-minor-mode 1) (require 'foldout)))) ;;;; ;;;; End of my C and C++ outline-minor-mode settings. ;;;; ;;;; Highlighting by font-lock.el mode. (global-font-lock-mode t) (setq font-lock-support-mode 'lazy-lock-mode) (setq font-lock-maximum-decoration t) ;;;;
This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:33 MET