From 8ff76bb005d3693c892a7572cc5fd6af0058c23e Mon Sep 17 00:00:00 2001 From: brettlangdon Date: Wed, 21 May 2014 09:23:09 -0400 Subject: [PATCH] upgrade projectile --- .../projectile-autoloads.el | 34 +- .../elpa/projectile-0.10.0/projectile-pkg.el | 1 + .../projectile-pkg.elc | Bin 672 -> 541 bytes .../projectile.el | 837 +++++++++++++----- emacs.d/elpa/projectile-0.10.0/projectile.elc | Bin 0 -> 58012 bytes .../elpa/projectile-0.9.2/projectile-pkg.el | 1 - emacs.d/elpa/projectile-0.9.2/projectile.elc | Bin 41745 -> 0 bytes 7 files changed, 665 insertions(+), 208 deletions(-) rename emacs.d/elpa/{projectile-0.9.2 => projectile-0.10.0}/projectile-autoloads.el (58%) create mode 100644 emacs.d/elpa/projectile-0.10.0/projectile-pkg.el rename emacs.d/elpa/{projectile-0.9.2 => projectile-0.10.0}/projectile-pkg.elc (54%) rename emacs.d/elpa/{projectile-0.9.2 => projectile-0.10.0}/projectile.el (56%) create mode 100644 emacs.d/elpa/projectile-0.10.0/projectile.elc delete mode 100644 emacs.d/elpa/projectile-0.9.2/projectile-pkg.el delete mode 100644 emacs.d/elpa/projectile-0.9.2/projectile.elc diff --git a/emacs.d/elpa/projectile-0.9.2/projectile-autoloads.el b/emacs.d/elpa/projectile-0.10.0/projectile-autoloads.el similarity index 58% rename from emacs.d/elpa/projectile-0.9.2/projectile-autoloads.el rename to emacs.d/elpa/projectile-0.10.0/projectile-autoloads.el index dc2b1ae..9acb868 100644 --- a/emacs.d/elpa/projectile-0.9.2/projectile-autoloads.el +++ b/emacs.d/elpa/projectile-0.10.0/projectile-autoloads.el @@ -1,15 +1,36 @@ ;;; projectile-autoloads.el --- automatically extracted autoloads ;; ;;; Code: - +(add-to-list 'load-path (or (file-name-directory #$) (car load-path))) -;;;### (autoloads (projectile-global-mode projectile-mode) "projectile" -;;;;;; "projectile.el" (21002 9890 0 0)) +;;;### (autoloads nil "projectile" "projectile.el" (21271 14631 159805 +;;;;;; 564000)) ;;; Generated autoloads from projectile.el +(autoload 'projectile-commander "projectile" "\ +Execute a Projectile command with a single letter. +The user is prompted for a single character indicating the action to invoke. +The `?' character describes then +available actions. + +See `def-projectile-commander-method' for defining new methods. + +\(fn)" t nil) + +(defconst projectile-mode-line-lighter " Projectile" "\ +The default lighter for `projectile-mode'.") + (autoload 'projectile-mode "projectile" "\ Minor mode to assist project management and navigation. +When called interactively, toggle `projectile-mode'. With prefix +ARG, enable `projectile-mode' if ARG is positive, otherwise disable +it. + +When called from Lisp, enable `projectile-mode' if ARG is omitted, +nil or positive. If ARG is `toggle', toggle `projectile-mode'. +Otherwise behave as if called interactively. + \\{projectile-mode-map} \(fn &optional ARG)" t nil) @@ -37,16 +58,9 @@ See `projectile-mode' for more information on Projectile mode. ;;;*** -;;;### (autoloads nil nil ("projectile-pkg.el") (21002 9890 671493 -;;;;;; 0)) - -;;;*** - -(provide 'projectile-autoloads) ;; Local Variables: ;; version-control: never ;; no-byte-compile: t ;; no-update-autoloads: t -;; coding: utf-8 ;; End: ;;; projectile-autoloads.el ends here diff --git a/emacs.d/elpa/projectile-0.10.0/projectile-pkg.el b/emacs.d/elpa/projectile-0.10.0/projectile-pkg.el new file mode 100644 index 0000000..a966243 --- /dev/null +++ b/emacs.d/elpa/projectile-0.10.0/projectile-pkg.el @@ -0,0 +1 @@ +(define-package "projectile" "0.10.0" "Manage and navigate projects in Emacs easily" '((s "1.6.0") (dash "1.5.0") (pkg-info "0.4"))) diff --git a/emacs.d/elpa/projectile-0.9.2/projectile-pkg.elc b/emacs.d/elpa/projectile-0.10.0/projectile-pkg.elc similarity index 54% rename from emacs.d/elpa/projectile-0.9.2/projectile-pkg.elc rename to emacs.d/elpa/projectile-0.10.0/projectile-pkg.elc index 8124c40339103526b33103ae94ab4fda6e26af6b..fbe936dee5fa7773c66cd48aec914489735308fc 100644 GIT binary patch delta 66 zcmZ3$I+taF=)|?sOr{1KkGC5ZC|! delta 222 zcmYk0F%Q8&7=|NQx{LLTNr!%Sy&6;(Bu0sWA8^`FRZp+ED~ZWwmY5~}g58f(7RKjI zo+t0U^=Mx^XIP(LZK$f0EYd_5)cxyjY`K-fi7TqAebCd@B`q(kqAdZ zfZ%@ML{S7AqxZ1M6aiaVGM4>k8PZ meLOhU!K{8D1{gfWrO~XN+p7_FIr5$h{Y2U=^nCoH>pE}cyhV`! diff --git a/emacs.d/elpa/projectile-0.9.2/projectile.el b/emacs.d/elpa/projectile-0.10.0/projectile.el similarity index 56% rename from emacs.d/elpa/projectile-0.9.2/projectile.el rename to emacs.d/elpa/projectile-0.10.0/projectile.el index 98da514..4129783 100644 --- a/emacs.d/elpa/projectile-0.9.2/projectile.el +++ b/emacs.d/elpa/projectile-0.10.0/projectile.el @@ -1,17 +1,15 @@ ;;; projectile.el --- Manage and navigate projects in Emacs easily -;; Copyright © 2011-2013 Bozhidar Batsov +;; Copyright © 2011-2013 Bozhidar Batsov -;; Author: Bozhidar Batsov +;; Author: Bozhidar Batsov ;; URL: https://github.com/bbatsov/projectile ;; Keywords: project, convenience -;; Version: 0.9.2 -;; Package-Requires: ((s "1.0.0") (dash "1.0.0")) +;; Version: 0.10.0 +;; Package-Requires: ((s "1.6.0") (dash "1.5.0") (pkg-info "0.4")) ;; This file is NOT part of GNU Emacs. -;;; License: - ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 3, or (at your option) @@ -38,29 +36,57 @@ ;; ;;; Code: -;; requires -(require 'cl) -(require 'easymenu) (require 'thingatpt) (require 's) (require 'dash) -(require 'grep) - +(require 'grep) ; For `rgrep' +(require 'pkg-info) ; For `pkg-info-version-info' + +;;;; Compatibility +(eval-and-compile + (unless (fboundp 'defvar-local) + (defmacro defvar-local (var val &optional docstring) + "Define VAR as a buffer-local variable with default value VAL. +Like `defvar' but additionally marks the variable as being automatically +buffer-local wherever it is set." + (declare (debug defvar) (doc-string 3)) + `(progn + (defvar ,var ,val ,docstring) + (make-variable-buffer-local ',var))))) + + +;;; Customization (defgroup projectile nil "Manage and navigate projects easily." :group 'tools :group 'convenience) -(defconst projectile-current-version "0.9.1" - "The current Projectile version.") +(defcustom projectile-indexing-method (if (eq system-type 'windows-nt) 'native 'alien) + "Specifies the indexing method used by Projectile. + +There are two indexing methods - native and alien. + +The native method is implemented in Emacs Lisp (therefore it is +native to Emacs). It's advantage is that is portable and will +work everywhere that Emacs does. It's disadvantage is that is a +bit slow (especially for large projects). Generally it's a good +idea to pair the native indexing method with caching. + +The alien indexing method uses external tools (e.g. git, find, +etc) to speed up the indexing process. The disadvantage of this +method is that it's not well supported on Windows systems. -(defcustom projectile-use-native-indexing (eq system-type 'windows-nt) - "Use native Emacs Lisp project indexing." +By default alien indexing is the default on all operating +systems, except Windows." :group 'projectile - :type 'boolean) + :type 'symbol + :options '(native alien)) -(defcustom projectile-enable-caching projectile-use-native-indexing - "Enable project files caching." +(defcustom projectile-enable-caching (eq projectile-indexing-method 'native) + "When t enables project files caching. + +Project caching is automatically enabled by default if you're +using the native indexing method." :group 'projectile :type 'boolean) @@ -93,31 +119,88 @@ Otherwise consider the current directory the project root." :group 'projectile :type 'string) -(defcustom projectile-tags-command "ctags -Re %s %s" +(defcustom projectile-tags-command "ctags -Re %s" "The command Projectile's going to use to generate a TAGS file." :group 'projectile :type 'string) -;; variables -(defvar projectile-project-root-files - '(".projectile" "project.clj" ".git" ".hg" ".fslckout" ".bzr" "_darcs" - "rebar.config" "pom.xml" "build.sbt" "Gemfile" "Makefile") - "A list of files considered to mark the root of a project.") +(defcustom projectile-project-root-files + '(".projectile" ; projectile project marker + ".git" ; Git VCS root dir + ".hg" ; Mercurial VCS root dir + ".fslckout" ; Fossil VCS root dir + ".bzr" ; Bazaar VCS root dir + "_darcs" ; Darcs VCS root dir + "rebar.config" ; Rebar project file + "project.clj" ; Leiningen project file + "pom.xml" ; Maven project file + "build.sbt" ; SBT project file + "build.gradle" ; Gradle project file + "Gemfile" ; Bundler file + "requirements.txt" ; Pip file + "Makefile" ; Make project file + ) + "A list of files considered to mark the root of a project." + :group 'projectile + :type '(repeat string)) -(defvar projectile-globally-ignored-files +(defcustom projectile-globally-ignored-files '("TAGS") - "A list of files globally ignored by projectile.") + "A list of files globally ignored by projectile." + :group 'projectile + :type '(repeat string)) + +(defcustom projectile-globally-ignored-directories + '(".idea" + ".eunit" + ".git" + ".hg" + ".fslckout" + ".bzr" + "_darcs" + "venv" + "build") + "A list of directories globally ignored by projectile." + :group 'projectile + :type '(repeat string)) + +(defcustom projectile-globally-ignored-modes + '("erc-mode" + "help-mode" + "completion-list-mode" + "Buffer-menu-mode" + "gnus-.*-mode" + "occur-mode") + "A list of regular expressions for major modes ignored by projectile. + +If a buffer is using a given major mode, projectile will ignore +it for functions working with buffers." + :group 'projectile + :type '(repeat string)) -(defvar projectile-globally-ignored-directories - '(".idea" ".eunit" ".git" ".hg" ".fslckout" ".bzr" "_darcs") - "A list of directories globally ignored by projectile.") +(defcustom projectile-find-file-hook nil + "Hooks run when a file is opened with `projectile-find-file'." + :group 'projectile + :type 'hook) -(defvar projectile-find-file-hook nil - "Hooks run when a file is opened with `projectile-find-file'.") +(defcustom projectile-find-dir-hook nil + "Hooks run when a directory is opened with `projectile-find-dir'." + :group 'projectile + :type 'hook) -(defvar projectile-find-dir-hook nil - "Hooks run when a directory is opened with `projectile-find-dir'.") +(defcustom projectile-switch-project-action 'projectile-find-file + "Action invoked after switching projects with `projectile-switch-project'. +Any function that does not take arguments will do." + :group 'projectile + :type 'symbol) + +(defcustom projectile-find-dir-includes-top-level nil + "If true, add top-level dir to options offered by `projectile-find-dir'." + :group 'projectile + :type 'boolean) + +;;; Serialization (defun projectile-serialize (data filename) "Serialize DATA to FILENAME. @@ -149,12 +232,29 @@ The list of projects is ordered by the time they have been accessed.") :group 'projectile :type 'string) -(defun projectile-version () - "Reports the version of Projectile in use." - (interactive) - (message "Projectile (version %s) 2011-2013 Bozhidar Batsov " - projectile-current-version)) + +;;; Version information + +(defun projectile-version (&optional show-version) + "Get the Projectile version as string. + +If called interactively or if SHOW-VERSION is non-nil, show the +version in the echo area and the messages buffer. + +The returned string includes both, the version from package.el +and the library version, if both a present and different. + +If the version number could not be determined, signal an error, +if called interactively, or if SHOW-VERSION is non-nil, otherwise +just return nil." + (interactive (list t)) + (let ((version (pkg-info-version-info 'projectile))) + (when show-version + (message "Projectile version: %s" version)) + version)) + +;;; Caching (defun projectile-invalidate-cache (arg) "Remove the current project's files from `projectile-projects-cache'. @@ -178,6 +278,69 @@ The cache is created both in memory and on the hard drive." (puthash project files projectile-projects-cache) (projectile-serialize-cache))) +(defun projectile-purge-file-from-cache (file) + "Purge FILE from the cache of the current project." + (interactive + (list (projectile-completing-read + "Remove file from cache: " + (projectile-current-project-files)))) + (let* ((project-root (projectile-project-root)) + (project-cache (gethash project-root projectile-projects-cache))) + (if (projectile-file-cached-p file project-root) + (progn + (puthash project-root (remove file project-cache) projectile-projects-cache) + (projectile-serialize-cache) + (message "%s removed from cache" file)) + (error "%s is not in the cache" file)))) + +(defun projectile-purge-dir-from-cache (dir) + "Purge DIR from the cache of the current project." + (interactive + (list (projectile-completing-read + "Remove directory from cache: " + (projectile-current-project-dirs)))) + (let* ((project-root (projectile-project-root)) + (project-cache (gethash project-root projectile-projects-cache))) + (puthash project-root + (-filter (lambda (file) + (s-starts-with-p dir file)) + project-cache) + projectile-projects-cache))) + +(defun projectile-file-cached-p (file project) + "Check if FILE is already in PROJECT cache." + (member file (gethash project projectile-projects-cache))) + +(defun projectile-cache-current-file () + "Add the currently visited file to the cache." + (interactive) + (let* ((current-project (projectile-project-root)) + (abs-current-file (buffer-file-name (current-buffer))) + (current-file (file-relative-name abs-current-file current-project))) + (unless (or (projectile-file-cached-p current-file current-project) + (projectile-ignored-directory-p (file-name-directory abs-current-file))) + (puthash current-project + (cons current-file (gethash current-project projectile-projects-cache)) + projectile-projects-cache) + (projectile-serialize-cache) + (message "File %s added to project %s cache." + (propertize current-file 'face 'font-lock-keyword-face) + (propertize current-project 'face 'font-lock-keyword-face))))) + +;; cache opened files automatically to reduce the need for cache invalidation +(defun projectile-cache-files-find-file-hook () + "Function for caching files with `find-file-hook'." + (when (and (projectile-project-p) projectile-enable-caching) + (projectile-cache-current-file))) + +(defun projectile-cache-projects-find-file-hook () + "Function for caching projects with `find-file-hook'." + (when (projectile-project-p) + (projectile-add-known-project (projectile-project-root)) + (projectile-save-known-projects))) + + +;;; Project root related utilities (defun projectile-project-root () "Retrieves the root directory of a project if available. The current directory is assumed to be the project's root otherwise." @@ -186,17 +349,17 @@ The current directory is assumed to be the project's root otherwise." (--map (locate-dominating-file default-directory it)) (-remove #'null) (car) - (projectile-expand-file-name)) + (projectile-file-truename)) (if projectile-require-project-root - (error "You're not into a project") + (error "You're not in a project") default-directory)))) project-root)) -(defun projectile-expand-file-name (file-name) +(defun projectile-file-truename (file-name) "A thin wrapper around `expand-file-name' that handles nil. Expand FILE-NAME using `default-directory'." (when file-name - (expand-file-name file-name))) + (file-truename file-name))) (defun projectile-project-p () "Check if we're in a project." @@ -212,6 +375,8 @@ Expand FILE-NAME using `default-directory'." (error default-directory)))) (file-name-nondirectory (directory-file-name project-root)))) + +;;; Project indexing (defun projectile-get-project-directories () "Get the list of project directories that are of interest to the user." (-map (lambda (subdir) (concat (projectile-project-root) subdir)) @@ -226,17 +391,17 @@ Files are returned as relative paths to the project root." (root (projectile-project-root))) ;; cache disabled or cache miss (or files-list - (if projectile-use-native-indexing + (if (eq projectile-indexing-method 'native) (projectile-dir-files-native root directory) ;; use external tools to get the project files - (projectile-dir-files-external root directory))))) + (projectile-remove-ignored (projectile-dir-files-external root directory)))))) (defun projectile-dir-files-native (root directory) "Get the files for ROOT under DIRECTORY using just Emacs Lisp." (message "Projectile is indexing %s. This may take a while." (propertize directory 'face 'font-lock-keyword-face)) ;; we need the files with paths relative to the project root - (-map (lambda (file) (s-chop-prefix root file)) + (-map (lambda (file) (file-relative-name file root)) (projectile-index-directory directory (projectile-patterns-to-ignore)))) (defun projectile-dir-files-external (root directory) @@ -244,38 +409,10 @@ Files are returned as relative paths to the project root." (let ((default-directory directory) (files-list nil)) (setq files-list (-map (lambda (f) - (s-chop-prefix root (expand-file-name f directory))) + (file-relative-name (expand-file-name f directory) root)) (projectile-get-repo-files))) files-list)) -(defun projectile-file-cached-p (file project) - "Check if FILE is already in PROJECT cache." - (member file (gethash project projectile-projects-cache))) - -(defun projectile-cache-current-file () - "Add the currently visited file to the cache." - (interactive) - (let* ((current-project (projectile-project-root)) - (current-file (file-relative-name (buffer-file-name (current-buffer)) current-project))) - (unless (projectile-file-cached-p current-file current-project) - (puthash current-project - (cons current-file (gethash current-project projectile-projects-cache)) - projectile-projects-cache) - (projectile-serialize-cache) - (message "File %s added to project %s cache." current-file current-project)))) - -;; cache opened files automatically to reduce the need for cache invalidation -(defun projectile-cache-files-find-file-hook () - "Function for caching files with `find-file-hook'." - (when (and (projectile-project-p) projectile-enable-caching) - (projectile-cache-current-file))) - -(defun projectile-cache-projects-find-file-hook () - "Function for caching projects with `find-file-hook'." - (when (projectile-project-p) - (projectile-add-known-project (projectile-project-root)) - (projectile-save-known-projects))) - (defcustom projectile-git-command "git ls-files -zco --exclude-standard" "Command used by projectile to get the files in a git project." :group 'projectile @@ -291,7 +428,7 @@ Files are returned as relative paths to the project root." :group 'projectile :type 'string) -(defcustom projectile-bzr-command "bzr ls --versioned -0" +(defcustom projectile-bzr-command "bzr ls -R --versioned -0" "Command used by projectile to get the files in a bazaar project." :group 'projectile :type 'string) @@ -347,8 +484,8 @@ have been indexed." '("." ".." ".svn" ".cvs"))) (not (projectile-ignored-directory-p absolute-file)) (not (and patterns - (projectile-ignored-rel-p directory - absolute-file patterns)))) + (projectile-ignored-rel-p absolute-file + directory patterns)))) (setq files-list (append files-list (projectile-index-directory (expand-file-name current-file directory) @@ -357,12 +494,22 @@ have been indexed." ((and (not (s-ends-with-p "/" current-file)) (not (projectile-ignored-file-p absolute-file)) (not (and patterns - (projectile-ignored-rel-p directory - absolute-file patterns)))) + (projectile-ignored-rel-p absolute-file + directory patterns)))) (setq files-list (cons (expand-file-name current-file directory) files-list)))))))) +(defun projectile-remove-ignored (files) + "Remove ignored files and folders from FILES. + +Operates on filenames relative to the project root." + (let ((ignored (append (projectile-ignored-files-rel) + (projectile-ignored-directories-rel)))) + (-remove (lambda (file) + (--any-p (s-starts-with-p it file) ignored)) + files))) + (defun projectile-project-buffers () "Get a list of project buffers." (let ((project-root (projectile-project-root))) @@ -374,9 +521,17 @@ have been indexed." "Check if BUFFER is under PROJECT-ROOT." (with-current-buffer buffer (and (s-starts-with? project-root - (expand-file-name default-directory)) + (file-truename default-directory)) ;; ignore hidden buffers - (not (s-starts-with? " " (buffer-name buffer)))))) + (not (s-starts-with? " " (buffer-name buffer))) + (not (projectile-ignored-buffer-p buffer))))) + +(defun projectile-ignored-buffer-p (buffer) + "Check if BUFFER should be ignored." + (with-current-buffer buffer + (--any-p (s-matches? (concat "^" it "$") + (symbol-name major-mode)) + projectile-globally-ignored-modes))) (defun projectile-project-buffer-names () "Get a list of project buffer names." @@ -394,6 +549,14 @@ have been indexed." "Switch to buffer: " (projectile-project-buffer-names)))) +(defun projectile-switch-to-buffer-other-window () + "Switch to a project buffer and show it in another window." + (interactive) + (switch-to-buffer-other-window + (projectile-completing-read + "Switch to buffer: " + (projectile-project-buffer-names)))) + (defun projectile-multi-occur () "Do a `multi-occur' in the project's buffers." (interactive) @@ -408,7 +571,7 @@ have been indexed." "Check if FILE should be ignored." (member file (projectile-ignored-files))) -(defun projectile-ignored-rel-p (directory file patterns) +(defun projectile-ignored-rel-p (file directory patterns) "Check if FILE should be ignored relative to DIRECTORY according to PATTERNS." (let ((default-directory directory)) (-any? (lambda (pattern) @@ -435,6 +598,16 @@ have been indexed." projectile-globally-ignored-directories (projectile-project-ignored-directories))))) +(defun projectile-ignored-directories-rel () + "Return list of ignored directories, relative to the root." + (let ((project-root (projectile-project-root))) + (--map (file-relative-name it project-root) (projectile-ignored-directories)))) + +(defun projectile-ignored-files-rel () + "Return list of ignored files, relative to the root." + (let ((project-root (projectile-project-root))) + (--map (file-relative-name it project-root) (projectile-ignored-files)))) + (defun projectile-project-ignored-files () "Return list of project ignored files." (-remove 'file-directory-p (projectile-project-ignored))) @@ -461,11 +634,11 @@ have been indexed." "Return list of project ignored files/directories." (let ((paths (projectile-paths-to-ignore)) (default-directory (projectile-project-root))) - (apply 'append - (-map - (lambda (pattern) - (file-expand-wildcards pattern t)) - paths)))) + (-flatten (-map + (lambda (pattern) + (or (file-expand-wildcards pattern t) + (projectile-expand-root pattern))) + paths)))) (defun projectile-dirconfig-file () "Return the absolute path to the project's dirconfig file." @@ -489,9 +662,12 @@ prefix the string will be assumed to be an ignore string." (let* ((split-string-default-separators "[\r\n]") (strings (-map 's-trim (delete "" (split-string (buffer-string))))) (separated-vals (--separate (s-starts-with? "+" it) strings))) - (flet ((strip-prefix (s) (s-chop-prefixes '("-" "+") s))) - (cons (-map 'strip-prefix (first separated-vals)) - (-map 'strip-prefix (second separated-vals))))))))) + (cons (-map 'projectile-strip-dir-prefix (car separated-vals)) + (-map 'projectile-strip-dir-prefix (cadr separated-vals)))))))) + +(defun projectile-strip-dir-prefix (dir) + "Strip + or - prefix from DIR." + (s-chop-prefixes '("-" "+") dir)) (defun projectile-expand-root (name) "Expand NAME to project root. @@ -541,7 +717,9 @@ https://github.com/d11wtq/grizzl"))) (maphash (lambda (k v) (setq allkeys (cons k allkeys))) hash) allkeys)) -(defun projectile-find-file (arg) + +;;; Interactive commands +(defun projectile-find-file (&optional arg) "Jump to a project's file using completion. With a prefix ARG invalidates the cache first." @@ -553,19 +731,34 @@ With a prefix ARG invalidates the cache first." (find-file (expand-file-name file (projectile-project-root))) (run-hooks 'projectile-find-file-hook))) -(defun projectile-find-dir (arg) - "Jump to a project's file using completion. +(defun projectile-find-file-other-window (&optional arg) + "Jump to a project's file using completion and show it in another window. + +With a prefix ARG invalidates the cache first." + (interactive "P") + (when arg + (projectile-invalidate-cache nil)) + (let ((file (projectile-completing-read "Find file: " + (projectile-current-project-files)))) + (find-file-other-window (expand-file-name file (projectile-project-root))) + (run-hooks 'projectile-find-file-hook))) + +(defun projectile-find-dir (&optional arg) + "Jump to a project's directory using completion. With a prefix ARG invalidates the cache first." (interactive "P") (when arg (projectile-invalidate-cache nil)) - (let ((dir (projectile-completing-read "Find dir: " - (projectile-current-project-dirs)))) + (let ((dir (projectile-completing-read + "Find dir: " + (if projectile-find-dir-includes-top-level + (append '("./") (projectile-current-project-dirs)) + (projectile-current-project-dirs))))) (dired (expand-file-name dir (projectile-project-root))) (run-hooks 'projectile-find-dir-hook))) -(defun projectile-find-test-file (arg) +(defun projectile-find-test-file (&optional arg) "Jump to a project's test file using completion. With a prefix ARG invalidates the cache first." @@ -573,11 +766,18 @@ With a prefix ARG invalidates the cache first." (when arg (projectile-invalidate-cache nil)) (let ((file (projectile-completing-read "Find test file: " - (projectile-current-project-files)))) + (projectile-current-project-test-files)))) (find-file (expand-file-name file (projectile-project-root))))) -(defvar projectile-test-files-suffices '("_test" "_spec" "Test" "-test") - "Some common suffices of test files.") +(defcustom projectile-test-files-prefixes '("test_") + "Some common prefixes of test files." + :group 'projectile + :type '(repeat string)) + +(defcustom projectile-test-files-suffices '("_test" "_spec" "Test" "-test") + "Some common suffices of test files." + :group 'projectile + :type '(repeat string)) (defun projectile-test-files (files) "Return only the test FILES." @@ -585,18 +785,29 @@ With a prefix ARG invalidates the cache first." (defun projectile-test-file-p (file) "Check if FILE is a test file." - (-any? (lambda (suffix) - (s-ends-with? suffix (file-name-sans-extension file))) - projectile-test-files-suffices)) + (or (-any? (lambda (prefix) + (s-starts-with? prefix (file-name-nondirectory file))) + projectile-test-files-prefixes) + (-any? (lambda (suffix) + (s-ends-with? suffix (file-name-sans-extension file))) + projectile-test-files-suffices))) + +(defun projectile-current-project-test-files () + "Return a list of test files for the current project." + (projectile-test-files (projectile-current-project-files))) (defvar projectile-rails-rspec '("Gemfile" "app" "lib" "db" "config" "spec")) (defvar projectile-rails-test '("Gemfile" "app" "lib" "db" "config" "test")) (defvar projectile-symfony '("composer.json" "app" "src" "vendor")) (defvar projectile-ruby-rspec '("Gemfile" "lib" "spec")) (defvar projectile-ruby-test '("Gemfile" "lib" "test")) +(defvar projectile-django '("manage.py")) +(defvar projectile-python-pip '("requirements.txt")) +(defvar projectile-python-egg '("setup.py")) (defvar projectile-maven '("pom.xml")) (defvar projectile-lein '("project.clj")) (defvar projectile-rebar '("rebar")) +(defvar projectile-sbt '("build.sbt")) (defvar projectile-make '("Makefile")) (defun projectile-project-type () @@ -607,10 +818,14 @@ With a prefix ARG invalidates the cache first." ((projectile-verify-files projectile-rails-test) 'rails-test) ((projectile-verify-files projectile-ruby-rspec) 'ruby-rspec) ((projectile-verify-files projectile-ruby-test) 'ruby-test) + ((projectile-verify-files projectile-django) 'django) + ((projectile-verify-files projectile-python-pip)'python) + ((projectile-verify-files projectile-python-egg) 'python) ((projectile-verify-files projectile-symfony) 'symfony) ((projectile-verify-files projectile-maven) 'maven) ((projectile-verify-files projectile-lein) 'lein) ((projectile-verify-files projectile-rebar) 'rebar) + ((projectile-verify-files projectile-sbt) 'sbt) ((projectile-verify-files projectile-make) 'make) (t 'generic)))) @@ -640,7 +855,7 @@ With a prefix ARG invalidates the cache first." ((locate-dominating-file project-root ".svn") 'svn) (t 'none)))) -(defun projectile-toggle-between-implemenation-and-test () +(defun projectile-toggle-between-implementation-and-test () "Toggle between an implementation file and its test file." (interactive) (if (projectile-test-file-p (buffer-file-name)) @@ -655,32 +870,42 @@ With a prefix ARG invalidates the cache first." (find-file (projectile-expand-root test-file)) (error "No matching test file found"))))) +(defun projectile-test-prefix (project-type) + "Find test files prefix based on PROJECT-TYPE." + (cond + ((member project-type '(django python)) "test_"))) + (defun projectile-test-suffix (project-type) "Find test files suffix based on PROJECT-TYPE." (cond ((member project-type '(rails-rspec ruby-rspec)) "_spec") ((member project-type '(rails-test ruby-test lein)) "_test") - ((member project-type '(maven symfony)) "Test") - (t (error "Project type not supported!")))) + ((member project-type '(maven symfony)) "Test"))) (defun projectile-find-matching-test (file) "Compute the name of the test matching FILE." (let ((basename (file-name-nondirectory (file-name-sans-extension file))) (extension (file-name-extension file)) - (test-suffix (projectile-test-suffix (projectile-project-type)))) + (test-affix (or (projectile-test-prefix (projectile-project-type)) + (projectile-test-suffix (projectile-project-type)) + (error "Project type not supported!")))) (-first (lambda (current-file) - (s-equals? (file-name-nondirectory (file-name-sans-extension current-file)) - (concat basename test-suffix))) + (let ((current-file-basename (file-name-nondirectory (file-name-sans-extension current-file)))) + (or (s-equals? current-file-basename (concat test-affix basename)) + (s-equals? current-file-basename (concat basename test-affix))))) (projectile-current-project-files)))) (defun projectile-find-matching-file (test-file) "Compute the name of a file matching TEST-FILE." (let ((basename (file-name-nondirectory (file-name-sans-extension test-file))) (extension (file-name-extension test-file)) - (test-suffix (projectile-test-suffix (projectile-project-type)))) + (test-affix (or (projectile-test-prefix (projectile-project-type)) + (projectile-test-suffix (projectile-project-type)) + (error "Project type not supported!")))) (-first (lambda (current-file) - (s-equals? (concat (file-name-nondirectory (file-name-sans-extension current-file)) test-suffix) - basename)) + (let ((current-file-basename (file-name-nondirectory (file-name-sans-extension current-file)))) + (or (s-equals? (concat test-affix current-file-basename) basename) + (s-equals? (concat current-file-basename test-affix) basename)))) (projectile-current-project-files)))) (defun projectile-grep () @@ -694,9 +919,9 @@ With a prefix ARG invalidates the cache first." (dolist (root-dir roots) (require 'grep) ;; paths for find-grep should relative and without trailing / - (let ((grep-find-ignored-directories (union (-map (lambda (dir) (s-chop-suffix "/" (s-chop-prefix root-dir dir))) + (let ((grep-find-ignored-directories (-union (-map (lambda (dir) (s-chop-suffix "/" (file-relative-name dir root-dir))) (cdr (projectile-ignored-directories))) grep-find-ignored-directories)) - (grep-find-ignored-files (union (-map (lambda (file) (s-chop-prefix root-dir file)) (projectile-ignored-files)) grep-find-ignored-files))) + (grep-find-ignored-files (-union (-map (lambda (file) (file-relative-name file root-dir)) (projectile-ignored-files)) grep-find-ignored-files))) (grep-compute-defaults) (rgrep search-regexp "* .*" root-dir))))) @@ -710,10 +935,21 @@ With a prefix ARG invalidates the cache first." (projectile-ignored-directories)))) (call-interactively projectile-ack-function))) +(defun projectile-ag (regexp) + "Run an ag search with REGEXP in the project." + (interactive + (list (read-from-minibuffer + (projectile-prepend-project-name "Ag search for: ") + (projectile-symbol-at-point)))) + (if (fboundp 'ag-regexp) + (ag-regexp regexp (projectile-project-root)) + (error "Ag is not available"))) + (defun projectile-tags-exclude-patterns () "Return a string with exclude patterns for ctags." - (mapconcat (lambda (pattern) (format "--exclude=%s" pattern)) - (projectile-project-ignored-directories) " ")) + (mapconcat (lambda (pattern) (format "--exclude=%s" + (directory-file-name pattern))) + (projectile-ignored-directories-rel) " ")) (defun projectile-regenerate-tags () "Regenerate the project's etags." @@ -721,19 +957,46 @@ With a prefix ARG invalidates the cache first." (let* ((project-root (projectile-project-root)) (tags-exclude (projectile-tags-exclude-patterns)) (default-directory project-root)) - (shell-command (format projectile-tags-command tags-exclude project-root)) - (visit-tags-table project-root))) + (shell-command (format projectile-tags-command tags-exclude)) + (visit-tags-table project-root t))) -(defun projectile-replace () - "Replace a string in the project using `tags-query-replace'." +(defun projectile-find-tag () + "Find tag in project." (interactive) + (visit-tags-table (projectile-project-root) t) + (tags-completion-table) + (let (tag-names) + (mapc (lambda (x) + (unless (integerp x) + (push (prin1-to-string x t) tag-names))) + tags-completion-table) + (find-tag (projectile-completing-read "Find tag: " tag-names)))) + +(defun projectile-files-in-project-directory (directory) + "Return a list of files in DIRECTORY." + (let ((dir (file-relative-name (expand-file-name directory) (projectile-project-root)))) + (-filter (lambda (file) (s-starts-with-p dir file)) + (projectile-current-project-files)))) + +(defun projectile-replace (arg) + "Replace a string in the project using `tags-query-replace'. + +With a prefix argument ARG prompts you for a directory on which to run the replacement." + (interactive "P") (let* ((old-text (read-string (projectile-prepend-project-name "Replace: ") (projectile-symbol-at-point))) - (new-text (read-string - (projectile-prepend-project-name - (format "Replace %s with: " old-text))))) - (tags-query-replace old-text new-text nil '(-map 'projectile-expand-root (projectile-current-project-files))))) + (new-text (read-string + (projectile-prepend-project-name + (format "Replace %s with: " old-text)))) + (files (if arg + (-map 'projectile-expand-root + (projectile-files-in-project-directory + (read-directory-name "Replace in directory: "))) + (-map 'projectile-expand-root + (projectile-current-project-files))))) + ;; we have to reject directories as a workaround to work with git submodules + (tags-query-replace old-text new-text nil '(-reject 'file-directory-p files)))) (defun projectile-symbol-at-point () "Get the symbol at point and strip its properties." @@ -752,10 +1015,15 @@ With a prefix ARG invalidates the cache first." (mapc 'kill-buffer buffers)))) (defun projectile-dired () - "Opens dired at the root of the project." + "Open `dired' at the root of the project." (interactive) (dired (projectile-project-root))) +(defun projectile-vc-dir () + "Open `vc-dir' at the root of the project." + (interactive) + (vc-dir (projectile-project-root))) + (defun projectile-recentf () "Show a list of recently visited files in a project." (interactive) @@ -769,7 +1037,7 @@ With a prefix ARG invalidates the cache first." (let ((project-root (projectile-project-root))) (->> recentf-list (-filter (lambda (file) (s-starts-with-p project-root file))) - (-map (lambda (file) (s-chop-prefix project-root file))))) + (-map (lambda (file) (file-relative-name file project-root))))) nil)) (defun projectile-serialize-cache () @@ -780,6 +1048,10 @@ With a prefix ARG invalidates the cache first." (defvar projectile-ruby-compile-cmd "bundle exec rake build") (defvar projectile-ruby-test-cmd "bundle exec rake test") (defvar projectile-ruby-rspec-cmd "bundle exec rspec") +(defvar projectile-django-compile-cmd "venv/bin/python manage.py runserver") +(defvar projectile-django-test-cmd "venv/bin/python manage.py test") +(defvar projectile-python-compile-cmd "venv/bin/python setup.py build") +(defvar projectile-python-test-cmd "venv/bin/python -m unittest discover") (defvar projectile-symfony-compile-cmd "app/console server:run") (defvar projectile-symfony-test-cmd "phpunit -c app ") (defvar projectile-maven-compile-cmd "mvn clean install") @@ -788,6 +1060,8 @@ With a prefix ARG invalidates the cache first." (defvar projectile-lein-test-cmd "lein test") (defvar projectile-rebar-compile-cmd "rebar") (defvar projectile-rebar-test-cmd "rebar eunit") +(defvar projectile-sbt-compile-cmd "sbt compile") +(defvar projectile-sbt-test-cmd "sbt test") (defvar projectile-make-compile-cmd "make") (defvar projectile-make-test-cmd "make test") @@ -803,11 +1077,14 @@ With a prefix ARG invalidates the cache first." (cond ((member project-type '(rails-rspec rails-test)) projectile-rails-compile-cmd) ((member project-type '(ruby-rspec ruby-test)) projectile-ruby-compile-cmd) + ((eq project-type 'django) projectile-django-compile-cmd) + ((eq project-type 'python) projectile-python-compile-cmd) ((eq project-type 'symfony) projectile-symfony-compile-cmd) ((eq project-type 'lein) projectile-lein-compile-cmd) ((eq project-type 'make) projectile-make-compile-cmd) ((eq project-type 'rebar) projectile-rebar-compile-cmd) ((eq project-type 'maven) projectile-maven-compile-cmd) + ((eq project-type 'sbt) projectile-sbt-compile-cmd) (t projectile-make-compile-cmd))) (defun projectile-default-test-command (project-type) @@ -815,11 +1092,14 @@ With a prefix ARG invalidates the cache first." (cond ((member project-type '(rails-rspec ruby-rspec)) projectile-ruby-rspec-cmd) ((member project-type '(rails-test ruby-test)) projectile-ruby-test-cmd) + ((eq project-type 'django) projectile-django-test-cmd) + ((eq project-type 'python) projectile-python-test-cmd) ((eq project-type 'symfony) projectile-symfony-test-cmd) ((eq project-type 'lein) projectile-lein-test-cmd) ((eq project-type 'make) projectile-make-test-cmd) ((eq project-type 'rebar) projectile-rebar-test-cmd) ((eq project-type 'maven) projectile-maven-test-cmd) + ((eq project-type 'sbt) projectile-sbt-test-cmd) (t projectile-make-test-cmd))) (defun projectile-compilation-command (project) @@ -828,44 +1108,82 @@ With a prefix ARG invalidates the cache first." (projectile-default-compilation-command (projectile-project-type)))) (defun projectile-test-command (project) - "Retrieve the compilation command for PROJECT." + "Retrieve the test command for PROJECT." (or (gethash project projectile-test-cmd-map) (projectile-default-test-command (projectile-project-type)))) -(defun projectile-compile-project () - "Run project compilation command." - (interactive) +(defun projectile-compile-project (arg) + "Run project compilation command. + +Normally you'll be prompted for a compilation command, unless +variable `compilation-read-command'. You can force the prompt +with a prefix ARG." + (interactive "P") (let* ((project-root (projectile-project-root)) - (compilation-cmd (compilation-read-command (projectile-compilation-command project-root))) + (default-cmd (projectile-compilation-command project-root)) + (compilation-cmd (if (or compilation-read-command arg) + (compilation-read-command default-cmd) + default-cmd)) (default-directory project-root)) (puthash project-root compilation-cmd projectile-compilation-cmd-map) (compilation-start compilation-cmd))) ;; TODO - factor this duplication out -(defun projectile-test-project () - "Run project test command." - (interactive) +(defun projectile-test-project (arg) + "Run project test command. + +Normally you'll be prompted for a compilation command, unless +variable `compilation-read-command'. You can force the prompt +with a prefix ARG." + (interactive "P") (let* ((project-root (projectile-project-root)) - (test-cmd (compilation-read-command (projectile-test-command project-root))) + (default-cmd (projectile-test-command project-root)) + (test-cmd (if (or compilation-read-command arg) + (compilation-read-command default-cmd) + default-cmd)) (default-directory project-root)) (puthash project-root test-cmd projectile-test-cmd-map) (compilation-start test-cmd))) -(defun projectile-switch-project () - "Switch to a project we have seen before." - (interactive) +(defun projectile-relevant-known-projects () + "Return a list of known projects except the current one (if present)." + (if (projectile-project-p) + (-difference projectile-known-projects + (list (abbreviate-file-name (projectile-project-root)))) + projectile-known-projects)) + +(defun projectile-switch-project (&optional arg) + "Switch to a project we have visited before. +Invokes the command referenced by `projectile-switch-project-action' on switch. +With a prefix ARG invokes `projectile-commander' instead of +`projectile-switch-project-action.'" + (interactive "P") (let* ((project-to-switch - (projectile-completing-read "Switch to which project: " - projectile-known-projects)) + (projectile-completing-read "Switch to project: " + (projectile-relevant-known-projects))) (default-directory project-to-switch)) - (projectile-find-file nil) + (if arg + (projectile-commander) + (funcall projectile-switch-project-action)) (let ((project-switched project-to-switch)) (run-hooks 'projectile-switch-project-hook)))) -(defvar projectile-switch-project-hook nil +(defun projectile-find-file-in-directory () + "Jump to a file in a (maybe regular) directory. + +This command will first prompt for the directory the file is in." + (interactive) + (let* ((directory (read-directory-name "Find file in directory: ")) + (default-directory directory) + (projectile-require-project-root nil)) + (projectile-find-file))) + +(defcustom projectile-switch-project-hook nil "Hooks run when project is switched. -The path to the opened project is available as PROJECT-SWITCHED") +The path to the opened project is available as PROJECT-SWITCHED" + :group 'projectile + :type 'hook) (defun projectile-clear-known-projects () "Clear both `projectile-known-projects' and `projectile-known-projects-file'." @@ -877,7 +1195,7 @@ The path to the opened project is available as PROJECT-SWITCHED") "Remove a projected from the list of known projects." (interactive) (let ((project-to-remove - (projectile-completing-read "Switch to which project: " + (projectile-completing-read "Remove from known projects: " projectile-known-projects))) (setq projectile-known-projects (--reject (string= project-to-remove it) projectile-known-projects)) @@ -903,78 +1221,216 @@ Also set `projectile-known-projects'." "Save PROJECTILE-KNOWN-PROJECTS to PROJECTILE-KNOWN-PROJECTS-FILE." (projectile-serialize projectile-known-projects projectile-known-projects-file)) +;;;; projectile-commander + +(defconst projectile-commander-help-buffer "*Commander Help*") + +(defvar projectile-commander-methods nil + "List of file-selection methods for the `projectile-commander' command. +Each element is a list (KEY DESCRIPTION FUNCTION). +DESCRIPTION is a one-line description of what the key selects.") + +;;;###autoload +(defun projectile-commander () + "Execute a Projectile command with a single letter. +The user is prompted for a single character indicating the action to invoke. +The `?' character describes then +available actions. + +See `def-projectile-commander-method' for defining new methods." + (interactive) + (message "Commander [%s]: " + (apply #'string (mapcar #'car projectile-commander-methods))) + (let* ((ch (save-window-excursion + (select-window (minibuffer-window)) + (read-char))) + (method (cl-find ch projectile-commander-methods :key #'car))) + (cond (method + (funcall (cl-caddr method))) + (t + (message "No method for character: ?\\%c" ch) + (ding) + (sleep-for 1) + (discard-input) + (projectile-commander))))) + +(defmacro def-projectile-commander-method (key description &rest body) + "Define a new `projectile-commander' method. + +KEY is the key the user will enter to choose this method. + +DESCRIPTION is a one-line sentence describing how the method. + +BODY is a series of forms which are evaluated when the find +is chosen." + (let ((method `(lambda () + ,@body))) + `(setq projectile-commander-methods + (cl-sort (cons (list ,key ,description ,method) + (cl-remove ,key projectile-commander-methods :key #'car)) + #'< :key #'car)))) + +(def-projectile-commander-method ?? "Commander help buffer." + (ignore-errors (kill-buffer projectile-commander-help-buffer)) + (with-current-buffer (get-buffer-create projectile-commander-help-buffer) + (insert "Projectile Commander Methods:\n\n") + (loop for (key line nil) in projectile-commander-methods + do (insert (format "%c:\t%s\n" key line))) + (goto-char (point-min)) + (help-mode) + (display-buffer (current-buffer) t)) + (projectile-commander)) + +(def-projectile-commander-method ?f + "Find file in project." + (projectile-find-file)) + +(def-projectile-commander-method ?T + "Find test file in project." + (projectile-find-test-file)) + +(def-projectile-commander-method ?b + "Switch to project buffer." + (projectile-switch-to-buffer)) + +(def-projectile-commander-method ?d + "Find directory in project." + (projectile-find-dir)) + +(def-projectile-commander-method ?D + "Open project root in dired." + (projectile-dired)) + +(def-projectile-commander-method ?g + "Run grep on project." + (projectile-grep)) + +(def-projectile-commander-method ?s + "Switch project." + (projectile-switch-project)) + +(def-projectile-commander-method ?o + "Run multi-occur on project buffers." + (projectile-multi-occur)) + +(def-projectile-commander-method ?j + "Find tag in project." + (projectile-find-tag)) + +(def-projectile-commander-method ?k + "Kill all project buffers." + (projectile-grep)) + +(def-projectile-commander-method ?e + "Find recently visited file in project." + (projectile-recentf)) + + +;;; Minor mode (defvar projectile-mode-map (let ((map (make-sparse-keymap))) (let ((prefix-map (make-sparse-keymap))) + (define-key prefix-map (kbd "4 f") 'projectile-find-file-other-window) (define-key prefix-map (kbd "f") 'projectile-find-file) (define-key prefix-map (kbd "T") 'projectile-find-test-file) - (define-key prefix-map (kbd "t") 'projectile-toggle-between-implemenation-and-test) + (define-key prefix-map (kbd "l") 'projectile-find-file-in-directory) + (define-key prefix-map (kbd "t") 'projectile-toggle-between-implementation-and-test) (define-key prefix-map (kbd "g") 'projectile-grep) + (define-key prefix-map (kbd "4 b") 'projectile-switch-to-buffer-other-window) (define-key prefix-map (kbd "b") 'projectile-switch-to-buffer) (define-key prefix-map (kbd "o") 'projectile-multi-occur) (define-key prefix-map (kbd "r") 'projectile-replace) (define-key prefix-map (kbd "i") 'projectile-invalidate-cache) (define-key prefix-map (kbd "R") 'projectile-regenerate-tags) + (define-key prefix-map (kbd "j") 'projectile-find-tag) (define-key prefix-map (kbd "k") 'projectile-kill-buffers) (define-key prefix-map (kbd "d") 'projectile-find-dir) (define-key prefix-map (kbd "D") 'projectile-dired) + (define-key prefix-map (kbd "v") 'projectile-vc-dir) (define-key prefix-map (kbd "e") 'projectile-recentf) (define-key prefix-map (kbd "a") 'projectile-ack) + (define-key prefix-map (kbd "A") 'projectile-ag) (define-key prefix-map (kbd "c") 'projectile-compile-project) (define-key prefix-map (kbd "p") 'projectile-test-project) (define-key prefix-map (kbd "z") 'projectile-cache-current-file) (define-key prefix-map (kbd "s") 'projectile-switch-project) + (define-key prefix-map (kbd "m") 'projectile-commander) (define-key map projectile-keymap-prefix prefix-map)) map) "Keymap for Projectile mode.") -(defun projectile-add-menu () - "Add Projectile's menu under Tools." - (easy-menu-add-item nil '("Tools") - '("Projectile" - ["Find file" projectile-find-file] - ["Switch to buffer" projectile-switch-to-buffer] - ["Kill project buffers" projectile-kill-buffers] - ["Recent files" projectile-recentf] - "--" - ["Open project in dired" projectile-dired] - ["Find in project (grep)" projectile-grep] - ["Find in project (ack)" projectile-ack] - ["Replace in project" projectile-replace] - ["Multi-occur in project" projectile-multi-occur] - "--" - ["Invalidate cache" projectile-invalidate-cache] - ["Regenerate etags" projectile-regenerate-tags] - "--" - ["Compile project" projectile-compile-project] - ["Test project" projectile-test-project] - "--" - ["About" projectile-version]) - "Search Files (Grep)...") - - (easy-menu-add-item nil '("Tools") '("--") "Search Files (Grep)...")) - -(defun projectile-remove-menu () - "Remove Projectile's menu." - (easy-menu-remove-item nil '("Tools") "Projectile") - (easy-menu-remove-item nil '("Tools") "--")) - -;;; define minor mode +(easy-menu-change + '("Tools") "Projectile" + '(["Find file" projectile-find-file] + ["Find test file" projectile-find-test-file] + ["Find directory" projectile-find-dir] + ["Find file in directory" projectile-find-file-in-directory] + ["Switch to buffer" projectile-switch-to-buffer] + ["Jump between implementation file and test file" projectile-toggle-between-implementation-and-test] + ["Kill project buffers" projectile-kill-buffers] + ["Recent files" projectile-recentf] + "--" + ["Open project in dired" projectile-dired] + ["Switch to project" projectile-switch-project] + ["Find in project (grep)" projectile-grep] + ["Find in project (ack)" projectile-ack] + ["Replace in project" projectile-replace] + ["Multi-occur in project" projectile-multi-occur] + "--" + ["Cache current file" projectile-cache-current-file] + ["Invalidate cache" projectile-invalidate-cache] + ["Regenerate etags" projectile-regenerate-tags] + "--" + ["Compile project" projectile-compile-project] + ["Test project" projectile-test-project] + "--" + ["About" projectile-version]) + "Search Files (Grep)...") + +(easy-menu-change '("Tools") "--" nil "Search Files (Grep)...") + +;;;###autoload +(defconst projectile-mode-line-lighter " Projectile" + "The default lighter for `projectile-mode'.") + +(defvar-local projectile-mode-line projectile-mode-line-lighter + "The dynamic mode line lighter variable for `projectile-mode'.") + +(defun projectile-update-mode-line () + "Report project in mode-line." + (let* ((project-name (projectile-project-name)) + (message (format "%s[%s]" projectile-mode-line-lighter project-name))) + (setq projectile-mode-line message)) + (force-mode-line-update)) ;;;###autoload (define-minor-mode projectile-mode "Minor mode to assist project management and navigation. +When called interactively, toggle `projectile-mode'. With prefix +ARG, enable `projectile-mode' if ARG is positive, otherwise disable +it. + +When called from Lisp, enable `projectile-mode' if ARG is omitted, +nil or positive. If ARG is `toggle', toggle `projectile-mode'. +Otherwise behave as if called interactively. + \\{projectile-mode-map}" - :lighter " Projectile" + :lighter projectile-mode-line :keymap projectile-mode-map :group 'projectile - (if projectile-mode - ;; on start - (projectile-add-menu) - ;; on stop - (projectile-remove-menu))) + :require 'projectile + (cond + (projectile-mode + (add-hook 'find-file-hook 'projectile-cache-files-find-file-hook t t) + (add-hook 'find-file-hook 'projectile-cache-projects-find-file-hook t t) + (add-hook 'projectile-find-dir-hook 'projectile-cache-projects-find-file-hook) + (add-hook 'find-file-hook 'projectile-update-mode-line t t)) + (t + (remove-hook 'find-file-hook 'projectile-cache-files-find-file-hook t) + (remove-hook 'find-file-hook 'projectile-cache-projects-find-file-hook t) + (remove-hook 'find-file-hook 'projectile-update-mode-line t)))) ;;;###autoload (define-globalized-minor-mode projectile-global-mode @@ -991,25 +1447,12 @@ Also set `projectile-known-projects'." (defun projectile-global-on () "Enable Projectile global minor mode." - (add-hook 'find-file-hook 'projectile-cache-files-find-file-hook) - (add-hook 'find-file-hook 'projectile-cache-projects-find-file-hook) - (add-hook 'projectile-find-dir-hook 'projectile-cache-projects-find-file-hook)) + (projectile-global-mode +1)) (defun projectile-global-off () "Disable Projectile global minor mode." - (remove-hook 'find-file-hook 'projectile-cache-files-find-file-hook) - (remove-hook 'find-file-hook 'projectile-cache-projects-find-file-hook)) - -(defadvice projectile-global-mode (after projectile-setup-hooks activate) - "Add/remove `find-file-hook' functions within `projectile-global-mode'." - (if projectile-global-mode - (projectile-global-on) - (projectile-global-off))) + (projectile-global-mode -1)) (provide 'projectile) -;; Local Variables: -;; byte-compile-warnings: (not cl-functions) -;; End: - ;;; projectile.el ends here diff --git a/emacs.d/elpa/projectile-0.10.0/projectile.elc b/emacs.d/elpa/projectile-0.10.0/projectile.elc new file mode 100644 index 0000000000000000000000000000000000000000..952eee4d6d0defabe29bfdfcaff4fdab898df241 GIT binary patch literal 58012 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 K9`U2i_5TA};y3O9 literal 0 HcmV?d00001 diff --git a/emacs.d/elpa/projectile-0.9.2/projectile-pkg.el b/emacs.d/elpa/projectile-0.9.2/projectile-pkg.el deleted file mode 100644 index 9d4df7e..0000000 --- a/emacs.d/elpa/projectile-0.9.2/projectile-pkg.el +++ /dev/null @@ -1 +0,0 @@ -(define-package "projectile" "0.9.2" "Manage and navigate projects in Emacs easily" (quote ((s "1.0.0") (dash "1.0.0")))) diff --git a/emacs.d/elpa/projectile-0.9.2/projectile.elc b/emacs.d/elpa/projectile-0.9.2/projectile.elc deleted file mode 100644 index fd7f36f862afa78098c393a1427133eee0587a8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41745 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

w*g;DrDi5DB~$_PQ7wbSR%@^JB3? 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 AKL7v#