前言

我知道标题看起来很主观,但是我希望这个问题对根本不是来自emacs的新手来说是一个对spacemacs的顺利介绍(这就是我的情况)。

您可能想知道为什么我决定使用spacemacs(这是对emacs的高度自定义的修改),而又没有花时间去习惯原始的emacs。好吧,事实上,我已经尝试使用emacs和vim了很长时间了,因为我可以理解为什么这些软件能够提高生产力,并让您在编码/黑客时感觉更“在家”。
不幸的是,当我开始习惯于Vim时,您需要花费在学习上的时间,最重要的是,您需要花费在上来配置这些软件的时间对我来说太高了。
然后,我发现了 spacemacs ,它吸收了vim的一些优点,emacs的一些优点,并将它们组合成一个不错的,通常预先配置的软件包。

问题在于,大多数配置都是通过emacs-lisp完成的,并希望用户在启动软件时了解如何加载和执行代码,而我完全不知道(随着我开始意识到越来越多的问题)我研究了代码)。

我想要实现的目标

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

  • 行号显示在我打开
  • 的任何缓冲区中
  • git live更改显示在左侧
  • 光标在上方时,突出显示
  • 符号
  • 我的“主页”显示了一个项目列表,我可以加载最新的项目,它可以记住上次
  • 的缓冲区配置

    我希望能够在必要时实际编码那些功能(也许还有很多),或者在它们可用时进行安装。

    我尝试了什么

    (什么不起作用)

    我(天真)配置了我的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(或 ~/.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-configdotspacemacs/user-config中,则更有可能希望在dotspacemacs/user-config中进行自定义。首先尝试在那里,如果它不起作用,则可以尝试在此处设置变量。
  • (<function>):这是最有可能放置所有个人配置的地方。在所有软件包都已加载并配置之后,将在执行此操作,因此它将覆盖任何其他配置。
  • Emacs配置是在Emacs lisp中完成的,因此您需要具备配置Spacemacs的基本知识,没有其他方法。 真的基础知识:
  • (<function> <arg_1> <arg_2> …):函数调用。
  • (setq <variable> <value>):带参数的函数调用。
  • ~/.spacemacs:设置变量的值。

  • 关于您的问题:

    注意:我已经看到您说其中一些配置不起作用,但是它们对我来说是预期的。请尝试在gitter上寻求帮助,以帮助您进行调试。
  • «行号显示在我打开的任何缓冲区中»:已经存在一个配置选项,您可以在(setq diff-hl-side 'left)中启用此选项(供读者练习:-)。
  • «git live changes显示在左侧»:我在自己的user-config中放入了SPC t h a,并且可以正常工作。对于IIRC,无法在Emacs的终端(非GUI)模式下进行自定义。
  • «光标悬停时突出显示符号»:可以使用(spacemacs/toggle-automatic-symbol-highlight-on)启用。您可以在开始时通过从user-config调用projects启用它。请注意,提供此功能的软件包存在一些问题,并且与其他一些软件包(https://github.com/syl20bnr/spacemacs/issues/2706https://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在项目之间切换
  • 退出Spacemacs
  • 启动Spacemacs,并使用dotspacemacs-auto-resume-layouts(仅将t设置为SPC t w起作用)回到您的项目中。
  • «TODO显示空白»:可以使用SPC t C-w切换缓冲区,或使用(spacemacs/toggle-whitespace-globally-on)切换所有缓冲区。您可以在user-config中使用develop在启动时启用它。
  • «;;锈»:在rust上,只要您使用master层就不需要。不过现在可能不在major-mode上。

  • 一些补充信息
  • minor-modemajor-mode。这些与它们仅适用于一个或所有缓冲区的事实无关。相反,每个缓冲区都有一个,而只有一个python-mode(如ruby-modeminor-mode等)。每个缓冲区可以具有几个linum-mode(例如minor-mode)。从某种意义上来说,某些globalglobal-centered-cursor-mode,它们会影响所有缓冲区,例如global
  • Emacs lisp变量可以是buffer-localglobal。更改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)))
    
  • Spacemacs确实为某些功能提供了一些切换功能。它们称为-on,并在末尾添加-off(custom-set-variables)启用或禁用它们。
  • customize是Emacs的ojit_code部分的一部分,目前应避免使用Spacemacs,因为它们的行为尚未得到很好的定义(https://github.com/syl20bnr/spacemacs/pull/5168可以解决此问题)。
  • «我希望能够回答以下问题:“哦,我想自定义行为,我需要在哪里编码?我应该调用的方法是什么?我不应该调用的方法是什么?我可以变量是什么?更改/创建?当我将代码放在这里时,实际上执行的是什么?...等”»:

    像Emacs或vim一样,Spacemacs是一个功能强大的工具。像每个强大的工具一样,它需要一些时间来适应它,以适应它。如果要开始驾驶飞机,您将无法直观地知道要执行此操作所要按下的按钮。如果您想取得成就,则必须阅读一本非常长的手册或找一位讲师。 Spacemacs也是一样。
    有一个documentationquick-startmigrating from vim文档。它们很长,但这是因为可能的范围与文档一样长。另一种方法是从某些“讲师”那里获得帮助,即Spacemacs的常规贡献者。我建议您参加gitter room,它非常活跃,希望对您有所帮助。
  • 关于emacs - 如何配置spacemacs,以使其在启动时执行代码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37076998/

    10-09 00:10