[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
switch-file.el v0.1
From: |
Vinicius Jose Latorre |
Subject: |
switch-file.el v0.1 |
Date: |
Tue, 08 Apr 2008 21:24:05 -0300 |
User-agent: |
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.13) Gecko/20080313 SeaMonkey/1.1.9 |
;;; switch-file.el --- switch from one file to another.
;; This package facilitates when you need to switch from a .cpp file,
;; for example, to a corresponding .hpp file.
;;
;; It also helps when you have three (or more) file extensions to
;; switch, for example, you could have .cpp, .hpp and .inc extensions.
;; So, you could switch from a .cpp file to a .hpp file, from .hpp to
;; .inc, and from .inc to .cpp again.
;;; switch-file.el --- switch from one file to another.
;; Copyright (C) 2008 Vinicius Jose Latorre
;; Author: Vinicius Jose Latorre <address@hidden>
;; Maintainer: Vinicius Jose Latorre <address@hidden>
;; Keywords: convenience
;; Time-stamp: <2008/04/08 20:40:45 vinicius>
;; Version: 0.1
;; X-URL: http://www.emacswiki.org/cgi-bin/wiki/ViniciusJoseLatorre
;; This file is *NOT* (yet?) 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 3, or (at
;; your option) any later version.
;; This program is distributed in the hope that it will be useful, but
;; WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
;; General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs; see the file COPYING. If not, write to the
;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
;; Boston, MA 02110-1301, USA.
;;; Commentary:
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Introduction
;; ------------
;;
;; This package facilitates when you need to switch from a .cpp file,
;; for example, to a corresponding .hpp file.
;;
;; It also helps when you have three (or more) file extensions to
;; switch, for example, you could have .cpp, .hpp and .inc extensions.
;; So, you could switch from a .cpp file to a .hpp file, from .hpp to
;; .inc, and from .inc to .cpp again.
;;
;; For good performance, be sure to byte-compile switch-file.el, e.g.
;;
;; M-x byte-compile-file <give the path to switch-file.el when prompted>
;;
;; This will generate switch-file.elc, which will be loaded instead of
;; switch-file.el.
;;
;; switch-file was tested with GNU Emacs 21, 22 and 23.
;;
;; I don't know if it is compatible with XEmacs.
;;
;;
;; Usage
;; -----
;;
;; To use switch-file, insert in your ~/.emacs:
;;
;; (require 'switch-file)
;; (setq switch-path (list <PATH-LIST>))
;;
;; And, for example, to switch from a current .cc file to a .hh
;; corresponding file (or vice-versa) type:
;;
;; M-x switch-cc-to-h RET
;;
;; As a suggestion for key bindings:
;;
;; (global-set-key [f3] 'switch-cc-to-h)
;;
;;
;; Options
;; -------
;;
;; Below it's shown a brief description of switch-file options,
;; please, see the options declaration in the code for a long
;; documentation.
;;
;; `switch-path' Specify a path list for locating files
;; to switch.
;;
;; `switch-major-mode-alist' Specify a major mode alist.
;;
;; To set the above options you may:
;;
;; a) insert code in your ~/.emacs, like:
;;
;; (setq switch-path '("some-dir/" "other-dir/"))
;;
;; This method preserves your default settings when you enter a new
;; Emacs session.
;;
;; b) or use `set-variable' in your Emacs session, like:
;;
;; M-x set-variable RET switch-path RET
;; '("some-dir/" "other-dir/") RET
;;
;; This method preserves your settings only during the current
;; Emacs session.
;;
;; c) or use customization, for example:
;; click on menu-bar *Help* option,
;; then click on *Customize*,
;; then click on *Browse Customization Groups*,
;; expand *Convenience* group,
;; and then customize switch-file options.
;; This way, you may choose if the settings are kept or not when
;; you leave out the current Emacs session.
;;
;; d) or see the option value:
;;
;; C-h v switch-path RET
;;
;; and click the *customize* hypertext button.
;; This way, you may choose if the settings are kept or not when
;; you leave out the current Emacs session.
;;
;;
;; Acknowledgments
;; ---------------
;;
;; Thanks to Arndt Gulbrandsen (QtMode EmacsWiki) for very first
;; version.
;;
;;
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; code:
;;;###autoload
(defcustom switch-path
'("./")
"*Specify a path list for locating files to switch."
:type '(repeat :tag "Path List"
directory)
:group 'convenience)
;;;###autoload
(defcustom switch-major-mode-alist
'((c-mode ("c" ".c") ("h" ".h"))
(c++-mode ("c\\|cc\\|C\\|cpp" ".cc" ".C" ".cpp" ".c")
("h\\|hh" ".h" ".hh")))
"*Specify a major mode alist.
The alist element has the following form:
(MAJOR-MODE (EXTENSION-REGEXP EXTENSION... )... )
Where:
MAJOR-MODE is a major mode symbol.
EXTENSION-REGEXP is a regexp used for matching the current buffer
file name extension.
EXTENSION is a string used for changing the file name extension."
:type '(repeat :tag "Switch List"
(list
(symbol :tag "Id")
(repeat :inline t
(list
(regexp :tag "File Extension Regexp")
(repeat :inline t
(string :tag "File Extension"))))))
:group 'convenience)
;;;###autoload
(defun switch-c-to-h ()
"Switch from C file to a H file or vice-versa."
(interactive)
(switch-file-major-mode 'c-mode))
;;;###autoload
(defun switch-cc-to-h ()
"Switch from CC file to a H file or vice-versa."
(interactive)
(switch-file-major-mode 'c++-mode))
;;;###autoload
(defun switch-file-major-mode (&optional mode)
"Switch from current file to another one depending on MODE or major mode."
(interactive)
(switch-to-other-file (cdr (assq (or mode major-mode)
switch-major-mode-alist))))
(defun switch-to-other-file (extension-list)
"Switch from one file to another file or vice-versa.
EXTENSION-LIST is a list which elements have the following form:
( (EXTENSION-REGEXP EXTENSION... )... )
Where:
EXTENSION-REGEXP is a regexp used for matching the current buffer
file name extension.
EXTENSION is a string used for changing the file name extension."
(save-match-data
(when (and buffer-file-name extension-list)
(let* ((file-name (file-name-nondirectory buffer-file-name))
(name (progn
(string-match "^\\(.*\\)\\.\\([^.]*\\)$"
file-name)
(match-string 1 file-name)))
(elist (let ((suffix
(file-name-extension buffer-file-name))
tmp)
(dolist (ext extension-list)
(unless (string-match suffix (car ext))
(setq tmp (cons (cdr ext) tmp))))
(nreverse tmp)))
slist dlist full-file-name found)
(while elist ; run list of extensions
(setq slist (car elist)
elist (cdr elist))
(while slist ; run extensions
(setq file-name (concat name (car slist))
slist (cdr slist)
dlist switch-path)
(while dlist ; run directories
(setq full-file-name (concat (car dlist) file-name)
dlist (cdr dlist))
;; found a file to switch to
(when (file-exists-p full-file-name)
(find-file full-file-name)
(setq elist nil
slist nil
dlist nil
found t)))))
(unless found
(message "Not found a file to switch to."))))))
(provide 'switch-file)
;;; switch-file.el ends here
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- switch-file.el v0.1,
Vinicius Jose Latorre <=