• Linux下开发环境搭建---2. emacs篇


    本节主要参考:
        曹乐的《在Emacs下用C/C++编程》
        王纯业的《Emacs 一个强大的平台》
        emacswiki.org

    emcas难学易用,可扩展性强。有人把她当作信仰,有人认为他是魔鬼!学习首先记住基本的键盘快捷键,学会常用插件,深入学习还需学习lisp语言。本节紧对emacs作为开发环境做一个基本的介绍。

    基本安装设置请参考:Ubuntu Ubuntu 8.04 LTS 配置笔记
    emacs的基本安装设置完成后,使emacs成为C开发环境还需做如下设置,新建$HOME/.emacs文件
    vim $HOME/.emacs
    本文把emacs插件放在 $HOME/.emacs.d/site-lisp/ 目录下,如果在$HOME下没有找到.emacs.d目录,请手动建立
    在.emacs文件添加
    ;;LOAD_PATH
    (add
    -to-list 'load-path' "~/.emacs.d/site-lisp")

    Color theme
    在.emacs文件添加
    下载Color theme解压后放到$HOME/.emacs.d/site-lisp/ 目录下
    ;;COLOR_THEME
    (require 'color
    -theme)
    (color
    -theme-classic)
    显示行号
    http://ann77.stu.cdut.edu.cn/EmacsDisplayLineNumber.html下载,把里面的 display-line-number.el放到加载路径~/.emacs.d/site-lisp/目录下。
    在.emacs文件添加
    (require 'display-line-number)
    (setq display
    -line-number-format "%3d ")
    (add
    -hook 'c-mode-hook 'display-line-number-mode)
    (add
    -hook 'c++-mode-hook 'display-line-number-mode)
    参考:http://ann77.stu.cdut.edu.cn/EmacsDisplayLineNumber.html
    感觉ann77的这个的确比setnu.el好用
    session
    http://emacs-session.sourceforge.net/ 下载,把里面的 session.el 解压出来放到加载路径~/.emacs.d/site-lisp/目录下。
    在.emacs文件添加
    (require 'session)
    (add
    -hook 'after-init-hook 'session-initialize)
    (load 
    "desktop")
    (desktop
    -save-mode)

    阅读代码

    在emacs下读代码通常有一下几种工具,etags,ECB(emacs code browser),cscope,Xref。这几种工具也可以相互配合使用。其中:etags是emcas自带的标准插件,注意不是ctags。Xref 是的Xrefactory的免费版本,非GNU,支持C和java的跳转,自动补全插等功能,比cedet+ECB组合速度要快,用起来也很简单,回答几 个问题新建一个project,然后几个快捷键就可以满足需要了,美中不足的是对C++支持是收费,且狂贵,这个小东西要400刀,也没找到破解的版本, 写C++代码的时候还得用CEDET+ECB。

    安装 cscope
    sudo apt-get install cscope
    找到xcscope.el文件 cp到 ~/.emacs.d/site-lisp/
    在.emacs文件添加
    (require 'xcscope)
    cscope的主要功能和对应的快捷键:
    ;; C-c s a             设定初始化的目录,一般是你代码的根目录
    ;; C-s s I             对目录中的相关文件建立列表并进行索引
    ;; C-c s s             序找符号
    ;; C-c s g             寻找全局的定义
    ;; C-c s c             看看指定函数被哪些函数所调用
    ;; C-c s C             看看指定函数调用了哪些函数
    ;; C-c s e             寻找正则表达式
    ;; C-c s f             寻找文件
    ;; C-c s i             看看指定的文件被哪些文件include)

    安装CEDET
    http://cedet.sourceforge.net/下载cedet,解压到~/.emacs.d/site-lisp/在cedet目录下运行make。以下载到的cedet-1.0pre4.tar.gz为例
    cp cedet-1.0pre4.tar.gz ~/.emacs.d/site-lisp/
    cd 
    ~/.emacs.d/site-lisp/
    tar xvzf cedet
    -1.0pre4.tar.gz
    cd cedet
    -1.0pre4
    make
    详情请参考INSTALL文档
    在.emacs文件添加
    (add-hook 'texinfo-mode-hook (lambda () (require 'sb-texinfo)))
         (load
    -file "~/.emacs.d/site-lisp/cedet-1.0pre4/common/cedet.el")
         (semantic
    -load-enable-code-helpers)
         (autoload 'speedbar
    -frame-mode "speedbar" "Popup a speedbar frame" t)
         (autoload 'speedbar
    -get-focus "speedbar" "Jump to speedbar frame" t)
         (define
    -key-after (lookup-key global-map [menu-bar tools])
                    [speedbar]
                    '(
    "Speedbar" .
                    speedbar
    -frame-mode)
                    [calendar])
    安装ECB
    http://ecb.sourceforge.net/ 下载ECB,解压到~/.emacs.d/site-lisp/ 即可
    在.emacs文件添加
    (add-to-list 'load-path "~/.emacs.d/site-lisp/ecb-2.32")
    (load
    -file "~/.emacs.d/site-lisp/ecb-2.32/ecb.el")
    (require 'ecb)
    (setq ecb
    -auto-activate t
              ecb
    -tip-of-the-day nil
              ecb
    -tree-indent 4
              ecb
    -windows-height 0.5
              ecb
    -windows-width 0.20)
              ecb
    -auto-compatibility-check nil
              ecb
    -version-check nil
              inhibit
    -startup-message t
    重启Emacs
    在emacs执行M-x ecb-byte-complie编译,可以加快ECB运行速度
    M-x ecb-show-help看在线帮助
    M-x customize-option RET ecb-source-path RET设置源码目录

    ECB默认是不支持鼠标响应的,需作如下设置:
    打开emacs中的菜单 ECB->Preferences->Most important...,
    找到Ecb Primary Secondary Mouse Buttons:并点击Show Value,
    选择第三个选项:Primary:mouse-1,secondary:mouse-2
    保存选项为以后所用

    设置自动补全
    在.emacs文件添加
    ;;;;C/C++语言启动时自动加载semantic对/usr/include的索引数据库
    (setq semanticdb
    -search-system-databases t)
      (add
    -hook 'c-mode-common-hook
              (lambda ()
                (setq semanticdb
    -project-system-databases
                      (list (semanticdb
    -create-database
                               semanticdb
    -new-database-class
                               
    "/usr/include")))))

    ;; project root path
    (setq semanticdb
    -project-roots
              (list
            (expand
    -file-name "/")))
    ;; 避免semantic占用CPU过多
    (setq
    -default semantic-idle-scheduler-idle-time 432000)

    (defun my
    -indent-or-complete ()
       (interactive)
       (
    if (looking-at """>")
              (hippie
    -expand nil)
              (indent
    -for-tab-command)))
    (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
            )
    )
    ;;快捷键
    在.emacs文件添加
    (global-set-key [M-/] 'hippie-expand)
    ;;右Ctrl
    +" 自动补全menu
    (global
    -set-key ""C-""" 'semantic-ia-complete-symbol-menu)
    ;; 跳转到全局定义
    (global
    -set-key ""C-xg" 'cscope-find-global-definition-no-prompting)
    安装Xref
    http://xref-tech.com/xrefactory/downloads/下载1.X.X linux版本(1.X.X为免费版,2.X.X为收费版)。解压后放到~/.emacs.d/site-lisp/目录下。以下载的xref-1.6.10-i86pcLinux.tar.gz为例
    cp xref-1.6.10-i86pcLinux.tar.gz ~/.emacs.d/site-lisp/
    cd 
    ~/.emacs.d/site-lisp/xref
    sh .
    /xrefsetup
    .........
    请参考INSTALL文档
    安装程序在.emacs文件上追加了
    ;; Xrefactory configuration part ;;
    ;; some Xrefactory defaults can be set here
    (defvar xref
    -current-project nil) ;; can be also "my_project_name"
    (defvar xref
    -key-binding 'global) ;; can be also 'local or 'none
    (setq load
    -path (cons "/home/uiu/.emacs.d/site-lisp/xref/emacs" load-path))
    (setq exec
    -path (cons "/home/uiu/.emacs.d/site-lisp/xref" exec-path))
    (load 
    "xrefactory")
    ;; end of Xrefactory configuration part ;;
    (message 
    "xrefactory loaded")
    为使上次建立的project仍有效,需将
    (defvar xref-current-project nil) ;; can be also "my_project_name"
    改为
    (defvar xref-current-project t) ;; can be also "my_project_name"
    ;; c-mode设置
    在.emacs文件添加
    ;; c-mode公共设置
    (defun my
    -c-mode-common-hook ()
      (setq 
    default-tab-width 4)
      (setq tab
    -width 4)
      (setq c
    -basic-offset 4)
      (hs
    -minor-mode t))
    (add
    -hook 'c-mode-common-hook 'my-c-mode-common-hook)

    ;; C语言设置
    (defun my
    -c-mode-hook ()
      (c
    -set-style "cc-mode"))
    (add
    -hook 'c-mode-hook 'my-c-mode-hook)

    ;; C
    ++设置
    (defun my
    -c++-mode-hook ()
      (c
    -set-style "stroustrup"))
    (add
    -hook 'c++-mode-hook 'my-c++-mode-hook)
    输入左边的括号,就会自动补全右边的部分.包括(), "", [] , {} , 等
    在.emacs文件添加
    (defun my-c-mode-auto-pair ()
      (interactive)
      (make
    -local-variable 'skeleton-pair-alist)
      (setq skeleton
    -pair-alist  '(
        (
    ??` _ "''")
        (
    ?"( ?  _ " )")
        (
    ?"[ ?  _ " ]")
        (
    ?{ "n > _ "n ?>)))
      (setq skeleton
    -pair t)
      (local
    -set-key (kbd "(") 'skeleton-pair-insert-maybe)
      (local
    -set-key (kbd "{") 'skeleton-pair-insert-maybe)
      (local
    -set-key (kbd "`") 'skeleton-pair-insert-maybe)
      (local
    -set-key (kbd "[") 'skeleton-pair-insert-maybe))
    (add
    -hook 'c-mode-hook 'my-c-mode-auto-pair)
    (add
    -hook 'c++-mode-hook 'my-c-mode-auto-pair)

    我的.emacs相关的配置,仅供参考
    ;;LOAD_PATH
    (add
    -to-list 'load-path' "~/.emacs.d/site-lisp")
    ;
    =========================================END==============================================;


    ;;COLOR_THEME
    (require 'color
    -theme)
    (color
    -theme-classic) 
    ;
    =========================================END==============================================;


    ;;LANG
    (set
    -language-environment 'Chinese-GB)
    (set
    -keyboard-coding-system 'utf-8)
    (set
    -clipboard-coding-system 'utf-8)
    (set
    -terminal-coding-system 'utf-8)
    (set
    -buffer-file-coding-system 'utf-8)
    (set
    -default-coding-systems 'utf-8)
    (set
    -selection-coding-system 'utf-8)
    (modify
    -coding-system-alist 'process "*" 'utf-8)
    (setq 
    default-process-coding-system '(utf-8 . utf-8))
    (setq
    -default pathname-coding-system 'utf-8)
    (set
    -file-name-coding-system 'utf-8)
    (setq ansi
    -color-for-comint-mode t) ;;处理shell-mode乱码,好像没作用
    ;
    =========================================END==============================================;

    ;;MY CUSTOMIZE
    (auto
    -image-file-mode t);打开图片显示功能
    (display
    -time-mode 1);显示时间,格式如下
    (setq display
    -time-24hr-format t)
    (setq display
    -time-day-and-date t)
    (transient
    -mark-mode t);允许临时设置标记
    (setq frame
    -title-format '("" buffer-file-name "@emacs" ));在标题栏显示buffer名称
    (setq 
    default-fill-column 80);默认显示 80列就换行 
    (set
    -scroll-bar-mode nil)  ; 取消滚动栏
    ;;(tool
    -bar-mode nil)        ; 取消工具栏
    (setq 
    default-directory "~/")     ; 设置打开文件的缺省路径
    (ido
    -mode t)             ; 打开ido,使打开文件时后面有提示,在emacs23带有ido
    (setq visible
    -bell t)          ; 关闭烦人的出错时的提示声
    (setq inhibit
    -startup-message t) ; 关闭emacs启动时的画面
    (setq gnus
    -inhibit-startup-message t) ; 关闭gnus启动时的画面
    (fset 'yes
    -or-no-p 'y-or-n-p)    ; 按 y 或空格键表示 yes,n 表示 no
    (setq mouse
    -yank-at-point t)    ; 不在鼠标点击的那个地方插入剪贴板内容
    (setq kill
    -ring-max 200)    ; 设置粘贴缓冲条目数量
    (setq auto
    -save-mode nil)    ; 自动保存模式
    (setq x
    -select-enable-clipboard t) ; 允许emacs和外部其他程序的粘贴
    (setq user
    -full-name "XXXXXX")
    (setq user
    -mail-address "XXXXXX@gmail.com")    ; 设置有用的个人信息,这在很多地方有用。
    (setq global
    -font-lock-mode t)    ; 进行语法加亮。
    (setq
    -default kill-whole-line t) ; 在行首 C-k 时,同时删除该行
    (setq show
    -paren-mode t) ;打开括号匹配显示模式
    (setq show
    -paren-style 'parenthesis) ;括号匹配时可以高亮显示另外一边的括号,但光标不会烦人的跳到另一个括号处。
    (setq mouse
    -avoidance-mode 'animate) ;光标靠近鼠标指针时,让鼠标指针自动让开,别挡住视线。
    (setq auto
    -image-file-mode t) ;让 Emacs 可以直接打开和显示图片
    (setq 
    default-major-mode 'text-mode)
    ; (add
    -hook 'text-mode-hook 'turn-on-auto-fill) ; 设置缺省主模式是text,,并进入auto-fill次模式.而不是基本模式fundamental-mode
    (setq
    -default auto-fill-function 'do-auto-fill) ; Autofill in all modes;;

    ;(setq
    -default indent-tabs-mode nil)
    ;(setq 
    default-tab-width 8)
    ;(setq tab
    -stop-list ())
    ;;不用 TAB 字符来indent, 这会引起很多奇怪的错误。编辑 Makefile 的时候也不用担心,因为 makefile
    -mode 会把 TAB 键设置成真正的 TAB 字符,并且加亮显示的。注:还没搞清楚
    (setq column
    -number-mode t)
    (setq line
    -number-mode t) ; 显示行号
    (setq display
    -time-24hr-format t)
    (setq display
    -time-day-and-date t)
    (display
    -time) ; 显示时间
    (setq sentence
    -end """([。!?]""|……""|[.?!][]""')}]*""($""|[ "t]"")"")[ "t"n]*")
    (setq sentence-end-double-space nil)     ; 设置 sentence-end 可以识别中文标点。不用在 fill 时在句号后插入两个空格。
    (setq enable-recursive-minibuffers t)     ; 可以递归的使用 minibuffer
    (setq scroll-margin 3  scroll-conservatively 10000) 
    ;;防止页面滚动时跳动, scroll-margin 3 可以在靠近屏幕边沿3行时就开始滚动,可以很好的看到上下文。
    (setq track-eol t)    ; 当光标在行尾上下移动的时候,始终保持在行尾。
    (setq Man-notify-method 'pushy) ; 当浏览 man page 时,直接跳转到 man buffer。
    (setq next-line-add-newlines nil)    ; Emacs 21 中已经是缺省设置。按 C-n 或向下键时不添加新行。
    (setq speedbar-show-unknown-files t);;可以显示所有目录以及文件
    (setq dframe-update-speed nil);;不自动刷新,手动 g 刷新
    (setq speedbar-update-flag nil)
    (setq speedbar-use-images nil);;不使用 image 的方式
    (setq speedbar-verbosity-level 0)
    (setq time-stamp-active t)
    (setq time-stamp-warn-inactive t)
    (setq time-stamp-format 
    "%:y-%02m-%02d %3a %02H:%02M:%02S chunyu") ; 设置时间戳,标识出最后一次保存文件的时间。
    (setq dired-recursive-copies 'top)
    (setq dired-recursive-deletes 'top) ;让 dired 可以递归的拷贝和删除目录。
    ;=========================================END==============================================;


    ;;xcscope
    (require 'xcscope)
    ;; C-c s a             设定初始化的目录,一般是你代码的根目录
    ;; C-s s I             对目录中的相关文件建立列表并进行索引
    ;; C-c s s             序找符号
    ;; C-c s g             寻找全局的定义
    ;; C-c s c             看看指定函数被哪些函数所调用
    ;; C-c s C             看看指定函数调用了哪些函数
    ;; C-c s e             寻找正则表达式
    ;; C-c s f             寻找文件
    ;; C-c s i             看看指定的文件被哪些文件include
    ;=========================================END==============================================;

    ;;文件头header设置
    (require 'header2)
    ;;(require 'header)
    (setq make-header-hooks '(header-mode-line
                                header-blank
                                header-file-name
                                header-blank
                                header-copyright
                                header-blank
                                header-author
                                header-creation-date
                                header-modification-author
                                header-modification-date
                                header-update-count
                                header-blank
                                header-history
                                header-blank
                                ))
    (setq header-copyright-notice 
    "  XXXXXXX" )
    (make-local-variable 'user-full-name)
    (make-local-variable 'user-mail-address)
    ;=========================================END==============================================;



    ;;setnu
    ;(add-hook 'c-mode-common-hook '(lambda()  (require 'setnu+)  ) ) ;;设置C/C++mode显示行号
    ;(add-hook 'c++-mode-common-hook '(lambda()  (require 'setnu+)  ) )

    ;; 加载显示行号模块
    (require 'display-line-number)
    ;;(add-hook 'c-mode-common-hook '(lambda()  (require 'display-line-number)  ) )
    ;; 如果想所有打开的文件都显示行的话就打开下面的注释
    ;;(global-display-line-number-mode 1)
    ;; 设置显示格式
    (setq display-line-number-format 
    "%3d ")
    ;; 在 tool bar 上增加一个图标,
    ;; 注意: 一定要在 load-path 中 可以找到 display-line-nuber.xpm 文件才行。
    ;;
    ;;(tool-bar-add-item 
    "display-line-number"
    ;;                   'display-line-number-mode
    ;;                   'display-line-number-mode
    ;;                  :help 
    "display line number!"
    ;;                   :button (cons :toggle  '(and (boundp
    ;;                                                 display-line-number-mode)
    ;;                                                display-line-number-mode)))
    ;;
    ;; 使用方法
    ;; M-x display-line-number-mode
    ;; 用来 toggle 显示行号的模式
    ;; M-x display-line-number-mode-on
    ;; 启动显示行号的模式
    ;; M-x display-line-number-mode-off
    ;; 关闭显示行号的模式
    ;; 仅对某种 mode 启动显示行号的模式
    ;; (add-hook 'c-mode-hook 'display-line-number-mode)
    (add-hook 'c-mode-hook 'display-line-number-mode)
    (add-hook 'c++-mode-hook 'display-line-number-mode)
    ;=========================================END==============================================;

    ;;tabbar
    (require 'tabbar)
    (tabbar-mode)
    ;=========================================END==============================================;

    ;加入会话功能
    (require 'session)
    (add-hook 'after-init-hook 'session-initialize)
    (load 
    "desktop")
    (desktop-save-mode) 
    ;=========================================END==============================================;

    ;; 启用redo
    (require 'redo)
    ;=========================================END==============================================;

    ;;cedet ecb安装
    (add-hook 'texinfo-mode-hook (lambda () (require 'sb-texinfo)))
         (load-file 
    "~/.emacs.d/site-lisp/cedet-1.0pre4/common/cedet.el")
         (semantic-load-enable-code-helpers)
         (autoload 'speedbar-frame-mode 
    "speedbar" "Popup a speedbar frame" t)
         (autoload 'speedbar-get-focus 
    "speedbar" "Jump to speedbar frame" t)
         (define-key-after (lookup-key global-map [menu-bar tools])
                    [speedbar]
                    '(
    "Speedbar" .
                    speedbar-frame-mode)
                    [calendar])

    ;; 指定semantic临时文件的路径,避免到处都是临时文件
    (setq semanticdb-default-save-directory 
    "~/backups/emacs/semantic")

    ;;;;C/C++语言启动时自动加载semantic对/usr/include的索引数据库
    (setq semanticdb-search-system-databases t)
      (add-hook 'c-mode-common-hook
              (lambda ()
                (setq semanticdb-project-system-databases
                      (list (semanticdb-create-database
                               semanticdb-new-database-class
                               
    "/usr/include")))))

    ;; project root path
    (setq semanticdb-project-roots
              (list
            (expand-file-name 
    "/")))
    ;; 避免semantic占用CPU过多
    (setq-default semantic-idle-scheduler-idle-time 432000)

    ;;ecb
    (add-to-list 'load-path 
    "~/.emacs.d/site-lisp/ecb-2.32")
    (load-file 
    "~/.emacs.d/site-lisp/ecb-2.32/ecb.el")
    (require 'ecb)
    (setq ecb-auto-activate nil
              ecb-tip-of-the-day nil
              ecb-tree-indent 4
              ecb-windows-height 0.5
              ecb-windows-width 0.13)
              ecb-auto-compatibility-check nil
              ecb-version-check nil
              inhibit-startup-message t
    ;;重启Emacs
    ;;运行M-x ecb-byte-complie编译,可以加快运行速度
    ;;M-x ecb-show-help看在线帮助
    ;;M-x customize-option RET ecb-source-path RET设置源码目录

    ;;设置自动补全
    (defun my-indent-or-complete ()
       (interactive)
       (if (looking-at 
    """>")
              (hippie-expand nil)
              (indent-for-tab-command)))
    (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
            )
    )
    ;=========================================END==============================================;


    ;; c-mode设置
    ;; c-mode公共设置
    (defun my-c-mode-common-hook ()
      (setq default-tab-width 4)
      (setq tab-width 4)
      (setq c-basic-offset 4)
      (hs-minor-mode t))
    (add-hook 'c-mode-common-hook 'my-c-mode-common-hook)

    (load-library 
    "hideshow")
    (add-hook 'c-mode-hook 'hs-minor-mode)
    (add-hook 'c++-mode-hook 'hs-minor-mode)
    (add-hook 'java-mode-hook 'hs-minor-mode)
    (add-hook 'perl-mode-hook 'hs-minor-mode)
    (add-hook 'php-mode-hook 'hs-minor-mode)
    (add-hook 'emacs-lisp-mode-hook 'hs-minor-mode)
    ;;能把一个代码块缩起来,需要的时候再展开
    ;;  M-x              hs-minor-mode
    ;;  C-c @ ESC C-s    show all
    ;;  C-c @ ESC C-h    hide all
    ;;  C-c @ C-s        show block
    ;;  C-c @ C-h        hide block
    ;;  C-c @ C-c toggle hide/show

    ;; C语言设置
    (defun my-c-mode-hook ()
      (c-set-style 
    "cc-mode"))
    (add-hook 'c-mode-hook 'my-c-mode-hook)

    ;; C++设置
    (defun my-c++-mode-hook ()
      (c-set-style 
    "stroustrup"))
    (add-hook 'c++-mode-hook 'my-c++-mode-hook)

    ;=========================================END==============================================;

    (defun my-c-mode-auto-pair ()
      (interactive)
      (make-local-variable 'skeleton-pair-alist)
      (setq skeleton-pair-alist  '(
        (?` ?` _ 
    "''")
        (?"( ?  _ 
    " )")
        (?"[ ?  _ 
    " ]")
        (?{ "n > _ "n ?} >)))
      (setq skeleton-pair t)
      (local-set-key (kbd 
    "(") 'skeleton-pair-insert-maybe)
      (local-set-key (kbd 
    "{") 'skeleton-pair-insert-maybe)
      (local-set-key (kbd 
    "`") 'skeleton-pair-insert-maybe)
      (local-set-key (kbd 
    "[") 'skeleton-pair-insert-maybe))
    (add-hook 'c-mode-hook 'my-c-mode-auto-pair)
    (add-hook 'c++-mode-hook 'my-c-mode-auto-pair)
    ;;输入左边的括号,就会自动补全右边的部分.包括(), 
    "", [] , {} , 等等。
    ;=========================================END==============================================;


    ;;bakup
    (setq auto-save-default nil)    ;不生成 #filename# 文件
    (setq make-backup-files t)    ;设定不产生备份文件
    (setq auto-save-mode nil)    ;自动保存模式
    ;;(setq-default make-backup-files t)    ; 不生成临时文件
    (setq   delete-old-versions   t)
    (setq version-control 'never)    ; 启用版本控制,即可以备份多次
    (setq kept-old-versions 2)    ; 备份最原始的版本两次,及第一次编辑前的文档,和第二次编辑前的文档
    (setq kept-new-versions 1)    ; 备份最新的版本1次,理解同上
    (setq delete-old-versions t)    ;删掉不属于以上3中版本的版本
    (setq backup-directory-alist '((
    " " . "~/backups/emacs/")))    ; 设置备份文件的路径
    (setq backup-by-copying t)    ;备份设置方法,直接拷贝
       
    ;; Emacs 中,改变文件时,默认都会产生备份文件(以 ~ 结尾的文件)。可以完全去掉
    ;; (并不可取),也可以制定备份的方式。这里采用的是,把所有的文件备份都放在一
    ;; 个固定的地方(
    "~/backups")。对于每个备份文件,保留最原始的两个版本和最新的
    ;; 1个版本。并且备份的时候,备份文件是复本,而不是原件。
    ;=========================================END==============================================;


    ;;HOT KEY
    ;;保留F3、F4、F5、F6、F7、F8 for Xrefactory
    (global-set-key [f1] 'shell)                              ; 进入shell
    (global-set-key [C-f9] 'gdb)                              ; 调试
    (setq compile-command 
    "make -f Makefile")                 ; 编译
    (global-set-key [f9] 'do-compile)
    (global-set-key [f10] 'speedbar)                          ; 启动/关闭speedbar

    (global-set-key (kbd 
    "M-"[") 'hs-hide-block)              ; 隐藏块
    (global-set-key (kbd 
    "M-"]") 'hs-show-block)              ; 显示块
    (global-set-key [C-f12] 'comment-or-uncomment-region)     ; 注释 / 取消注释
    (global-set-key [f12] 'c-indent-line-or-region)           ; 格式化代码

    (global-set-key (kbd 
    "C-`") 'ecb-goto-window-sources)     ; 切换到ecb sources窗口
    (global-set-key [C-tab] 'other-window)                    ; 切换窗口
    (global-set-key [M-return] 'delete-other-windows)         ; 关闭其他窗口
    (global-set-key 
    ""C-xk" 'kill-this-buffer)                ; 关闭当前buffer
    (global-set-key (kbd 
    "s-SPC") 'set-mark-command)          ; 改变set mark键

    ;; 显示buffer列表
    (global-set-key (kbd 
    "C-x C-b") 'ibuffer)

    ;; 跳转到当前目录的Dired
    (global-set-key 
    ""C-x"C-j" 'dired-jump)

    ;; 跳转到寄存器指定的位置
    (global-set-key 
    ""C-xj" 'jump-to-register)

    ;; 跳转到全局定义
    (global-set-key 
    ""C-xg" 'cscope-find-global-definition-no-prompting) 

    (global-set-key (kbd 
    "S-<SPC>") 'set-mark-command) ;用shift+space 来 setmark 了, C-@ 很不好按。

    (global-set-key [C-=] 'my-indent-or-complete)     ;自动补全或缩进
    (global-set-key ["C-f12] 'ecb-activate)         ;启用ECB
    (global-set-key ["C-S-f12] 'ecb-deactivate)     ;退出ECB
    ;; 补全命令 右Ctrl+" 自动补全menu
    (global-set-key [M-/] 'hippie-expand)
    ;;(global-set-key [(control return)] 'senator-complete-symbol);
    ;;(global-set-key [(control return)] ' senator-completion-menu-popup)
    (global-set-key 
    ""C-""" 'semantic-ia-complete-symbol-menu)
    ;;tabbar
    (global-set-key (kbd 
    "S-<up>") 'tabbar-backward-group)
    (global-set-key (kbd 
    "S-<down>") 'tabbar-forward-group)
    (global-set-key (kbd 
    "S-<left>") 'tabbar-backward)
    (global-set-key (kbd 
    "S-<right>") 'tabbar-forward)
    (global-set-key ( kbd 
    "C-.") 'redo) 
    ;=========================================END==============================================;


    (custom-set-variables
      ;; custom-set-variables was added by Custom.
      ;; If you edit it by hand, you could mess it up, so be careful.
      ;; Your init file should contain only one such instance.
      ;; If there is more than one, they won't work right.
     '(ecb-options-version 
    "2.32")
     '(ecb-primary-secondary-mouse-buttons (quote mouse-1--mouse-2)))
    (custom-set-faces
      ;; custom-set-faces was added by Custom.
      ;; If you edit it by hand, you could mess it up, so be careful.
      ;; Your init file should contain only one such instance.
      ;; If there is more than one, they won't work right.
     )
    ;=========================================END==============================================;


    ;; Xrefactory configuration part ;;
    ;; some Xrefactory defaults can be set here
    (defvar xref-current-project t) ;; can be also 
    "my_project_name"
    ;;注:这里的nil改为了t
    (defvar xref-key-binding 'global) ;; can be also 'local or 'none
    (setq load-path (cons 
    "/home/uiu/.emacs.d/site-lisp/xref/emacs" load-path))
    (setq exec-path (cons 
    "/home/uiu/.emacs.d/site-lisp/xref" exec-path))
    (load 
    "xrefactory")
    ;; end of Xrefactory configuration part ;;
    (message 
    "xrefactory loaded")
    ;=========================================END==============================================;
  • 相关阅读:
    异常处理机制中的return关键字
    QuickHit 项目
    kali2.0升级
    sslscan
    RC4弱密码套件检测
    CVE-2017-11882漏洞复现
    应急响应小总结
    服务器日志分析
    《x86汇编语言:从实模式到保护模式 》学习笔记之:第一次编写汇编语言
    nasm不是内部或外部命令
  • 原文地址:https://www.cnblogs.com/Henrya2/p/1395612.html
Copyright © 2020-2023  润新知