;;; tabbar.el --- Display a tab bar in the header line ;; Copyright (C) 2003 David Ponce ;; Author: David Ponce ;; Maintainer: David Ponce ;; Created: 25 February 2003 ;; Keywords: convenience ;; Revision: $Id: tabbar.el,v 1.20 2003/06/05 08:15:49 ponced Exp $ (defconst tabbar-version "1.3") ;; This file is not part of GNU Emacs. ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the GNU General Public License as ;; published by the Free Software Foundation; either version 2, or (at ;; your option) any later version. ;; This program is distributed in the hope that it will be useful, but ;; WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;; General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with this program; see the file COPYING. If not, write to ;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;;; Commentary: ;; ;; This library provides a minor mode to display tabs in the header ;; line. It works only on GNU Emacs 21. ;; ;; M-x `tabbar-mode' toggle the display of the tab bar, globally. ;; ;; M-x `tabbar-local-mode' toggle the display of the tab bar, locally ;; in the current buffer, when the global mode in on. This mode ;; permit to see the tab bar in a buffer where the header line is ;; already used by another mode (like `info' buffers). That command ;; is particularly useful when it is given a keyboard shortcut, like ;; this: ;; ;; (global-set-key [(control f10)] 'tabbar-local-mode) ;; ;; It is possible to navigate through tabs using commands (that is, ;; using the keyboard). The main commands to cycle through tabs are: ;; ;; - `tabbar-forward' select the next available tab. ;; - `tabbar-backward' select the previous available tab. ;; ;; It is worth defining keys for them. For example: ;; ;; (global-set-key [(control shift tab)] 'tabbar-backward) ;; (global-set-key [(control tab)] 'tabbar-forward) ;; ;; The default cycle is to first try to select the tab just ;; after/before the selected tab. If this is the last/first tab, then ;; the first/last tab of the next/previous group of tabs is selected. ;; That behavior is controlled by the `tabbar-cycling-scope' option. ;; ;; The following specialized commands can be useful too: ;; ;; - `tabbar-forward-tab'/`tabbar-backward-tab' ;; Navigate through visible tabs only. ;; ;; - `tabbar-forward-group'/`tabbar-backward-group' ;; Navigate through tab groups only. ;; ;; Core ;; ---- ;; ;; The content of the tab bar is represented by an internal data ;; structure: a tab set. A tab set is a collection of tabs, ;; identified by an unique name. In a tab set, at any time, one and ;; only one tab is designated as selected within the tab set. ;; ;; A tab is a simple data structure giving: the value of the tab, and ;; a reference to its tab set container. A tab value can be any Lisp ;; object, even if the most common value is probably a string. Each ;; tab object is guaranteed to be unique. ;; ;; A tab set is displayed on the tab bar through a "view" defined by ;; the index of the leftmost tab shown. Thus, it is possible to ;; scroll the tab bar horizontally, by changing the start index of the ;; tab set view. ;; ;; The visual representation of a tab set is a list a ;; `header-line-format' template elements. Each template element is ;; the visual representation of a tab. When the visual representation ;; of a tab is required, the function specified in the variable ;; `tabbar-tab-label-function' is called to obtain a label (a text ;; representation) for that tab. Also, the function specified in the ;; variable `tabbar-help-on-tab-function' is called when the mouse is ;; on a tab. That function is passed the tab and can return a help ;; string to display. Finally, when a tab is selected by clicking on ;; it, the function specified in the variable ;; `tabbar-select-tab-function' is called with the mouse event ;; received, and the tab. ;; ;; To increase performance, the tab set automatically maintains its ;; visual representation in a cache. As far as possible, that cache ;; is used to display the tab set, and refreshed only when necessary. ;; ;; Several tab sets can be maintained at the same time. Only one is ;; displayed on the tab bar, it is obtained by calling the function ;; specified in the variable `tabbar-current-tabset-function'. ;; ;; A special tab set is maintained, that contains the list of ;; currently selected tabs, in existing tab sets. For example, a such ;; tab set can be used to display a tab bar with a tab for each ;; created tab set, allowing to switch to another tab set by clicking ;; on the corresponding tab. ;; ;; Three buttons are displayed to the left, on the tab bar: the "home" ;; button, the "scroll left" and the "scroll right" buttons. The ;; "home" button is a general purpose button used to change something ;; on the tab bar. The scroll left and scroll right buttons are used ;; to scroll tabs horizontally. The following variables are ;; available, for respectively the `home', `scroll-left' and ;; `scroll-right' value of `