Spacemacs自定义layer的入门问题

我刚切换过来,说句老实话,互联网上都找不到一个完整的例子来引导新用户如何自定义layer。 这也太折腾新用户了。不知道大家怎么熬过来的。 我现在自定了自己的layer,在.emacs.d/private/dean/package.el中添加了如下配置, (defconst dean-packages '(chinese-pyim) )

(defun dean/init-PACKAGE
    (use-package chinese-pyim)
    )

;; input method
(require 'chinese-pyim)

重启emacs后报错 Warning (initialization): An error occurred while loading ‘/home/dean/.emacs.d/init.el’:

File error: Cannot open load file, No such file or directory, chinese-pyim

我自己摸索出来了,给大家一个贡献,新手可以看看我的博客。

我就山寨山人的

spacemacs.org/doc/LAYERS.html看了么。。

1 个赞

我写的是这个

(defun dean/init-chinese-pyim()  
    (use-package chinese-pyim)  
    )  

原理我没研究,我也是新手,就是弄出来能用。

放在自己的layer里面是为了防止和github上的配置混在一起,将来好升级。

看了,这种doc缺少完整的例子,所以上手较难。

因为多数人都只是想要一个开箱即用的工具,不想自己制造工具。

出现问题真的很复杂。 找不大人帮忙。

会一点 Elisp 就方便很多。 至少能够了解为什么会出错。 顺带,我觉得 Spacemacs 自带的 Documentation SPC h SPC 已经比较详细了。 如果觉得实际范例不够多的话,layer文件夹里的层都是很不错的应用范例,拿来抄是足够的。 对于use-package的用法,在emacs中按c-h f后输入任何 function 都会显示有关的的用法。 以下是出自山人的范例(在 chinese layer 中)

(defun chinese/init-chinese-pyim ()
  (use-package chinese-pyim
    :if (eq 'pinyin chinese-default-input-method)
    :init
    (progn
      (setq pyim-use-tooltip t
            pyim-dicts-directory spacemacs-cache-directory
            pyim-personal-file (concat spacemacs-cache-directory
                                       "pyim-personal.txt")
            default-input-method "chinese-pyim")
      (evilified-state-evilify pyim-dicts-manager-mode pyim-dicts-manager-mode-map))))

Spacemacs 中配置 layer ,因为考虑到性能问题(启动速度),几乎不需要用 require ,通常用use-package起到相同的作用。 你在博客中的例子。

;; clang  
(defun dean/c-c++()  
  (use-package c-c++)  
  )  
  
(setq-default dotspacemacs-configuration-layers  
              '((c-c++ :variables  
                       c-c++-default-mode-for-headers 'c++-mode)))  
(setq-default dotspacemacs-configuration-layers  
              '((c-c++ :variables c-c++-enable-clang-support t)))  
  
;; Bind clang-format-region to C-M-tab in all modes:  
(global-set-key [C-M-tab] 'clang-format-region)  
;; Bind clang-format-buffer to tab on the c++-mode only:  
(add-hook 'c++-mode-hook 'clang-format-bindings)  
(defun clang-format-bindings ()  
  (define-key c++-mode-map [tab] 'clang-format-buffer))  

很实诚地说,糟透了。 layer 是对应package配置的。你可能误解了package的概念,c-c++并不是个package,只是个层,所以你这里的第一段代码没有发挥任何作用。

(setq-default dotspacemacs-configuration-layers  
              '((c-c++ :variables  
                       c-c++-default-mode-for-headers 'c++-mode)))  
(setq-default dotspacemacs-configuration-layers  
              '((c-c++ :variables c-c++-enable-clang-support t)))  

对于这一段,更好的办法是在 .spacemacs 里声明 layer 的地方加:

dotspacemacs-configuration-layers
'(
  (c-c++ :variables
         c-c++-enable-clang-support t
         c-c++-default-mode-for-headers 'c++-mode)
  )

下面这几行,也是直接加在 .spacemacs的user-config里面就行。加载layer里面属于多余配置。

;; Bind clang-format-region to C-M-tab in all modes:  
(global-set-key [C-M-tab] 'clang-format-region)  
;; Bind clang-format-buffer to tab on the c++-mode only:  
(add-hook 'c++-mode-hook 'clang-format-bindings)  
(defun clang-format-bindings ()  
  (define-key c++-mode-map [tab] 'clang-format-buffer)

下面这一段,倒是可以配置在layer里面。

(defun dotspacemacs/user-config ()  
  "Configuration function for user code.  
This function is called at the very end of Spacemacs initialization after  
layers configuration.  
This is the place where most of your configurations should be done. Unless it is  
explicitly specified that a variable should be set before a package is loaded,  
you should place your code here."  
  (require 'org)  
  (require 'org-chinese-utils)  
  (ocus-enable)  
  (require 'openwith)  
  (setq openwith-associations '(("\\.odt\\'" "libreoffice" (file))))  
  (openwith-mode t)  
  )  

首先

(defconst dean-packages
'(chinese-pyim
  org-chinese-utils
  openwith)
)

然后:

(defun dean/init-org-chinese-utils ()
  (use-package org-chinese-utils
    :defer t)
  (eval-after-load org (ocus-enable)))
(defun dean/init-openwith ()
  (use-package openwith
    :init
    (setq openwith-associations '(("\\.odt\\'" "libreoffice" (file))))
    :defer t)

(openwith-mode t)这种粗暴的用法我已经没法说什么了。建议加个hook到要用这个插件的major-mode。一般 package 说明里的配置还是很粗浅的用法,直接用是不明智的行为。还是要强调,学学elisp 好处多。


先到这里,别的还有补充。

4 个赞

建议楼主下次在提这样的问题之前,先确认自己把官方文档读过了。

1 个赞

这个提议点个赞,顺带为了防止大家采坑,可以注意一下官方的配置 layer 的文档的小错误: