前言
我知道标题看起来很主观,但是我希望这个问题对根本不是来自emacs的新手来说是一个对spacemacs的顺利介绍(这就是我的情况)。
您可能想知道为什么我决定使用spacemacs(这是对emacs的高度自定义的修改),而又没有花时间去习惯原始的emacs。好吧,事实上,我已经尝试使用emacs和vim了很长时间了,因为我可以理解为什么这些软件能够提高生产力,并让您在编码/黑客时感觉更“在家”。
不幸的是,当我开始习惯于Vim时,您需要花费在学习上的时间,最重要的是,您需要花费在上来配置这些软件的时间对我来说太高了。
然后,我发现了 spacemacs ,它吸收了vim的一些优点,emacs的一些优点,并将它们组合成一个不错的,通常预先配置的软件包。
问题在于,大多数配置都是通过emacs-lisp完成的,并希望用户在启动软件时了解如何加载和执行代码,而我完全不知道(随着我开始意识到越来越多的问题)我研究了代码)。
我想要实现的目标
我希望能够启动emacs,并看到它执行我将编写的一些自定义代码,以便:
我希望能够在必要时实际编码那些功能(也许还有很多),或者在它们可用时进行安装。
我尝试了什么
(什么不起作用)
我(天真)配置了我的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)
)
问题
我意识到存在一个称为“主要模式”和“次要模式”的概念,它们分别适用于所有缓冲区或仅适用于特定的缓冲区实例,但是我对emacs具有自己的全局变量和局部变量这一事实也感到非常困惑(似乎可以通过
(setq)
进行自定义),spacemacs还具有用于自定义(spacemacs/toggle-something-on)
以及(custom-set-variables)
的变量或方法,并且我想做的大多数事情都可以通过“ Hook ”来实现。spacemacs文档使我完全一无所知,因为它主要是假设您知道事情的原理,而emacs就像核电站的维护指南。
可以轻松地使用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
中进行自定义。首先尝试在那里,如果它不起作用,则可以尝试在此处设置变量。 (<function>)
:这是最有可能放置所有个人配置的地方。在所有软件包都已加载并配置之后,将在执行此操作,因此它将覆盖任何其他配置。 (<function> <arg_1> <arg_2> …)
:函数调用。 (setq <variable> <value>)
:带参数的函数调用。 ~/.spacemacs
:设置变量的值。 关于您的问题:
注意:我已经看到您说其中一些配置不起作用,但是它们对我来说是预期的。请尝试在gitter上寻求帮助,以帮助您进行调试。
(setq diff-hl-side 'left)
中启用此选项(供读者练习:-)。 user-config
中放入了SPC t h a
,并且可以正常工作。对于IIRC,无法在Emacs的终端(非GUI)模式下进行自定义。 (spacemacs/toggle-automatic-symbol-highlight-on)
启用。您可以在开始时通过从user-config
调用projects
启用它。请注意,提供此功能的软件包存在一些问题,并且与其他一些软件包(https://github.com/syl20bnr/spacemacs/issues/2706,https://github.com/syl20bnr/spacemacs/issues/3475)不兼容。 dotspacemacs-startup-lists
变量中包含dotspacemacs-auto-resume-layouts
,则应该显示最近的项目列表。可以通过将t
设置为layouts
来记住上一次的Windows布局。如果您希望能够使用每个项目的布局,则必须学习 SPC p l
。例如:SPC p l
以新的视角打开项目SPC l n
允许您打开项目SPC l n
在项目之间切换dotspacemacs-auto-resume-layouts
(仅将t
设置为SPC t w
起作用)回到您的项目中。 SPC t C-w
切换缓冲区,或使用(spacemacs/toggle-whitespace-globally-on)
切换所有缓冲区。您可以在user-config
中使用develop
在启动时启用它。 rust
上,只要您使用master
层就不需要。不过现在可能不在major-mode
上。 一些补充信息
minor-mode
和major-mode
。这些与它们仅适用于一个或所有缓冲区的事实无关。相反,每个缓冲区都有一个,而只有一个,python-mode
(如ruby-mode
,minor-mode
等)。每个缓冲区可以具有几个linum-mode
(例如minor-mode
)。从某种意义上来说,某些global
是global-centered-cursor-mode
,它们会影响所有缓冲区,例如global
。 buffer-local
或global
。更改buffer-local
变量将影响所有缓冲区。用(setq …
更改buffer-local
变量将仅影响当前缓冲区。可以使用(setq-default …
更改buffer-local
变量的默认值。这将更改所有新创建的缓冲区的值。hooks
变量具有默认值,但是在进入某些给定模式时,它们可能会被(spacemacs/toggle-…)
覆盖。为某种类型的缓冲区修改此类值时,应将函数添加到 Hook 中,例如:(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)))
-on
,并在末尾添加-off
或(custom-set-variables)
启用或禁用它们。 customize
是Emacs的ojit_code部分的一部分,目前应避免使用Spacemacs,因为它们的行为尚未得到很好的定义(https://github.com/syl20bnr/spacemacs/pull/5168可以解决此问题)。 像Emacs或vim一样,Spacemacs是一个功能强大的工具。像每个强大的工具一样,它需要一些时间来适应它,以适应它。如果要开始驾驶飞机,您将无法直观地知道要执行此操作所要按下的按钮。如果您想取得成就,则必须阅读一本非常长的手册或找一位讲师。 Spacemacs也是一样。
有一个documentation,quick-start和migrating from vim文档。它们很长,但这是因为可能的范围与文档一样长。另一种方法是从某些“讲师”那里获得帮助,即Spacemacs的常规贡献者。我建议您参加gitter room,它非常活跃,希望对您有所帮助。
关于emacs - 如何配置spacemacs,以使其在启动时执行代码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37076998/