From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Juri Linkov Newsgroups: gmane.emacs.devel Subject: Tab bar (was: Neat features in Eclipse editor) Date: Sun, 06 Apr 2008 23:52:18 +0300 Organization: JURTA Message-ID: <87wsnaso3h.fsf@jurta.org> References: NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: ger.gmane.org 1207516695 16946 80.91.229.12 (6 Apr 2008 21:18:15 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sun, 6 Apr 2008 21:18:15 +0000 (UTC) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sun Apr 06 23:18:46 2008 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1JicG8-0007rN-M8 for ged-emacs-devel@m.gmane.org; Sun, 06 Apr 2008 23:18:43 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1JicFU-0003Dy-AW for ged-emacs-devel@m.gmane.org; Sun, 06 Apr 2008 17:18:00 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1JicDa-0002Eo-BG for emacs-devel@gnu.org; Sun, 06 Apr 2008 17:16:02 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1JicDY-0002E0-UL for emacs-devel@gnu.org; Sun, 06 Apr 2008 17:16:01 -0400 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1JicDY-0002Du-KX for emacs-devel@gnu.org; Sun, 06 Apr 2008 17:16:00 -0400 Original-Received: from relay01.kiev.sovam.com ([62.64.120.200]) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1JicDX-0004bw-Mi for emacs-devel@gnu.org; Sun, 06 Apr 2008 17:16:00 -0400 Original-Received: from [83.170.232.243] (helo=smtp.svitonline.com) by relay01.kiev.sovam.com with esmtp (Exim 4.67) (envelope-from ) id 1JicDU-000610-Td for emacs-devel@gnu.org; Mon, 07 Apr 2008 00:15:57 +0300 In-Reply-To: (Richard Stallman's message of "Sat, 22 Mar 2008 17:45:52 -0400") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.0.60 (x86_64-pc-linux-gnu) X-Scanner-Signature: f7ac1c8531115e886d66c625a92687ed X-DrWeb-checked: yes X-SpamTest-Envelope-From: juri@jurta.org X-SpamTest-Group-ID: 00000000 X-SpamTest-Header: Not Detected X-SpamTest-Info: Profiles 2569 [Apr 04 2008] X-SpamTest-Info: helo_type=3 X-SpamTest-Method: none X-SpamTest-Rate: 0 X-SpamTest-Status: Not detected X-SpamTest-Status-Extended: not_detected X-SpamTest-Version: SMTP-Filter Version 3.0.0 [0278], KAS30/Release X-detected-kernel: by monty-python.gnu.org: FreeBSD 4.8-5.1 (or MacOS X 10.2-10.3) X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:94508 Archived-At: --=-=-= I just created a small experimental Emacs Lisp library that emulates the tab bar feature provided by most modern web browsers, file managers and editors. Tabs are very popular nowadays mostly due to their ability to group units equivalent to Emacs frames into one frame and providing handles to switch them quickly inside one frame without having to switch top-level frames. Below is a screenshot how this feature currently looks in Emacs: --=-=-= Content-Type: image/png Content-Disposition: inline; filename=emacs-tab-bar.png Content-Transfer-Encoding: base64 Content-Description: EmacsTabBar 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 AAAAAElFTkSuQmCC --=-=-= A graphical tab bar has two special buttons: on the left side to create a new tab, and on the right side to close the current tab. Between them there is a row of tabs that represent different window configurations. The name of the tab is the name of the current buffer (just as the name of the current frame is the name of the current buffer), but a full list of names of all buffers in a window configuration is displayed in a pop-up window over the tab. Clicking the left mouse button switches between displayed tabs. The current tab is disabled since there is no sense to clink it, and also this provides the visual feedback for the currently selected tab. There is also a menu "Tabs" that duplicates the tab bar and can be used on non-graphical terminals. It binds `C-z t' to the command that creates a new tab, and `C-z c' to the command that closes the current tab. `C-z' with a number selects the corresponding tab. The original command `suspend-frame' is rebound to `C-z C-z'. --=-=-= Content-Type: image/png Content-Disposition: inline; filename=emacs-tab-bar-menu.png Content-Transfer-Encoding: base64 Content-Description: EmacsTabBarMenu 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 --=-=-= So far I'm satisfied with this feature because it implements the intuitive and natural behavior expected from the modern tab bar. As for details of the implementation, it currently depends on the availability of the external program `convert' used to render the tab bar elements. I hope it could be replaced with a separate bar similar to the tool-bar. I think we should do this as soon as possible because this single feature can improve Emacs usability for most users that expect a tab bar is a standard editor feature. --=-=-= Content-Type: application/emacs-lisp Content-Disposition: attachment; filename=tab-bar.el Content-Transfer-Encoding: quoted-printable ;;; tab-bar.el --- Tab bar mode for Emacs ;; Copyright (C) 2008 Juri Linkov ;; Author: Juri Linkov ;; Keywords: frames ;; Version: 1.0 ;; 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 3 of the License, 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. If not, see . ;;; Commentary: ;; ;;; Code: (defvar tab-bar-image-tab "iVBORw0KGgoAAAANSUhEUgAAAEkAAAAbCAIAAAC/VzV3AAAAAXNSR0IArs4c6QAAAJ9JREFU= WMPt 2KENgyEUBOBHW88ArIAgeQmBtRgEyx4sAQLBJkgkFX9Kk+oa/ty5J78cZxBjDPqklNJ7p2NjjPHe 7/P1AwshnGuLMRLR5n1tF2zOea7NOVdr3bYH3TewHRIhBHqDDTbsDb3Bhr2hN9hgw97wJmHD3tAb bH+ypZSY+egPPCLSWjNzSuk6n1LK1hozW2tv0JVSaq2Vc26tvQFQli+WwdTC9AAAAABJRU5ErkJg gg=3D=3D") (defvar tab-bar-image-tab-create "iVBORw0KGgoAAAANSUhEUgAAABsAAAAaCAIAAADJ6rCnAAAAAXNSR0IArs4c6QAAAghJREFU= SMfV lj1oE2EYx/+XBHS4NaCXoDTLgfFopR8SweLaUIwnLgYKQWuR21s/Stpi6GBxvsF0C9wkjQUhq9Sh oDUhOdNBNEVNz48MGUwGpfc+Dgf2WnPJ5cjiM73v/+X98bzP//3ims0mBho+DDr+B2LA3nn9ZkfX qx4okhSdGB87TrRwd2bnPBCz608BWNBDoq5Xb9+a/dluO00L5YMA9uVGKB8k3wkjURc2wwCMRD1x 7frm843jRABERESOmSgCto1QPghFMM2wkA1jBGz8PH0/MqsfompAmUFsGDgX8AN3d4GyX81Rwivx 89VvZ9RTuJBDbAcAtuMowZAbZJpdicyRePbFaSgzwDDwAwBiTxArC2rw0/RXRyIjYsS61jGHUg6K cHAg+LNljMCcG2X7jBjzWkegFq9H1LCfa+xN7Q0VhgKltxR3V8f04oJ9KLO69nHqC4D0w3ngJgC8 mgduZFbXQNS7jkvpe5qmtVotSy8UCunFhUeZx046c+k1z/NWQxRFa9RJ77HqleUH9kQARCIRWZaX l+531LsR/3qdTCad7GkfPaaiKDLq7jUjTdNqtVpH3L86z/O/fvdadaVSKRaL7i+eiYuXXe2eVCrl kljd/WAn+vrY4Q7R22vOd3J07JL+7n1f0A5ESYrmN55NTl7xcIdvbb2UpKjV5uzv9UDeGW7gP4A/ UXFisiIGSiwAAAAASUVORK5CYII=3D") (defvar tab-bar-image-tab-close "iVBORw0KGgoAAAANSUhEUgAAABsAAAAaCAIAAADJ6rCnAAAAAXNSR0IArs4c6QAAAhNJREFU= SMdj fP/+PQNVARMDtcFQMJEFmXPq9JnLl6+SYYqurraZqQm6iRDjUlPSyDBx9pxZDAwMEEMRJl6+fDU5 KeXz168MDAzSzN8ZPr19yi0DkeK8eYHx5qVvfnG4TPQPCNq4YR3ERJRw/A8DDDdOM1w8LHnv1P// /3nfPuNfPlFg/bz/eAH2cITL/ZfTYLx/g2n/OomTB5luXmF8+OirUwiyNjSALIXdjY9ZhH/r2f3/ /Jnl1EGmu7d/OPi/i8ok143/oHL/mNgYXr1heP2O4c0Hxpfv4OKkufHf/////v/79/+f5PObbLM7 GF+8/qui/4+Rm33OfPGmeogUVvT/3z8CvmbZsIDxxpXfzoEPKyf8LGxg/P2ffdliimLmj0soo5J+ /P5TDOdKGRgYZvVPZr56BSJVW12GrKW5tQvN19jDMWHukmXLls2K/AIR3759+/p3r5v+/a+rLV+2 bNmXLwjx2uqypubOfwTdCAE8PDwQhrq6OrJDMMUJ+LqhvhLZIQwMDEpKSoGBgfV1FVjF8ZkIiWsI ++vXr8hSEOdERUVhKSb0TZDjGks4Llu27N69e2jaeHh4WlpasCbGn78I+frSpUvnzp0jvuAxM7f9 T0zMJCQkEGni1Wt3CORrUgtHwnHNyMRhbGJ1+cotkgzFYqKurvb6dWvs7BzIKMMPHTqgq6sNYTMi 19dUqWcYqd4CAADTF+GOC37qSAAAAABJRU5ErkJggg=3D=3D") (defvar tab-bar-map-prefix "\C-z") (defvar tab-bar-prefix-map (let ((map (make-sparse-keymap))) (define-key map tab-bar-map-prefix (global-key-binding tab-bar-map-pref= ix)) map)) (defvar tab-bar-menu-bar-map (let ((map (make-sparse-keymap))) (define-key map [tabs] (cons "Tabs" tab-bar-prefix-map)) map)) (defvar tab-bar-map (let ((map (make-sparse-keymap))) (define-key map tab-bar-map-prefix tab-bar-prefix-map) (define-key map [menu-bar] tab-bar-menu-bar-map) map) "Keymap for the tab bar.") (define-minor-mode tab-bar-mode "Toggle use of the tab bar. With numeric ARG, display the tab bar if and only if ARG is positive." :global t :group 'frames :keymap tab-bar-map (and (display-images-p) (tool-bar-mode 1) (if (and tab-bar-mode (display-graphic-p)) (tab-bar-setup)))) (defvar tab-bar-tabs nil) (defvar tab-bar-tab-current nil) (defvar tab-bar-tab-index ?0) (defvar tab-bar-image-tab-file nil) (defvar tab-bar-image-tab-create-data nil) (defvar tab-bar-image-tab-close-data nil) (defun tab-bar-setup () (let ((coding-system-for-write 'no-conversion)) (with-temp-file (setq tab-bar-image-tab-file (make-temp-file "tab")) (insert (base64-decode-string tab-bar-image-tab))) (setq tab-bar-image-tab-create-data (base64-decode-string tab-bar-image= -tab-create)) (setq tab-bar-image-tab-close-data (base64-decode-string tab-bar-image-= tab-close))) (define-key-after tab-bar-prefix-map (vector ?t) `(menu-item "Create tab" tab-bar-tab-create :image ,(create-image tab-bar-image-tab-create-data 'png t)= )) (tab-bar-tab-create) (define-key-after tab-bar-prefix-map (vector ?c) `(menu-item "Close tab" (lambda () (interactive) (define-key tab-bar-prefix-map (vector tab-bar-tab-curren= t) nil) (redraw-frame (selected-frame))) :image ,(create-image tab-bar-image-tab-close-data 'png t))) (setq tool-bar-map tab-bar-prefix-map)) (defun tab-bar-tab-create () (interactive) (setq tab-bar-tab-current (setq tab-bar-tab-index (1+ tab-bar-tab-index))) (let ((form '(setq tab-bar-tabs (cons (list tab-bar-tab-current (buffer-name (current-buffer)) (current-window-configuration) (delq nil (mapcar (lambda (b) (and (buffer-live-p= b) b)) (frame-parameter (selected-fram= e) 'buffer-list))) (delq nil (mapcar (lambda (b) (and (buffer-live-p= b) b)) (frame-parameter (selected-fram= e) 'buried-buffer= -list)))) (assq-delete-all tab-bar-tab-current tab-bar-tab= s))))) (eval form) (define-key-after tab-bar-prefix-map (vector tab-bar-tab-index) `(menu-item ,(buffer-name (current-buffer)) ,`(lambda () (interactive) ,form (let ((current (assq (setq tab-bar-tab-current ,tab-bar-tab-index) tab-ba= r-tabs))) (set-window-configuration (nth 2 current)) (modify-frame-parameters (selected-frame) (list (cons 'buffer-list (delq nil (mapcar (lambda= (b) (and = (buffer-live-p b) b)) (nth 3 = current)))))) (modify-frame-parameters (selected-frame) (list (cons 'buried-buffer-list (delq nil (mapcar (lambda= (b) (and = (buffer-live-p b) b)) (nth 4 = current))))))) (redraw-frame (selected-frame))) :image ,(tab-bar-create-tab-image (buffer-name (current-b= uffer))) :enable ,`(not (equal tab-bar-tab-current ,tab-bar-tab-in= dex)) :help ,(mapconcat (lambda (w) (buffer-name (window-buffer= w))) (window-list) ", ")) (1- tab-bar-tab-index))) (redraw-frame (selected-frame))) (defvar tab-bar-image-cache nil) (defun tab-bar-create-tab-image (name) (or (cdr (assoc name tab-bar-image-cache)) (let* ((coding-system-for-read 'no-conversion) (tab-image (create-image (string-make-unibyte (shell-command-to-string (format "convert -background '#f0f0f0f0' -fill black -gravity cen= ter -size 73x27 caption:\"%s\" +size %s +swap -gravity south -composite png= :-" name tab-bar-image-tab-file))) 'png t))) (push (cons name tab-image) tab-bar-image-cache) tab-image))) (provide 'tab-bar) ;;; tab-bar.el ends here --=-=-= -- Juri Linkov http://www.jurta.org/emacs/ --=-=-=--