2010-12-10 73 views
2

我正在寻找一种方法来模仿Textmate在Emacs中的CSS编辑行为。Emacs css模式自动关闭大括号和冒号后自动插入分号(ala Textmate)

在TextMate中,添加CSS属性时:

#element {} <-- Braces auto close. 
#element {background: ;} <-- after typing the colon, the semi-colon is automatically inserted and the cursor is placed between them. 

我已经采取了看看几款CSS-模式(和textmate.el),但看不到任何人实施了这一点。

我的Emacs Lisp语言绝对零知识会愿意给它一个镜头,写自己的东西,但没有人知道,如果这已经做了?

+0

自动完成属性名称后插入冒号和分号也很舒服! – smonff 2016-12-06 14:30:25

回答

3

您想查看electric函数的一些示例(在输入特定可见字符时执行附加输入或格式化时使用的命名约定)。

没有什么特别的实施。问题的关键是在模式的键盘映射中绑定到执行工作的功能。除了必须处理输入的字符的插入之外,它就像任何其他的键绑定一样。

cc-mode有几个例子。其基本做法是这样的:

(define-key c-mode-base-map "{" 'c-electric-brace) 

(defun c-electric-brace (arg) 
    (interactive "*P") 
    ;; [...] 
    (self-insert-command (prefix-numeric-value arg)) 
    ;; [...] 
) 

不可否认C-电梅开二度比你可能期待一个更为复杂的功能,但它是微不足道的具有简单地插入相同数量的}个功能在插入{之后。

(defun my-electric-brace (arg) 
    "Automatically add a closing '}' for every '{' inserted." 
    (interactive "*P") 
    (let ((count (prefix-numeric-value arg))) 
    (self-insert-command count) 
    (save-excursion 
     (insert-char ?} count)))) 

(defun my-css-mode-hook() 
    (local-set-key (kbd "{") 'my-electric-brace)) 

(add-hook 'css-mode-hook 'my-css-mode-hook) 

但是,您可能会发现这有点过分简单,并且有些情况下您不希望插入匹配大括号。通过定义电子删除功能,您可能还希望在删除其中一个时自动处理删除的大括号。

您的电子冒号要求也不如支架那么简单,因为它只能出现在正确的环境中(尽管在实践中您可能会失去一个天真的实现,因为我不认为您会在冒号中输入冒号这是不正确的上下文中的CSS文件。)

希望这点你在正确的方向,如果你决定写自己的解决方案。

很明显,你会想读一些教程上elisp的,但对于理解上面的代码,只要注意,您可以使用章˚Fdescribe-function)来读取文档的任何elisp的功能(或的Mxfind-function到查看代码)。

+0

谢谢你这样详细的解释 – prevailrob 2010-12-11 10:09:37

1

对于各种括号通用自行配对,等你可能想看看autopair-mode

+0

这是一个非常全面的解决方案。 – phils 2010-12-11 11:28:43

相关问题