如何配置spacemacs以便在启动时执行代码?

Jér*_*tin 9 lisp emacs elisp spacemacs

前言

我知道这个标题看起来很主观,但是我希望这个问题可以顺利地介绍一下对于不是来自emacs的新手来说(这是我的情况).

您可能想知道为什么我决定使用spacemacs,这是一个高度自定义的黑客而不是emacs,而没有花时间习惯先使用vanilla emacs.好吧,事实上,我一直在尝试使用emacs和vim很长一段时间,因为我可以理解为什么这些软件能够提高工作效率并让你在编码/黑客时感觉更"在家".
不幸的是,当我开始习惯vim时,你需要花时间学习,最重要的是,你需要花费在配置这些软件上的时间对我来说太高了.
然后我发现了spacemacs,它包含了vim中的一些优点,emacs中的优点,并将它们组合成一个很好的大多数预先配置的包.

问题是大多数配置是通过emacs-lisp完成的,并且期望用户在启动软件时理解代码的加载和执行方式,我完全没有(因为我开始意识到越来越多)我深入研究了代码).

我想要实现的目标

我希望能够启动emacs,并看到它执行一些我想写的自定义代码,以便:

  • 行号显示在我打开的任何缓冲区中
  • git实时更改显示在左侧
  • 光标结束时,符号会突出显示
  • 我的"主页"显示项目列表,我可以加载最新的项目,它会记住上次的缓冲区配置

我希望能够在必要时对这些功能(以及可能是其他功能)进行实际编码,或者在它们已经可用时安装它们.

我尝试了什么

(什么不起作用)

(天真)配置我的spacemacs就像任何lisp/emacs新手一样:

