当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 2 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 请帮忙解决C/lah mode下缩进问题,谢谢咯~
帖子发表于 : 2009-08-04 11:59 

注册: 2009-08-04 11:49
帖子: 1
送出感谢: 0 次
接收感谢: 0 次
C/lah mode模式下
Tab及Ctrl+Tab自动补齐有效缓冲区提示Using try-expand-line 但在行首或词尾无缩进效果
行首或词尾通过菜单操作C > Indent Line or Region缓冲区提示menu-bar C Indent Line or Region但并无缩进操作
行首按Tab键包括缓冲区都无任何反应

感觉是下面的自定义失效了!!
(defun my-indent-or-complete ()
(interactive)
(if (looking-at "\\>")
(hippie-expand nil)
(indent-for-tab-command))
)
;;自定义自动补齐命令 如果在单词中间就补齐 否则就是tab

附件中的配置文件曾经一段时间即可补齐又可缩进,不记得从什么时候开始缩进就失效了,哎!

基本环境
WindowsXpSp2英文版
Emacs为Zip文件解压后直接使用,版本:emacs23.0.92.1 With cscope15.7
cedet-1.0pre6(将cedet-1.0pre6.tar.gz解压至site-lisp目录直接使用)启动记录

Loading d:/emacs/site-lisp/wb-line-number.el (source)...done
Loading d:/emacs/site-lisp/cedet-1.0pre6/common/cedet.el (source)...
Setting up CEDET packages...
Loading `dframe': old-style backquotes detected!
Setting up CEDET packages...done
Loading d:/emacs/site-lisp/cedet-1.0pre6/common/cedet.el (source)...done
Toggling tool-bar-mode off; better pass an explicit argument.


cedet-1.0pre4(将cedet-1.0pre4.tar.gz解压至site-lisp目录后在cygwin下make再使用)启动记录

Loading d:/emacs/site-lisp/wb-line-number.el (source)...done
Loading d:/emacs/site-lisp/cedet-1.0pre4/common/cedet.el (source)...
"d:/emacs/site-lisp/cedet-1.0pre4/common/" added to `load-path'
Setting up cedet...done
Setting up cogre...done
Setting up ede...done
Setting up eieio...done
Setting up semantic...done
Setting up speedbar...done
Setting up cedet-contrib...done
Loading d:/emacs/site-lisp/cedet-1.0pre4/common/cedet.el (source)...done
Toggling tool-bar-mode off; better pass an explicit argument.
此时,Tab键无法自动补齐,在词尾提示No context of type function to advance in

顺祝:工作顺利!天天开心!呵~

附件:配置文件_emacs
;;*********************************[版本]*********************************
;;emacs23.0.92.1 of 2009-04-06 file released with cscope15.7
;;This is GNU Emacs 23.0.92.1 (i386-mingw-nt5.1.2600) of 2009-04-06 on MSLK
;;Google "GNU Emacs MSLK" Download
;;Latest Win32 binary builds of Emacs CVS http://ntemacs.sf.net
;;www.gnu.org/software/emacs/
;;cscope.sourceforge.net



;;配置文件主要部分相互间隔3行/较复杂设定前后间隔1行/
;;含汉字注释的语句以;;注释/纯配置语句以;注释
;;*******************************[ ]*******************************
;;75列前后*各31个 且约定左对齐即确保前*31个 []内4汉字间距
;;----------------------- -----------------------
;;61列前后*各23个 且约定左对齐即确保前*23个 []内6汉字间距

