免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 833 | 回复: 0
打印 上一主题 下一主题

emacsprj 插件(基于ecb等) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-29 00:39 |只看该作者 |倒序浏览
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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP