emacs 使用集锦

emacs 使用集锦

声明, 主要在c/c++环境中使用!
----------------------------------------
1. emacs 中 TAGS 位置设置
----------------------------------------
a)临时使用方式:
M-x visit-tags-table

b)启动Emacs时自动加载方式:
在~/.emacs文件中加入一行,设置tags-file-name变量
(setq tags-file-name "path/TAGS")
如果要一次查找多个TAGS文件,可以设置tags-table-list变量
(setq tags-table-list '("path1/TAGS" "path2/TAGS" "path3/TAGS"))
另外,对于较大又不是经常使用的TAGS,尽量放到该list的后面,避免不必要的打开

----------------------------------------
2. emacs 中缩进的设置
----------------------------------------
emacs 中 c/c++代码缩进总是不尽人意,
这是我用的方式,跟vim 中的一致了,也是我中意的格式

;; 设置c/c++的排版方式
(add-hook `c-mode-common-hook `(lambda()
                            (c-set-style "linux")
                            (setq c-basic-offset 4)
                            (setq tab-width 4)
                            (hs-minor-mode t)
                            (modify-syntax-entry ?_ "w")
                            (linum-mode t)))
注释: 用的是linux 格式,但要重新设置偏移量,tab宽度才能满足要求
顺便再设上hs模式(隐藏显示模式),linum-mode(显示行号模式),并把下划杠当字符,这样会调整影响选词及跳转等功能.

emacs:  c模式缩进设置

默认设置,可通过C-h v c-default-style 查看,是gnu 模式
gnu模式不尽人意,它的基本偏移是2,大括号下有缩进
我需要tab 偏移为4, if,else,while 等大括号下要对齐的格式.
在初始化时加如下代码即可.
(add-hook 'c-mode-common-hook
          (lambda ()
            (setq c-basic-offset 4)
        (c-set-offset 'substatement-open 0)))

C-h v c-style-alist 可查看内置的style, 通过c-set-style 命令可以设置,
但其设置都还赶不上上面的配置好. 即在gnu格式上调整两个参数。

----------------------------------------
3. 让emacs 滚动屏幕上的代码
----------------------------------------
(global-set-key (kbd "M-<up>") (lambda () (interactive) (scroll-up 1)))
(global-set-key (kbd "M-<down>") (lambda () (interactive) (scroll-down 1)))
注意up,down 的写法,因为M 要求后面只能跟一个字符.  其实映射成M-n, M-p 更好,使用更方便,

----------------------------------------
4. 优化rgrep 功能
----------------------------------------
rgrep 需要我们输入分词及目录, 虽然它能够取到光标下的词做默认,取当前目录为默认目录,但我们还是要敲2次回车确认,
而且它默认搜索的文件类型也不尽满意,经常需要改为*.h *.cpp 以搜索.h, .cpp 结尾的文件.
怎样才能不要输入这2个确认呢? 终于找到了方法,如下:

;; 客户化rgrep
(defun my-rgrep()
  "call rgrep with default directory in c++ and h files"
    (interactive)
    (grep-compute-defaults)
    (rgrep (grep-read-regexp) "*.[ch]*" default-directory))
;; 添加快捷键
(global-set-key (kbd "C-c r") 'my-rgrep)
从此不再需要指明搜索词,搜索的文件类型和搜索的起始目录了,甚爽! 负担小了很多!

------------------------------------------------------------------------------
5. 安装noccur 插件及iedit 插件,从此重构代码就简单了.(project 多文件重构)
   安装loccur 插件, 可以立即看到本文件中对符号的使用情况,结合iedit可重构本文件
------------------------------------------------------------------------------

occur 模式真的是一种创新,它保留了grep 的那种映射关系,还能够编辑occur 缓冲的内容,

就等于直接编辑了原代码位置处内容,可以说是带编辑功能的grep模式. 是我首次在emacs中看到的.

而iedit 实际上是一种多点编辑模式,同时对多处文本进行编辑. 结合occur 会让你想到什么? 把大三角形映射到小三角形,并在小三角形中进行可视编辑.

occur 用e 键进入编辑模式,而不要用Ctrl-x Ctrl-q来退出只读模式, 退出只能仍然没有进入编辑模式.

noccur 也需要重构以简化使用,查看其调用方式,可仿照rgrep 来简化
(defun my-occur()
  "call noccur with simp-project-root returned directory"
  (interactive)
  (setq default-directory (simp-project-root))
  (setq grep-word (concat "\\<" (grep-read-regexp) "\\>"))
  (noccur-project grep-word 0 default-directory))
;; 添加快捷键
(global-set-key (kbd "C-c o") 'my-occur)

这样,与loccur 的快捷键 C-o 还是很搭配的!

------------------------------------------------------------------------------

6. 拷贝缓冲区文件信息到剪切版,交互式,

    可copy 路径,目录和文件名

------------------------------------------------------------------------------

(defun my-copy-buffer-file-name(choice)
  "Copy the buffer-file-name to the kill-ring"
  (interactive "cCopy Buffer Name (F) Full, (D) Directory, (N) Name")
  (let ((new-kill-string)
        (name (if (eq major-mode 'dired-mode)
                  (dired-get-filename)
                (or (buffer-file-name) ""))))
    (cond ((eq choice ?f)
           (setq new-kill-string name))
          ((eq choice ?d)
           (setq new-kill-string (file-name-directory name)))
          ((eq choice ?n)
           (setq new-kill-string (file-name-nondirectory name)))
          (t (message "Quit")))
    (when new-kill-string
      (message "%s copied" new-kill-string)
      (kill-new new-kill-string))))
(global-set-key (kbd "C-c b") 'my-copy-buffer-file-name)

------------------------------------------------------------------------------

7.  将文件路径设置到标题栏

------------------------------------------------------------------------------

(setq frame-title-format '("%b - %f"))

%b 是缓冲名

%f 是文件全路经名

最简单的格式,@-@, 够我用了!

更完善的功能如下:

;; default-directory 表示当前目录
;; abbreviate-file-name 将其转化为缩略的形式(例如"/home/user/path/"变为"~/path/"),
;; directory-file-name 去掉最后的斜杠
;; buffer-file-name 代表缓冲区对应了一个磁盘文件,该变量为假代表缓存不存在对应文件
;; buffer-name 返回缓冲的名字
;; concat 完成字符串连接
;; eval 评估一个表达式, 这样把后面表达式的值付给窗口标题格式
(setq frame-title-format
      '(:eval(concat
              (if (and buffer-file-name (buffer-modified-p)) "•")
              (buffer-name)
              (if buffer-file-name
                  (concat " (" (directory-file-name (abbreviate-file-name default-directory)) ")")))))

------------------------------------------------------------------------------

8. Emacs 文本折叠:

------------------------------------------------------------------------------
Emacs 有一种折叠的方式叫做 selective-display ,它单纯根据每行的缩进折叠
例如读man bash
需要折叠可用 C-u C-x $, 这样设定了代码的缩进列数为4
折叠起来,就一下子看到了它的目录结构!

------------------------------------------------------------------------------

9. Emacs 头文件与cpp文件的相互跳转

------------------------------------------------------------------------------

这是内置的功能。定义在find-file.el中, 使用方法:

M-x ff-find-other-file

M-x ff-find-other-file-other-window

emacs 总是有让人意外的惊喜!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值