-;;; ztree-dir.el --- Text mode directory tree
+;;; ztree-dir.el --- Text mode directory tree -*- lexical-binding: t; -*-
-;; Copyright (C) 2013 Alexey Veretennikov
+;; Copyright (C) 2013-2016 Free Software Foundation, Inc.
;;
-;; Author: Alexey Veretennikov <alexey dot veretennikov at gmail dot com>
-;; Created: 2013-11-1l
-;; Version: 1.0.0
-;; Keywords: files
+;; Author: Alexey Veretennikov <alexey.veretennikov@gmail.com>
+;;
+;; Created: 2013-11-11
+;;
+;; Keywords: files tools
;; URL: https://github.com/fourier/ztree
-;; Compatibility: GNU Emacs GNU Emacs 24.x
+;; Compatibility: GNU Emacs 24.x
;;
-;; This file is NOT part of GNU Emacs.
+;; This file is part of GNU Emacs.
;;
-;; This program is free software; you can redistribute it and/or
-;; modify it under the terms of the GNU General Public License
-;; as published by the Free Software Foundation; either version 2
-;; of the License, or (at your option) any later version.
+;; 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 3 of the License, or
+;; (at your option) any later version.
;;
-;; This program is distributed in the hope that it will be useful,
+;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
+;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
;;
;;; Commentary:
;;
;;; TODO:
;; 1) Add some file-handling and marking abilities
;;
-;;
-;;; Change Log:
-;;
-;; 2013-11-10 (1.0.0)
-;; Initial Release.
-;;
;;; Code:
(require 'ztree-util)
(require 'ztree-view)
+(eval-when-compile (require 'cl-lib))
;;
;; Constants
;;
(defconst ztree-hidden-files-regexp "^\\."
- "Hidden files regexp. By default all filest starting with dot '.',
-including . and ..")
+ "Hidden files regexp.
+By default all filest starting with dot '.', including . and ..")
+
+;;
+;; Configurable variables
+;;
+
+(defvar ztree-dir-move-focus nil
+ "If set to true moves the focus to opened window when the
+user press RETURN on file ")
+
+(defvar-local ztree-dir-filter-list (list ztree-hidden-files-regexp)
+ "List of regexp file names to filter out.
+By default paths starting with dot (like .git) are ignored.
+One could add own filters in the following way:
+
+(setq-default ztree-dir-filter-list (cons \"^.*\\.pyc\" ztree-dir-filter-list))
+")
+
+(defvar-local ztree-dir-show-filtered-files nil
+ "Show or not files from the filtered list.")
;;
(defvar ztreep-header-face 'ztreep-header-face)
+(define-minor-mode ztreedir-mode
+ "A minor mode for displaying the directory trees in text mode."
+ ;; initial value
+ nil
+ ;; modeline name
+ " Dir"
+ ;; The minor mode keymap
+ `(
+ (,(kbd "H") . ztree-dir-toggle-show-filtered-files)))
+
+
+
+
;;
;; File bindings to the directory tree control
;;
(defun ztree-insert-buffer-header ()
+ "Insert the header to the ztree buffer."
(let ((start (point)))
(insert "Directory tree")
- (newline-and-begin)
+ (insert "\n")
(insert "==============")
(set-text-properties start (point) '(face ztreep-header-face)))
- (newline-and-begin))
+ (insert "\n"))
(defun ztree-file-not-hidden (filename)
- (not (string-match ztree-hidden-files-regexp
- (file-short-name filename))))
+ "Determines if the file with FILENAME should be visible."
+ (let ((name (ztree-file-short-name filename)))
+ (and (not (or (string= name ".") (string= name "..")))
+ (or
+ ztree-dir-show-filtered-files
+ (not (cl-find-if (lambda (rx) (string-match rx name)) ztree-dir-filter-list))))))
+
(defun ztree-find-file (node hard)
- "Finds the file at NODE.
+ "Find the file at NODE.
If HARD is non-nil, the file is opened in another window.
Otherwise, the ztree window is used to find the file."
(when (and (stringp node) (file-readable-p node))
- (if hard
- (save-selected-window (find-file-other-window node))
- (find-file node))))
+ (cond ((and hard ztree-dir-move-focus)
+ (find-file-other-window node))
+ (hard
+ (save-selected-window (find-file-other-window node)))
+ (t
+ (find-file node)))))
+
+
+(defun ztree-dir-toggle-show-filtered-files ()
+ "Toggle visibility of the filtered files."
+ (interactive)
+ (setq ztree-dir-show-filtered-files (not ztree-dir-show-filtered-files))
+ (message (concat (if ztree-dir-show-filtered-files "Show" "Hide") " filtered files"))
+ (ztree-refresh-buffer))
+
+
+
;;;###autoload
(defun ztree-dir (path)
- "Creates an interactive buffer with the directory tree of the path given"
+ "Create an interactive buffer with the directory tree of the PATH given."
(interactive "DDirectory: ")
(when (and (file-exists-p path) (file-directory-p path))
(let ((buf-name (concat "*Directory " path " tree*")))
(ztree-view buf-name
(expand-file-name (substitute-in-file-name path))
- 'ztree-file-not-hidden
- 'ztree-insert-buffer-header
- 'file-short-name
- 'file-directory-p
- 'string-equal
- '(lambda (x) (directory-files x 'full))
+ #'ztree-file-not-hidden
+ #'ztree-insert-buffer-header
+ #'ztree-file-short-name
+ #'file-directory-p
+ #'string-equal
+ (lambda (x) (directory-files x 'full))
nil ; face
- 'ztree-find-file)))) ; action
+ #'ztree-find-file) ; action
+ (ztreedir-mode))))
+
(provide 'ztree-dir)