;;*********************************[说明]*********************************
;;配置Emacs使用Elisp语言,Emacs附带非常详细的Elisp手册,通过M-x info得到
;;(setq variable-name value)设置变量值如(setq transient-mark-mode t)设置选定区域范围高亮
;;(require 'extension)安装一个扩展包
;;(load "file-name")使用一个.el文件,el表示emacs lisp
;;(global-set-key (kbd "C-c f") 'function-name)全局自定义键绑定
;;(define-key dired-mode (kbd "j") 'dired-next-line)局部键绑定,仅在dired-mode起作用
;;(if ...)简单的判断语句



;;********************************[初始化]********************************
(server-start);;启动emacsclient服务,然后用emacsclientw.exe打开文件就不用新开一个emacs了
(setq inhibit-startup-message t);;去掉启动欢迎界面

(setq default-major-mode 'text-mode);;可通过F1 - m 查看当前主模式的帮助
;;将默认的主模式major mode设置为文本模式text-mode而不是fundamental(基础的/基本的)-mode
;;针对不同类型的文本进入相应的编辑模式即主模式major mode
;;Emacs还能进一步定义次模式minor mode每一个缓冲区buffer只能关联于一种主模式却能同时关联多个次模式
;;比如,编写C语言的主模式可以同时定义多个次模式,每个次模式有着不同的缩进风格indent style

(load-file "D:/emacs/site-lisp/wb-line-number.el")
;;wb-line-number.el可以在窗口左侧分割出一个显示行号的小窗口
;;http://homepage1.nifty.com/blankspace/emacs/elisp.html

(require 'maxframe);;最大化Emacs窗口M-x maximize-frame即可 Tab自动完成restoreframe还原窗口

(require 'xcscope)
;;GNU Emacs默认自带cscope的支持!有几种Emacs插件都提供了Cscope接口,试用后最终选择了xcscope.el尽管它是为XEmacs开发的



;;*********************************[编程]*********************************
;;------------------------CC-mode配置-----------------------
;;http://cc-mode.sourceforge.net/
(require 'cc-mode)
(c-set-offset 'inline-open 0)
(c-set-offset 'friend '-)
(c-set-offset 'substatement-open 0)
;;-----------------------语言编辑策略-----------------------
(defun my-c-mode-common-hook()
(setq tab-width 4 indent-tabs-mode nil)
;;; hungry-delete and auto-newline
(c-toggle-auto-hungry-state 1)

;;------------------------预处理设置------------------------
(setq c-macro-shrink-window-flag t)
(setq c-macro-preprocessor "cpp")
(setq c-macro-cppflags " ")
(setq c-macro-prompt-flag t)
(setq hs-minor-mode t)
(setq abbrev-mode t)
)
(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)

;;-----------------------代码自动补齐-----------------------
;;自动补齐通常都是用hippie-expand 根据敲过的词和kill-ring等进行判断,并不对程序语法进行分析
;;安装semantic代码分析工具,然后将它加进hippie-expand的扩展策略里去
;;Semantic是CEDET-Collection of Emacs Development Environment Tools中的一个工具

;;(load-file "D:/emacs/site-lisp/cedet-1.0pre4/common/cedet.el")
;;cedet-1.0pre4.tar.gz解压至site-lisp目录后在cygwin下make再使用

(load-file "D:/emacs/site-lisp/cedet-1.0pre6/common/cedet.el")
;;cedet-1.0pre6.tar.gz解压至site-lisp目录后直接使用

;;cedet.sourceforge.net

(setq semanticdb-project-roots
(list
(expand-file-name "/")))
;;配置Semantic的检索范围

(defun my-indent-or-complete ()
(interactive)
(if (looking-at "\\>")
(hippie-expand nil)
(indent-for-tab-command))
)
;;自定义自动补齐命令 如果在单词中间就补齐 否则就是tab

(autoload 'senator-try-expand-semantic "senator")
(setq hippie-expand-try-functions-list
'(
senator-try-expand-semantic
try-expand-dabbrev
try-expand-dabbrev-visible
try-expand-dabbrev-all-buffers
try-expand-dabbrev-from-kill
try-expand-list
try-expand-list-all-buffers
try-expand-line
try-expand-line-all-buffers
try-complete-file-name-partially
try-complete-file-name
try-expand-whole-kill
)
)
;;hippie-expand扩展的自动补齐策略 优先调用senator的分析结果
;;自定义的hippie补全

;;按键定义
(define-key c-mode-base-map [(control \`)] 'hs-toggle-hiding)
(define-key c-mode-base-map [(return)] 'newline-and-indent)
(define-key c-mode-base-map [(f7)] 'compile)
(define-key c-mode-base-map [(meta \`)] 'c-indent-command)
;; (define-key c-mode-base-map [(tab)] 'hippie-expand)

;;------------------------??????????------------------------
(global-set-key [(control tab)] 'my-indent-or-complete)
(define-key c-mode-base-map [(tab)] 'my-indent-or-complete)
;;Tab及Ctrl+Tab自动补齐有效Using try-expand-line 但在行首或词尾无缩进效果
;;行首或词尾通过菜单操作C > Indent Line or Region缓冲区提示menu-bar C Indent Line or Region但并无缩进操作
;;行首按Tab键包括缓冲区都无任何反应(关键词第一次出现在词尾按Tab键则提示No expansion found正常)
;;采用Cygwin make过的cedet-1.0pre4:Tab键在行首无任何反应,Tab键无法自动补齐,在词尾提示No context of type function to advance in
;;[expansion扩展,context上下文,advance in]
;;调用自定义的hippie补全 快捷键Tab

;;------------------------??????????------------------------
(define-key c-mode-base-map [(meta ?/)] 'semantic-ia-complete-symbol-menu)
;;Alt + /提示Wrong type argument: (or eieio-object-p class-p), nil
;;
;;semantic命令semantic-ia-complete-symbol-menu会根据分析结果弹出补齐的菜单绑定Alt + /

;;代码自动补齐快捷键

;;----------------------C++语言编辑策略---------------------
;(defun my-c++-mode-hook()
; (setq tab-width 4 indent-tabs-mode nil)
; (c-set-style "stroustrup")
; (define-key c++-mode-map [f3] 'replace-regexp)
;;)



;;*********************************[显示]*********************************
(setq initial-frame-alist '((top . 0)(left . 103)))
;;初始化窗口位置top值越大距顶部越远
(setq default-frame-alist;;alist偏好
'(
;;(foreground-color . "Wheat") ;;注释这4句确保Blog截图效果
;;(background-color . "DarkSlateGray")
;;(pointerColor . "Orchid")
;;(cursor-color . "Orchid")
(bitmapIcon . "on")
(paneFont . "8x16")
(width . 90);;初始化窗口宽度
(height . 35);;初始化窗口高度,曾用值20
)
)
(tool-bar-mode nil);;去掉工具栏
(set-scroll-bar-mode nil) ;;no scroll bar, even in x-window system
(require 'wb-line-number)
(wb-line-number-enable);;或者注销此句仅在需要显示行号的buffer中M-x wb-line-number-toggle即可



;;*********************************[字体]*********************************
(setq w32-charset-info-alist
(cons '("gbk" w32-charset-gb2312.936) w32-charset-info-alist))
;;微软官方XP版雅黑字体、Consolas混合版
(set-default-font "YaHei Consolas Hybrid-11")
(set-fontset-font (frame-parameter nil 'font)
'han '("微软雅黑". "unicode-bmp"))
(set-fontset-font (frame-parameter nil 'font)
'cjk-misc '("微软雅黑" . "unicode-bmp"))
(set-fontset-font (frame-parameter nil 'font)
'bopomofo '("微软雅黑" . "unicode-bmp"))
(set-fontset-font (frame-parameter nil 'font)
'gb18030 '("微软雅黑". "unicode-bmp"))
(set-fontset-font (frame-parameter nil 'font)
'symbol '("微软雅黑". "unicode-bmp"))



;;*********************************[其它]*********************************
(column-number-mode t);;加速开启语法显示大文件的移动速度
(setq visible-bell t);;不要打入TAB时总是听到PC喇叭嘀嘀嘀的叫
(fset 'yes-or-no-p 'y-or-n-p);;不要总是没完没了的问yes or no, 为什么不能用 y/n
(setq-default make-backup-files nil);;编辑时不建立备份文件

(show-paren-mode t)
(setq show-paren-style 'parentheses)
;;括号匹配时显示另外一边的括号而不是烦人的跳到另一个括号

(global-font-lock-mode t);;全局语法加亮M-x global-font-lock-mode
;;title设置
(setq frame-title-format
'("GNU/Emacs - [ " (buffer-file-name "%f \]"
(dired-directory dired-directory "%b \]"))))
(mouse-avoidance-mode 'animate);;光标靠近鼠标的时候,让鼠标自动让开,别挡住视线
;; 自动存盘
(setq auto-save-mode t)
(setq track-eol t);;當光標在行尾上下移動的時候,始終保持在行尾
(setq scroll-margin 3 scroll-conservatively 10000);防止頁面滾動時跳動 scroll-margin 3 可以在靠近屏幕边沿3行时就开始滚动,可以很好的看到上下文



;;-------------------------光标设置-------------------------
(setq x-stretch-cursor nil);;如果设置为t,光标在TAB字符上会显示为一个大方块:)
(blink-cursor-mode -1);光标不要闪烁
(setq-default cursor-type 'bar);;光标显示为一竖线



;;*********************************[快键]*********************************
(global-set-key (kbd "C-SPC") 'nil);;注销与OS输入法切换冲突的快捷键
(global-set-key (kbd "M-<SPC>") 'set-mark-command);;标记快捷键
(global-set-key [C-f4] 'kill-this-buffer)
(global-set-key [M-f4] 'save-buffers-kill-emacs)
(global-set-key (kbd "C-M-m") 'buffer-menu);;M-x buffer-menu打开缓冲区并将光标切换过去,快键Ctrl-Alt-m
(global-set-key [(ctrl c) (meta c)] 'comment-or-uncomment-region) ;;C-c M-c区域注释或取消注释,如改为M-c则ctrl c改为meta c
(global-set-key "\M-p" 'insert-page-break);;分页符插入快键
;;-------outline minor mode默认快捷键前缀C-c @改为C-o-------
(setq outline-minor-mode-prefix (kbd "C-o"))
;;------Ctrl-x Ctrl-m或Ctrl-c Ctrl-m调用M-x使操作更高效-----
(global-set-key "\C-x\C-m" 'execute-extended-command)
(global-set-key "\C-c\C-m" 'execute-extended-command)
;;-----------------"C-l"字符定义为页面分页符----------------
(defun insert-page-break ()
(interactive "*")
(insert "\n\C-L\n")
)
(global-set-key "\C-h" 'backward-delete-char-untabify);;Ctrl-h删除前一字符,相当于Backspace;帮助改用F1键(相当原C-h)替代



;;*********************************[技巧]*********************************
;;-------------------------M-g跳到指定行--------------------
(global-set-key [(meta g)] 'goto-line)
(defun wy-go-to-char (n char)
"Move forward to Nth occurence of CHAR.
Typing `wy-go-to-char-key' again will move forwad to the next Nth
occurence of CHAR."
(interactive "p\ncGo to char: ")
(search-forward (string char) nil nil n)
(while (char-equal (read-char)
char)
(search-forward (string char) nil nil n))
(setq unread-command-events (list last-input-event)))
(define-key global-map (kbd "C-c a") 'wy-go-to-char)
;;-------------------------使用Win下的选择习惯--------------
(pc-selection-mode);;用shift+方向键进行选择

;;C-.记录当前位置,稍后可用C-,跳回来(使用过程中如感觉失效可先将下两句ska-point-to-register改为point-to-register,之后重启Emacs,观察C-.键后Minibuffer是否提示输入;然后将point-to-register恢复为ska-point-to-register,再试即可)
(global-set-key [(control ?\.)] 'ska-point-to-register)
(global-set-key [(control ?\,)] 'ska-jump-to-register)
(defun ska-point-to-register()
"Store cursorposition _fast_ in a register.
Use ska-jump-to-register to jump back to the stored
position."
(interactive)
(setq zmacs-region-stays t)
(point-to-register 8))
(defun ska-jump-to-register()
"Switches between current cursorposition and position
that was stored with ska-point-to-register."
(interactive)
(setq zmacs-region-stays t)
(let ((tmp (point-marker)))
(jump-to-register 8)
(set-register 8 tmp)))


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 请帮忙解决C/lah mode下缩进问题,谢谢咯~
帖子发表于 : 2009-08-11 9:41 

注册: 2009-02-24 19:39
帖子: 159
送出感谢: 0 次
接收感谢: 0 次
自己 debug 下你那个函数。
在函数体内,M-x edebug-defun,看看问题出在哪儿了。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 2 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 4 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译