From 94b05b65efebc19f815f24350bca5473bb28fb46 Mon Sep 17 00:00:00 2001 From: Tom Willemsen Date: Tue, 20 Sep 2011 01:08:06 +0200 Subject: Split off emacs configs to dotemacs --- .emacs.d/elisp/ide-skel.el | 4016 -------------------------------------------- 1 file changed, 4016 deletions(-) delete mode 100644 .emacs.d/elisp/ide-skel.el (limited to '.emacs.d/elisp/ide-skel.el') diff --git a/.emacs.d/elisp/ide-skel.el b/.emacs.d/elisp/ide-skel.el deleted file mode 100644 index 90be871..0000000 --- a/.emacs.d/elisp/ide-skel.el +++ /dev/null @@ -1,4016 +0,0 @@ -;; ide-skel.el --- IDE skeleton for Emacs Lisp hackers - -;; Copyright (C) 2008 Peter Karpiuk, Scott Tiger S.A. - -;; Author: Peter Karpiuk -;; Maintainer: Peter Karpiuk -;; Created: 24 Apr 2008 -;; Version 0.6.0 -;; Keywords: ide speedbar - -;; GNU Emacs 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. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - -;;; Commentary: - -;; Ide-skel is a skeleton (or framework) of IDE for Emacs users. -;; Like Eclipse, it can be used as is with some predefined plugins -;; on board, but is designed to extend by Emacs Lisp programmers to -;; suite their own needs. Emacs 22 only, tested under Linux only -;; (under Windows ide-skel.el will rather not work, sorry). -;; -;; ** Configuration in .emacs -;; -;; (require 'ide-skel) -;; -;; ;; optional, but useful - see Emacs Manual -;; (partial-completion-mode) -;; (icomplete-mode) -;; -;; ;; for convenience -;; (global-set-key [f4] 'ide-skel-proj-find-files-by-regexp) -;; (global-set-key [f5] 'ide-skel-proj-grep-files-by-regexp) -;; (global-set-key [f10] 'ide-skel-toggle-left-view-window) -;; (global-set-key [f11] 'ide-skel-toggle-bottom-view-window) -;; (global-set-key [f12] 'ide-skel-toggle-right-view-window) -;; (global-set-key [C-next] 'tabbar-backward) -;; (global-set-key [C-prior] 'tabbar-forward) -;; -;; ** Side view windows -;; -;; Left and right view windows are "speedbars" - they are embedded -;; inside main Emacs frame and can be open/closed independently. -;; Right view window summarizes information related to the current -;; editor buffer - it can present content of such buffer in another -;; way (eg. Imenu tree), or show an extra panel for buffer major -;; mode operations (see SQL*Plus mode plugin example). Left view -;; window contains buffers such like buffer list (yet another, -;; popular way for switching buffers), filesystem/project browser -;; for easy navigation, or Info documentation browser, -;; or... whatever you wish. -;; -;; Side view windows are special - they cannot take focus and we can -;; operate on it only with mouse (!). Some window operations like -;; delete-other-windows (C-x 1) are slighty modified to treat side -;; view windows specially. -;; -;; ** Bottom view window -;; -;; Let auxiliary buffers (*shell*, *Messages*, *Help*, *Compilation* -;; and another buffers with '*' in name) pop up/show in bottom -;; window only. BUT, if you want, you can open any buffer in any -;; window (except side windows) as usual - that's only nice -;; heuristic, not pressure. -;; -;; Bottom view window remembers last selected buffer within it, so -;; if you close this window and open later, it will show you buffer -;; which you expect. -;; -;; ** Tabbars -;; -;; Ide-skel uses (great) tabbar.el package with some modifications: -;; -;; - there is no division into major mode groups (like in -;; Eclipse), -;; -;; - side view windows, bottom view window and editor windows have -;; different tabsets, -;; -;; - you can scroll tabs with mouse wheel, -;; -;; - the Home button in window left corner acts as window menu -;; (you can add your items to it in your plugin), -;; -;; - mouse-3 click on tab kills its buffer -;; -;; * Project -;; -;; Here, "project" means a directory tree checked out from CVS or -;; SVN. One project can contain source files of many types. When -;; we edit any project file, Emacs can easily find the project root -;; directory simply by looking at filesystem. -;; -;; So, we can execute many commands (grep, find, replace) on all -;; project source files or on all project source files of the same -;; type as file edited now (see Project menu). Ide-skel package -;; also automatically configures partial-completion-mode for project -;; edited now. -;; -;; There is no configuration for concrete projects needed (and -;; that's great advantage in my opinion). - -;; If you find this package useful, send me a postcard to address: -;; -;; Peter Karpiuk -;; Scott Tiger S.A. -;; ul. Gawinskiego 8 -;; 01-645 Warsaw -;; Poland - - -;; * Notes for Emacs Lisp hackers -;; -;; Each side window buffer should have: -;; -;; - name that begins with space, -;; -;; - tab label (string) - buffer local IDE-SKEL-TABBAR-TAB-LABEL -;; variable, -;; -;; - keep condition function (IDE-SKEL-KEEP-CONDITION-FUNCTION), -;; -;; - menu (IDE-SKEL-TABBAR-MENU-FUNCTION) - optional. -;; -;; Side window buffer is enabled (can be choosed by mouse click on -;; his tab) if it has buffer local variable IDE-SKEL-TABBAR-ENABLED -;; set to non-nil. There may be many live side window buffers, but -;; unavailable in current context ("context" means buffer edited in -;; editor window) if they have IDE-SKEL-TABBAR-ENABLED set to nil. -;; -;; Hiding side window operation disables all window buffers. "Show -;; side window" event handler should enable (and maybe create) side -;; window buffers based on current context. When you switch to -;; other buffer in editor window (switching the context), all side -;; window buffers for which keep condition function returns nil are -;; disabled. Handlers for EDITOR-BUFFER-CHANGED event should enable -;; (and maybe create) additional buffers based on current context. -;; -;; ** Side window events -;; -;; Event handlers should be implemented as an abnormal hook: -;; -;; ide-skel-side-view-window-functions -;; -;; It should be function with parameters -;; -;; - side: symbol LEFT or RIGHT -;; -;; - event-type: symbol for event: -;; SHOW/EDITOR-BUFFER-CHANGED/TAB-CHANGE/HIDE -;; -;; - list (optional): event parameters specific for event type. -;; -;; Events are send only for opened (existing and visible) windows. -;; -;; Hook functions are called in order until one of them returns -;; non-nil. -;; -;; *** Show -;; -;; After side window open. Event handler should enable (and maybe -;; create) buffers appropriate for current context. After event -;; handle, if no side window buffer is selected, there will be -;; selected one of them. No parameters. -;; -;; *** Editor Buffer Changed -;; -;; After editor buffer changed (aka context switch). -;; -;; Before event, buffers for which keep condition function returns -;; nil, are disabled. Event handler should enable (and maybe -;; create) buffers appropriate for new context. -;; -;; Parameters: before-buffer current-buffer. -;; -;; *** Tab Change -;; -;; Before side window buffer change (as result of mouse click on tab -;; or ide-skel-side-window-switch-to-buffer function call). -;; Parameters: current-buffer new-buffer -;; -;; *** Hide -;; -;; Before side window hiding. After event handling, all side window -;; buffers are disabled. -;; -;; *** Functions & vars -;; -;; In plugins, you can use variables with self-descriptive names: -;; -;; ide-skel-selected-frame -;; ide-skel-current-editor-window -;; ide-skel-current-editor-buffer -;; ide-skel-current-left-view-window -;; ide-skel-current-right-view-window -;; -;; Moreover, when user selects another buffer to edit, the -;; -;; ide-skel-editor-buffer-changed-hook -;; -;; hook is run. It is similar to "editor buffer changed" event, but -;; has no parameters and is run even when all side windows are -;; closed. -;; -;; **** Functions -;; -;; ide-skel-side-window-switch-to-buffer (side-window buffer) -;; Switch buffer in side window (please use only this function for -;; this operation). -;; -;; ide-skel-get-side-view-buffer-create (name side-sym tab-label -;; help-string keep-condition-function) -;; Create new buffer for side view window. NAME should begin with -;; space, side sym should be LEFT or RIGHT. -;; -;; **** Local variables in side window buffers -;; -;; ide-skel-tabbar-tab-label -;; ide-skel-tabbar-tab-help-string -;; ide-skel-tabbar-menu-function -;; ide-skel-tabbar-enabled -;; ide-skel-keep-condition-function - -(require 'cl) -(require 'complete) -(require 'tree-widget) -(require 'tabbar) -(require 'recentf) - -(defgroup ide-skel nil - "Ide Skeleton" - :group 'tools - :version 21) - -(defcustom ide-skel-tabbar-hidden-buffer-names-regexp-list '("^TAGS" "^diary$") - "Buffer name that matches any of this regexps, will have no tab." - :group 'ide-skel - :tag "Hidden Buffer Names Regexp List" - :type '(repeat regexp) - :initialize 'custom-initialize-default - :set (lambda (symbol value) - (when tabbar-mode - (tabbar-init-tabsets-store)) - (set-default symbol value))) - -(defcustom ide-skel-bottom-view-buffer-names-regexps '("\\*.*\\*") - "Buffers with names matched by one of this regexps will be shown in bottom view." - :group 'ide-skel - :tag "Bottom View Buffer Names Regexps" - :type '(repeat regexp) - :initialize 'custom-initialize-default - :set (lambda (symbol value) - (when tabbar-mode - (tabbar-init-tabsets-store)) - (set-default symbol value)) - ) - -(defcustom ide-skel-bottom-view-buffer-names-disallowed-regexps '("\\*info\\*" "\\*Backtrace\\*") - "Buffers with names matched by one of this regexps will NOT be shown in bottom view." - :group 'ide-skel - :tag "Bottom View Buffer Names Disallowed Regexps" - :type '(repeat regexp) - :initialize 'custom-initialize-default - :set (lambda (symbol value) - (when tabbar-mode - (tabbar-init-tabsets-store)) - (set-default symbol value)) - ) - -(defconst ide-skel-left-view-window-tabset-name "LeftView") -(defconst ide-skel-right-view-window-tabset-name "RightView") -(defconst ide-skel-bottom-view-window-tabset-name "BottomView") -(defconst ide-skel-editor-window-tabset-name "Editor") - -(defun ide-skel-shine-color (color percent) - (when (equal color "unspecified-bg") - (setq color (if (< percent 0) "white" "black"))) - (apply 'format "#%02x%02x%02x" - (mapcar (lambda (value) - (min 65535 (max 0 (* (+ (/ value 650) percent) 650)))) - (color-values color)))) - -(defun ide-skel-color-percentage (color) - (truncate (* (/ (/ (reduce '+ (color-values color)) 3.0) 65535.0) 100.0))) - -(defun ide-skel-shine-face-background (face-sym percent) - (when (>= (ide-skel-color-percentage (face-background 'default)) 50) - (setq percent (- percent))) - (set-face-attribute face-sym nil - :background (ide-skel-shine-color (face-background 'default) percent))) - -(defun ide-skel-shine-face-foreground (face-sym percent) - (when (>= (ide-skel-color-percentage (face-foreground 'default)) 50) - (setq percent (- percent))) - (set-face-attribute face-sym nil - :foreground (ide-skel-shine-color (face-foreground 'default) percent))) - - -(defvar ide-skel-tabbar-tab-label-max-width 25 - "Max width for tab label. Nil means no limit. If label width is too big, it will be shortened with ... inside.") - -(defvar ide-skel-tabbar-tab-label nil - "Tab name. Local for buffer in side view window.") -(make-variable-buffer-local 'ide-skel-tabbar-tab-label) - -(defvar ide-skel-tabbar-tab-help-string nil - "Tooltip text for tab in side view window. Buffer local.") -(make-variable-buffer-local 'ide-skel-tabbar-tab-help-string) - -(defvar ide-skel-tabset-name nil) -(make-variable-buffer-local 'ide-skel-tabset-name) - -(defvar ide-skel-tabbar-menu-function nil) -(make-variable-buffer-local 'ide-skel-tabbar-menu-function) - -(defvar ide-skel-tabbar-enabled nil) -(make-variable-buffer-local 'ide-skel-tabbar-enabled) - -(defvar ide-skel-keep-condition-function nil) -(make-variable-buffer-local 'ide-skel-keep-condition-function) - -(defvar ide-skel-current-left-view-window nil) -(defvar ide-skel-current-right-view-window nil) -(defvar ide-skel-current-editor-window nil) -(defvar ide-skel-current-editor-buffer nil) -(defvar ide-skel-selected-frame nil) - -(defconst ide-skel-left-view-window-xpm "\ -/* XPM */ -static char * left_view_xpm[] = { -\"24 24 145 2\", -\" c None\", -\". c #000000\", -\"+ c #FBFED6\", -\"@ c #F3F6CE\", -\"# c #EBEEC7\", -\"$ c #E3E7BF\", -\"% c #DCE0B9\", -\"& c #D5D9B2\", -\"* c #FFFFFF\", -\"= c #FDFDFD\", -\"- c #F9F9F9\", -\"; c #F4F4F4\", -\"> c #DDDDDD\", -\", c #F2F5CD\", -\"' c #E4E8C0\", -\") c #DDE1BA\", -\"! c #D7DAB4\", -\"~ c #D1D4AE\", -\"{ c #FEFEFE\", -\"] c #FBFBFB\", -\"^ c #F8F8F8\", -\"/ c #F5F5F5\", -\"( c #F2F2F2\", -\"_ c #DBDBDB\", -\": c #E9EDC5\", -\"< c #D8DBB5\", -\"[ c #D2D5AF\", -\"} c #CDD0AA\", -\"| c #FCFCFC\", -\"1 c #F6F6F6\", -\"2 c #F3F3F3\", -\"3 c #F0F0F0\", -\"4 c #DADADA\", -\"5 c #E1E5BD\", -\"6 c #CDD0AB\", -\"7 c #C8CCA6\", -\"8 c #FAFAFA\", -\"9 c #F7F7F7\", -\"0 c #EFEFEF\", -\"a c #D9D9D9\", -\"b c #DADDB6\", -\"c c #C4C7A2\", -\"d c #EDEDED\", -\"e c #D7D7D7\", -\"f c #D3D6B0\", -\"g c #CFD3AD\", -\"h c #CBCFA9\", -\"i c #C8CBA6\", -\"j c #C0C39F\", -\"k c #F1F1F1\", -\"l c #EEEEEE\", -\"m c #ECECEC\", -\"n c #D6D6D6\", -\"o c #C9CDA7\", -\"p c #C6C9A4\", -\"q c #C3C6A1\", -\"r c #BFC39E\", -\"s c #BCBF9B\", -\"t c #EAEAEA\", -\"u c #D4D4D4\", -\"v c #C7CAA5\", -\"w c #C1C5A0\", -\"x c #BEC29D\", -\"y c #BBBF9B\", -\"z c #B9BC98\", -\"A c #EBEBEB\", -\"B c #E8E8E8\", -\"C c #D3D3D3\", -\"D c #C2C5A0\", -\"E c #BDC09C\", -\"F c #BABE99\", -\"G c #B8BB97\", -\"H c #B5B895\", -\"I c #E9E9E9\", -\"J c #E7E7E7\", -\"K c #D1D1D1\", -\"L c #BBBE9A\", -\"M c #B7BA96\", -\"N c #B4B794\", -\"O c #B2B592\", -\"P c #E5E5E5\", -\"Q c #D0D0D0\", -\"R c #B3B693\", -\"S c #B1B491\", -\"T c #AFB28F\", -\"U c #E3E3E3\", -\"V c #CECECE\", -\"W c #B4B793\", -\"X c #B0B390\", -\"Y c #AEB18F\", -\"Z c #ACAF8D\", -\"` c #E6E6E6\", -\" . c #E4E4E4\", -\".. c #E2E2E2\", -\"+. c #CDCDCD\", -\"@. c #ADB08E\", -\"#. c #ABAE8C\", -\"$. c #AAAD8B\", -\"%. c #E0E0E0\", -\"&. c #CBCBCB\", -\"*. c #A9AC8A\", -\"=. c #A7AA89\", -\"-. c #DEDEDE\", -\";. c #CACACA\", -\">. c #ABAE8B\", -\",. c #A8AB89\", -\"'. c #A6A988\", -\"). c #A5A887\", -\"!. c #C8C8C8\", -\"~. c #A7AA88\", -\"{. c #A6A987\", -\"]. c #A4A786\", -\"^. c #A3A685\", -\"/. c #DFDFDF\", -\"(. c #C7C7C7\", -\"_. c #A5A886\", -\":. c #A2A584\", -\"<. c #A1A483\", -\"[. c #C6C6C6\", -\"}. c #A4A785\", -\"|. c #A0A382\", -\"1. c #9FA282\", -\"2. c #D8D8D8\", -\"3. c #C4C4C4\", -\"4. c #A3A684\", -\"5. c #A2A484\", -\"6. c #A0A383\", -\"7. c #9EA181\", -\"8. c #9DA080\", -\"9. c #C3C3C3\", -\"0. c #8D8F72\", -\"a. c #8C8E72\", -\"b. c #8B8D71\", -\"c. c #8A8C70\", -\"d. c #898B6F\", -\"e. c #888A6F\", -\"f. c #C5C5C5\", -\"g. c #C2C2C2\", -\"h. c #C1C1C1\", -\"i. c #C0C0C0\", -\"j. c #BEBEBE\", -\"k. c #BDBDBD\", -\"l. c #BBBBBB\", -\"m. c #BABABA\", -\"n. c #ABABAB\", -\" \", -\" . . . . . . . . . . . . . . . . . . . . . . \", -\". + @ # $ % & . * * * * * * * * * * = - ; ; > . \", -\". , # ' ) ! ~ . * * * * * * * * * { ] ^ / ( _ . \", -\". : $ ) < [ } . * * * * * * * * * | - 1 2 3 4 . \", -\". 5 % ! [ 6 7 . * * * * * * * * = 8 9 ; 3 0 a . \", -\". b & ~ } 7 c . * * * * * * * { ] ^ / ( 0 d e . \", -\". f g h i c j . * * * * * * * | - 1 2 k l m n . \", -\". } o p q r s . * * * * * * = 8 9 ; 3 0 m t u . \", -\". v c w x y z . * * * * * = 8 9 / ( 0 d A B C . \", -\". D r E F G H . * * * * { ] ^ / 2 3 l A I J K . \", -\". E L z M N O . * * * { ] ^ 1 2 3 l m I J P Q . \", -\". z M H R S T . * * { ] ^ 1 2 k l m t B P U V . \", -\". H W O X Y Z . * = ] ^ 1 2 k 0 m t B ` ...+.. \", -\". O X T @.#.$.. = 8 ^ 1 2 k 0 m t B ` ...%.&.. \", -\". T @.Z $.*.=.. 8 9 / 2 k 0 m t B ` ...%.-.;.. \", -\". Z >.*.,.'.).. 9 / 2 3 l m t B ` ...%.-.> !.. \", -\". *.,.~.{.].^.. ; ( 3 l m t B ` ...%./.> _ (.. \", -\". ~.{._.^.:.<.. k 0 l m t B ` ...%./.> _ a [.. \", -\". _.}.:.<.|.1.. 0 d A I B ` ...%./.> _ a 2.3.. \", -\". 4.5.6.1.7.8.. m A I J P ...%.-.> _ a 2.n 9.. \", -\". 0.a.b.c.d.e.. +.&.;.!.(.f.3.g.h.i.j.k.l.m.n.. \", -\" . . . . . . . . . . . . . . . . . . . . . . \", -\" \"}; -" - "XPM format image used as left view window icon") - -(defconst ide-skel-left-view-window-image - (create-image ide-skel-left-view-window-xpm 'xpm t)) - -(defconst ide-skel-right-view-window-xpm "\ -/* XPM */ -static char * right_view_xpm[] = { -\"24 24 125 2\", -\" c None\", -\". c #000000\", -\"+ c #FFFFFF\", -\"@ c #A8AB89\", -\"# c #A6A987\", -\"$ c #A4A785\", -\"% c #A2A484\", -\"& c #A0A282\", -\"* c #919376\", -\"= c #A7AA88\", -\"- c #A5A886\", -\"; c #A2A584\", -\"> c #A0A383\", -\", c #9FA181\", -\"' c #909275\", -\") c #A3A685\", -\"! c #A1A483\", -\"~ c #9FA282\", -\"{ c #9DA080\", -\"] c #8F9174\", -\"^ c #A4A786\", -\"/ c #A0A382\", -\"( c #9EA181\", -\"_ c #9C9F7F\", -\": c #8E9073\", -\"< c #FEFEFE\", -\"[ c #9B9E7F\", -\"} c #8D8F73\", -\"| c #FCFCFC\", -\"1 c #A1A484\", -\"2 c #9EA180\", -\"3 c #9A9D7E\", -\"4 c #8C8E72\", -\"5 c #FDFDFD\", -\"6 c #FAFAFA\", -\"7 c #9B9E7E\", -\"8 c #999C7D\", -\"9 c #8B8D71\", -\"0 c #F7F7F7\", -\"a c #9FA281\", -\"b c #9A9C7D\", -\"c c #989B7C\", -\"d c #8A8C70\", -\"e c #FBFBFB\", -\"f c #F8F8F8\", -\"g c #F5F5F5\", -\"h c #9C9E7F\", -\"i c #9A9D7D\", -\"j c #979A7B\", -\"k c #898B70\", -\"l c #F6F6F6\", -\"m c #F3F3F3\", -\"n c #999C7C\", -\"o c #96997A\", -\"p c #888A6F\", -\"q c #F1F1F1\", -\"r c #9B9D7E\", -\"s c #989A7B\", -\"t c #959779\", -\"u c #87896E\", -\"v c #EFEFEF\", -\"w c #959879\", -\"x c #949678\", -\"y c #86886D\", -\"z c #ECECEC\", -\"A c #97997B\", -\"B c #949778\", -\"C c #939577\", -\"D c #85876C\", -\"E c #EAEAEA\", -\"F c #95987A\", -\"G c #919476\", -\"H c #84876C\", -\"I c #F9F9F9\", -\"J c #F0F0F0\", -\"K c #EEEEEE\", -\"L c #E8E8E8\", -\"M c #949779\", -\"N c #939578\", -\"O c #929476\", -\"P c #909375\", -\"Q c #83866B\", -\"R c #F4F4F4\", -\"S c #F2F2F2\", -\"T c #E6E6E6\", -\"U c #939678\", -\"V c #929477\", -\"W c #909376\", -\"X c #8F9275\", -\"Y c #82856A\", -\"Z c #E4E4E4\", -\"` c #8E9174\", -\" . c #818469\", -\".. c #EDEDED\", -\"+. c #EBEBEB\", -\"@. c #E9E9E9\", -\"#. c #E2E2E2\", -\"$. c #8D9073\", -\"%. c #808368\", -\"&. c #E7E7E7\", -\"*. c #E5E5E5\", -\"=. c #E0E0E0\", -\"-. c #8C8F72\", -\";. c #7F8268\", -\">. c #D6D6D6\", -\",. c #D5D5D5\", -\"'. c #D4D4D4\", -\"). c #D2D2D2\", -\"!. c #D1D1D1\", -\"~. c #D0D0D0\", -\"{. c #CECECE\", -\"]. c #CDCDCD\", -\"^. c #CBCBCB\", -\"/. c #CACACA\", -\"(. c #C8C8C8\", -\"_. c #C7C7C7\", -\":. c #C5C5C5\", -\"<. c #C4C4C4\", -\"[. c #C2C2C2\", -\"}. c #7D8066\", -\"|. c #7C7F65\", -\"1. c #7B7E64\", -\"2. c #7B7D64\", -\"3. c #7A7C63\", -\"4. c #70725B\", -\" \", -\" . . . . . . . . . . . . . . . . . . . . . . \", -\". + + + + + + + + + + + + + + + . @ # $ % & * . \", -\". + + + + + + + + + + + + + + + . = - ; > , ' . \", -\". + + + + + + + + + + + + + + + . # ) ! ~ { ] . \", -\". + + + + + + + + + + + + + + + . ^ ; / ( _ : . \", -\". + + + + + + + + + + + + + + < . ) ! ~ { [ } . \", -\". + + + + + + + + + + + + + + | . 1 & 2 _ 3 4 . \", -\". + + + + + + + + + + + + + 5 6 . > ( _ 7 8 9 . \", -\". + + + + + + + + + + + + 5 6 0 . a { 7 b c d . \", -\". + + + + + + + + + + + < e f g . { h i c j k . \", -\". + + + + + + + + + + < e f l m . _ 3 n j o p . \", -\". + + + + + + + + + < e f l m q . r 8 s o t u . \", -\". + + + + + + + + 5 e f l m q v . 8 c o w x y . \", -\". + + + + + + + 5 6 f l m q v z . c A w B C D . \", -\". + + + + + < | 6 0 g m q v z E . A F B C G H . \", -\". + + + + 5 e I 0 g m J K z E L . F M N O P Q . \", -\". + + < | 6 f l R S J K z E L T . M U V W X Y . \", -\". < 5 e I 0 g m q v K z E L T Z . U V * X ` .. \", -\". e I f l R S q v ..+.@.L T Z #.. V * X ` $.%.. \", -\". f l g m q J K z +.@.&.*.Z #.=.. W X ` $.-.;.. \", -\". >.,.'.).!.~.{.].^./.(._.:.<.[.. }.|.1.2.3.4.. \", -\" . . . . . . . . . . . . . . . . . . . . . . \", -\" \"}; -" - "XPM format image used as right view window icon") - -(defconst ide-skel-right-view-window-image - (create-image ide-skel-right-view-window-xpm 'xpm t)) - -(defconst ide-skel-bottom-view-window-xpm "\ -/* XPM */ -static char * bottom_view_xpm[] = { -\"24 24 130 2\", -\" c None\", -\". c #000000\", -\"+ c #FFFFFF\", -\"@ c #FDFDFD\", -\"# c #F9F9F9\", -\"$ c #F6F6F6\", -\"% c #F4F4F4\", -\"& c #DDDDDD\", -\"* c #FEFEFE\", -\"= c #FBFBFB\", -\"- c #F8F8F8\", -\"; c #F5F5F5\", -\"> c #F2F2F2\", -\", c #DBDBDB\", -\"' c #FCFCFC\", -\") c #F3F3F3\", -\"! c #F0F0F0\", -\"~ c #DADADA\", -\"{ c #FAFAFA\", -\"] c #F7F7F7\", -\"^ c #F1F1F1\", -\"/ c #EFEFEF\", -\"( c #D9D9D9\", -\"_ c #EDEDED\", -\": c #D7D7D7\", -\"< c #EEEEEE\", -\"[ c #ECECEC\", -\"} c #D6D6D6\", -\"| c #EAEAEA\", -\"1 c #D4D4D4\", -\"2 c #EBEBEB\", -\"3 c #E8E8E8\", -\"4 c #D3D3D3\", -\"5 c #E9E9E9\", -\"6 c #E7E7E7\", -\"7 c #D1D1D1\", -\"8 c #E5E5E5\", -\"9 c #D0D0D0\", -\"0 c #E3E3E3\", -\"a c #CECECE\", -\"b c #E6E6E6\", -\"c c #E4E4E4\", -\"d c #E2E2E2\", -\"e c #CDCDCD\", -\"f c #E0E0E0\", -\"g c #CBCBCB\", -\"h c #CCCFAB\", -\"i c #CACDAA\", -\"j c #C8CBA8\", -\"k c #C7CAA7\", -\"l c #C5C8A5\", -\"m c #C3C6A4\", -\"n c #C2C5A3\", -\"o c #C0C3A1\", -\"p c #BEC1A0\", -\"q c #BDBF9E\", -\"r c #BBBE9D\", -\"s c #B9BC9B\", -\"t c #B8BA9A\", -\"u c #B6B999\", -\"v c #B4B797\", -\"w c #B3B596\", -\"x c #B1B495\", -\"y c #B0B293\", -\"z c #AEB192\", -\"A c #ADAF91\", -\"B c #ABAE8F\", -\"C c #9C9E82\", -\"D c #C9CCA8\", -\"E c #C6C9A6\", -\"F c #C4C7A5\", -\"G c #C1C4A2\", -\"H c #BFC2A1\", -\"I c #BEC19F\", -\"J c #BCBF9E\", -\"K c #BABD9C\", -\"L c #B7BA9A\", -\"M c #B6B998\", -\"N c #ABAE90\", -\"O c #AAAD8E\", -\"P c #9A9D81\", -\"Q c #C2C4A2\", -\"R c #BFC1A0\", -\"S c #BDC09F\", -\"T c #BCBE9D\", -\"U c #B9BB9B\", -\"V c #B7BA99\", -\"W c #B6B898\", -\"X c #B1B494\", -\"Y c #A9AB8D\", -\"Z c #999C80\", -\"` c #C1C3A2\", -\" . c #BFC2A0\", -\".. c #B9BC9C\", -\"+. c #B8BB9A\", -\"@. c #B7B999\", -\"#. c #B5B898\", -\"$. c #B4B697\", -\"%. c #B2B596\", -\"&. c #AAAD8F\", -\"*. c #A7AA8C\", -\"=. c #989B80\", -\"-. c #BDC09E\", -\";. c #B3B696\", -\">. c #B2B595\", -\",. c #B1B394\", -\"'. c #AFB293\", -\"). c #A6A98B\", -\"!. c #97997F\", -\"~. c #A7A98C\", -\"{. c #A6A88B\", -\"]. c #A4A78A\", -\"^. c #A3A689\", -\"/. c #A2A588\", -\"(. c #A1A487\", -\"_. c #A0A286\", -\":. c #9FA185\", -\"<. c #9EA084\", -\"[. c #9D9F83\", -\"}. c #9B9E82\", -\"|. c #999B80\", -\"1. c #989A7F\", -\"2. c #97997E\", -\"3. c #96987D\", -\"4. c #95977D\", -\"5. c #94967C\", -\"6. c #92957B\", -\"7. c #91947A\", -\"8. c #909279\", -\"9. c #85876F\", -\" \", -\" . . . . . . . . . . . . . . . . . . . . . . \", -\". + + + + + + + + + + + + + + + + + @ # $ % & . \", -\". + + + + + + + + + + + + + + + + * = - ; > , . \", -\". + + + + + + + + + + + + + + + + ' # $ ) ! ~ . \", -\". + + + + + + + + + + + + + + + @ { ] % ^ / ( . \", -\". + + + + + + + + + + + + + + * = - ; > ! _ : . \", -\". + + + + + + + + + + + + + + ' # $ ) / < [ } . \", -\". + + + + + + + + + + + + + @ { ] % ^ < [ | 1 . \", -\". + + + + + + + + + + + + @ { ] ; > / _ 2 3 4 . \", -\". + + + + + + + + + + + * = - ; > ! < 2 5 6 7 . \", -\". + + + + + + + + + + * = - $ ) ! < [ 5 6 8 9 . \", -\". + + + + + + + + + * = - $ ) ^ < [ | 3 8 0 a . \", -\". + + + + + + + + @ = - $ ) ^ / [ | 3 b c d e . \", -\". + + + + + + + @ { - $ ) ^ / [ | 3 b c d f g . \", -\". . . . . . . . . . . . . . . . . . . . . . . . \", -\". h i j k l m n o p q r s t u v w x y z A B C . \", -\". D k E F n G H I J K s L M v w x y z A N O P . \", -\". E F m Q o R S T K U V W v w X y z A N O Y Z . \", -\". m n ` .I J r ..+.@.#.$.%.X y z A N &.Y *.=.. \", -\". G H p -.T K s t u #.;.>.,.'.z A N O Y *.).!.. \", -\". ~.{.].^./.(._.:.<.[.}.P |.1.2.3.4.5.6.7.8.9.. \", -\" . . . . . . . . . . . . . . . . . . . . . . \", -\" \"}; -" - "XPM format image used as bottom view window icon") - -(defconst ide-skel-bottom-view-window-image - (create-image ide-skel-bottom-view-window-xpm 'xpm t)) - -(defvar ide-skel-win--win2-switch t) - -(defvar ide-skel-win--minibuffer-selected-p nil) - -;; (copy-win-node w) -;; (win-node-corner-pos w) -;; (make-win-node :corner-pos 0 :buffer b :horiz-scroll 0 :point 0 :mark nil :divisions nil) -;; (win-node-p w) -(defstruct win-node - "Window configuration tree node." - (corner-pos nil) ; pair - original position of left top window corner - (buf-corner-pos 1) ; position within the buffer at the upper left of the window - buffer ; the buffer window displays - (horiz-scroll 0) ; amount of horizontal scrolling, in columns - (point 1) ; point - (mark nil) ; the mark - (edges nil) ; (window-edges) - (cursor-priority nil) - (fixed-size nil) - (divisions nil)) ; children (list of division) - -(defstruct division - "Podzial okienka" - win-node ; winnode for window after division - horizontal-p ; division horizontal or vertical - percent) ; 0.0-1.0: width/height of parent after division - -(defvar sel-window nil) -(defvar sel-priority nil) - -(defvar ide-skel-ommited-windows nil) - -(defvar ide-skel--fixed-size-windows nil) - -;; args: 'left/right 'show/editor-buffer-changed/hide/tab-change &rest buffer... -(defvar ide-skel-side-view-window-functions nil) - -(defvar ide-skel-editor-buffer-changed-hook nil) - -(defvar ide-skel-last-buffer-change-event nil) -(defvar ide-skel-last-selected-window-or-buffer nil) - -(defcustom ide-skel-bottom-view-window-size 0.35 - "Default bottom view window height in characters (int >= 5) or percent of Emacs frame height (0.0 - 1.0)" - :group 'ide-skel - :tag "Default Bottom View Window Height" - :type (list 'restricted-sexp - :match-alternatives (list (lambda (value) - (or (and (floatp value) - (> value 0.0) - (< value 1.0)) - (and (integerp value) - (>= value 5))))))) - -(defcustom ide-skel-bottom-view-on-left-view t - "Non-nil if bottom view lies partially on left view." - :group 'ide-skel - :tag "Bottom View on Left View" - :type '(boolean) - :initialize 'custom-initialize-default - :set (lambda (symbol value) - (let ((is-bottom-view-window (ide-skel-get-bottom-view-window))) - (when is-bottom-view-window - (ide-skel-hide-bottom-view-window)) - (unwind-protect - (set-default symbol value) - (when is-bottom-view-window - (ide-skel-show-bottom-view-window)))))) - -(defcustom ide-skel-bottom-view-on-right-view t - "Non-nil if bottom view lies partially on right view." - :group 'ide-skel - :tag "Bottom View on Right View" - :type '(boolean) - :initialize 'custom-initialize-default - :set (lambda (symbol value) - (let ((is-bottom-view-window (ide-skel-get-bottom-view-window))) - (when is-bottom-view-window - (ide-skel-hide-bottom-view-window)) - (unwind-protect - (set-default symbol value) - (when is-bottom-view-window - (ide-skel-show-bottom-view-window)))))) - -(defconst ide-skel-unexpected-bottom-view-window-buffer-names '("*Completions*" "*Compile-Log*")) - -(defvar ide-skel--last-bottom-view-buffer-name nil) - -(defvar ide-skel-was-scratch nil) - -(defvar ide-skel-bottom-view-window-oper-in-progress nil) - -(defvar ide-skel--current-side-windows (cons nil nil)) - -(defcustom ide-skel-left-view-window-width 25 - "Default width of left view window." - :group 'ide-skel - :tag "Default Left View Window Width" - :type '(integer) - :initialize 'custom-initialize-default - :set (lambda (symbol value) - (let ((is-left-view-window (ide-skel-get-left-view-window))) - (when is-left-view-window - (ide-skel-hide-left-view-window)) - (unwind-protect - (set-default symbol value) - (when is-left-view-window - (ide-skel-show-left-view-window)))))) - -(defcustom ide-skel-right-view-window-width 30 - "Default width of right view window." - :group 'ide-skel - :tag "Default Right View Window Width" - :type '(integer) - :initialize 'custom-initialize-default - :set (lambda (symbol value) - (let ((is-right-view-window (ide-skel-get-right-view-window))) - (when is-right-view-window - (ide-skel-hide-right-view-window)) - (unwind-protect - (set-default symbol value) - (when is-right-view-window - (ide-skel-show-right-view-window)))))) - -(defcustom ide-skel-side-view-display-cursor nil - "Non-nil if cursor should be displayed in side view windows" - :group 'ide-skel - :tag "Side View Display Cursor" - :type 'boolean) - -(defvar ide-skel-highlight-face 'ide-skel-highlight-face) -(defface ide-skel-highlight-face - (list - (list '((background light)) - (append (list :inherit 'variable-pitch :background (ide-skel-shine-color (face-background 'default) -70) :foreground (face-background 'default)) - (when (>= emacs-major-version 22) '(:box (:style released-button))))) - (list '((background dark)) - (append (list :inherit 'variable-pitch :background (ide-skel-shine-color (face-background 'default) +70) :foreground (face-background 'default)) - (when (>= emacs-major-version 22) '(:box (:style released-button))))) - '(t (:inherit default))) - "Face for selection in side views." - :group 'ide-skel) - -;;; buffer -> alist -;;; :imenu-buffer -;;; :default-left-tab-label, :default-right-tab-label -(defvar ide-skel-context-properties (make-hash-table :test 'eq)) - -(defvar ide-skel-last-left-view-window-tab-label nil) -(defvar ide-skel-last-right-view-window-tab-label nil) - -(defvar ide-skel-buffer-list-buffer nil) -(defvar ide-skel-buffer-list nil) - -(defvar ide-skel-buffer-list-tick nil) - -(defconst ide-skel-tree-widget-open-xpm "\ -/* XPM */ -static char *open[] = { -/* columns rows colors chars-per-pixel */ -\"11 15 49 1\", -\" c #4D084D080B7B\", -\". c #5A705A700DBB\", -\"X c #7B647B6404B5\", -\"o c #7818781810F1\", -\"O c #7E1E7E1E16D4\", -\"+ c #5EB75D2D6FCF\", -\"@ c #5FD85D2D6FCF\", -\"# c #60415D2D6FCF\", -\"$ c #88BD88BD068F\", -\"% c #8A5D8A5D0969\", -\"& c #82F782F71033\", -\"* c #841B841B1157\", -\"= c #87BC87BC1125\", -\"- c #878787871696\", -\"; c #87D587BE172E\", -\": c #87C187C11812\", -\"> c #895A895A1B9C\", -\", c #8A0A8A0A1C10\", -\"< c #8E5B8DF21DE7\", -\"1 c #95DF95DF1A5F\", -\"2 c #95CC95CC1B5B\", -\"3 c #98D498D41EE5\", -\"4 c #9BBB9BBB2414\", -\"5 c #9BBB9BBB2622\", -\"6 c #9CDF9CDF2696\", -\"7 c #984C984C281C\", -\"8 c #9EA19EA129C1\", -\"9 c #A060A0602B4B\", -\"0 c #A3BAA3BA3148\", -\"q c #A78AA78A36FD\", -\"w c #A7BBA7BB38D9\", -\"e c #A7B7A7B73B03\", -\"r c #AB1AAB1A3B03\", -\"t c #ABD7ABD73C6C\", -\"y c #AFC5AFC54435\", -\"u c #B5D2B5D24A67\", -\"i c #B659B6594AEE\", -\"p c #B959B9595378\", -\"a c #BBCEBBCE5267\", -\"s c #BE64BE645A53\", -\"d c #C2D2C2D26078\", -\"f c #C43BC43B60D8\", -\"g c #C42EC42E60EE\", -\"h c #C44FC44F60EC\", -\"j c #C73BC73B66E7\", -\"k c #C65DC65D697B\", -\"l c #CECECECE7676\", -\"z c #D02CD02C7B7B\", -\"x c None\", -/* pixels */ -\"xxxxxxxxxxx\", -\"xxxxxxxxxxx\", -\"xxxxxxxxxxx\", -\"xxxxxxxxxxx\", -\"x,> xxxxxxx\", -\"6zlpw07xxxx\", -\"5k32211=oxx\", -\"49ryuasfexx\", -\"$8yuasgdOxx\", -\"%qiashjtxxx\", -\"X&*<;-:.xxx\", -\"xxx@xxxxxxx\", -\"xxx#xxxxxxx\", -\"xxx+xxxxxxx\", -\"xxx+xxxxxxx\" -}; -") - -(defconst ide-skel-tree-widget-open-image - (create-image ide-skel-tree-widget-open-xpm 'xpm t)) - -(defconst ide-skel-tree-widget-no-handle-xpm "\ -/* XPM */ -static char *no_handle[] = { -/* columns rows colors chars-per-pixel */ -\"7 15 1 1\", -\" c None\", -/* pixels */ -\" \", -\" \", -\" \", -\" \", -\" \", -\" \", -\" \", -\" \", -\" \", -\" \", -\" \", -\" \", -\" \", -\" \", -\" \" -}; -") - -(defconst ide-skel-tree-widget-no-handle-image - (create-image ide-skel-tree-widget-no-handle-xpm 'xpm t)) - -(defconst ide-skel-tree-widget-no-guide-xpm "\ -/* XPM */ -static char *no_guide[] = { -/* columns rows colors chars-per-pixel */ -\"4 15 1 1\", -\" c None\", -/* pixels */ -\" \", -\" \", -\" \", -\" \", -\" \", -\" \", -\" \", -\" \", -\" \", -\" \", -\" \", -\" \", -\" \", -\" \", -\" \" -}; -") - -(defconst ide-skel-tree-widget-no-guide-image - (create-image ide-skel-tree-widget-no-guide-xpm 'xpm t)) - -(defconst ide-skel-tree-widget-leaf-xpm "\ -/* XPM */ -static char *leaf[] = { -/* columns rows colors chars-per-pixel */ -\"11 15 42 1\", -\" c #224222422242\", -\". c #254525452545\", -\"X c #272727272727\", -\"o c #31DA31DA31DA\", -\"O c #4CAC4CAC4CAC\", -\"+ c #4F064F064F06\", -\"@ c #506050605060\", -\"# c #511651165116\", -\"$ c #57D657D657D6\", -\"% c #59A559A559A5\", -\"& c #5AAC5AAC5AAC\", -\"* c #5D5A5D5A5D5A\", -\"= c #5F025F025F02\", -\"- c #60C660C660C6\", -\"; c #617D617D617D\", -\": c #63D363D363D3\", -\"> c #8B908B908B90\", -\", c #8E3C8E3C8E3C\", -\"< c #8F588F588F58\", -\"1 c #93FC93FC93FC\", -\"2 c #949194919491\", -\"3 c #96AD96AD96AD\", -\"4 c #991899189918\", -\"5 c #99EA99EA99EA\", -\"6 c #9B619B619B61\", -\"7 c #9CD69CD69CD6\", -\"8 c #9E769E769E76\", -\"9 c #9FA59FA59FA5\", -\"0 c #A0C3A0C3A0C3\", -\"q c #A293A293A293\", -\"w c #A32EA32EA32E\", -\"e c #A480A480A480\", -\"r c #A5A5A5A5A5A5\", -\"t c #A755A755A755\", -\"y c #AA39AA39AA39\", -\"u c #AC77AC77AC77\", -\"i c #B1B7B1B7B1B7\", -\"p c #B283B283B283\", -\"a c #B7B7B7B7B7B7\", -\"s c #BD02BD02BD02\", -\"d c gray74\", -\"f c None\", -/* pixels */ -\"fffffffffff\", -\"fffffffffff\", -\"fffffffffff\", -\"XXXXfffffff\", -\"%,25#offfff\", -\"*6qr$&.ffff\", -\"=1<3>wOffff\", -\";6648a@ffff\", -\";wweys#ffff\", -\":970ed#ffff\", -\"-tuipp+ffff\", -\"XXXXXX ffff\", -\"fffffffffff\", -\"fffffffffff\", -\"fffffffffff\" -}; -") - -(defconst ide-skel-tree-widget-leaf-image - (create-image ide-skel-tree-widget-leaf-xpm 'xpm t)) - -(defconst ide-skel-tree-widget-handle-xpm "\ -/* XPM */ -static char *handle[] = { -/* columns rows colors chars-per-pixel */ -\"7 15 2 1\", -\" c #56D752D36363\", -\". c None\", -/* pixels */ -\".......\", -\".......\", -\".......\", -\".......\", -\".......\", -\".......\", -\".......\", -\" \", -\".......\", -\".......\", -\".......\", -\".......\", -\".......\", -\".......\", -\".......\" -}; -") - -(defconst ide-skel-tree-widget-handle-image - (create-image ide-skel-tree-widget-handle-xpm 'xpm t)) - -(defconst ide-skel-tree-widget-guide-xpm "\ -/* XPM */ -static char *guide[] = { -/* columns rows colors chars-per-pixel */ -\"4 15 2 1\", -\" c #73C96E6E8484\", -\". c None\", -/* pixels */ -\"... \", -\"... \", -\"... \", -\"... \", -\"... \", -\"... \", -\"... \", -\"... \", -\"... \", -\"... \", -\"... \", -\"... \", -\"... \", -\"... \", -\"... \" -}; -") - -(defconst ide-skel-tree-widget-guide-image - (create-image ide-skel-tree-widget-guide-xpm 'xpm t)) - -(defconst ide-skel-tree-widget-end-guide-xpm "\ -/* XPM */ -static char *end_guide[] = { -/* columns rows colors chars-per-pixel */ -\"4 15 2 1\", -\" c #73C96E6E8484\", -\". c None\", -/* pixels */ -\"... \", -\"... \", -\"... \", -\"... \", -\"... \", -\"... \", -\"... \", -\"... \", -\"....\", -\"....\", -\"....\", -\"....\", -\"....\", -\"....\", -\"....\" -}; -") - -(defconst ide-skel-tree-widget-end-guide-image - (create-image ide-skel-tree-widget-end-guide-xpm 'xpm t)) - -(defconst ide-skel-tree-widget-empty-xpm "\ -/* XPM */ -static char *empty[] = { -/* columns rows colors chars-per-pixel */ -\"11 15 39 1\", -\" c #2BCF2BCF2BCF\", -\". c #31F831F831F8\", -\"X c #3F283F283F28\", -\"o c #41B141B141B1\", -\"O c #467946794679\", -\"+ c #476747674767\", -\"@ c #484648464846\", -\"# c #498749874987\", -\"$ c #4B684B684B68\", -\"% c #524F524F524F\", -\"& c #52D352D352D3\", -\"* c #554155415541\", -\"= c #561C561C561C\", -\"- c #598659865986\", -\"; c #5D775D775D77\", -\": c #5E7E5E7E5E7E\", -\"> c #60CE60CE60CE\", -\", c #615161516151\", -\"< c #61F361F361F3\", -\"1 c #642464246424\", -\"2 c #654865486548\", -\"3 c #678767876787\", -\"4 c #68D868D868D8\", -\"5 c #699569956995\", -\"6 c #6D556D556D55\", -\"7 c #6FB56FB56FB5\", -\"8 c #72CF72CF72CF\", -\"9 c #731073107310\", -\"0 c #757775777577\", -\"q c #7B747B747B74\", -\"w c #809080908090\", -\"e c #81F281F281F2\", -\"r c #820D820D820D\", -\"t c #84F984F984F9\", -\"y c #858285828582\", -\"u c #95E295E295E2\", -\"i c #9FFF9FFF9FFF\", -\"p c #A5A5A5A5A5A5\", -\"a c None\", -/* pixels */ -\"aaaaaaaaaaa\", -\"aaaaaaaaaaa\", -\"aaaaaaaaaaa\", -\"aaaaaaaaaaa\", -\"a&% aaaaaaa\", -\",piy76u-===*#oaa\", -\":14690qe3aa\", -\"+;680qewOaa\", -\"@290qrt5aaa\", -\"XO+@#$$.aaa\", -\"aaaaaaaaaaa\", -\"aaaaaaaaaaa\", -\"aaaaaaaaaaa\", -\"aaaaaaaaaaa\" -}; -") - -(defconst ide-skel-tree-widget-empty-image - (create-image ide-skel-tree-widget-empty-xpm 'xpm t)) - -(defconst ide-skel-tree-widget-close-xpm "\ -/* XPM */ -static char *close[] = { -/* columns rows colors chars-per-pixel */ -\"11 15 45 1\", -\" c #4EA14EA10DFA\", -\". c #5AA05AA00C52\", -\"X c #75297529068F\", -\"o c #7B647B6404B5\", -\"O c #8B888B880B91\", -\"+ c #8EDE8EDE0F5F\", -\"@ c #82F782F71033\", -\"# c #83A683A61157\", -\"$ c #84AD84AD13BC\", -\"% c #857985791489\", -\"& c #868086801590\", -\"* c #8A8A8A8A1697\", -\"= c #878787871812\", -\"- c #885388531936\", -\"; c #8BAB8BAB17B8\", -\": c #8CCC8CCC1A7D\", -\"> c #8DB68DB61BC4\", -\", c #90EC90EC11D0\", -\"< c #9161916114B5\", -\"1 c #92A292A2163F\", -\"2 c #8E8B8E8B2150\", -\"3 c #8F0F8F0F2274\", -\"4 c #9AF79AF72386\", -\"5 c #9D289D282655\", -\"6 c #9ED19ED1286E\", -\"7 c #9F599F592912\", -\"8 c #A31DA31D2D82\", -\"9 c #A3DDA3DD2DA2\", -\"0 c #A144A1442ED2\", -\"q c #A828A82833B4\", -\"w c #AB38AB383AEB\", -\"e c #AD21AD213DC2\", -\"r c #AD6DAD6D3E56\", -\"t c #AFFCAFFC4481\", -\"y c #B0AAB0AA429F\", -\"u c #B1B1B1B144E8\", -\"i c #B51DB51D4A5F\", -\"p c #B535B5354A8A\", -\"a c #B56FB56F4AEE\", -\"s c #B7B0B7B0525B\", -\"d c #BD14BD1459B1\", -\"f c #BFACBFAC5C55\", -\"g c #C5D9C5D965F7\", -\"h c #C85FC85F6D04\", -\"j c None\", -/* pixels */ -\"jjjjjjjjjjj\", -\"jjjjjjjjjjj\", -\"jjjjjjjjjjj\", -\"jjjjjjjjjjj\", -\"j32 jjjjjjj\", -\"1uy84570.jj\", -\"O69wtpsd*jj\", -\"+qrtpsdf;jj\", -\",etisdfg:jj\", -\"jj\", -\"o@#$%&=-Xjj\", -\"jjjjjjjjjjj\", -\"jjjjjjjjjjj\", -\"jjjjjjjjjjj\", -\"jjjjjjjjjjj\" -}; -") - -(defconst ide-skel-tree-widget-close-image - (create-image ide-skel-tree-widget-close-xpm 'xpm t)) - -(define-widget 'ide-skel-imenu-internal-node-widget 'tree-widget - "Internal node widget.") - -(define-widget 'ide-skel-imenu-leaf-widget 'push-button - "Leaf widget." - :format "%[%t%]\n" - :button-face 'variable-pitch - ) - -(defvar ide-skel-imenu-sorted nil) -(make-variable-buffer-local 'ide-skel-imenu-sorted) - -(defvar ide-skel-imenu-editor-buffer nil) -(make-variable-buffer-local 'ide-skel-imenu-editor-buffer) - -(defvar ide-skel-imenu-open-paths nil) -(make-variable-buffer-local 'ide-skel-imenu-open-paths) - -(defface imenu-side-view-face '((t :inherit variable-pitch :height 0.8)) - "Default face used in right view for imenu" - :group 'ide-skel) - -(define-widget 'ide-skel-info-tree-dir-widget 'tree-widget - "Directory Tree widget." - :expander 'ide-skel-info-tree-expand-dir - :notify 'ide-skel-info-open - :indent 0) - -(define-widget 'ide-skel-info-tree-file-widget 'push-button - "File widget." - :format "%[%t%]%d\n" - :button-face 'variable-pitch - :notify 'ide-skel-info-file-open) - -(defvar ide-skel-info-open-paths nil) -(make-variable-buffer-local 'ide-skel-info-open-paths) - -(defvar ide-skel-info-root-node nil) -(make-variable-buffer-local 'ide-skel-info-root-node) - -(defvar ide-skel-info-buffer nil) - -(define-widget 'ide-skel-dir-tree-dir-widget 'tree-widget - "Directory Tree widget." - :expander 'ide-skel-dir-tree-expand-dir - :notify 'ide-skel-dir-open - :indent 0) - -(define-widget 'ide-skel-dir-tree-file-widget 'push-button - "File widget." - :format "%[%t%]%d\n" - :button-face 'variable-pitch - :notify 'ide-skel-file-open) - -(defvar ide-skel-dir-open-paths nil) -(make-variable-buffer-local 'ide-skel-dir-open-paths) - -(defvar ide-skel-dir-root-dir "/") -(make-variable-buffer-local 'ide-skel-dir-root-dir) - -(defvar ide-skel-dir-buffer nil) - -(defconst ide-skel-cvs-dir-regexp "\\(\\.svn\\|CVS\\)$") - -(defstruct ide-skel-project - root-path - include-file-path ; for PC-include-file-path variable -) - -(defvar ide-skel-projects nil) - -(defvar ide-skel-proj-find-results-buffer-name "*Proj find*") - -(defvar ide-skel-project-menu - '("Project" - :filter ide-skel-project-menu) - "Menu for CVS/SVN projects") - -(defvar ide-skel-proj-find-project-files-history nil) -(defvar ide-skel-proj-grep-project-files-history nil) - -(defvar ide-skel-proj-ignored-extensions '("semantic.cache")) - -(defvar ide-skel-all-text-files-flag nil) - -(defvar ide-skel-proj-grep-header nil) - -(defvar ide-skel-proj-old-compilation-exit-message-function nil) -(make-variable-buffer-local 'ide-skel-proj-old-compilation-exit-message-function) - -(defvar ide-skel-proj-grep-mode-map nil) - -(defvar ide-skel-proj-grep-replace-history nil) - -;;; - -(copy-face 'mode-line 'mode-line-inactive) - -(define-key tree-widget-button-keymap [drag-mouse-1] 'ignore) - -(defun ide-skel-tabbar-tab-label (tab) - "Return a label for TAB. -That is, a string used to represent it on the tab bar." - (let* ((object (tabbar-tab-value tab)) - (tabset (tabbar-tab-tabset tab)) - (label (format " %s " - (or (and (bufferp object) - (with-current-buffer object ide-skel-tabbar-tab-label)) ; local in buffer - object)))) - (when (and (not (memq tabset (list (tabbar-get-tabset ide-skel-left-view-window-tabset-name) - (tabbar-get-tabset ide-skel-right-view-window-tabset-name)))) - (numberp ide-skel-tabbar-tab-label-max-width) - (> ide-skel-tabbar-tab-label-max-width 0)) - (setq label (tabbar-shorten label ide-skel-tabbar-tab-label-max-width))) - label)) - -(defun ide-skel-tabbar-help-on-tab (tab) - "Return the help string shown when mouse is onto TAB." - (let ((tabset (tabbar-tab-tabset tab)) - (object (tabbar-tab-value tab))) - (or (when (bufferp object) - (with-current-buffer object - (or ide-skel-tabbar-tab-help-string ; local in buffer - (buffer-file-name)))) - "mouse-1: switch to buffer\nmouse-2: delete other windows\nmouse-3: kill buffer"))) - -(defun ide-skel-tabbar-buffer-groups () - "Return the list of group names the current buffer belongs to." - (if (and (ide-skel-side-view-buffer-p (current-buffer)) - (or (not ide-skel-tabbar-tab-label) - (not ide-skel-tabbar-enabled))) - nil - (let ((result (list (or ide-skel-tabset-name ; local in current buffer - (when (ide-skel-bottom-view-buffer-p (current-buffer)) ide-skel-bottom-view-window-tabset-name) - ide-skel-editor-window-tabset-name)))) - (dolist (window (copy-list (window-list nil 1))) - (when (eq (window-buffer window) (current-buffer)) - (let ((tabset-name (ide-skel-get-tabset-name-for-window window))) - (unless (member tabset-name result) - (push tabset-name result))))) - result))) - -(defun ide-skel-tabbar-buffer-tabs () - "Return the buffers to display on the tab bar, in a tab set." - ;; (message "ide-skel-tabbar-buffer-tabs %S" (current-buffer)) - (tabbar-buffer-update-groups) - (let* ((window (selected-window)) - (tabset (tabbar-get-tabset (ide-skel-get-tabset-name-for-window window)))) - (when (not (tabbar-get-tab (current-buffer) tabset)) - (tabbar-add-tab tabset (current-buffer) t)) - (tabbar-select-tab-value (current-buffer) tabset) - tabset)) - -(defun ide-skel-tabbar-buffer-list () - "Return the list of buffers to show in tabs. -The current buffer is always included." - (ide-skel-tabbar-faces-adapt) - (delq t - (mapcar #'(lambda (b) - (let ((buffer-name (buffer-name b))) - (cond - ((and (ide-skel-side-view-buffer-p b) - (with-current-buffer b - (or (not ide-skel-tabbar-tab-label) - (not ide-skel-tabbar-enabled)))) - t) - ;; Always include the current buffer. - ((eq (current-buffer) b) b) - ;; accept if buffer has tabset name - ((with-current-buffer b ide-skel-tabset-name) b) - ;; remove if matches any regexp from ide-skel-tabbar-hidden-buffer-names-regexp-list - ((not (null (some (lambda (regexp) - (string-match regexp buffer-name)) - ide-skel-tabbar-hidden-buffer-names-regexp-list))) - t) - ;; accept if buffer has filename - ((buffer-file-name b) b) - ;; remove if name starts with space - ((and (char-equal ?\ (aref (buffer-name b) 0)) - (not (ide-skel-side-view-buffer-p b))) - t) - ;; accept otherwise - (b)))) - (buffer-list (selected-frame))))) - -(defun ide-skel-get-tabset-name-for-window (window) - (cond ((eq (ide-skel-get-left-view-window) window) ide-skel-left-view-window-tabset-name) - ((eq (ide-skel-get-right-view-window) window) ide-skel-right-view-window-tabset-name) - ((eq (ide-skel-get-bottom-view-window) window) ide-skel-bottom-view-window-tabset-name) - (t ide-skel-editor-window-tabset-name))) - -(defun ide-skel-tabbar-select-tab (event tab) - "On mouse EVENT, select TAB." - (let* ((mouse-button (event-basic-type event)) - (buffer (tabbar-tab-value tab)) - (tabset-name (and (buffer-live-p buffer) - (with-current-buffer buffer ide-skel-tabset-name))) - (left-tabset (equal tabset-name ide-skel-left-view-window-tabset-name)) - (right-tabset (equal tabset-name ide-skel-right-view-window-tabset-name))) - (cond - ((eq mouse-button 'mouse-1) - (cond (left-tabset (ide-skel-side-window-switch-to-buffer ide-skel-current-left-view-window buffer)) - (right-tabset (ide-skel-side-window-switch-to-buffer ide-skel-current-right-view-window buffer)) - (t (switch-to-buffer buffer)))) - ((and (eq mouse-button 'mouse-2) - (not left-tabset) - (not right-tabset)) - (switch-to-buffer buffer) - (delete-other-windows)) - ((and (eq mouse-button 'mouse-3) - (not left-tabset) - (not right-tabset)) - (kill-buffer buffer))) - ;; Disable group mode. - (set 'tabbar-buffer-group-mode nil))) - -(defun ide-skel-tabbar-buffer-kill-buffer-hook () - "Hook run just before actually killing a buffer. -In Tabbar mode, try to switch to a buffer in the current tab bar, -after the current buffer has been killed. Try first the buffer in tab -after the current one, then the buffer in tab before. On success, put -the sibling buffer in front of the buffer list, so it will be selected -first." - (let ((buffer-to-kill (current-buffer))) - (save-selected-window - (save-current-buffer - ;; cannot kill buffer from any side view window - (when (and (eq header-line-format tabbar-header-line-format) - (not (ide-skel-side-view-buffer-p (current-buffer)))) - (dolist (window (copy-list (window-list nil 1))) - (when (eq buffer-to-kill (window-buffer window)) - (select-window window) - (let ((bl (tabbar-tab-values (funcall tabbar-current-tabset-function))) - found sibling) - (while (and bl (not found)) - (if (equal buffer-to-kill (car bl)) - (setq found t) - (setq sibling (car bl))) - (setq bl (cdr bl))) - (setq sibling (or sibling (car bl))) - (if (and sibling - (not (eq sibling buffer-to-kill)) - (buffer-live-p sibling)) - ;; Move sibling buffer in front of the buffer list. - (switch-to-buffer sibling) - (let ((next-buffer (ide-skel--find-buffer-for-bottom-view-window))) - (when (eq next-buffer buffer-to-kill) - (setq next-buffer (some (lambda (buf) - (if (or (eq buf buffer-to-kill) - (ide-skel-side-view-buffer-p buf) - (ide-skel-hidden-buffer-name-p (buffer-name buf))) - nil - buf)) - (buffer-list (selected-frame))))) - (when next-buffer - (switch-to-buffer next-buffer) - (tabbar-current-tabset t)))))))))))) - -(defun ide-skel-tabbar-inhibit-function () - "Inhibit display of the tab bar in specified windows, that is -in `checkdoc' status windows and in windows with its own header -line." - (let ((result (tabbar-default-inhibit-function)) - (sw (selected-window))) - (when (and result - (ide-skel-side-view-window-p sw)) - (setq result nil)) - (when (not (eq header-line-format tabbar-header-line-format)) - (setq result t)) - result)) - -(defun ide-skel-tabbar-home-function (event) - (let* ((window (posn-window (event-start event))) - (is-view-window (ide-skel-side-view-window-p window)) - (buffer (window-buffer window)) - extra-commands - (normal-window-counter 0)) - (dolist (win (copy-list (window-list nil 1))) - (unless (ide-skel-side-view-window-p win) - (incf normal-window-counter))) - (with-selected-window window - (when (and is-view-window - ide-skel-tabbar-menu-function) - (setq extra-commands (funcall ide-skel-tabbar-menu-function))) - (let ((close-p (when (or is-view-window - (> normal-window-counter 1)) - (list '(close "Close" t)))) - (maximize-p (when (and (not is-view-window) - (> normal-window-counter 1)) - (list '(maximize "Maximize" t))))) - (when (or close-p maximize-p) - (let ((user-selection - (car (x-popup-menu event (append (list 'keymap) close-p maximize-p extra-commands))))) - (cond ((eq user-selection 'close) - (call-interactively 'delete-window)) - ((eq user-selection 'maximize) - (delete-other-windows window)) - ((eq user-selection nil)) - (t - (funcall user-selection))))))))) - -(defun ide-skel-tabbar-mwheel-scroll-forward (event) - (interactive "@e") - (tabbar-press-scroll-left)) - -(defun ide-skel-tabbar-mwheel-scroll-backward (event) - (interactive "@e") - (tabbar-press-scroll-right)) - -(defun ide-skel-tabbar-mwheel-scroll (event) - "Select the next or previous group of tabs according to EVENT." - (interactive "@e") - (if (tabbar--mwheel-up-p event) - (ide-skel-tabbar-mwheel-scroll-forward event) - (ide-skel-tabbar-mwheel-scroll-backward event))) - -(defun ide-skel-tabbar-mwhell-mode-hook () - (setq tabbar-mwheel-mode-map - (let ((km (make-sparse-keymap))) - (if (get 'mouse-wheel 'event-symbol-elements) - ;; Use one generic mouse wheel event - (define-key km [A-mouse-wheel] - 'ide-skel-tabbar-mwheel-scroll) - ;; Use separate up/down mouse wheel events - (let ((up (tabbar--mwheel-key tabbar--mwheel-up-event)) - (down (tabbar--mwheel-key tabbar--mwheel-down-event))) - (define-key km `[header-line ,down] - 'ide-skel-tabbar-mwheel-scroll-backward) - (define-key km `[header-line ,up] - 'ide-skel-tabbar-mwheel-scroll-forward) - )) - km)) - (setcdr (assoc 'tabbar-mwheel-mode minor-mode-map-alist) tabbar-mwheel-mode-map)) - -(defun ide-skel-tabbar-mode-hook () - (setq tabbar-prefix-map - (let ((km (make-sparse-keymap))) - (define-key km [(control home)] 'tabbar-press-home) - (define-key km [(control left)] 'tabbar-backward) - (define-key km [(control right)] 'tabbar-forward) - (define-key km [(control prior)] 'tabbar-press-scroll-left) - (define-key km [(control next)] 'tabbar-press-scroll-right) - km)) - (setq tabbar-mode-map - (let ((km (make-sparse-keymap))) - (define-key km tabbar-prefix-key tabbar-prefix-map) - km)) - (setcdr (assoc 'tabbar-mode minor-mode-map-alist) tabbar-mode-map)) - -(defun ide-skel-tabbar-init-hook () - (setq tabbar-cycle-scope 'tabs - tabbar-auto-scroll-flag nil) - (setq - tabbar-tab-label-function 'ide-skel-tabbar-tab-label - tabbar-help-on-tab-function 'ide-skel-tabbar-help-on-tab - tabbar-buffer-groups-function 'ide-skel-tabbar-buffer-groups - tabbar-buffer-list-function 'ide-skel-tabbar-buffer-list - tabbar-current-tabset-function 'ide-skel-tabbar-buffer-tabs - tabbar-select-tab-function 'ide-skel-tabbar-select-tab - tabbar-inhibit-functions (append '(ide-skel-tabbar-inhibit-function) - (delq 'tabbar-default-inhibit-function tabbar-inhibit-functions)) - tabbar-home-function 'ide-skel-tabbar-home-function - tabbar-home-help-function (lambda () "Window menu")) - (add-hook 'kill-buffer-hook 'ide-skel-tabbar-buffer-kill-buffer-hook)) - -(defun ide-skel-tabbar-quit-hook () - (setq - tabbar-current-tabset-function nil - tabbar-tab-label-function nil - tabbar-select-tab-function nil - tabbar-help-on-tab-function nil - tabbar-home-function nil - tabbar-home-help-function nil - tabbar-buffer-groups-function nil - tabbar-buffer-list-function nil) - (remove-hook 'kill-buffer-hook 'ide-skel-tabbar-buffer-kill-buffer-hook)) - -(defun ide-skel-tabbar-load-hook () - (add-hook 'tabbar-mode-hook 'ide-skel-tabbar-mode-hook) - (add-hook 'tabbar-mwheel-mode-hook 'ide-skel-tabbar-mwhell-mode-hook) - (add-hook 'tabbar-init-hook 'ide-skel-tabbar-init-hook t) - (add-hook 'tabbar-quit-hook 'ide-skel-tabbar-quit-hook t) - (custom-set-faces - '(tabbar-default ((t (:inherit variable-pitch :background "gray82" :foreground "gray50" :height 0.8)))) - '(tabbar-selected ((t (:inherit tabbar-default :background "white" :foreground "blue" :box (:line-width 1 :color "black"))))) - '(tabbar-separator ((t (:inherit tabbar-default :height 0.2)))) - '(tabbar-highlight ((t ()))) - '(tabbar-button-highlight ((t (:inherit tabbar-button)))) - '(tabbar-unselected ((t (:inherit tabbar-default :background "gray72" :foreground "black" :box (:line-width 1 :color "black")))))) - (ide-skel-tabbar-faces-adapt)) - -(defun ide-skel-tabbar-faces-adapt () - (ide-skel-shine-face-background 'tabbar-default +18) - (set-face-attribute 'tabbar-selected nil :background (face-background 'default)) - (set-face-attribute 'tabbar-selected nil :foreground (face-foreground 'font-lock-function-name-face)) - (set-face-attribute 'tabbar-selected nil :box (list :line-width 1 :color (face-foreground 'default))) - (ide-skel-shine-face-background 'tabbar-unselected +30) - (set-face-attribute 'tabbar-unselected nil :foreground (face-foreground 'default)) - (set-face-attribute 'tabbar-unselected nil :box (list :line-width 1 :color (face-foreground 'default))) - (ide-skel-shine-face-background 'tabbar-button +18) - (ide-skel-shine-face-foreground 'tabbar-button +20)) - -(defun ide-skel-paradox-settings () - ;; hide scroll buttons - (setq tabbar-scroll-left-button (cons (cons "" nil) (cons "" nil)) - tabbar-scroll-right-button (cons (cons "" nil) (cons "" nil)))) - -(ide-skel-paradox-settings) - - -;;; Views - -(defun ide-skel-window-list () - (delq nil - (mapcar (lambda (win) - (unless (memq win ide-skel-ommited-windows) - win)) - (copy-list (window-list nil 1))))) - -(defun ide-skel-next-window (&optional window minibuf all-frames) - (let ((nw (next-window window minibuf all-frames))) - (if (memq nw ide-skel-ommited-windows) - (ide-skel-next-window nw minibuf all-frames) - nw))) - -(defun ide-skel-previous-window (window minibuf all-frames) - (let ((pw (previous-window window minibuf all-frames))) - (if (memq pw ide-skel-ommited-windows) - window - pw))) - -(defun ide-skel-win--absorb-win-node (dest-win-node src-win-node) - (dotimes (index (length src-win-node)) - (setf (elt dest-win-node index) - (elt src-win-node index)))) - -(defun ide-skel-win--create-win-node (object) - (cond ((win-node-p object) (copy-win-node object)) - ((windowp object) - (make-win-node :corner-pos (ide-skel-win-corner object) - :buf-corner-pos (window-start object) - :buffer (window-buffer object) - :horiz-scroll (window-hscroll object) - :point (window-point object) - :mark nil - :edges (window-edges object) - :fixed-size (cdr (assoc (ide-skel-win-corner object) ide-skel--fixed-size-windows)) - :divisions nil)) - (t (error "Argument is not win-not nor window: %S" object)))) - -(defun ide-skel-win--get-corner-pos (object) - (cond ((windowp object) (ide-skel-win-corner object)) - ((win-node-p object) (win-node-corner-pos object)) - ((consp object) object) - (t (error "Invalid arg: %S" object)))) - -(defun ide-skel-win--corner-pos-equal (win-node1 win-node2) - (let ((corner-pos1 (ide-skel-win--get-corner-pos win-node1)) - (corner-pos2 (ide-skel-win--get-corner-pos win-node2))) - (equal corner-pos1 corner-pos2))) - -(defun ide-skel-win--add-division (win-node division &optional at-end-p) - (setf (win-node-divisions win-node) - (if at-end-p - (reverse (cons division (reverse (win-node-divisions win-node)))) - (cons division (win-node-divisions win-node))))) - -(defun ide-skel-win--remove-division (win-node &optional from-end-p) - (let (result) - (if from-end-p - (let ((divs (reverse (win-node-divisions win-node)))) - (setq result (car divs)) - (setf (win-node-divisions win-node) - (reverse (cdr divs)))) - (setq result (car (win-node-divisions win-node))) - (setf (win-node-divisions win-node) (cdr (win-node-divisions win-node)))) - result)) - -(defun ide-skel-win--find-node (root predicate) - "Return node for which predicate returns non-nil." - (when root - (if (funcall predicate root) - root - (some (lambda (division) - (ide-skel-win--find-node (division-win-node division) predicate)) - (win-node-divisions root))))) - -(defun ide-skel-win--find-node-by-corner-pos (root corner-pos) - "Return struct for window with specified corner coordinates." - (setq corner-pos - (cond ((windowp corner-pos) (ide-skel-win-corner corner-pos)) - ((consp corner-pos) corner-pos) - (t (error "arg corner-pos %S is not a pair/window" corner-pos)))) - (ide-skel-win--find-node root - (lambda (win-node) - (equal corner-pos (win-node-corner-pos win-node))))) - -(defun ide-skel-win--get-window-list () - (let* ((start-win (selected-window)) - (cur-win (ide-skel-next-window start-win 1 1)) - (win-list (list start-win))) - (while (not (eq cur-win start-win)) - (setq win-list (cons cur-win win-list)) - (setq cur-win (ide-skel-next-window cur-win 1 1))) - (reverse win-list))) - -(defun ide-skel-win--analysis (&optional window-proc) - ;; (message "ide-skel-win--analysis BEGIN %S" (get-internal-run-time)) - (let ((window-size-fixed nil)) - (setq ide-skel--fixed-size-windows nil) - (dolist (window (copy-list (window-list nil 1))) - (with-selected-window window - (cond ((eq window-size-fixed 'width) - (push (cons (ide-skel-win-corner window) (cons (window-width window) nil)) ide-skel--fixed-size-windows)) - ((eq window-size-fixed 'height) - (push (cons (ide-skel-win-corner window) (cons nil (window-height window))) ide-skel--fixed-size-windows)) - ((not window-size-fixed) - nil) - (t - (push (cons (ide-skel-win-corner window) (cons (window-width window) (window-height window))) ide-skel--fixed-size-windows))))) - (dolist (window (ide-skel-window-list)) - (when (ide-skel-side-view-window-p window) (set-window-dedicated-p window nil))) - (setq ide-skel-win--minibuffer-selected-p (eq (selected-window) (minibuffer-window))) - (when ide-skel-win--minibuffer-selected-p - (select-window (ide-skel-get-editor-window))) - (when (memq (selected-window) ide-skel-ommited-windows) - (select-window (ide-skel-next-window (selected-window) 1 1))) - (let* (leaf-win - (counter 0) - (cursor-alist (mapcar (lambda (win) (prog1 (cons win counter) (incf counter))) (ide-skel-win--get-window-list))) - win-node-set) - (select-window (ide-skel-win-get-upper-left-window)) - (while (setq leaf-win (get-window-with-predicate - (lambda (win) - (if ide-skel-win--win2-switch (ide-skel-win--is-leaf2 win) (ide-skel-win--is-leaf win))) 1 1)) - (let* ((parent-win (ide-skel-previous-window leaf-win 1 1)) - (parent-node (car (member* (ide-skel-win-corner parent-win) win-node-set :test 'ide-skel-win--corner-pos-equal))) - (leaf-node (car (member* (ide-skel-win-corner leaf-win) win-node-set :test 'ide-skel-win--corner-pos-equal)))) - (unless leaf-node - (setq leaf-node (ide-skel-win--create-win-node leaf-win)) - (setf (win-node-cursor-priority leaf-node) (cdr (assq leaf-win cursor-alist))) - (setq win-node-set (adjoin leaf-node win-node-set :test 'ide-skel-win--corner-pos-equal))) - (unless parent-node - (setq parent-node (ide-skel-win--create-win-node parent-win)) - (setf (win-node-cursor-priority parent-node) (cdr (assq parent-win cursor-alist))) - (setq win-node-set (adjoin parent-node win-node-set :test 'ide-skel-win--corner-pos-equal))) - - (let* ((is-horizontal (ide-skel-win--is-adjacent parent-win 'right leaf-win)) - (size (if is-horizontal (window-width parent-win) (window-height parent-win))) - percent) - (setf (win-node-edges leaf-node) (window-edges leaf-win)) - (when window-proc (funcall window-proc parent-win)) - (when window-proc (funcall window-proc leaf-win)) - (delete-window leaf-win) - (when window-proc (funcall window-proc parent-win)) - (setq percent - (/ (float size) (if is-horizontal (window-width parent-win) (window-height parent-win)))) - (ide-skel-win--add-division parent-node - (make-division :win-node leaf-node - :horizontal-p is-horizontal - :percent percent))))) - ;; if there was only one window - (unless win-node-set - (when window-proc (funcall window-proc (selected-window))) - (let ((node (ide-skel-win--create-win-node (selected-window)))) - (setq win-node-set (adjoin node win-node-set - :test 'ide-skel-win--corner-pos-equal)))) - ;; return root node - (let ((root-node (car (member* (ide-skel-win-corner (selected-window)) - win-node-set - :test 'ide-skel-win--corner-pos-equal)))) - (setf (win-node-edges root-node) (window-edges (selected-window))) - ;; (message "ide-skel-win--analysis END %S" (get-internal-run-time)) - root-node)))) - -(defun ide-skel-win-get-upper-left-window () - "Return window in left upper corner" - (let (best-window) - (dolist (win (ide-skel-window-list)) - (if (null best-window) - (setq best-window win) - (let* ((best-window-coords (window-edges best-window)) - (best-window-weight (+ (car best-window-coords) (cadr best-window-coords))) - (win-coords (window-edges win)) - (win-weight (+ (car win-coords) (cadr win-coords)))) - (when (< win-weight best-window-weight) - (setq best-window win))))) - best-window)) - -(defun ide--is-right-window (window) - (let ((bounds (window-edges window)) - (result t)) - (dolist (win (ide-skel-window-list)) - (let ((left-edge-pos (car (window-edges win)))) - (when (>= left-edge-pos (nth 2 bounds)) - (setq result nil)))) - result)) - -(defun ide-skel-get-win-width-delta (window) - (if window-system - (let ((bounds (window-edges window))) - (+ (- (- (nth 2 bounds) (nth 0 bounds)) (window-width window)) - (if (and (not scroll-bar-mode) - (ide--is-right-window window)) - 1 - 0))) - 1)) - -(defun ide-skel-win--split (window horizontal-p percentage) - "Split window and return children." - (let* ((delta (ide-skel-get-win-width-delta window)) - (weight percentage) - (new-size (cond - ((integerp weight) (if (< weight 0) - (if horizontal-p - (+ (window-width window) weight) - (+ (window-height window) weight)) - (if horizontal-p (+ delta weight) weight))) - (t ; float - (when (< weight 0.0) - (setq weight (+ 1.0 weight))) - (if horizontal-p - (round (+ delta (* (window-width window) weight))) - (round (* (window-height window) weight))))))) - (split-window window new-size horizontal-p))) - -(defun ide-skel-win--process-win-node (win win-node &optional window-proc) - (let ((win2 win)) - (set-window-buffer win (win-node-buffer win-node)) - ; (set-window-start win (win-node-buf-corner-pos win-node)) - (set-window-hscroll win (win-node-horiz-scroll win-node)) - (set-window-point win (win-node-point win-node)) - (when window-proc (setq win (funcall window-proc win))) - (dolist (division (win-node-divisions win-node)) - (when (not (null (division-win-node division))) - (let ((child-window (ide-skel-win--split win (division-horizontal-p division) (division-percent division)))) - (when window-proc (setq win (funcall window-proc win))) - (ide-skel-win--process-win-node child-window (division-win-node division) window-proc)))) - (with-selected-window win2 - (let ((fixed-size (win-node-fixed-size win-node)) - (window-size-fixed nil)) - (when fixed-size - (when (car fixed-size) - (enlarge-window (- (car fixed-size) (window-width win2)) t)) - (when (cdr fixed-size) - (enlarge-window (- (cdr fixed-size) (window-height win2)) nil))))) - (when (win-node-cursor-priority win-node) - (unless sel-window - (setq sel-window win - sel-priority (win-node-cursor-priority win-node))) - (when (< (win-node-cursor-priority win-node) sel-priority) - (setq sel-window win - sel-priority (win-node-cursor-priority win-node)))))) - -(defun ide-skel-win--synthesis (window win-node &optional window-proc) - (let ((window-size-fixed nil) - sel-window - sel-priority) - (ide-skel-win--process-win-node window win-node window-proc) - (when sel-window - (select-window sel-window)) - (when ide-skel-win--minibuffer-selected-p - (select-window (minibuffer-window))) - (setq ide-skel-win--minibuffer-selected-p nil) - (dolist (window (ide-skel-window-list)) - (when (ide-skel-side-view-window-p window) (set-window-dedicated-p window t))))) - -(defun ide-skel-win--remove-child (win-node child-win-node) - (if (eq win-node child-win-node) - (let* ((division (ide-skel-win--remove-division win-node t)) - (divisions (win-node-divisions win-node))) - (when division - (ide-skel-win--absorb-win-node win-node (division-win-node division))) - (setf (win-node-divisions win-node) - (append divisions (win-node-divisions win-node)))) - (dolist (division (win-node-divisions win-node)) - (if (and (eq (division-win-node division) child-win-node) (null (win-node-divisions (division-win-node division)))) - (setf (division-win-node division) nil) - (ide-skel-win--remove-child (division-win-node division) child-win-node))))) - -(defun ide-skel-win-remove-window (window) - "Remove window with coordinates WINDOW." - (let* ((window-corner-pos (ide-skel-win-corner window)) - (root-win-node (ide-skel-win--analysis)) - (child-win-node (ide-skel-win--find-node-by-corner-pos root-win-node window-corner-pos))) - (ide-skel-win--remove-child root-win-node child-win-node) - (ide-skel-win--synthesis (selected-window) root-win-node))) - -(defun ide-skel-win-add-window (buffer parent-window-edges edge-symbol size) - "Split PARENT-WINDOW-EDGES window along specified edge. In new window with width/height SIZE -show buffer BUFFER. SIZE can be integer (character count) or float 0.0 - 1.0." - (when (windowp parent-window-edges) - (setq parent-window-edges (window-edges parent-window-edges))) - (let ((horizontal-p (or (eq edge-symbol 'left) (eq edge-symbol 'right))) - (replace-parent-p (or (eq edge-symbol 'top) (eq edge-symbol 'left))) - (percentage - (if (or (eq edge-symbol 'bottom) (eq edge-symbol 'right)) - (- size) - size))) - (ide-skel-win--add-window buffer parent-window-edges horizontal-p percentage replace-parent-p))) - -(defun ide-skel-win--add-window (buffer parent-window-edges horizontal-p percentage replace-parent-p) - (let* ((root-win-node (ide-skel-win--analysis)) - (new-win-node (make-win-node :buffer buffer))) - (ide-skel-win--synthesis (selected-window) root-win-node - (lambda (window) - (if (equal (window-edges window) parent-window-edges) - (let ((child-window (ide-skel-win--split window horizontal-p percentage))) - (set-window-buffer (if replace-parent-p window child-window) buffer) - (if replace-parent-p child-window window)) - window))))) - -(defun ide-skel-win--get-bounds (object) - (cond ((windowp object) (window-edges object)) - ((and (listp object) (= (length object) 4)) object) - (t (error "Invalid object param: %S" object)))) - -(defun ide-skel-win--win-area (window) - (let ((win-bounds (ide-skel-win--get-bounds window))) - (* (- (nth 2 win-bounds) (nth 0 win-bounds)) - (- (nth 3 win-bounds) (nth 1 win-bounds))))) - -(defun ide-skel-win--is-adjacent(window1 edge-symbol window2) - "Non-nil if WINDOW1 sticks to WINDOW2 along specified edge." - (let ((bounds1 (ide-skel-win--get-bounds window1)) - (bounds2 (ide-skel-win--get-bounds window2)) - result) - (if (or (equal edge-symbol 'top) (equal edge-symbol 'bottom)) - (setq result (and - (equal (nth 0 bounds1) (nth 0 bounds2)) ; bounds.LEFT = bounds2.LEFT - (equal (nth 2 bounds1) (nth 2 bounds2)))) ; bounds.RIGHT = bounds2.RIGHT - (setq result (and - (equal (nth 1 bounds1) (nth 1 bounds2)) ; bounds.TOP = bounds2.TOP - (equal (nth 3 bounds1) (nth 3 bounds2))))) ; bounds.BOTTOM = bounds2.BOTTOM - (when result - (setq result - (cond ((equal edge-symbol 'top) (equal (nth 1 bounds1) (nth 3 bounds2))) ; bounds.TOP = bounds2.BOTTOM - ((equal edge-symbol 'bottom) (equal (nth 3 bounds1) (nth 1 bounds2))) ; bounds.BOTTOM = bounds2.TOP - ((equal edge-symbol 'left) (equal (nth 0 bounds1) (nth 2 bounds2))) ; bounds.LEFT = bounds2.RIGHT - (t (equal (nth 2 bounds1) (nth 0 bounds2)))))) - result)) - -(defun ide-skel-win--is-leaf (&optional window) - "Non-nil if WINDOW is a leaf." - (unless window - (setq window (selected-window))) - ;; no window can stick from right or bottom - (when (and (not (get-window-with-predicate - (lambda (win) (ide-skel-win--is-adjacent window 'right win)) 1 1)) - (not (get-window-with-predicate - (lambda (win) (ide-skel-win--is-adjacent window 'bottom win)) 1 1))) - (let ((parent (ide-skel-previous-window window 1 1))) - ;; parent must exist and come from left or up - (when (and parent - (or (ide-skel-win--is-adjacent window 'top parent) - (ide-skel-win--is-adjacent window 'left parent))) - window)))) - -(defun ide-skel-win--is-leaf2 (&optional win2) - "Non-nil if WIN2 is leaf." - (unless win2 - (setq win2 (selected-window))) - ;; no window can stick from right or bottom - (when (and (not (get-window-with-predicate - (lambda (win) (ide-skel-win--is-adjacent win2 'right win)))) - (not (get-window-with-predicate - (lambda (win) (ide-skel-win--is-adjacent win2 'bottom win))))) - (let ((parent (ide-skel-previous-window win2 1 1))) - ;; parent must exist and come from left or up - (when (and parent - (or (ide-skel-win--is-adjacent win2 'top parent) - (ide-skel-win--is-adjacent win2 'left parent))) - win2)))) - -(defun ide-skel-win-corner (window) - (let ((coords (window-edges window))) - (cons (car coords) (cadr coords)))) - -(defun ide-skel-window-size-changed (frame) - (let* ((editor-window (ide-skel-get-editor-window)) - (left-view-window (car ide-skel--current-side-windows)) - (right-view-window (cdr ide-skel--current-side-windows)) - (bottom-view-window (ide-skel-get-bottom-view-window))) - (ide-skel-recalculate-view-cache) - (when bottom-view-window - (ide-skel-remember-bottom-view-window)) - (when left-view-window - (setq ide-skel-left-view-window-width (window-width left-view-window))) - (when right-view-window - (setq ide-skel-right-view-window-width (window-width right-view-window))))) - -(add-hook 'window-size-change-functions 'ide-skel-window-size-changed) - -(setq special-display-regexps ide-skel-bottom-view-buffer-names-regexps) - -(defun ide-skel-recalculate-view-cache () - (setq ide-skel-selected-frame (selected-frame) - ide-skel-current-editor-window (ide-skel-get-editor-window)) - (setq ide-skel-current-editor-buffer (window-buffer ide-skel-current-editor-window) - ide-skel-current-left-view-window (car ide-skel--current-side-windows) - ide-skel-current-right-view-window (cdr ide-skel--current-side-windows))) - -(defun ide-skel-get-last-selected-window () - (and ide-skel-last-selected-window-or-buffer - (or (and (window-live-p (car ide-skel-last-selected-window-or-buffer)) - (car ide-skel-last-selected-window-or-buffer)) - (and (buffer-live-p (cdr ide-skel-last-selected-window-or-buffer)) - (get-buffer-window (cdr ide-skel-last-selected-window-or-buffer)))))) - -(require 'mwheel) - -(defvar ide-skel-mouse-wheel-events (list mouse-wheel-up-event mouse-wheel-down-event)) - -(run-with-idle-timer 0 t (lambda () -;; (when ide-skel-current-left-view-window -;; (with-selected-window ide-skel-current-left-view-window -;; (beginning-of-line))) -;; (when ide-skel-current-right-view-window -;; (with-selected-window ide-skel-current-right-view-window -;; (beginning-of-line))) - (unless (or (active-minibuffer-window) - (memq 'down (event-modifiers last-input-event)) - (memq (event-basic-type last-input-event) ide-skel-mouse-wheel-events) - (mouse-movement-p last-input-event)) - ;; selected frame changed? - (unless (eq (selected-frame) ide-skel-selected-frame) - (ide-skel-recalculate-view-cache)) - ;; side view windows cannot have cursor - (while (memq (selected-window) (list ide-skel-current-left-view-window - ide-skel-current-right-view-window)) - (let ((win (ide-skel-get-last-selected-window))) - (if (and win (not (eq (selected-window) win))) - (select-window win) - (other-window 1)))) - (setq ide-skel-last-selected-window-or-buffer - (cons (selected-window) (window-buffer (selected-window)))) - ;; current buffer changed? - (let ((editor-buffer (window-buffer ide-skel-current-editor-window))) - (when (not (eq ide-skel-last-buffer-change-event editor-buffer)) - (ide-skel-send-event nil 'editor-buffer-changed ide-skel-last-buffer-change-event editor-buffer)))))) - -(setq special-display-function - (lambda (buffer &optional data) - (let ((bottom-view-window (ide-skel-get-bottom-view-window))) - (if (and bottom-view-window - (eq bottom-view-window (selected-window)) - (member (buffer-name buffer) ide-skel-unexpected-bottom-view-window-buffer-names)) - (progn - (show-buffer (ide-skel-get-editor-window) buffer) - (ide-skel-get-editor-window)) - (unless (ide-skel-get-bottom-view-window) - (ide-skel-show-bottom-view-window)) - (set-window-buffer (ide-skel-get-bottom-view-window) buffer) - ;; (select-window (ide-skel-get-bottom-view-window)) - (ide-skel-get-bottom-view-window))))) - -;;; Bottom view - -(defun ide-skel-hidden-buffer-name-p (buffer-name) - (equal (elt buffer-name 0) 32)) - -(defun ide-skel-bottom-view-buffer-p (buffer) - "Non-nil if buffer should be shown in bottom view." - (let ((name (buffer-name buffer))) - (or (with-current-buffer buffer - (and ide-skel-tabset-name - (string= ide-skel-tabset-name ide-skel-bottom-view-window-tabset-name))) - (and (not (ide-skel-hidden-buffer-name-p name)) - (some (lambda (regexp) (string-match regexp name)) ide-skel-bottom-view-buffer-names-regexps) - (not (some (lambda (regexp) (string-match regexp name)) ide-skel-bottom-view-buffer-names-disallowed-regexps)))))) - -(defun ide-skel-remember-bottom-view-window () - (let ((bottom-view-window (ide-skel-get-bottom-view-window))) - (when bottom-view-window - (setq ide-skel--last-bottom-view-buffer-name (buffer-name (window-buffer bottom-view-window)) - ide-skel-bottom-view-window-size (max 5 (window-height bottom-view-window)))))) - -(defun ide-skel--find-buffer-for-bottom-view-window () - "Returns first buffer to display in bottom view window (always returns a buffer)." - (let ((best-buffers (list (car (buffer-list (selected-frame)))))) - (some (lambda (buffer) - (when (ide-skel-bottom-view-buffer-p buffer) - (if (member (buffer-name buffer) ide-skel-unexpected-bottom-view-window-buffer-names) - (setq best-buffers (append best-buffers (list buffer))) - (setq best-buffers (cons buffer best-buffers))) - nil)) - (buffer-list (selected-frame))) - (if (and (not ide-skel-was-scratch) - (get-buffer "*scratch*")) - (progn - (setq ide-skel-was-scratch t) - (get-buffer "*scratch*")) - (car best-buffers)))) - -(defun ide-skel--is-full-width-window (window &rest except-windows) - (let ((bounds (window-edges window)) - (result t)) - (dolist (win (ide-skel-window-list)) - (unless (memq win except-windows) - (let ((left-edge-pos (car (window-edges win)))) - (when (or (< left-edge-pos (car bounds)) - (>= left-edge-pos (nth 2 bounds))) - (setq result nil))))) - result)) - -(defun ide-skel-get-bottom-view-window () - (let* ((editor-window (ide-skel-get-editor-window)) - best-window) - ;; get lowest window - (dolist (win (copy-list (window-list nil 1))) - (when (with-current-buffer (window-buffer win) - (and (or (not ide-skel-tabset-name) - (equal ide-skel-tabset-name ide-skel-bottom-view-window-tabset-name)) - (not (eq win editor-window)))) - (if (null best-window) - (setq best-window win) - (when (> (cadr (window-edges win)) (cadr (window-edges best-window))) - (setq best-window win))))) - (when (and best-window - (not (ide-skel--is-full-width-window best-window (ide-skel-get-left-view-window) (ide-skel-get-right-view-window)))) - (setq best-window nil)) - best-window)) - -(defun ide-skel-show-bottom-view-window (&optional buffer) - (interactive) - (unless ide-skel-bottom-view-window-oper-in-progress - (let ((saved-window (cons (selected-window) (window-buffer (selected-window))))) - (unwind-protect - (unless (ide-skel-get-bottom-view-window) ;; if not open yet - (setq ide-skel-bottom-view-window-oper-in-progress t) - (unless buffer - (setq buffer - (or (and ide-skel--last-bottom-view-buffer-name (get-buffer ide-skel--last-bottom-view-buffer-name)) - (ide-skel--find-buffer-for-bottom-view-window)))) - (let* ((left-view-window (ide-skel-get-left-view-window)) - (left-view-window-bounds (and left-view-window - (window-edges left-view-window))) - (right-view-window (ide-skel-get-right-view-window)) - (right-view-window-bounds (and right-view-window - (window-edges right-view-window))) - (root-win-node (ide-skel-win--analysis)) - (window-bounds (window-edges (selected-window)))) ; bounds of maximized window (after analysis) - (when (and left-view-window-bounds (not ide-skel-bottom-view-on-left-view)) - (setf (nth 0 window-bounds) (nth 2 left-view-window-bounds))) - (when (and right-view-window-bounds (not ide-skel-bottom-view-on-right-view)) - (setf (nth 2 window-bounds) (nth 0 right-view-window-bounds))) - (ide-skel-win--synthesis (selected-window) root-win-node) - (let ((ide-skel-win--win2-switch (and (not (null left-view-window)) - ide-skel-bottom-view-on-right-view)) - (old ide-skel-ommited-windows)) - (when (and (not ide-skel-bottom-view-on-left-view) - (not ide-skel-bottom-view-on-right-view) - (ide-skel-get-left-view-window)) - (push (ide-skel-get-left-view-window) ide-skel-ommited-windows)) - (ide-skel-win-add-window buffer window-bounds 'bottom ide-skel-bottom-view-window-size) - (setq ide-skel-ommited-windows old)))) - (if (window-live-p (car saved-window)) - (select-window (car saved-window)) - (when (get-buffer-window (cdr saved-window)) - (select-window (get-buffer-window (cdr saved-window))))) - (setq ide-skel-bottom-view-window-oper-in-progress nil))))) - -(defun ide-skel-hide-bottom-view-window () - (interactive) - (unless ide-skel-bottom-view-window-oper-in-progress - (setq ide-skel-bottom-view-window-oper-in-progress t) - (let ((bottom-view-window (ide-skel-get-bottom-view-window))) - (when bottom-view-window - (let ((ide-skel-win--win2-switch nil) - (select-editor (eq bottom-view-window (selected-window)))) - (ide-skel-remember-bottom-view-window) - (ide-skel-win-remove-window bottom-view-window) - (when select-editor (select-window (ide-skel-get-editor-window)))))) - (setq ide-skel-bottom-view-window-oper-in-progress nil))) - -(defun ide-skel-toggle-bottom-view-window () - "Toggle bottom view window." - (interactive) - (if (ide-skel-get-bottom-view-window) - (ide-skel-hide-bottom-view-window) - (ide-skel-show-bottom-view-window))) - -;;; Editor - -(defun ide-skel-get-editor-window () - (let (best-window) - (setq ide-skel--current-side-windows (cons nil nil)) - (dolist (win (copy-list (window-list nil 1))) - (when (with-current-buffer (window-buffer win) - (when (equal ide-skel-tabset-name ide-skel-left-view-window-tabset-name) - (setcar ide-skel--current-side-windows win)) - (when (equal ide-skel-tabset-name ide-skel-right-view-window-tabset-name) - (setcdr ide-skel--current-side-windows win)) - (or (not ide-skel-tabset-name) - (equal ide-skel-tabset-name ide-skel-editor-window-tabset-name))) - (if (null best-window) - (setq best-window win) - (let* ((best-window-coords (window-edges best-window)) - (win-coords (window-edges win))) - (when (or (< (cadr win-coords) (cadr best-window-coords)) - (and (= (cadr win-coords) (cadr best-window-coords)) - (< (car win-coords) (car best-window-coords)))) - (setq best-window win)))))) - best-window)) - -;;; Left view & Right view - -(defun ide-skel-toggle-side-view-window (name &optional run-hooks) - (if (funcall (intern (format "ide-skel-get-%s-view-window" name))) - (funcall (intern (format "ide-skel-hide-%s-view-window" name)) run-hooks) - (funcall (intern (format "ide-skel-show-%s-view-window" name)) run-hooks))) - -(defun ide-skel-toggle-left-view-window () - (interactive) - (ide-skel-toggle-side-view-window 'left (interactive-p))) - -(defun ide-skel-toggle-right-view-window () - (interactive) - (ide-skel-toggle-side-view-window 'right (interactive-p))) - - -(add-hook 'kill-buffer-hook (lambda () - (when (eq ide-skel-current-editor-buffer (current-buffer)) - (let* ((context (gethash ide-skel-current-editor-buffer ide-skel-context-properties)) - (imenu-buffer (cdr (assq :imenu-buffer context))) - (imenu-window (when imenu-buffer (get-buffer-window imenu-buffer)))) - (when imenu-window - (set-window-dedicated-p imenu-window nil) - (set-window-buffer imenu-window ide-skel-default-right-view-buffer) - (set-window-dedicated-p imenu-window t)) - (remhash (current-buffer) ide-skel-context-properties) - (when imenu-buffer - (kill-buffer imenu-buffer)))))) - -(defun ide-skel-send-event (side-symbol event-type &rest params) - (ide-skel-recalculate-view-cache) - (cond ((eq event-type 'hide) - (run-hook-with-args-until-success 'ide-skel-side-view-window-functions side-symbol 'hide) - (ide-skel-disable-nonactual-side-view-tabs side-symbol 'disable-all)) - ((eq event-type 'show) - (run-hook-with-args-until-success 'ide-skel-side-view-window-functions side-symbol 'show) - (ide-skel-side-window-switch-to-buffer (symbol-value (intern (format "ide-skel-current-%s-view-window" side-symbol))) nil)) - ((eq event-type 'editor-buffer-changed) - (run-hooks 'ide-skel-editor-buffer-changed-hook) - (when ide-skel-current-left-view-window - (ide-skel-disable-nonactual-side-view-tabs 'left) - (run-hook-with-args-until-success 'ide-skel-side-view-window-functions - 'left 'editor-buffer-changed - ide-skel-last-buffer-change-event ide-skel-current-editor-buffer) - (ide-skel-side-window-switch-to-buffer ide-skel-current-left-view-window nil)) - (when ide-skel-current-right-view-window - (ide-skel-disable-nonactual-side-view-tabs 'right) - (run-hook-with-args-until-success 'ide-skel-side-view-window-functions - 'right 'editor-buffer-changed - (car params) (cadr params)) - (ide-skel-side-window-switch-to-buffer ide-skel-current-right-view-window nil)) - (setq ide-skel-last-buffer-change-event ide-skel-current-editor-buffer)) - ((eq event-type 'tab-change) - (run-hook-with-args-until-success 'ide-skel-side-view-window-functions side-symbol 'tab-change (car params) (cadr params))))) - -(defun ide-skel-hide-side-view-window (name &optional run-hooks) - (let* ((view-window (funcall (intern (format "ide-skel-get-%s-view-window" name)))) - (select-editor (eq view-window (selected-window)))) - (when view-window - (when (active-minibuffer-window) - (error "Cannot remove side window while minibuffer is active")) - (let* ((bottom-view-window (ide-skel-get-bottom-view-window)) - (selected-bottom-view-window (and bottom-view-window (eq bottom-view-window (selected-window)))) - (buffer (window-buffer view-window)) - (second-side-window (funcall (intern (format "ide-skel-get-%s-view-window" (if (eq name 'left) 'right 'left)))))) - (set (intern (format "ide-skel-last-%s-view-buffer" name)) buffer) - (when run-hooks - (ide-skel-send-event name 'hide)) - (when bottom-view-window - (ide-skel-hide-bottom-view-window)) - (when second-side-window - (push second-side-window ide-skel-ommited-windows)) - (let ((ide-skel-win--win2-switch (eq name 'left))) - (set (intern (format "ide-skel-%s-view-window-width" name)) (window-width view-window)) - (ide-skel-win-remove-window view-window)) - (setq ide-skel-ommited-windows nil) - (when bottom-view-window - (ide-skel-show-bottom-view-window) - (when selected-bottom-view-window - (select-window (ide-skel-get-bottom-view-window)))) - (ide-skel-recalculate-view-cache) - (when select-editor (select-window (ide-skel-get-editor-window))))))) - -(defun ide-skel-hide-left-view-window (&optional run-hooks) - (interactive) - (let ((right-view-window (ide-skel-get-right-view-window))) - (when right-view-window - (ide-skel-hide-right-view-window)) - (ide-skel-hide-side-view-window 'left (or run-hooks (interactive-p))) - (when right-view-window - (ide-skel-show-right-view-window)))) - -(defun ide-skel-hide-right-view-window (&optional run-hooks) - (interactive) - (ide-skel-hide-side-view-window 'right (or (interactive-p) run-hooks))) - -(defun ide-skel-get-side-view-buffer-create (name side-sym tab-label help-string keep-condition-function) - (let* ((was-buffer (get-buffer name)) - (km (make-sparse-keymap)) - (buffer (get-buffer-create name))) - (unless was-buffer - (with-current-buffer buffer - (kill-all-local-variables) - (remove-overlays) - (define-key km [drag-mouse-1] 'ignore) - (use-local-map km) - (make-local-variable 'mouse-wheel-scroll-amount) - (make-local-variable 'auto-hscroll-mode) - (make-local-variable 'hscroll-step) - (make-local-variable 'hscroll-margin) - (setq ide-skel-tabset-name (if (eq side-sym 'left) ide-skel-left-view-window-tabset-name ide-skel-right-view-window-tabset-name) - ide-skel-tabbar-tab-label tab-label - ide-skel-tabbar-tab-help-string help-string - ide-skel-keep-condition-function keep-condition-function - auto-hscroll-mode nil - hscroll-step 0.0 - hscroll-margin 0 -;; left-fringe-width 0 -;; right-fringe-width 0 - buffer-read-only t - mode-line-format " " - mouse-wheel-scroll-amount '(1) - window-size-fixed 'width) - ;; (make-variable-buffer-local 'fringe-indicator-alist) - (setq fringe-indicator-alist (copy-alist default-fringe-indicator-alist)) -;; (when (>= emacs-major-version 22) -;; (set 'indicate-buffer-boundaries '((up . left) (down . left)))) - (setcdr (assq 'truncation fringe-indicator-alist) nil) - (set (make-local-variable 'scroll-conservatively) 1500) ; much greater than 0 - (when (and window-system - (not ide-skel-side-view-display-cursor)) - (setq cursor-type nil)))) - buffer)) - -(defvar ide-skel-default-left-view-buffer - (let ((buffer (ide-skel-get-side-view-buffer-create " Default Left View Buffer" 'left nil nil (lambda (buf) t)))) - (with-current-buffer buffer - (setq header-line-format " ")) - buffer)) -(defvar ide-skel-last-left-view-buffer ide-skel-default-left-view-buffer) -(defvar ide-skel-default-right-view-buffer - (let ((buffer (ide-skel-get-side-view-buffer-create " Default Right View Buffer" 'right nil nil (lambda (buf) t)))) - (with-current-buffer buffer - (setq header-line-format " ")) - buffer)) -(defvar ide-skel-last-right-view-buffer ide-skel-default-right-view-buffer) - -(defun ide-skel-show-side-view-window (name &optional run-hooks) - (unless (funcall (intern (format "ide-skel-get-%s-view-window" name))) - (let* ((current-buffer (window-buffer (selected-window))) - (bottom-view-window (ide-skel-get-bottom-view-window)) - root-win-node - (bottom-view-window-bounds (and (or (symbol-value (intern (format "ide-skel-bottom-view-on-%s-view" name))) - (and ide-skel-bottom-view-on-left-view - (not ide-skel-bottom-view-on-right-view))) - bottom-view-window - (window-edges bottom-view-window))) - best-window-bounds) - (when bottom-view-window-bounds - (ide-skel-hide-bottom-view-window)) - (let ((second-side-window (funcall (intern (format "ide-skel-get-%s-view-window" (if (eq name 'left) 'right 'left)))))) - (when second-side-window - (push second-side-window ide-skel-ommited-windows)) - (setq root-win-node (ide-skel-win--analysis)) - (setq best-window-bounds (window-edges (selected-window))) ; bounds of maximized window (after analysis) - (ide-skel-win--synthesis (selected-window) root-win-node) - (ide-skel-win-add-window - (symbol-value (intern (format (if run-hooks "ide-skel-default-%s-view-buffer" "ide-skel-last-%s-view-buffer") name))) - best-window-bounds name - (symbol-value (intern (format "ide-skel-%s-view-window-width" name)))) - (setq ide-skel-ommited-windows nil) - (when bottom-view-window-bounds - (ide-skel-show-bottom-view-window)) - (set-window-dedicated-p (funcall (intern (format "ide-skel-get-%s-view-window" name))) t) - (when run-hooks - (dolist (tab (tabbar-tabs (tabbar-get-tabset (symbol-value (intern (format "ide-skel-%s-view-window-tabset-name" name)))))) - (tabbar-delete-tab tab)) - (ide-skel-send-event name 'show)) - (some (lambda (win) (when (eq (window-buffer win) current-buffer) (select-window win) t)) (copy-list (window-list nil 1))))))) - -;; Disables from view all buffers for which keep condition function -;; returns nil. If a current buffer is there, select another enabled, -;; which implies tab-change event, then select any enabled buffer. -(defun ide-skel-disable-nonactual-side-view-tabs (name &optional disable-all) - (let* ((tabset (tabbar-get-tabset (symbol-value (intern (format "ide-skel-%s-view-window-tabset-name" name))))) - (tabs (tabbar-tabs tabset)) - (editor-buffer (window-buffer (ide-skel-get-editor-window))) - selected-deleted - (selected-tab (tabbar-selected-tab tabset))) - (when tabs - (dolist (tab tabs) - (let ((buffer (tabbar-tab-value tab))) - (with-current-buffer buffer - (when (or disable-all - (not ide-skel-keep-condition-function) - (not (funcall ide-skel-keep-condition-function editor-buffer))) - (setq ide-skel-tabbar-enabled nil) - (when (eq tab selected-tab) - (setq selected-deleted t)) - (tabbar-delete-tab tab))))) - (let ((selected-buffer (when (and (not selected-deleted) - (tabbar-tabs tabset) (tabbar-selected-value tabset))))) - (when (and (not disable-all) - (or selected-deleted - (not (eq (tabbar-selected-tab tabset) selected-tab)))) - (unless selected-buffer - (setq selected-buffer (symbol-value (intern (format "ide-skel-default-%s-view-buffer" name))))) - (ide-skel-side-window-switch-to-buffer - (symbol-value (intern (format "ide-skel-current-%s-view-window" name))) - selected-buffer)))))) - -(defun ide-skel-show-left-view-window (&optional run-hooks) - (interactive) - (let ((right-view-window (ide-skel-get-right-view-window))) - (when right-view-window - (ide-skel-hide-right-view-window)) - (ide-skel-show-side-view-window 'left (or run-hooks (interactive-p))) - (when right-view-window - (ide-skel-show-right-view-window)))) - -(defun ide-skel-show-right-view-window (&optional run-hooks) - (interactive) - (ide-skel-show-side-view-window 'right (or run-hooks (interactive-p)))) - -(defun ide-skel-get-side-view-window (name) - (let ((tabset-name (symbol-value (intern (format "ide-skel-%s-view-window-tabset-name" name))))) - (some (lambda (win) - (when (with-current-buffer (window-buffer win) - (equal ide-skel-tabset-name tabset-name)) - win)) - (copy-list (window-list nil 1))))) - -(defun ide-skel-get-left-view-window () - (ide-skel-get-side-view-window 'left)) - -(defun ide-skel-get-right-view-window () - (ide-skel-get-side-view-window 'right)) - -(defun ide-skel-get-side-view-windows () - (let (result - (left-view-win (ide-skel-get-left-view-window)) - (right-view-win (ide-skel-get-right-view-window))) - (when left-view-win (push left-view-win result)) - (when right-view-win (push right-view-win result)) - result)) - -(defun ide-skel-side-view-window-p (window) - (ide-skel-side-view-buffer-p (window-buffer window))) - -(defun ide-skel-side-view-buffer-p (buffer) - (with-current-buffer buffer - (or (equal ide-skel-tabset-name ide-skel-left-view-window-tabset-name) - (equal ide-skel-tabset-name ide-skel-right-view-window-tabset-name)))) - -(defadvice delete-window (around delete-window-around-advice (&optional window)) - (let* ((target-window (if window window (selected-window))) - (editor-window (and (interactive-p) (ide-skel-get-editor-window))) ; for ide-skel--current-side-windows (side-effects) - (hide-view-windows (and (interactive-p) - (not (eq (car ide-skel--current-side-windows) target-window)) - (not (eq (cdr ide-skel--current-side-windows) target-window)))) - (hide-left-view-window (and hide-view-windows (car ide-skel--current-side-windows))) - (hide-right-view-window (and hide-view-windows (cdr ide-skel--current-side-windows))) - result) - (when (interactive-p) - (if (eq (car ide-skel--current-side-windows) target-window) - (ide-skel-send-event 'left 'hide) - (when (eq (cdr ide-skel--current-side-windows) target-window) - (ide-skel-send-event 'right 'hide)))) - (let* ((edges (window-inside-edges window)) - (buf (window-buffer window)) - win - (center-position (cons (/ (+ (car edges) (caddr edges)) 2) - (/ (+ (cadr edges) (cadddr edges)) 2)))) - (when hide-left-view-window (ide-skel-hide-left-view-window)) - (when hide-right-view-window (ide-skel-hide-right-view-window)) - (setq win (window-at (car center-position) (cdr center-position))) - (when (eq (window-buffer win) buf) - (setq window (window-at (car center-position) (cdr center-position))))) - (unwind-protect - (setq result (progn ad-do-it)) - (when hide-left-view-window (ide-skel-show-left-view-window)) - (when hide-right-view-window (ide-skel-show-right-view-window))) - result)) -(ad-activate 'delete-window) - -(defadvice delete-other-windows (around delete-other-windows-around-advice (&optional window)) - (ide-skel-assert-not-in-side-view-window) - (let* ((editor-window (ide-skel-get-editor-window)) - (dont-revert-after (and (interactive-p) (listp current-prefix-arg) (car current-prefix-arg))) ; C-u - (hide-left-view-window (and (interactive-p) (car ide-skel--current-side-windows))) - (hide-right-view-window (and (interactive-p) (cdr ide-skel--current-side-windows))) - result) - (when hide-left-view-window (ide-skel-hide-left-view-window dont-revert-after)) - (when hide-right-view-window (ide-skel-hide-right-view-window dont-revert-after)) - (unwind-protect - (setq result (progn ad-do-it)) - (when (not dont-revert-after) - (when hide-left-view-window - (ide-skel-show-left-view-window)) - (when hide-right-view-window - (ide-skel-show-right-view-window)))) - result)) -(ad-activate 'delete-other-windows) - -(defun ide-skel-assert-not-in-side-view-window () - (when (and (interactive-p) (ide-skel-side-view-window-p (selected-window))) - (error "Cannot do it"))) - -(defadvice kill-buffer (before kill-buffer-before-advice (buffer)) - (ide-skel-assert-not-in-side-view-window)) -(ad-activate 'kill-buffer) - -(defadvice split-window-vertically (before split-window-vertically-before-advice (&optional size)) - (ide-skel-assert-not-in-side-view-window)) -(ad-activate 'split-window-vertically) - -(defadvice split-window-horizontally (before split-window-horizontally-before-advice (&optional size)) - (ide-skel-assert-not-in-side-view-window)) -(ad-activate 'split-window-horizontally) - -(defadvice mouse-drag-vertical-line (around mouse-drag-vertical-line-around-advice (start-event)) - (let* ((editor-window (ide-skel-get-editor-window)) - (left-view-window (car ide-skel--current-side-windows)) - (right-view-window (cdr ide-skel--current-side-windows))) - (when left-view-window (with-selected-window left-view-window (setq window-size-fixed nil))) - (when right-view-window (with-selected-window right-view-window (setq window-size-fixed nil))) - (unwind-protect - (progn ad-do-it) - (when left-view-window (with-selected-window left-view-window (setq window-size-fixed 'width))) - (when right-view-window (with-selected-window right-view-window (setq window-size-fixed 'width)))))) -(ad-activate 'mouse-drag-vertical-line) - -(defadvice other-window (after other-window-after-advice (arg &optional all-frames)) - (if (memq (selected-window) (list ide-skel-current-left-view-window ide-skel-current-right-view-window)) - (other-window arg all-frames) - ad-return-value)) -(ad-activate 'other-window) - -;; Buffer list buffer (left side view) - -(define-derived-mode fundmental-mode - fundamental-mode "Fundmental") - -(setq default-major-mode 'fundmental-mode) - -(defun ide-skel-recentf-closed-files-list () - "Lista ostatnio otwieranych, ale aktualnie zamknietych plikow" - (let* ((open-file-paths (delq nil (mapcar (lambda (buffer) (buffer-file-name buffer)) (buffer-list))))) - (if (featurep 'recentf) - (sort (reverse (set-difference recentf-list open-file-paths :test 'string=)) - (lambda (path1 path2) - (string< (file-name-nondirectory path1) (file-name-nondirectory path2)))) - nil))) - -(defun ide-skel-select-buffer (buffer-or-path &optional line-no) - (let* ((window (ide-skel-get-last-selected-window)) - (buffer (or (and (bufferp buffer-or-path) buffer-or-path) - (find-file-noselect buffer-or-path))) - (is-bottom-view-buffer (ide-skel-bottom-view-buffer-p buffer))) - (when (not (buffer-live-p buffer)) - (error "Buffer %s is dead" buffer)) - (unless (get-buffer-window buffer) - ;; (message "%S %S" window (ide-skel-get-bottom-view-window)) - (if (and window - (not (eq window (ide-skel-get-bottom-view-window))) - (not is-bottom-view-buffer)) - (set-window-buffer window buffer) - (let ((editor-window (ide-skel-get-editor-window))) - (select-window editor-window) - (if is-bottom-view-buffer - (switch-to-buffer-other-window buffer) - (set-window-buffer editor-window buffer))))) - (setq ide-skel-last-selected-window-or-buffer (cons (get-buffer-window buffer) buffer)) - (select-window (car ide-skel-last-selected-window-or-buffer)) - (when line-no - (with-current-buffer buffer - (goto-line line-no))))) - -(defun ide-skel-select-buffer-handler (event) - (interactive "@e") - ;; (message "EVENT: %S" event) - (with-selected-window (posn-window (event-start event)) - (let* ((object (get-text-property (posn-point (event-start event)) 'object-to-display))) - (beginning-of-line) - (ide-skel-select-buffer object)))) - -(defun ide-skel-buffers-view-insert-buffer-list (label buffer-list) - (setq label (propertize label 'face 'bold)) - (insert (format "%s\n" label)) - (dolist (object buffer-list) - (let* ((label (format " % -100s" (if (bufferp object) (buffer-name object) (file-name-nondirectory object)))) - (km (make-sparse-keymap))) - (define-key km [mouse-1] 'ide-skel-select-buffer-handler) - (setq label (propertize label - 'mouse-face 'ide-skel-highlight-face - 'local-map km - 'face 'variable-pitch - 'pointer 'hand - 'object-to-display object - 'help-echo (if (bufferp object) (buffer-file-name object) object))) - (insert label) - (insert "\n")))) - -(defun ide-skel-buffers-view-fill () - (when ide-skel-current-left-view-window - (with-current-buffer ide-skel-buffer-list-buffer - (let ((point (point)) - (window-start (when (eq (window-buffer ide-skel-current-left-view-window) ide-skel-buffer-list-buffer) - (save-excursion - (goto-char (window-start ide-skel-current-left-view-window)) - (cons (line-number-at-pos) (current-column)))))) - ;; (message "%S" window-start) - (let (asterisk-buffers - (inhibit-read-only t) - normal-buffers) - (erase-buffer) - (dolist (buffer (sort (buffer-list) (lambda (buf1 buf2) (string< (buffer-name buf1) (buffer-name buf2))))) - (let* ((name (buffer-name buffer)) - (first-char (aref (buffer-name buffer) 0))) - (unless (char-equal ?\ first-char) - (if (char-equal ?* first-char) - (push buffer asterisk-buffers) - (push buffer normal-buffers))))) - (ide-skel-buffers-view-insert-buffer-list "Normal Buffers:" normal-buffers) - (ide-skel-buffers-view-insert-buffer-list "Scratch Buffers:" asterisk-buffers) - (ide-skel-buffers-view-insert-buffer-list "Recent Files:" (ide-skel-recentf-closed-files-list))) - (if window-start - (let ((pos (save-excursion - (goto-line (car window-start)) - (beginning-of-line) - (forward-char (cdr window-start)) - (point)))) - (set-window-start ide-skel-current-left-view-window pos)) - (goto-char point) - (beginning-of-line)))))) - -(defun ide-skel-some-view-window-buffer (side-symbol predicate) - (some (lambda (buffer) - (and (buffer-live-p buffer) - (with-current-buffer buffer - (and (equal ide-skel-tabset-name (symbol-value (intern (format "ide-skel-%s-view-window-tabset-name" side-symbol)))) - ide-skel-tabbar-enabled - (funcall predicate buffer) - buffer)))) - (buffer-list))) - -(defun ide-skel-side-window-switch-to-buffer (side-window buffer) - "If BUFFER is nil, then select any non-default buffer. The -TAB-CHANGE event is send only if selected buffer changed." - (unwind-protect - (let* ((side-symbol (cond ((eq side-window ide-skel-current-left-view-window) 'left) - ((eq side-window ide-skel-current-right-view-window) 'right) - (t nil))) - (context (gethash ide-skel-current-editor-buffer ide-skel-context-properties)) - (context-default-tab-label-symbol (intern (format "default-%s-tab-label" side-symbol)))) - (when side-symbol - (unless buffer - (let* ((default-empty-buffer (symbol-value (intern (format "ide-skel-default-%s-view-buffer" side-symbol)))) - (context-default-tab-label (cdr (assq context-default-tab-label-symbol context))) - (last-view-window-tab-label (symbol-value (intern (format "ide-skel-last-%s-view-window-tab-label" side-symbol))))) - ;; first non-nil: - ;; - selected before in this context - ;; - selected in previous context - ;; - current if other than default-empty - ;; - first non default-empty - ;; - default-empty - (setq buffer - (or (and context-default-tab-label - (ide-skel-some-view-window-buffer side-symbol (lambda (buffer) - (equal ide-skel-tabbar-tab-label context-default-tab-label)))) - (and last-view-window-tab-label - (ide-skel-some-view-window-buffer side-symbol (lambda (buffer) - (equal ide-skel-tabbar-tab-label last-view-window-tab-label)))) - (and (not (eq (window-buffer side-window) default-empty-buffer)) - (window-buffer side-window)) - (ide-skel-some-view-window-buffer side-symbol (lambda (buffer) ide-skel-tabbar-tab-label)) - default-empty-buffer)))) - (unless (eq (window-buffer side-window) buffer) - (set (intern (format "ide-skel-last-%s-view-window-tab-label" side-symbol)) (with-current-buffer buffer ide-skel-tabbar-tab-label)) - (setq context (assq-delete-all context-default-tab-label-symbol context)) - (puthash ide-skel-current-editor-buffer - (cons (cons context-default-tab-label-symbol (with-current-buffer buffer ide-skel-tabbar-tab-label)) context) - ide-skel-context-properties) - (ide-skel-send-event side-symbol 'tab-change (window-buffer side-window) buffer))) - (set-window-dedicated-p side-window nil) - (set-window-buffer side-window buffer)) - (set-window-dedicated-p side-window t))) - -;; args: 'left/right 'show/editor-buffer-changed/hide/tab-change &rest buffer... -(defun ide-skel-default-side-view-window-function (side event &rest list) - ;; (message "SIDE: %S, event: %S, rest: %S %S" side event list ide-skel-current-left-view-window) - (when (and (eq side 'left) ide-skel-current-left-view-window) - (cond ((eq event 'show) - (unless ide-skel-buffer-list-buffer - (setq ide-skel-buffer-list-buffer (ide-skel-get-side-view-buffer-create - " Ide-Skel Buffer List Buffer" 'left "Bufs" "List of opened and recent files" - (lambda (buf) t))) - (with-current-buffer ide-skel-buffer-list-buffer - (setq ide-skel-tabbar-enabled t))) - (ide-skel-buffers-view-fill) - (ide-skel-side-window-switch-to-buffer ide-skel-current-left-view-window ide-skel-buffer-list-buffer)))) - nil) - - ;; (message "SIDE: %S, event: %S, rest: %S" side event list) - -(add-hook 'change-major-mode-hook (lambda () (setq ide-skel-buffer-list-tick t))) -(add-hook 'kill-buffer-hook (lambda () (setq ide-skel-buffer-list-tick t))) -(run-with-idle-timer 0.1 t (lambda () - (when ide-skel-buffer-list-tick - (setq ide-skel-buffer-list-tick nil) - (ide-skel-buffers-view-fill)))) - -(add-hook 'ide-skel-side-view-window-functions 'ide-skel-default-side-view-window-function) - -(define-key-after global-map [tool-bar ide-skel-toggle-left-view-window] - (list 'menu-item "Left View Window" 'ide-skel-toggle-left-view-window :image ide-skel-left-view-window-image)) -(define-key-after global-map [tool-bar ide-skel-toggle-bottom-view-window] - (list 'menu-item "Bottom View Window" 'ide-skel-toggle-bottom-view-window :image ide-skel-bottom-view-window-image)) -(define-key-after global-map [tool-bar ide-skel-toggle-right-view-window] - (list 'menu-item "Right View Window" 'ide-skel-toggle-right-view-window :image ide-skel-right-view-window-image)) - -(eval-after-load "tabbar" '(ide-skel-tabbar-load-hook)) - -;;; Tree Widget - -(defadvice tree-widget-lookup-image (around tree-widget-lookup-image-around-advice (name)) - (if (equal (tree-widget-theme-name) "small-folder") - (setq ad-return-value (apply 'create-image (symbol-value (intern (format "ide-skel-tree-widget-%s-xpm" name))) 'xpm t (tree-widget-image-properties name))) - ad-do-it)) -(ad-activate 'tree-widget-lookup-image) - - - -;;; Imenu - -(require 'imenu) - -(defun ide-skel-imenu-refresh () - (interactive) - (ide-skel-imenu-side-view-draw-tree (window-buffer ide-skel-current-right-view-window) t)) - -(defun ide-skel-imenu-sort-change () - (interactive) - (with-current-buffer (window-buffer ide-skel-current-right-view-window) - (setq ide-skel-imenu-sorted (not ide-skel-imenu-sorted))) - (ide-skel-imenu-side-view-draw-tree (window-buffer ide-skel-current-right-view-window) t)) - -(defun ide-skel-imenu-get-buffer-create (editor-buffer &optional dont-create) - (let* ((context (gethash editor-buffer ide-skel-context-properties)) - (buffer (cdr (assq :imenu-buffer context)))) - (when (and (not buffer) (not dont-create)) - (setq buffer (ide-skel-get-side-view-buffer-create (concat " " (buffer-name editor-buffer) " Ide Skel Imenu") - 'right "Imenu" nil - (lambda (editor-buffer) - (eq ide-skel-imenu-editor-buffer ide-skel-current-editor-buffer)))) - (with-current-buffer buffer - (setq ide-skel-tabbar-menu-function - (lambda () - (let ((is-outline-mode (with-current-buffer (window-buffer ide-skel-current-right-view-window) - (with-current-buffer ide-skel-imenu-editor-buffer - (or (eq major-mode 'outline-mode) - (and (boundp 'outline-minor-mode) - (symbol-value 'outline-minor-mode))))))) - (append - (list - (list 'ide-skel-imenu-refresh "Refresh" t) - (unless is-outline-mode - (list 'ide-skel-imenu-sort-change (if (with-current-buffer (window-buffer ide-skel-current-right-view-window) - ide-skel-imenu-sorted) - "Natural order" - "Sorted order") t)))))) - ide-skel-imenu-editor-buffer editor-buffer - ide-skel-imenu-open-paths (make-hash-table :test 'equal)) - (add-hook 'tree-widget-after-toggle-functions (lambda (widget) - (let ((path (widget-get widget :path))) - (when path - (if (widget-get widget :open) - (puthash path t ide-skel-imenu-open-paths) - (remhash path ide-skel-imenu-open-paths))))) - nil t)) - (puthash editor-buffer (cons (cons :imenu-buffer buffer) context) ide-skel-context-properties)) - buffer)) - -(defun ide-skel-tree-node-notify (widget &rest rest) - (let ((index-name (widget-get widget :index-name)) - (index-position (widget-get widget :index-position)) - (function (widget-get widget :function)) - (arguments (widget-get widget :arguments))) - (select-window (ide-skel-get-editor-window)) - (if function - (apply function index-name index-position arguments) - (goto-char index-position)))) - -;; building hash -(defun ide-skel-imenu-analyze (hash prefix element) - (when element - (if (and (consp (cdr element)) - (listp (cadr element))) - (dolist (elem (cdr element)) - (ide-skel-imenu-analyze hash (concat prefix "/" (car element)) elem)) - (puthash (concat prefix "/" (car element)) (list (cons :element element)) hash)))) - -;; logical linking, internal nodes creation -(defun ide-skel-imenu-analyze2 (hash prefix element) - (when element - (if (and (consp (cdr element)) - (listp (cadr element))) - (dolist (elem (cdr element)) - (ide-skel-imenu-analyze2 hash (concat prefix "/" (car element)) elem)) - (let* ((index-name (car element)) - (path (concat prefix "/" index-name)) - (node (gethash path hash)) - (reverse-separators (let ((index 0) - result) - (while (string-match "[*#:.]+" index-name index) - (push (cons (match-beginning 0) (match-end 0)) result) - (setq index (match-end 0))) - result)) - found) - (some (lambda (separator-pair) - (let* ((begin (car separator-pair)) - (end (cdr separator-pair)) - (before-name (substring index-name 0 begin)) - (after-name (substring index-name end)) - (parent-path (concat prefix "/" before-name)) - (parent-node (gethash parent-path hash))) - (when parent-node - (push (cons :parent parent-path) node) - (unless (assq :name node) - (push (cons :name after-name) node)) - (puthash path node hash) - (unless (assq :widget parent-node) - (let* ((parent-element (cdr (assq :element parent-node))) - (parent-index-name (car parent-element)) - (parent-index-position (if (consp (cdr parent-element)) (cadr parent-element) (cdr parent-element))) - (parent-function (when (consp (cdr parent-element)) (caddr parent-element))) - (open-status (gethash parent-path ide-skel-imenu-open-paths)) - (parent-arguments (when (consp (cdr parent-element)) (cdddr parent-element)))) - (push (cons :widget - ;; internal node - (list 'ide-skel-imenu-internal-node-widget - :open open-status - :indent 0 - :path parent-path - :notify 'ide-skel-tree-node-notify - :index-name parent-index-name - :index-position parent-index-position - :function parent-function - :arguments parent-arguments - :node (list 'push-button - :format "%[%t%]\n" - :button-face 'variable-pitch - :tag (or (cdr (assq :name parent-node)) - before-name) - ;; :tag (cadr (assq :element parent-node)) - ))) - parent-node) - (puthash parent-path parent-node hash))) - t))) - reverse-separators))))) - -;; widget linking, leafs creation -(defun ide-skel-imenu-analyze3 (hash prefix element) - (when element - (if (and (consp (cdr element)) - (listp (cadr element))) - (dolist (elem (cdr element)) - (ide-skel-imenu-analyze3 hash (concat prefix "/" (car element)) elem)) - (let* ((index-name (car element)) - (index-position (if (consp (cdr element)) (cadr element) (cdr element))) - (function (when (consp (cdr element)) (caddr element))) - (arguments (when (consp (cdr element)) (cdddr element))) - (path (concat prefix "/" index-name)) - (node (gethash path hash)) - (widget (cdr (assq :widget node))) - (parent-path (cdr (assq :parent node))) - (parent-node (when parent-path (gethash parent-path hash))) - (parent-widget (when parent-node (cdr (assq :widget parent-node))))) - ;; create leaf if not exists - (unless widget - ;; leaf node - (push (cons :widget (list 'ide-skel-imenu-leaf-widget - :notify 'ide-skel-tree-node-notify - :index-name index-name - :index-position index-position - :function function - :arguments arguments - :tag (or (cdr (assq :name node)) - index-name))) - node) - (puthash path node hash) - (setq widget (cdr (assq :widget node)))) - ;; add to parent - (when parent-widget - (setcdr (last parent-widget) (cons widget nil))))))) - -(defun ide-skel-imenu-create-tree (hash prefix element) - (when element - (if (and (consp (cdr element)) - (listp (cadr element))) - (let* ((menu-title (car element)) - (sub-alist (cdr element)) - (path (concat prefix "/" menu-title)) - (open-status (gethash path ide-skel-imenu-open-paths))) - (append - (list 'ide-skel-imenu-internal-node-widget - :open open-status - :indent 0 - :path path - :node (list 'push-button - :format "%[%t%]\n" - :button-face 'variable-pitch - :tag menu-title)) - (delq nil (mapcar (lambda (elem) - (ide-skel-imenu-create-tree hash path elem)) - sub-alist)))) - (let* ((index-name (car element)) - (index-position (if (consp (cdr element)) (cadr element) (cdr element))) - (function (when (consp (cdr element)) (caddr element))) - (arguments (when (consp (cdr element)) (cdddr element))) - (path (concat prefix "/" index-name)) - (node (gethash path hash)) - (parent-path (cdr (assq :parent node))) - (widget (cdr (assq :widget node)))) - (unless parent-path - widget))))) - -(defun ide-skel-imenu-compare (e1 e2) - (let ((ce1 (and (consp (cdr e1)) (listp (cadr e1)))) - (ce2 (and (consp (cdr e2)) (listp (cadr e2))))) - (when ce1 - (setcdr e1 (sort (cdr e1) 'ide-skel-imenu-compare))) - (when ce2 - (setcdr e2 (sort (cdr e2) 'ide-skel-imenu-compare))) - (if (or (and ce1 ce2) - (and (not ce1) (not ce2))) - (string< (car e1) (car e2)) - (and ce1 (not ce2))))) - -(defun ide-skel-outline-tree-create (index-alist) - (let (stack - node-list - (current-depth 0)) - (dolist (element index-alist) - (let ((index-name (car element)) - (index-position (if (consp (cdr element)) (cadr element) (cdr element))) - (function (when (consp (cdr element)) (caddr element))) - (arguments (when (consp (cdr element)) (cdddr element)))) - ;; (message "index-name: %S" index-name) - (string-match "^\\([*]+\\)[ ]*\\(.*\\)$" index-name) - (let* ((depth (length (match-string 1 index-name))) - (name (match-string 2 index-name)) - parent-node - node) - (while (and stack - (>= (caar stack) depth)) - (setq stack (cdr stack))) - (when stack - (setq parent-node (cdar stack)) - (when (eq (car parent-node) 'ide-skel-imenu-leaf-widget) - (let ((path (plist-get (cdr parent-node) :path))) - (setcar parent-node 'ide-skel-imenu-internal-node-widget) - (setcdr parent-node (list :open (gethash path ide-skel-imenu-open-paths) - :indent 0 - :notify 'ide-skel-tree-node-notify - :index-name (plist-get (cdr parent-node) :index-name) - :index-position (plist-get (cdr parent-node) :index-position) - :function (plist-get (cdr parent-node) :function) - :arguments (plist-get (cdr parent-node) :arguments) - :path path - :node (list 'push-button - :format "%[%t%]\n" - :button-face 'variable-pitch - :tag (plist-get (cdr parent-node) :tag))))))) - (setq node (list 'ide-skel-imenu-leaf-widget - :notify 'ide-skel-tree-node-notify - :index-name index-name - :index-position index-position - :function function - :path (concat (plist-get (cdr parent-node) :path) "/" index-name) - :arguments arguments - :tag name)) - (push (cons depth node) stack) - (if parent-node - (setcdr (last parent-node) (cons node nil)) - (push node node-list))))) - (append - (list 'ide-skel-imenu-internal-node-widget - :open t - :indent 0 - :path "" - :tag "") - (reverse node-list)))) - -(defun ide-skel-imenu-side-view-draw-tree (imenu-buffer &optional refresh) - (with-current-buffer imenu-buffer - (let ((index-alist (with-current-buffer ide-skel-imenu-editor-buffer - (when refresh - (imenu--cleanup) - (setq imenu--index-alist nil)) - (cons "" (progn - (unless imenu--index-alist - (font-lock-default-fontify-buffer) - (condition-case err - (imenu--make-index-alist t) - (error nil))) - imenu--index-alist)))) - (is-outline-mode (with-current-buffer ide-skel-imenu-editor-buffer - (or (eq major-mode 'outline-mode) - (and (boundp 'outline-minor-mode) - (symbol-value 'outline-minor-mode))))) - (inhibit-read-only t) - (hash (make-hash-table :test 'equal)) - (start-line (save-excursion - (goto-char (window-start ide-skel-current-right-view-window)) - (line-number-at-pos)))) - (unless is-outline-mode - (when ide-skel-imenu-sorted - (setq index-alist (cons "" (sort (copy-tree (cdr index-alist)) 'ide-skel-imenu-compare)))) - (ide-skel-imenu-analyze hash "/" index-alist) - (ide-skel-imenu-analyze2 hash "/" index-alist) - (ide-skel-imenu-analyze3 hash "/" index-alist)) - (let ((tree (if is-outline-mode - (ide-skel-outline-tree-create (cdr index-alist)) - (ide-skel-imenu-create-tree hash "/" index-alist)))) - (plist-put (cdr tree) :open t) - (plist-put (cdr tree) :indent 0) - (erase-buffer) - (tree-widget-set-theme "small-folder") - (widget-create tree) - (set-keymap-parent (current-local-map) tree-widget-button-keymap) - (widget-setup) - (goto-line start-line) - (beginning-of-line) - (set-window-start ide-skel-current-right-view-window (point)))))) - -(defun ide-skel-imenu-side-view-window-function (side event &rest list) - ;; (message "%S %S %S" side event list) - (when (and (eq side 'right) - ide-skel-current-right-view-window) - (let ((imenu-buffer (ide-skel-imenu-get-buffer-create ide-skel-current-editor-buffer t))) - (when (memq event '(show editor-buffer-changed)) - (when (ide-skel-has-imenu ide-skel-current-editor-buffer) - (unless imenu-buffer - (setq imenu-buffer (ide-skel-imenu-get-buffer-create ide-skel-current-editor-buffer))) - (with-current-buffer imenu-buffer - (setq ide-skel-tabbar-enabled t)))) - (when (and imenu-buffer - (eq event 'tab-change) - (eq (cadr list) imenu-buffer)) - (with-current-buffer imenu-buffer - (when (= (buffer-size) 0) - (ide-skel-imenu-side-view-draw-tree imenu-buffer)))))) - nil) - -(add-hook 'ide-skel-side-view-window-functions 'ide-skel-imenu-side-view-window-function) - -;;; Info - -(require 'info) - -(defun ide-skel-info-get-buffer-create () - (let ((buffer (ide-skel-get-side-view-buffer-create " Ide Skel Info" - 'left "Info" "Info browser" - (lambda (editor-buffer) t)))) - (with-current-buffer buffer - (setq ide-skel-tabbar-menu-function - (lambda () - (append - (list - (list 'ide-skel-info-refresh "Refresh" t)))) - ide-skel-info-open-paths (make-hash-table :test 'equal) - ide-skel-info-root-node (cons "Top" "(dir)top")) - (add-hook 'tree-widget-after-toggle-functions (lambda (widget) - (let ((path (widget-get widget :path))) - (when path - (if (widget-get widget :open) - (puthash path t ide-skel-info-open-paths) - (remhash path ide-skel-info-open-paths))))) - nil t)) - buffer)) - -(defun ide-skel-info-file-open (widget &rest rest) - (let ((path (widget-get widget :path))) - (if (not (string-match "^(\\([^)]+\\))\\([^.]+\\)$" path)) - (error "Invalid node %s" path) - (let ((filename (match-string 1 path)) - (nodename (match-string 2 path)) - (buffer (get-buffer "*info*")) - buffer-win) - (unless buffer - (with-selected-window (ide-skel-get-last-selected-window) - (info) - (setq buffer (window-buffer (selected-window))) - (setq buffer-win (selected-window)))) - (unless buffer-win - (setq buffer-win (get-buffer-window buffer)) - (unless buffer-win - (with-selected-window (ide-skel-get-last-selected-window) - (switch-to-buffer buffer) - (setq buffer-win (selected-window))))) - (select-window buffer-win) - (Info-find-node filename nodename))))) - -(defun ide-skel-info-tree-expand-dir (tree) - (let ((path (widget-get tree :path))) - (condition-case err - (mapcar 'ide-skel-info-tree-widget (Info-speedbar-fetch-file-nodes path)) - (error - (message "%s" (error-message-string err)) - nil)))) - -(defun ide-skel-info-tree-widget (e) - (let ((name (car e)) - (path (cdr e))) - (if (condition-case err - (Info-speedbar-fetch-file-nodes path) - (error nil)) - (list 'ide-skel-info-tree-dir-widget - :path path - :help-echo name - :open (gethash path ide-skel-info-open-paths) - :node (list 'push-button - :tag name - :format "%[%t%]\n" - :notify 'ide-skel-info-file-open - :path path - :button-face 'variable-pitch - :help-echo name - :keymap tree-widget-button-keymap - )) - (list 'ide-skel-info-tree-file-widget - :path path - :help-echo name - :keymap tree-widget-button-keymap - :tag name)))) - -(defun ide-skel-info-refresh (&optional show-top) - (interactive) - (with-current-buffer ide-skel-info-buffer - (let ((inhibit-read-only t) - (start-line (save-excursion - (goto-char (window-start ide-skel-current-left-view-window)) - (line-number-at-pos)))) - (erase-buffer) - (tree-widget-set-theme "small-folder") - (let ((tree (ide-skel-info-tree-widget ide-skel-info-root-node))) - (plist-put (cdr tree) :open t) - (widget-create tree)) - (set-keymap-parent (current-local-map) tree-widget-button-keymap) - (widget-setup) - (if show-top - (goto-char (point-min)) - (goto-line start-line)) - (beginning-of-line) - (set-window-start ide-skel-current-right-view-window (point))))) - -(defun ide-skel-info (root-node) - (with-current-buffer ide-skel-info-buffer - (clrhash ide-skel-info-open-paths) - (setq ide-skel-info-root-node root-node) - (ide-skel-info-refresh t))) - -(defun ide-skel-info-side-view-window-function (side event &rest list) - (when (and (eq side 'left) ide-skel-current-left-view-window) - (cond ((eq event 'show) - (unless ide-skel-info-buffer - (setq ide-skel-info-buffer (ide-skel-info-get-buffer-create))) - (with-current-buffer ide-skel-info-buffer - (setq ide-skel-tabbar-enabled t))) - ((and (eq event 'tab-change) - (eq (cadr list) ide-skel-info-buffer) - (= (buffer-size ide-skel-info-buffer) 0)) - (ide-skel-info-refresh)))) - nil) - -(add-hook 'ide-skel-side-view-window-functions 'ide-skel-info-side-view-window-function) - -;;; Dir tree - -(defun ide-skel-dir-node-notify (widget &rest rest) - (let ((path (widget-get widget :path))) - (ide-skel-dir path))) - -(defun ide-skel-file-open (widget &rest rest) - (let ((path (widget-get widget :path))) - (ide-skel-select-buffer path))) - -(defun ide-skel-dir-tree-widget (e) - "Return a widget to display file or directory E." - (if (file-directory-p e) - `(ide-skel-dir-tree-dir-widget - :path ,e - :help-echo ,e - :open ,(gethash e ide-skel-dir-open-paths) - :node (push-button - :tag ,(file-name-as-directory - (file-name-nondirectory e)) - :format "%[%t%]\n" - :notify ide-skel-dir-node-notify - :path ,e - :button-face (variable-pitch bold) - :help-echo ,e - :keymap ,tree-widget-button-keymap ; Emacs - )) - `(ide-skel-dir-tree-file-widget - :path ,e - :help-echo ,e - :tag ,(file-name-nondirectory e)))) - -(defun ide-skel-dir-get-buffer-create () - (let ((buffer (ide-skel-get-side-view-buffer-create " Ide Skel Dirs" - 'left "Dirs" "Filesystem browser" - (lambda (editor-buffer) t)))) - (with-current-buffer buffer - (setq ide-skel-tabbar-menu-function - (lambda () - (append - (list - (list 'ide-skel-dir-refresh "Refresh" t) - (when (and (buffer-file-name ide-skel-current-editor-buffer) - (fboundp 'ide-skel-proj-get-project-create) - (funcall 'ide-skel-project-p (car (funcall 'ide-skel-proj-get-project-create (buffer-file-name ide-skel-current-editor-buffer))))) - (list 'ide-skel-dir-project "Show project tree" t)) - (list 'ide-skel-dir-home "Home" t) - (list 'ide-skel-dir-filesystem-root "/" t) - ))) - ide-skel-dir-open-paths (make-hash-table :test 'equal) - ide-skel-dir-root-dir (file-truename (substitute-in-file-name "~"))) - (add-hook 'tree-widget-after-toggle-functions (lambda (widget) - (let ((path (widget-get widget :path))) - (when path - (if (widget-get widget :open) - (puthash path t ide-skel-dir-open-paths) - (remhash path ide-skel-dir-open-paths))))) - nil t)) - buffer)) - -(defun ide-skel-dir-tree-list (dir) - "Return the content of the directory DIR. -Return the list of components found, with sub-directories at the -beginning of the list." - (let (files dirs) - (dolist (entry (directory-files dir 'full)) - (unless (string-equal (substring entry -1) ".") - (if (file-directory-p entry) - (push entry dirs) - (push entry files)))) - (nreverse (nconc files dirs)))) - -(defun ide-skel-dir-tree-expand-dir (tree) - "Expand the tree widget TREE. -Return a list of child widgets." - (let ((dir (directory-file-name (widget-get tree :path)))) - (if (file-accessible-directory-p dir) - (progn - (message "Reading directory %s..." dir) - (condition-case err - (prog1 - (mapcar 'ide-skel-dir-tree-widget (ide-skel-dir-tree-list dir)) - (message "Reading directory %s...done" dir)) - (error - (message "%s" (error-message-string err)) - nil))) - (error "This directory is inaccessible")))) - -(defun ide-skel-select-dir-handler (event) - (interactive "@e") - (with-selected-window (posn-window (event-start event)) - (let* ((path (get-text-property (posn-point (event-start event)) 'path))) - (ide-skel-dir path)))) - -(defun ide-skel-dir-refresh (&optional show-top) - (interactive) - (with-current-buffer ide-skel-dir-buffer - (let ((inhibit-read-only t) - (start-line (save-excursion - (goto-char (window-start ide-skel-current-left-view-window)) - (line-number-at-pos)))) - (erase-buffer) - (let ((path-dirs (split-string (directory-file-name ide-skel-dir-root-dir) "[/\\]")) - (km (make-sparse-keymap)) - path) - (setq path-dirs (reverse (cdr (reverse path-dirs)))) - (define-key km [mouse-1] 'ide-skel-select-dir-handler) - (while path-dirs - (let ((dir (car path-dirs))) - (when (and (> (current-column) 0) - (>= (+ (current-column) (length dir) 1) (window-width ide-skel-current-left-view-window))) - (insert "\n")) - (setq path (directory-file-name (concat path (format "/%s" dir)))) - (unless (equal (char-before) ?/) - (insert "/")) - (insert (propertize dir - 'face 'bold - 'local-map km - 'mouse-face 'highlight - 'path path))) - (setq path-dirs (cdr path-dirs)))) - (insert "\n\n") - (tree-widget-set-theme "small-folder") - (let ((default-directory ide-skel-dir-root-dir) - (tree (ide-skel-dir-tree-widget (directory-file-name ide-skel-dir-root-dir)))) - (plist-put (cdr tree) :open t) - (widget-create tree)) - (set-keymap-parent (current-local-map) tree-widget-button-keymap) - (widget-setup) - (if show-top - (goto-char (point-min)) - (goto-line start-line)) - (beginning-of-line) - (set-window-start ide-skel-current-right-view-window (point)) - ))) - -(defun ide-skel-dir (root-dir) - (with-current-buffer ide-skel-dir-buffer - (clrhash ide-skel-dir-open-paths) - (setq ide-skel-dir-root-dir (file-truename (substitute-in-file-name root-dir))) - (ide-skel-dir-refresh t))) - -(defun ide-skel-dir-project () - (interactive) - (let ((root-dir (funcall 'ide-skel-project-root-path - (car (funcall 'ide-skel-proj-get-project-create (buffer-file-name ide-skel-current-editor-buffer)))))) - (message "Root dir: %S" root-dir) - (ide-skel-dir root-dir))) - -(defun ide-skel-dir-home () - (interactive) - (ide-skel-dir "~")) - -(defun ide-skel-dir-filesystem-root () - (interactive) - (ide-skel-dir "/")) - -(defun ide-skel-dirs-side-view-window-function (side event &rest list) - (when (and (eq side 'left) ide-skel-current-left-view-window) - (cond ((eq event 'show) - (unless ide-skel-dir-buffer - (setq ide-skel-dir-buffer (ide-skel-dir-get-buffer-create))) - (with-current-buffer ide-skel-dir-buffer - (setq ide-skel-tabbar-enabled t))) - ((and (eq event 'tab-change) - (eq (cadr list) ide-skel-dir-buffer) - (= (buffer-size ide-skel-dir-buffer) 0)) - (ide-skel-dir-refresh)))) - nil) - -(add-hook 'ide-skel-side-view-window-functions 'ide-skel-dirs-side-view-window-function) - -(easy-menu-add-item nil nil ide-skel-project-menu t) - -(defun ide-skel-proj-insert-with-face (string face) - (let ((point (point))) - (insert string) - (let ((overlay (make-overlay point (point)))) - (overlay-put overlay 'face face)))) - -(defun ide-skel-mode-name-stringify (mode-name) - (let ((name (format "%s" mode-name))) - (replace-regexp-in-string "-" " " - (capitalize - (if (string-match "^\\(.*\\)-mode" name) - (match-string 1 name) - name))))) - -(defun ide-skel-proj-get-all-dirs (root-dir) - (condition-case err - (split-string (shell-command-to-string (format "find %s -type d | grep -v '/CVS\\|/\\.svn'" root-dir)) - "\n" t) - (error nil))) - -(defun ide-skel-shell () - (interactive) - (when (fboundp 'ide-skel-show-bottom-view-window) - (funcall 'ide-skel-show-bottom-view-window) - (select-window (or (funcall 'ide-skel-get-bottom-view-window) - (selected-window))) - (ansi-term (or (getenv "ESHELL") (getenv "SHELL"))))) - -(defun ide-skel-project-menu (menu) - (let* ((curbuf-file (buffer-file-name (current-buffer))) - (curbuf-mode-name (when (and (buffer-file-name (current-buffer)) - (ide-skel-mode-file-regexp-list (list major-mode))) - (ide-skel-mode-name-stringify major-mode)))) - (condition-case err - (append - (when curbuf-mode-name - (list (vector (format "Search for %s file..." curbuf-mode-name) 'ide-skel-proj-find-files-by-regexp curbuf-mode-name))) - (list (vector "Search for file..." 'ide-skel-proj-find-text-files-by-regexp curbuf-mode-name)) - (when curbuf-mode-name - (list (vector (format "Grep %s files..." curbuf-mode-name) 'ide-skel-proj-grep-files-by-regexp curbuf-mode-name))) - (list (vector "Grep files..." 'ide-skel-proj-grep-text-files-by-regexp curbuf-file)) - (list (vector "Shell" 'ide-skel-shell t))) - (error (message (error-message-string err)))))) - -;; (ide-skel-project . relative-path) jesli path nalezy do projektu, -;; (qdir . filename) wpp - -(defun ide-skel-proj-get-project-create (path) - (let ((path (file-truename (substitute-in-file-name path))) - dir) - (if (file-directory-p path) - (progn - (setq path (file-name-as-directory path)) - (setq dir path)) - (setq dir (file-name-as-directory (file-name-directory path)))) - ;; path - true, qualified file name (no environment variables, ~, links) - (let ((project (some (lambda (project) - (let ((root-dir (ide-skel-project-root-path project))) - (when (string-match (concat "^" (regexp-quote root-dir)) path) - project))) - ide-skel-projects))) - (when project - (setq dir (ide-skel-project-root-path project))) - ;; there is no such project - (unless project - (let ((last-project-dir dir) - (dir-list (split-string dir "/")) - is-project) - ;; there is no root dir - (while (directory-files dir t (concat "^" ide-skel-cvs-dir-regexp) t) - (setq is-project t - last-project-dir (file-name-as-directory dir) - dir (file-name-as-directory (file-name-directory (directory-file-name dir))))) - (when is-project - (let ((list (nthcdr (1- (length (split-string last-project-dir "/"))) dir-list))) - (cond ((equal (car list) "trunk") - (setq last-project-dir (concat last-project-dir "trunk/"))) - ((member (car list) '("branches" "tags")) - (setq last-project-dir (concat last-project-dir (car list) "/" (when (cdr list) (concat (cadr list) "/"))))) - (t))) - (setq project (make-ide-skel-project :root-path last-project-dir - :include-file-path (ide-skel-proj-get-all-dirs last-project-dir)) - dir last-project-dir) - (push project ide-skel-projects)))) - (list (or project dir) (file-relative-name path dir) path)))) - -(defun ide-skel-proj-get-root (proj-or-dir) - (when proj-or-dir - (directory-file-name (file-truename (substitute-in-file-name - (if (ide-skel-project-p proj-or-dir) - (ide-skel-project-root-path proj-or-dir) - proj-or-dir)))))) - -(defun ide-skel-proj-find-files (dir file-predicate &optional dir-predicate) - "Return list of all qualified file paths in tree dir with root -DIR, for which FILE-PREDICATE returns non-nil. We will go into -directory only if DIR-PREDICATE returns non-nil or DIR-PREDICATE *is* nil." - (setq dir (file-name-as-directory (file-truename (substitute-in-file-name dir)))) - (let (result-list) - (mapcar (lambda (path) - (if (file-directory-p path) - (when (and (file-accessible-directory-p path) - (or (null dir-predicate) - (funcall dir-predicate path))) - (setq result-list (append result-list (ide-skel-proj-find-files path file-predicate dir-predicate)))) - (when (or (null file-predicate) - (funcall file-predicate path)) - (push path result-list)))) - (delete (concat (file-name-as-directory dir) ".") - (delete (concat (file-name-as-directory dir) "..") - (directory-files dir t nil t)))) - result-list)) - -(defun ide-skel-root-dir-for-path (path) - (let (root-dir) - (setq root-dir (car (ide-skel-proj-get-project-create path))) - (unless (stringp root-dir) - (setq root-dir (ide-skel-project-root-path root-dir))) - root-dir)) - -(defun ide-skel-has-imenu (&optional buffer) - (with-current-buffer (or buffer (current-buffer)) - (or (and imenu-prev-index-position-function - imenu-extract-index-name-function) - imenu-generic-expression - (not (eq imenu-create-index-function - 'imenu-default-create-index-function))))) - -(defun ide-skel-mode-file-regexp-list (mode-symbol-list) - (delq nil (mapcar (lambda (element) - (let ((fun-name (if (listp (cdr element)) (cadr element) (cdr element)))) - (when (memq fun-name mode-symbol-list) (cons (car element) fun-name)))) - auto-mode-alist))) - -(defun ide-skel-find-project-files (root-dir mode-symbol-list predicate) - (let ((obj-file-regexp-list (delq nil (mapcar (lambda (element) - (let ((len (length element))) - (unless (and (> len 0) - (equal (elt element (1- len)) ?/)) - (concat (regexp-quote element) "$")))) - (append ide-skel-proj-ignored-extensions completion-ignored-extensions)))) - (mode-file-regexp-list (ide-skel-mode-file-regexp-list mode-symbol-list))) ; (file-path-regexp . major-mode-function-symbol) - (when (and mode-symbol-list - (not mode-file-regexp-list)) - (error (format "No rules for %s major modes in auto-mode-alist." (mapconcat 'identity mode-symbol-list ", ")))) - (ide-skel-proj-find-files root-dir - (lambda (file-name) - (and (not (string-match "#" file-name)) - (not (string-match "semantic.cache" file-name)) - (or (and (not mode-symbol-list) - (not (some (lambda (regexp) - (string-match regexp file-name)) - obj-file-regexp-list))) - (and mode-symbol-list - (some (lambda (element) - (let ((freg (if (string-match "[$]" (car element)) - (car element) - (concat (car element) "$")))) - (when (string-match freg file-name) - (cdr element)))) - mode-file-regexp-list))) - (or (not predicate) - (funcall predicate file-name)))) - (lambda (dir-path) - (not (string-match (concat "/" ide-skel-cvs-dir-regexp) dir-path)))))) - -(defun ide-skel-proj-find-text-files-by-regexp () - (interactive) - (unwind-protect - (progn - (setq ide-skel-all-text-files-flag t) - (call-interactively 'ide-skel-proj-find-files-by-regexp)) - (setq ide-skel-all-text-files-flag nil))) - -(defun ide-skel-proj-grep-text-files-by-regexp () - (interactive) - (unwind-protect - (progn - (setq ide-skel-all-text-files-flag t) - (call-interactively 'ide-skel-proj-grep-files-by-regexp)) - (setq ide-skel-all-text-files-flag nil))) - -(defun ide-skel-proj-grep-files-by-regexp (root-dir mode-symbol-list regexp) - (interactive (let* ((path (buffer-file-name (current-buffer))) - (all-text-files (or ide-skel-all-text-files-flag - (consp current-prefix-arg))) - (whatever (progn - (when (and (not all-text-files) - (not (ide-skel-mode-file-regexp-list (list major-mode)))) - (error (format "No rules for %s major mode in auto-mode-alist" (symbol-name major-mode)))) - (unless path - (error "Current buffer (%s) is not visiting any project file" (buffer-name (current-buffer)))))) - (root-dir (when path (ide-skel-root-dir-for-path path))) - (thing (let ((res (thing-at-point 'symbol))) - (set-text-properties 0 (length res) nil res) - res)) - (chunk (let ((result (read-string (concat (if root-dir (format "Root dir is %s. " root-dir) "") - (format "Search in %s files. Regexp%s: " - (if all-text-files - "all text" - (ide-skel-mode-name-stringify major-mode)) - (if thing (format " (default %s)" thing) ""))) - nil ide-skel-proj-grep-project-files-history thing))) - (if (and result (> (length result) 0)) - result - (error "Regexp cannot be null"))))) - (list root-dir (unless all-text-files (list major-mode)) chunk))) - (let* ((paths (ide-skel-find-project-files root-dir mode-symbol-list (lambda (path) t))) - (temp-file-path (concat (file-name-as-directory temporary-file-directory) (make-temp-name "ide-")))) - (unless paths - (error "No files to grep")) - ;; create temporary file with file paths to search - (with-temp-file temp-file-path - (dolist (path paths) - ;; save buffer if is open - (let ((buffer (get-file-buffer path))) - (when (and buffer - (buffer-live-p buffer)) - (with-current-buffer buffer - (save-buffer)))) - (setq path (concat "./" (file-relative-name path (file-name-as-directory root-dir)))) - (insert (concat "'" path "'\n")))) - (let* ((default-directory root-dir) - (grep-command (format "cat %s | xargs grep -n %s" temp-file-path regexp))) - (setq ide-skel-proj-grep-header (list root-dir - (if mode-symbol-list - (mapconcat (lambda (sym) (ide-skel-mode-name-stringify sym)) mode-symbol-list ", ") - "all text") - regexp)) - (grep grep-command)) - ;; delete file after some time, because grep is executed as external process - (run-with-idle-timer 5 nil (lambda (file-path) - (condition-case nil - nil ; (delete-file file-path) - (error nil))) - temp-file-path))) - -(defun ide-skel-proj-find-files-by-regexp (root-dir mode-symbol-list name-regexp &optional case-sensitive) - "Search directory tree with root in ROOT-DIR and returns -qualified paths to files which after open in Emacs would have one -of modes in MODE-SYMBOL-LIST (if list is empty, we will take all -text files) and their name (without dir) matches NAME-REGEXP." - (interactive (let* ((path (buffer-file-name (current-buffer))) - (all-text-files (or ide-skel-all-text-files-flag - (consp current-prefix-arg))) - (whatever (progn - (when (and (not all-text-files) - (not (ide-skel-mode-file-regexp-list (list major-mode)))) - (error (format "No rules for %s major mode in auto-mode-alist" (symbol-name major-mode)))) - (unless path - (error "Current buffer (%s) is not visiting any project file" (buffer-name (current-buffer)))))) - (root-dir (when path (ide-skel-root-dir-for-path path))) - (chunk (read-string (concat (if root-dir (format "Root dir is %s. " root-dir) "") - (if all-text-files - "F" - (concat (ide-skel-mode-name-stringify major-mode) " f")) - (format "ile name regexp: " )) - nil ide-skel-proj-find-project-files-history nil))) - (list root-dir (unless all-text-files (list major-mode)) chunk))) - (let* ((paths (ide-skel-find-project-files root-dir mode-symbol-list - (lambda (path) - (let ((case-fold-search (not case-sensitive))) - (or (not name-regexp) - (string-match name-regexp (file-name-nondirectory path))))))) - (buffer (get-buffer-create ide-skel-proj-find-results-buffer-name)) - (saved-window (cons (selected-window) (window-buffer (selected-window))))) - (if (= (length paths) 1) - (find-file (car paths)) - (save-selected-window - (save-excursion - (set-buffer buffer) - (setq buffer-read-only nil - default-directory root-dir) - (erase-buffer) - - (insert "Root dir: ") - (ide-skel-proj-insert-with-face root-dir 'font-lock-keyword-face) - (insert "; Range: ") - (ide-skel-proj-insert-with-face - (if mode-symbol-list - (mapconcat (lambda (sym) (ide-skel-mode-name-stringify sym)) mode-symbol-list ", ") - "all text") - 'font-lock-keyword-face) - (insert " files; Regexp: ") - (ide-skel-proj-insert-with-face name-regexp 'font-lock-keyword-face) - (insert "; Case sensitive: ") - (ide-skel-proj-insert-with-face (if case-sensitive "Yes" "No") 'font-lock-keyword-face) - (insert "\n\n") - (compilation-minor-mode 1) - (let ((invisible-suffix ":1:1 s")) - (put-text-property 0 (length invisible-suffix) 'invisible t invisible-suffix) - (dolist (path paths) - (let ((relative-path (file-relative-name path root-dir))) - (put-text-property 0 (length relative-path) 'mouse-face 'highlight relative-path) - (insert relative-path) - (insert invisible-suffix) - (insert "\n")))) - (insert (format "\n%d files found." (length paths))) - (goto-char (point-min)) - (setq buffer-read-only t) - (when (and paths (fboundp 'compile-reinitialize-errors) (funcall (symbol-function 'compile-reinitialize-errors) t))) - (switch-to-buffer-other-window buffer) - (goto-line 1) - (goto-line 3))) - (if (window-live-p (car saved-window)) - (select-window (car saved-window)) - (when (get-buffer-window (cdr saved-window)) - (select-window (get-buffer-window (cdr saved-window)))))))) - -(unless ide-skel-proj-grep-mode-map - (setq ide-skel-proj-grep-mode-map (make-sparse-keymap)) - (define-key ide-skel-proj-grep-mode-map "r" 'ide-skel-proj-grep-replace)) - -(defun ide-skel-proj-grep-replace () - (interactive) - (let ((replace-to (read-string "Replace to: " nil 'ide-skel-proj-grep-replace-history)) - (current-pos 1) - begin end - buffers-to-revert - replace-info) - (save-excursion - (while current-pos - (setq current-pos (next-single-property-change current-pos 'font-lock-face (current-buffer))) - (when (and current-pos - (eq (get-text-property current-pos 'font-lock-face) 'match)) - (setq begin current-pos) - (setq current-pos (next-single-property-change current-pos 'font-lock-face (current-buffer))) - (setq end current-pos) - (save-excursion - (goto-char begin) - (beginning-of-line) - (let ((begline (point))) - (re-search-forward "^\\(.*\\):\\([0-9]+\\):" nil t) - (let ((len (length (match-string 0))) - (file-path (expand-file-name (substring-no-properties (match-string 1)) default-directory))) - (when (get-file-buffer file-path) - (push (get-file-buffer file-path) buffers-to-revert)) - (push (list file-path - (string-to-number (match-string 2)) - (- begin begline len) - (- end begline len)) - replace-info))))))) - (dolist (replacement replace-info) - (let ((file-path (nth 0 replacement)) - (line-no (nth 1 replacement)) - (from-column-no (nth 2 replacement)) - (to-column-no (nth 3 replacement))) - (condition-case err - (with-temp-file file-path - (insert-file-contents file-path) - (goto-line line-no) - (forward-char from-column-no) - (delete-region (point) (+ (point) (- to-column-no from-column-no))) - (insert replace-to)) - (error (message "%s" (error-message-string err)))))) - (dolist (buffer buffers-to-revert) - (when (buffer-live-p buffer) - (with-current-buffer buffer - (revert-buffer t t t)))) ; ignore-auto, nonconfirm, preserve-modes - (message "Done."))) - -(define-minor-mode ide-skel-proj-grep-mode - "" - nil ; init value - nil ; mode indicator - ide-skel-proj-grep-mode-map ; keymap - ;; body - (unless (assq 'ide-skel-proj-grep-mode minor-mode-map-alist) - (push (cons 'ide-skel-proj-grep-mode ide-skel-proj-grep-mode-map) minor-mode-map-alist))) - -(add-hook 'grep-setup-hook (lambda () - (when ide-skel-proj-grep-header - (ide-skel-proj-grep-mode 1) - (unwind-protect - (progn - (setq buffer-read-only nil) - (erase-buffer) - (remove-overlays) - (insert "Root dir: ") - (ide-skel-proj-insert-with-face (car ide-skel-proj-grep-header) 'font-lock-keyword-face) - (insert "; Range: ") - (ide-skel-proj-insert-with-face (cadr ide-skel-proj-grep-header) 'font-lock-keyword-face) - (insert " files; Regexp: ") - (ide-skel-proj-insert-with-face (caddr ide-skel-proj-grep-header) 'font-lock-keyword-face) - (insert "\n") - (insert "mouse-1 toggle match; r replace matches") - (insert "\n\n")) - (setq buffer-read-only t - ide-skel-proj-grep-header nil) - (setq ide-skel-proj-old-compilation-exit-message-function (symbol-value 'compilation-exit-message-function)) - (set 'compilation-exit-message-function - (lambda (status code msg) - (let ((result (if ide-skel-proj-old-compilation-exit-message-function - (funcall ide-skel-proj-old-compilation-exit-message-function - status code msg) - (cons msg code)))) - (save-excursion - (goto-char (point-min)) - (let (begin - end - (km (make-sparse-keymap)) - (inhibit-read-only t)) - (define-key km [down-mouse-1] 'ignore) - (define-key km [mouse-1] 'ide-skel-proj-grep-click) - (while (setq begin (next-single-property-change (point) 'font-lock-face (current-buffer) nil)) - (setq end (next-single-property-change begin 'font-lock-face (current-buffer) nil)) - (put-text-property begin end 'pointer 'hand) - (put-text-property begin end 'local-map km) - (goto-char end)))) - result))))))) - -(defun ide-skel-proj-grep-click (event) - (interactive "@e") - (with-selected-window (posn-window (event-start event)) - (let* ((posn-point (posn-point (event-start event))) - (begin (or (and (not (get-text-property (1- posn-point) 'font-lock-face)) - posn-point) - (previous-single-property-change posn-point 'font-lock-face (current-buffer) nil))) - (end (next-single-property-change posn-point 'font-lock-face (current-buffer) nil)) - (font-lock-face (get-text-property posn-point 'font-lock-face)) - (inhibit-read-only t)) - (put-text-property begin end 'font-lock-face (if (eq font-lock-face 'match) 'widget-field 'match))))) - -(defun ide-skel-proj-change-buffer-hook-function () - (let ((path (buffer-file-name))) - (when path - (condition-case err - (let ((project-list (ide-skel-proj-get-project-create path))) - (when (ide-skel-project-p (car project-list)) - (setq PC-include-file-path (ide-skel-project-include-file-path (car project-list))))) - (error nil))))) - -(add-hook 'ide-skel-editor-buffer-changed-hook 'ide-skel-proj-change-buffer-hook-function) - -(tabbar-mode 1) - -(provide 'ide-skel) - -- cgit v1.2.3-54-g00ecf