(defun dotspacemacs/user-config ()
  "Configuration function for user code.
 This function is called at the very end of Spacemacs initialization after
layers configuration. You are free to put any user code."

  ;; TODO
  ;; - Display whitespaces
  ;; - Install workgroups2

  ;; interface  ;; this works
  (setq powerline-default-separator 'arrow)

  ;; mouse scroll  ;; this works? maybe
  (setq mouse-wheel-scroll-amount '(1 ((shift) . 1))) ;; one line at a time
  (setq mouse-wheel-progressive-speed nil) ;; don't accelerate scrolling

  ;; middle click copy-paste  ;; this works
  (setq x-select-enable-primary t)

  ;; diff-hl  ;; this used to work but now does not
  (diff-hl-flydiff-mode)
  (setq diff-hl-side 'left)

  ;; rust  ;; this works (and seems the right way to do it)
  (add-hook 'rust-mode-hook #'racer-mode)
  (add-hook 'racer-mode-hook #'eldoc-mode)

  ;; neotree  ;; this works? maybe
  (setq neo-show-hidden-files nil)

  ;; toggle preferences  ;; this does not work
  (spacemacs/toggle-automatic-symbol-highlight-on)
  (spacemacs/toggle-line-numbers-on)

  ;; COrrect DOuble CAps  ;; this does not works either (should be a hook)
  (doublecaps-mode 1)
)
Run Code Online (Sandbox Code Playgroud)

这个问题

我意识到有一个名为"major-modes"和"minor-modes"的概念,它们分别适用于所有缓冲区或仅适用于特定的缓冲区实例,但我也对emacs有自己的全局变量和局部变量这一事实感到非常困惑. (似乎可以自定义(setq)),spacemacs也有自定义的变量或方法,(spacemacs/toggle-something-on)而且(custom-set-variables)我想要做的大部分是使用"hooks"实现的.

spacemacs文档让我完全无能为力,因为它主要是让你知道事情是如何运作的,而emacs就像核工厂维护指南一样.

有人可以轻松地使用spacemacs给我一个理解这些概念的"切入点"吗?

我希望能够回答这些问题:"哦,我想自定义这种行为,我需要在哪里编码?我应该调用哪些方法?我不应该调用哪些方法?我可以更改哪个变量/创建?当我把代码放在这里时实际执行了什么?...等"

Str*_*bra 40

以下是您需要了解的内容:

  • 您应该触摸以定制Spacemacs 的唯一文件是~/.spacemacs(或者~/.spacemacs.d/init.el如果您更喜欢拥有目录).你不应该碰到任何东西~/.emacs.d.你也不应该有任何~/.emacs文件.

  • 您应该阅读~/.spacemacs文件一次以查看所有可能的配置选项,它们都有详细记录.

  • ~/.spacemacs文件的结构具有以下功能:

    • dotspacemacs/layers:这是配置所需Spacemacs功能的地方,例如激活的图层,您需要的其他软件包,您不需要的排除软件包等等......您不应该在那里添加/删除任何变量或代码,只需修改现有值.

    • dotspacemacs/init:您可以在此处启用/禁用Spacemacs提供的自定义功能,例如更改领导键,使用https更新,打开行号等等...您不应在此处添加/删除任何变量或代码,只需修改现有值.

    • dotspacemacs/user-init:这是您加载包之前自定义Spacemacs的地方.只有在需要这种情况时才会出现这种情况,只有在加载软件包之前才应设置变量.例如设置ranger-override-dired为,t以便何时ranger加载,它将执行dired用自己的功能覆盖功能所需的功能.在加载包之后执行此操作将无法正常工作,因为它将会延迟.如果您不确定在那里或内部放置自定义dotspacemacs/user-config,您更可能需要自定义dotspacemacs/user-config.首先尝试那里,如果它不起作用,你可以尝试在这里设置变量.

    • dotspacemacs/user-config:这是您最有可能放置所有个人配置的地方.这将在加载和配置所有软件包执行,因此它将覆盖任何其他配置.

  • Emacs配置在Emacs lisp中完成,因此您需要具备配置Spacemacs的基本知识,没有其他方法.在真正的基础:

    • (<function>):函数调用.
    • (<function> <arg_1> <arg_2> …):带参数的函数调用.
    • (setq <variable> <value>):设置变量的值.

关于你的问题:

注意:我已经看到你说其中一些配置不起作用,但它们对我来说是预期的.请尝试在gitter上请求一些帮助来帮助您调试.

  • «行号显示在我打开的任何缓冲区中»:已经存在一个配置选项,您可以为此启用~/.spacemacs(将其作为读者的练习:-)).

  • «git实时更改显示在左侧»:我放入(setq diff-hl-side 'left)我的user-config,这是有效的.IIRC无法在Emacs的终端(非GUI)模式下进行自定义.

  • 当光标结束时,«符号会突出显示»:可以使用此选项切换SPC t h a.您可以启用它在通过调用开始时间(spacemacs/toggle-automatic-symbol-highlight-on)user-config.请注意,包提供此功能有一些问题,并与其他几个包不兼容(https://github.com/syl20bnr/spacemacs/issues/2706,https://github.com/syl20bnr/spacemacs/issues/ 3475).

  • «my"主页"显示项目列表,我可以加载最新的项目,它记住上次的缓冲区配置»:如果你projectsdotspacemacs-startup-lists变量中,最近的项目列表应该是可见的.记住上次的窗口布局可以通过设置dotspacemacs-auto-resume-layouts为来完成t.您需要了解layouts是否希望能够使用每个项目的布局.例如:

    • SPC p l 以新的视角开放项目
    • 更改此项目的窗口配置
    • SPC p l 允许您打开项目的新视角
    • 更改此项目的窗口配置
    • 用于SPC l n在项目之间切换
    • 退出Spacemacs
    • 启动Spacemacs,并使用他们的视角返回您的项目SPC l n(仅适用于dotspacemacs-auto-resume-layoutsset t).
  • «TODO显示空格»:可以SPC t w为缓冲区或SPC t C-w所有缓冲区切换.您可以使用(spacemacs/toggle-whitespace-globally-on)in user-config在启动时启用它.

  • «;; 生锈»:develop只要你使用这个rust层就不需要了.但是master 现在可能还没有开启.

 一些补充信息

  • major-modeminor-mode.这些与它们仅适用于一个或所有缓冲区的事实无关.相反,每个缓冲区一个,且只有一个,major-mode(如python-mode,ruby-mode等...).每个缓冲区可以有几个minor-mode(像linum-mode).有些minor-modeglobal在这个意义上,他们会影响到所有的缓冲区,像global-centered-cursor-mode.

  • Emacs lisp变量可以是globalbuffer-local.更改global变量将影响所有缓冲区.更改buffer-local变量(setq …将仅影响当前缓冲区.可以使用更改buffer-local变量的默认值(setq-default ….这将更改所有新创建的缓冲区的值.

    buffer-local变量具有默认值,但hooks在进入某个给定模式时可能会覆盖它们.为某种缓冲区修改这些值的函数应该添加到钩子中,例如:

    (setq-default fill-column 80)
    (add-hook 'mail-mode-hook (lambda () (setq fill-column 72)))
    (add-hook 'python-mode-hook (lambda () (setq fill-column 79)))
    
    Run Code Online (Sandbox Code Playgroud)
  • Spacemacs确实为某些功能提供了一些切换功能.它们被调用(spacemacs/toggle-…)并添加-on-off最后启用或禁用它们.

  • (custom-set-variables)customizeEmacs 的一部分,现在应该避免使用Spacemacs,因为它们的行为没有很好地定义(https://github.com/syl20bnr/spacemacs/pull/5168可以解决这个问题).

  • "我希望能够回答这些问题:"哦,我想自定义这种行为,我需要在哪里编码?我应该调用哪些方法?我不应该调用哪些方法?我可以更改哪个变量/ create?当我把代码放在这里时实际执行了什么?...等等"»:

    Spacemacs,如Emacs或vim,是一个强大的工具.像每个强大的工具一样,它需要一些时间来适应它,舒适.如果你想开始驾驶飞机,你就不会直观地知道要按哪个按钮来做这个或那个.如果你想要实现某些目标,你必须经历一个非常长的手册,或者找一个教练.Spacemacs也是如此.有一个文档,一个快速入门从vim文档迁移.它们很长,但这是因为可能性的范围与文件一样长.另一种方法是从一些"讲师"那里获得帮助,即Spacemacs常规贡献者.我建议你来到非常活跃的gitter室,希望对你有所帮助.