- 论坛徽章:
- 0
|
emacsprj, 用于将项目的TAGS,书签,session记录等等独立保存。
FILE : 00-emacsprj.el
([color="#00ffff"]defun [color="#87cefa"]emacsprj-load (sourcedir)
(interactive [color="#ffa07a"]"DLoad emacs project from directory:")
(setq emacsprj-source-directory
(replace-regexp-in-string [color="#ffa07a"]"/*$" [color="#ffa07a"]""
(file-truename sourcedir)))
(setq emacsprj-id (file-name-nondirectory emacsprj-source-directory))
(setq emacsprj-directory
(expand-file-name (concat emacsprj-source-directory [color="#ffa07a"]"/.emacsprj/")))
(setq emacsprj-config-file
(expand-file-name (concat emacsprj-directory [color="#ffa07a"]"config.el")))
(setq emacsprj-data-directory
(expand-file-name (concat emacsprj-directory [color="#ffa07a"]"data/")))
(setq emacsprj-session-save-file
(expand-file-name (concat emacsprj-data-directory [color="#ffa07a"]".session")))
[color="#ff7f24"];;[color="#ff7f24"]
[color="#ff7f24"];; [color="#ff7f24"]check sanity of emacs project
[color="#ff7f24"];;[color="#ff7f24"]
[color="#ff7f24"];;; [color="#ff7f24"]check emacs project dir
([color="#00ffff"]unless (file-accessible-directory-p emacsprj-directory)
([color="#ffc0cb"]error [color="#ffa07a"]"emacsprj directory \"%s\" does not exist, create it first"
emacsprj-directory))
[color="#ff7f24"];;; [color="#ff7f24"]check config filetsocsk
([color="#00ffff"]unless (file-exists-p emacsprj-config-file)
([color="#ffc0cb"]error [color="#ffa07a"]"emacsprj config file \"%s\" does not exist, create it first"
emacsprj-config-file))
[color="#ff7f24"];;; [color="#ff7f24"]check emacs project data, if it does not exist, initial the emacsprj
([color="#00ffff"]unless (file-accessible-directory-p emacsprj-data-directory)
(make-directory emacsprj-data-directory)
(desktop-save emacsprj-data-directory)
(emacsprj-update-refs))
[color="#ff7f24"];;[color="#ff7f24"]
[color="#ff7f24"];; [color="#ff7f24"]loading project
[color="#ff7f24"];;[color="#ff7f24"]
[color="#ff7f24"];;; [color="#ff7f24"]set default variables
(setq default-directory emacsprj-source-directory)
(setq ecb-source-path (list (list emacsprj-source-directory emacsprj-id)))
(setq compile-command (concat [color="#ffa07a"]"make -C " emacsprj-source-directory))
(setq bookmark-default-file (concat emacsprj-data-directory [color="#ffa07a"]"bookmarks"))
(setq recentf-save-file (concat emacsprj-data-directory [color="#ffa07a"]"recentf"))
(setq server-name emacsprj-id)
[color="#ff7f24"];;; [color="#ff7f24"]run local expressions
(load emacsprj-config-file)
[color="#ff7f24"];;; [color="#ff7f24"]initialize ecb
(ecb-activate)
[color="#ff7f24"];;; [color="#ff7f24"]load desktop
(desktop-change-dir emacsprj-data-directory)
(desktop-save-mode)
[color="#ff7f24"];;; [color="#ff7f24"]save bookmarks when exist
(add-hook 'kill-emacs-hook 'bookmark-save)
[color="#ff7f24"];;; [color="#ff7f24"]load session
(setq session-save-file emacsprj-session-save-file)
(session-initialize)
[color="#ff7f24"];;; [color="#ff7f24"]load project tags and cscope database
(setq cscope-initial-directory emacsprj-data-directory)
(visit-tags-table emacsprj-data-directory)
(server-start)
(message [color="#ffa07a"]"emacsprj loaded\n"))
([color="#00ffff"]defun [color="#87cefa"]emacsprj-update-refs ()
(interactive)
([color="#00ffff"]if (boundp 'emacsprj-source-directory)
([color="#00ffff"]progn (my-try-run [color="#ffa07a"]"emacsprj-update-refs" emacsprj-source-directory)
(message [color="#ffa07a"]"references updated : %s" emacsprj-source-directory))
([color="#ffc0cb"]error [color="#ffa07a"]"No emacsprj is loaded")))
([color="#00ffff"]defun [color="#87cefa"]emacsprj-regen-refs ()
(interactive)
([color="#00ffff"]if (boundp 'emacsprj-source-directory)
([color="#00ffff"]progn (my-try-run [color="#ffa07a"]"emacsprj-clean-refs" emacsprj-source-directory)
(my-try-run [color="#ffa07a"]"emacsprj-update-refs" emacsprj-source-directory)
(message [color="#ffa07a"]"references regenerated : %s" emacsprj-source-directory))
([color="#ffc0cb"]error [color="#ffa07a"]"No emacsprj is loaded")))
FILE : emacsprj-update-refs
[color="#ff7f24"]#[color="#ff7f24"]!/bin/[color="#00ffff"]sh[color="#ff7f24"]
[ [color="#ffa07a"]"$#" != 1 ] && [color="#00ffff"]exit 1
[color="#b0c4de"]cd [color="#ffa07a"]"$1"
[color="#eedd82"]EMACSPRJ_DIR=.emacsprj/
[color="#eedd82"]EMACSPRJ_DATADIR=${[color="#eedd82"]EMACSPRJ_DIR}/data
[color="#eedd82"]TAGS_FILE=${[color="#eedd82"]EMACSPRJ_DATADIR}/TAGS
[color="#eedd82"]LOCAL_TAGS_FILE=${[color="#eedd82"]EMACSPRJ_DATADIR}/TAGS.local
[ -f [color="#ffa07a"]"${LOCAL_TAGS_FILE}" ] || [color="#eedd82"]LOCAL_TAGS_FILE_IS_NEW=1
[color="#eedd82"]INCLUDE_TAGS_FILES=$(cat [color="#ffa07a"]"${EMACSPRJ_DIR}/include_tags_files.list" 2>/dev/null)
[color="#eedd82"]FILES_REGEX=$(cat [color="#ffa07a"]"${EMACSPRJ_DIR}/files_regex.list" 2>/dev/null)
[color="#00ffff"]for file_regex[color="#00ffff"] in ${[color="#eedd82"]FILES_REGEX};[color="#00ffff"]do
REFFILES+=[color="#ffa07a"]' '$(find . -regex [color="#ffa07a"]"$file_regex")
[color="#00ffff"]done
[color="#ff7f24"]# [color="#ff7f24"]tags
[color="#ff7f24"]# [color="#ff7f24"]local tags
[color="#00ffff"]for reffile[color="#00ffff"] in ${[color="#eedd82"]REFFILES};[color="#00ffff"]do
[color="#00ffff"]if { [ ! -z [color="#ffa07a"]"${LOCAL_TAGS_FILE_IS_NEW}" ] ||
[ [color="#ffa07a"]"${reffiles}" -nt [color="#ffa07a"]"${LOCAL_TAGS_FILE}" ] ;};[color="#00ffff"]then
etags -a [color="#ffa07a"]"${PWD}/${reffile}" -o [color="#ffa07a"]"${LOCAL_TAGS_FILE}"
[color="#00ffff"]fi
[color="#00ffff"]done
[color="#ff7f24"]# [color="#ff7f24"]generate tags
[color="#eedd82"]NEED_REGEN=
[ ! -f [color="#ffa07a"]"${TAGS_FILE}" ] && [color="#eedd82"]NEED_REGEN=1
[ [color="#ffa07a"]"${LOCAL_TAGS_FILE}" -nt [color="#ffa07a"]"${TAGS_FILE}" ] && [color="#eedd82"]NEED_REGEN=1
[color="#00ffff"]for include_tags_file[color="#00ffff"] in ${[color="#eedd82"]INCLUDE_TAGS_FILES};[color="#00ffff"]do
[ [color="#ffa07a"]"${include_tags_file}" -nt [color="#ffa07a"]"${TAGS_FILE}" ] && [color="#eedd82"]NEED_REGEN=1
[color="#00ffff"]done
[color="#00ffff"]if [ [color="#ffa07a"]"$NEED_REGEN" == 1 ];[color="#00ffff"]then
cat [color="#ffa07a"]"$LOCAL_TAGS_FILE" > [color="#ffa07a"]"${TAGS_FILE}"
[color="#00ffff"]for include_tags_file[color="#00ffff"] in ${[color="#eedd82"]INCLUDE_TAGS_FILES};[color="#00ffff"]do
cat ~/.tags/output/$[color="#eedd82"]include_tags_file >> [color="#ffa07a"]"$TAGS_FILE"
[color="#00ffff"]done
[color="#00ffff"]fi
[color="#ff7f24"]# [color="#ff7f24"]cscope database
[color="#00ffff"]for reffile[color="#00ffff"] in ${[color="#eedd82"]REFFILES};[color="#00ffff"]do
[color="#b0c4de"]echo [color="#ffa07a"]"${PWD}/${reffile}"
[color="#00ffff"]done | ([color="#b0c4de"]cd ${[color="#eedd82"]EMACSPRJ_DATADIR};cscope -b -i -)
FILE : emacsprj-clean-refs
[color="#ff7f24"]#[color="#ff7f24"]!/bin/[color="#00ffff"]sh[color="#ff7f24"]
[ [color="#ffa07a"]"$#" != 1 ] && [color="#00ffff"]exit 1
rm -f [color="#ffa07a"]"${1}"/.emacsprj/data/TAGS
rm -f [color="#ffa07a"]"${1}"/.emacsprj/data/TAGS.*
rm -f [color="#ffa07a"]"${1}"/.emacsprj/data/cscope.*
使用例子
我的linux kernel项目目录 :
$ ls ~/mydoc/prog/linux/
build linux-2.6 rootfs
linux-2.6 是 git clone, rootfs 是虚拟机里用的一些 nfs root, build 是一些辅助脚本。
为了使用 emacsprj,我需要创建这么两个文件:
$ cat ~/mydoc/prog/linux/.emacsprj/config.el
(setq c-default-style '((c-mode . "linux") (other . "linux")))
(setq c-basic-offset 4)
$ cat ~/mydoc/prog/linux/.emacsprj/files_regex.list
\./linux-2.6/.*\.h
\./linux-2.6/.*\.c
\./linux-2.6/.*\.S
然后就可以调用 emacsprj-load 这个文件夹了,我把这些都做了键绑定了:
(global-set-key (kbd "") 'emacsprj-update-refs)
(global-set-key (kbd "S-") 'emacsprj-regen-refs)
(global-set-key (kbd "C-x ") 'emacsprj-load)
截图(看不出emacsprj痕迹。。):
![]()
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/8057/showart_511067.html |
|