我们使用一种内部脚本语言(我们称之为pkc
),它允许嵌入 C++ 代码。C++ 代码段由{{{
和}}}
标记分隔。
我使用Generic Mode和mmm-mode为这种语言创建了一个 emacs模式。
这是我得到的(剥离了在这里发布的非必要部分):
(require 'generic-x)
(setq pkc-imenu-generic-expression
'(("macros" "^[ \t]*macro[ \n\t]+\\([a-zA-Z0-9_]+\\)" 1)
("functions" "function[ \n\t]+\\([a-zA-Z0-9_]+\\)" 1)
))
(require 'cc-mode) ;; for c++-mode
(require 'mmm-auto)
(setq mmm-global-mode 'maybe)
(define-generic-mode
'pkc-mode ;; name of the mode to create
'("//" ("/*" . "*/")) ;; comments are same C++ comments
'( ... ) ;; some keywords
'("\\.pkc$") ;; files for which to activate this mode
;; other functions to call
'((lambda ()
(mmm-mode 1)
(setq mmm-submode-decoration-level 2)
(setq imenu-generic-expression pkc-imenu-generic-expression)
(which-function-mode 1)
(c-initialize-cc-mode t)
(c-init-language-vars-for 'c++-mode)
(c-common-init 'c++-mode)
(c-update-modeline)
(message "pkc-mode[mmm] is on")))
"A mode for pkc source files" ;; doc string for this mode
)
(mmm-add-classes
'((embedded-c++
:submode c++-mode
:face mmm-default-submode-face
:front "{{{"
:front-offset -1
:back "}}}"
:back-offset 1)))
(mmm-add-mode-ext-class 'pkc-mode nil 'embedded-c++)
当我加载带有嵌入式 C++ 代码段的源文件时,它们的突出显示比 C++ 模式是主要模式时的突出显示要少(但这不是我的问题)。当光标在 C++ 代码中时,模式行变为pkc/l[C++/l]
(如预期的那样)。
问题是,每当我按下TAB缩进一行时,我都会收到错误消息Wrong type argument: stringp, nil
。当我打开调试器时,这是我看到的堆栈跟踪:
Debugger entered--Lisp error: (wrong-type-argument stringp nil)
c-syntactic-skip-backward(nil nil t)
c-looking-at-decl-block(nil t)
c-guess-basic-syntax()
c-indent-line()
#[nil \302>\203)\212\303 \210\304\305x\210\303 \210\306 )i\306 X\203\"\307 !\202'\212\307 !))\20 \207" [indent-line-function column (indent-relative indent-relative-maybe) beginning-of-line "\n " nil current-indentation indent-line-to] 2 1908700 nil]()
c-indent-command(nil)
c-indent-line-or-region(nil nil)
call-interactively(c-indent-line-or-region nil nil)
查看定义,c-looking-at-decl-block
尤其是对 `c-syntactic-skip-backward 的调用,我发现:
(c-syntactic-skip-backward c-block-prefix-charset limit t)
检查第一个参数c-block-prefix-charset
会发现它的值为nil
。从纯 C++ 缓冲区执行相同操作会显示非nil
值。所以,我怀疑 C++ 模式需要一些没有正确完成的初始化。
所以,我的问题是:
- 我在实现中的 C++ 模式初始化部分缺少什么?
- 我是否使用了正确的方法(结合
generic-x
andmmm-mode
)?有更好的方法吗?
加载文件时,我还看到另一个错误 ( File mode specification error
),但我怀疑问题相同或类似。
谢谢你的时间。