问题说明
我最近有点学懵了,查资料半天查不到想要的东西
我想自己写一个major mode
做个练习,没想到好难啊,难得我前列腺炎都犯了
这是我的test.ne
文件,我需要写一个nemode
来给这种文件提供功能
/*
hello world
I am Steiner
*/
#include <stdio.h>
int main() {
printf("hello world\n");
char * str = "hello world !";
return 0;
}
/* I like Julia language */
// and I also like Clojure too
<h1> Hello World </h1>
我的配置
1. 为不同的标识设置不同的face
需要高亮keyword
, type
, html-tag
,string
, function
,
;; define face for all type
;; first is keyword
(defface neface/keyword
nil
"Face for keyword")
;; next is type
(defface neface/type
nil
"Face for type")
;; function face
(defface neface/function
nil
"Face for function")
;; for tag
(defface neface/tag
nil
"Face for tag")
;; for string
(defface neface/string
nil
"Face for string")
(face-spec-set 'neface/keyword
'((t :foreground "red"
:weight bold
:underline t)))
(face-spec-set 'neface/type
'((t :foreground "yellow"
:weight bold
:underline t)))
(face-spec-set 'neface/function
'((t :foreground "green"
:weight bold
:underline t)))
(face-spec-set 'neface/tag
'((t :foreground "blue"
:weight bold
:underline t)))
(face-spec-set 'neface/string
'((t :foreground "magenta"
:background "red"
:weight bold)))
(setq neface/keyword 'neface/keyword
neface/type 'neface/type
neface/function 'neface/function
neface/tag 'neface/tag
neface/string 'neface/string)
2. 设置匹配的正则表达式
(setq regex-keyword (concat "^#include " "\\|" "\\<return\\>")
regex-type (concat "\\<int\\>" "\\|" "\\<char\\>")
regex-tag (concat "<h1>" "\\|" "</h1>")
regex-function "\\w+(.*)"
regex-str "\".*\""
highlights `(
(,regex-keyword . neface/keyword)
(,regex-type . neface/type)
(,regex-function . (1 neface/function))
(,regex-tag . neface/tag)
(,regex-str . neface/string)))
3. 整合为nemode
(define-derived-mode nemode prog-mode "nemode"
(setq font-lock-defaults '(highlights)))
发现问题
图片
正则匹配了也不高亮
给你们看看,我也是醉了
无法匹配字符串
无法匹配标签
无法匹配函数
还有一些不会设置的东西
1. 缩进
比如说,在c文件中随便按Tab
键,他就会帮你弄好缩进,但是自定义major mode
该怎么定义缩进啊?
我这样设置tab-width
,按了几下Tab
就变这样了
(define-derived-mode nemode prog-mode "nemode"
(setq-local font-lock-defaults '(highlights))
(setq-local indent-tabs-mode t)
(setq-local tab-width 4))
2. 函数渲染?
在李杀的教程里有这样一个例子来改变文字属性
(defun x-make-word-red (begin end)
"make current region colored red, using text properties"
(interactive (list (region-beginning) (region-end)))
(put-text-property begin end 'font-lock-face '(:foreground "red")))
哪有没有方法在mode
加载的时候调用这种函数,匹配到文字后修改其文字属性
3. defcustom和defground
查文档的时候这两个宏看不懂,不知道这两玩样怎么使
4. syntax-table 的语法
英文实在看不懂,这是什么反人类的语言
最后有个吐槽
给条活路吧,让我用其他语言配置好不好
花了3天时间学习配置,现在的我只想安安静静的敲代码,去他妈的自动检查,去他妈的自动补全,去他妈emacs-lisp
,我还是去学Java
吧