另一种安装helm-gtags的方法,以及helm的键位绑定和一些小技巧

1.首先备份自己的~/.emacs.d

2.安装helm-gtags

git clone https://github.com/tuhdo/emacs-c-ide-demo ~/.emacs.d

3.修改~/.emacs.d/init.el添加行号显示和光标所在行有下划线

;;行番号表示 
(global-linum-mode t)
;;下划线
(setq hl-line-face 'underline)
(global-hl-line-mode) 

4.给helm-gtags定义绑定按键,修改文件 /custom/package-config/setup-helm-gtags.el

内容如下

(require 'helm-gtags)

(setq
helm-gtags-ignore-case t
helm-gtags-auto-update t
helm-gtags-use-input-at-cursor t
helm-gtags-pulse-at-cursor t
helm-gtags-suggested-key-mapping t
)

;; Enable helm-gtags-mode in Dired so you can jump to any tag
;; when navigate project tree with Dired
(add-hook 'dired-mode-hook 'helm-gtags-mode)

;; Enable helm-gtags-mode in Eshell for the same reason as above
(add-hook 'eshell-mode-hook 'helm-gtags-mode)

;; Enable helm-gtags-mode in languages that GNU Global supports
(add-hook 'c-mode-hook 'helm-gtags-mode)
(add-hook 'c++-mode-hook 'helm-gtags-mode)
(add-hook 'java-mode-hook 'helm-gtags-mode)
(add-hook 'asm-mode-hook 'helm-gtags-mode)

;; key bindings

(define-key helm-gtags-mode-map (kbd "C-j d") 'helm-gtags-dwim)
(define-key helm-gtags-mode-map (kbd "C-j f") 'helm-gtags-find-tag-from-here)

(define-key helm-gtags-mode-map (kbd "C-j r") 'helm-gtags-find-rtag)
(define-key helm-gtags-mode-map (kbd "C-j s") 'helm-gtags-find-symbol)

(define-key helm-gtags-mode-map (kbd "C-j h s") 'helm-gtags-select)
(define-key helm-gtags-mode-map (kbd "C-j h f") 'helm-gtags-tags-in-this-function)
(define-key helm-gtags-mode-map (kbd "C-j h i") 'helm-semantic-or-imenu)

(define-key helm-gtags-mode-map (kbd "M-,") 'helm-gtags-pop-stack)

(define-key helm-gtags-mode-map (kbd "C-j p") 'helm-gtags-previous-history)
(define-key helm-gtags-mode-map (kbd "C-j n") 'helm-gtags-next-history)



(provide 'setup-helm-gtags) 

5.小技巧

搜索工具 M + x helm-occur
查看所有按键绑定 M + x describe-bindings

emacs最基本的操作

首先是常用的按键定义如下

C = Control M = Meta = Alt | Esc Del = Backspace RET = Enter

1.光标移动

C-pC-nC-bC-f 行頭 C-a 行末 C-e
后翻页 C-v 前翻页 M-v
移动到某一行 M-x goto-line(M-g g)

移到句首 M-a 移到句尾 M-e 移动到下一单词 M-f 移动到上一单词 M-b
移动到文件头 M-< 移动到文件尾 M->

2.删除和剪切操作

光标处后一个文字删除 C-d 光标处一个单词剪切 M-d 光标处后面全剪切 C-k 整行剪切 C-w 向前删1个字符 C-h
粘贴复制 C-y

3.多行复制

标记 ctrl+shift+2, 选定要复制或者剪切的内容。
复制 M-w 剪切 C-w

4.文件打开

C-x C-f :画面下方会显示FindFile:~/,输入文件名即可,如果要新建输入自己想起的名字

5.回车 C-j 行增加 C-o

6.在文件中置换文字,将task换成hoge.

M-% (Esc shift+5)
Query replace: task
Query replace task with: hoge
然后置换地方y,不置换n

7.向上查找 C-r 向下查找 C-s (重复摁可以找下一个或者上一个)

向下查找,光标位置的单词作为查找字符串 C-s C-w

8.窗口命令

垂直分割窗格 C-x 3 水平分割窗格 C-x 2 关闭除了光标所在窗格外所有窗格 C-x 1

切换到其他窗格 C-x o 滚动其他窗格内容 M C-v

在其他窗格中打开文件 C-x 4 f 关闭当前缓冲区和窗格 C-x 4 0
以划分该缓冲区,并使顶部的缓冲区为九行内容的高度 M-9 C-x 2
以划分该缓冲区,并使底部的缓冲区为四行内容的高度 M-- M-4 C-x 2

9.书签

在光标当前位置创建书签 C-x r m 删除书签 M-x bookmark-delete
BOOKMARK 重命名书签 M-x bookmark-rename 跳到指定的书签 C-x r b

打开书签列表 C-x r l 后的一些操作

f: 显示光标所在的书签
o: 在下部窗口显示
q: 退出书签列表
m: 标记在其它的窗口显示
v: 显示被标记的书签,如果没有标记的书签,就显示光标所在的书签
d: 做删除的标记
x: 删除被标记删除的书签
u: 移除标记

10.shell模式

打开shell模式 M-x shell 退出shell(关闭shell buff) C-x k

11.buff操作

切换buff C-x b 文件另存为 C-x C-w

12.设定键位

m + x global-set-key 按“上” comint-previous-input 向上一个命令
m + x global-set-key 按 “下” comint-next-input 向下一个命令

13.撤销命令 C-/ TAB键 C-q TAB 删除连续空格 M-\

14.使用M-x 命令自动补全的操作是 M /

15.当前行在中部下部上部显示 C-l

helm相关操作

1.在helm的查找结果前进 M-. 后退M-,

uITRON .cfg文件

CRE_TSK(TSK1, {TA_HLNG , 0, task1, 1, 1024, NULL});
CRE_TSK(TSK2, {TA_HLNG|TA_ACT, 0, task2, 2, 1024, NULL});

#if 0
CRE_TSK(TSK3, {TA_HLNG|TA_ACT, 0, task3, 3, 1024, NULL});
CRE_TSK(TSK4, {TA_HLNG, 0, task4, 4, 1024, NULL});
CRE_TSK(TSK5, {TA_HLNG, 0, task5, 1, 1024, NULL});
CRE_TSK(TSK6, {TA_HLNG, 0, task6, 1, 1024, NULL});

#define IDX_act_tsk2 6
CRE_TSK(TSK7, {TA_HLNG, IDX_act_tsk2, task7, 1, 1024, NULL});
CRE_TSK(TSK8, {TA_HLNG, IDX_act_tsk2, task7, 2, 1024, NULL});

/* Semaphore definition */

CRE_SEM(SEM1, {TA_TFIFO, 1, 5});
CRE_SEM(SEM2, {TA_TFIFO, 1, 5});

/* Eventflag definition */

CRE_FLG(FLG1, {TA_TFIFO|TA_WSGL, 0});
CRE_FLG(FLG2, {TA_TFIFO|TA_WSGL, 0});

/* Data-queue */

CRE_DTQ(DTQ1, {TA_TFIFO, 16, NULL});
CRE_DTQ(DTQ2, {TA_TFIFO, 16, NULL});

/* Mail-box */

CRE_MBX(MBX1, {TA_TFIFO|TA_MFIFO, 0, NULL});
CRE_MBX(MBX2, {TA_TFIFO|TA_MFIFO, 0, NULL});

/* Fixde length memory pool */

CRE_MPF(MPF1, {TA_TFIFO, 8, 32, NULL});
CRE_MPF(MPF2, {TA_TFIFO, 8, 32, NULL});

/* Cyclic handler */

CRE_CYC(CYC1, {TA_HLNG, 0, cyclic_handler, 100, 100});
CRE_CYC(ALM1, {TA_HLNG, 0, alarm_handler, 30, 0});

/* Intrrupt handler */

DEF_INH(INH_LV4, {TA_HLNG, INH_handler});
#endif

/* Initialize routine */

ATT_INI({TA_HLNG, 0, _VTM_init});

source insight常用使用方法

1.查看函数和变量定义

摁住ctrl 鼠标点击

可以选中一个变量,然后右键,Jump to Definition,跳转到定义。

2.跳到某行

ctrl+g

3.显示中的每个字符宽度一致

Alt+F12

4.View菜单

调出或者关闭各种窗口。比如Relative Window可以显示出方法中调用的方法。

5.查找引用

ctrl+/ 选择一个变量或方法后右键Lookup References…
查找结果会在一个框里,点击每条查找结果前面的红色标记(两个红色的相背的三角形),
可以该条结果对应代码文件,进入代码编辑状态;再点击代码中的查找对应行开头的红色标记可以转回查找结果页面。
Lookup References弹出的对话框里可以进行查询的选项配置。比如是否大小写敏感,是不查找注释还是只在注释里查找。
另外Search Method也可以选是字符串、正则、关键字、还是引用类型。

6.查找调用

选中方法名,右键Jump to Caller

7.搜索文件

Ctrl + O

8.打开Symbol Window

Alt + G
Symbol Window,可以快速定位函数、变量定义等

9.F7

显示整个source insight工程的symbols参数

10.Alt+,或者Alt+.

来后退和前进

makefile简单概述

首先写一个简单的makefile

hello: main.o func1.o func2.o
(TAB)gcc main.o func1.o func2.o -o hello
main.o : main.c
(TAB)gcc -c main.c
func1.o : func1.c
(TAB)gcc -c func1.c
func2.o : func2.c
(TAB)gcc -c func2.c
.PHONY : clean
clean:
(TAB)rm -f hello main.o func1.o func2.o

规则:用于说明如何生成一个或多个目标文件,格式如下

target :prerequisites
(TAB)command

目标 依赖 命令

main.o : main.c
(TAB)gcc -c main.c

1.*** 第一条目标是最终要生成的目标这里是hello应用程序
2.*** 伪目标:makefile中把那些没有任何依赖只有执行动作的目标称为伪目标。
.PHONY 将clean目标声明为伪目标

.PHONY : clean
clean:
(TAB)rm -f hello main.o func1.o func2.o

3.*** 可以使用变量

obj = main.o func1.o func2.o func3.o
hello :$(obj)
(TAB)gcc $(obj) -o hello

$^ 代表所有依赖文件
$@ 代表目标
$< 代表第一个依赖文件

hello: main.o func1.o func2.o
(TAB)gcc main.o func1.o func2.o -o hello
等价于
hello: main.o func1.o func2.o
(TAB)gcc $^ -o $@

4.*** 杂项
makefile中#为注释
@:取消回显,使用方法

hello :hello.c
(TAB)@gcc hello.c -o hello

5.*** make命令会去找makefile
也可用make -f 文件名

GDB使用方法

例子程序tst.c

#include <stdio.h>
void main()
{
    int i;
    long result = 0;
    for ( i=1; i <= 100; i++)
    {
        result += i;
    }
    printf("result = %d\n",result);
}

1.首先编译程序tst.c生成可执行程序tst

gcc -g tst.c -o tst

2.启动GDB

gdb tst

3.在main处设置断点 (b=break)

b main

4.运行程序,程序会停在断点处 缩写r

run

5.单步运行 缩写n

next

6.连续运行 缩写c

continue

7.退出 缩写q

quit

常用命令

list 缩写 l 会显示程序

break 缩写 b 打断点

1.可以是函数
2.可以是行号
3.在多个文件时可以选择某个文件的第几行

例子: b tst.c:25

4.行号加if判断,条件为真断点生效

例子: b 23 if i =10
当i等于10的时候第23行断点生效

info break 查看所有断点

delete 断点号 删除断点操作

print 变量名 查看指定变量值 缩写 p

step 单步运行程序(进入子程序) 缩写s

next 也是单步运行程序 (不会进入子程序)

continue 继续运行程序,遇到断点会停下来,没有断点继续运行。 缩写c

finish 运行程序直到当前函数结束

watch 变量名 对指定变量进行监控

即,在使用watch时步骤如下:

1. 使用break在要观察的变量所在处设置断电;

2. 使用run执行,直到断点;

3. 使用watch设置观察点;

4. 使用continue观察设置的观察点是否有变化。

小技巧

查找技巧

1.当前目录查找.h和.c文件下的内容为sta_tsk

find ./ -name "*.[ch]" | xargs grep --color=auto -nH "sta_tsk"

2.全盘查找文件内容有sta_tsk的地方

find / -type f | xargs grep --color=auto -nH "sta_tsk"

3.全盘计数文件内容有sta_tsk的地方

find / -type f | xargs grep --color=auto -nH "sta_tsk" | wc -l