Jér*_*tin 9 lisp emacs elisp spacemacs
我知道这个标题看起来很主观,但是我希望这个问题可以顺利地介绍一下对于不是来自emacs的新手来说(这是我的情况).
您可能想知道为什么我决定使用spacemacs,这是一个高度自定义的黑客而不是emacs,而没有花时间习惯先使用vanilla 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)
)
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"主页"显示项目列表,我可以加载最新的项目,它记住上次的缓冲区配置»:如果你projects在dotspacemacs-startup-lists变量中,最近的项目列表应该是可见的.记住上次的窗口布局可以通过设置dotspacemacs-auto-resume-layouts为来完成t.您需要了解layouts是否希望能够使用每个项目的布局.例如:
SPC p l 以新的视角开放项目SPC p l 允许您打开项目的新视角SPC l n在项目之间切换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-mode和minor-mode.这些与它们仅适用于一个或所有缓冲区的事实无关.相反,每个缓冲区有一个,且只有一个,major-mode(如python-mode,ruby-mode等...).每个缓冲区可以有几个minor-mode(像linum-mode).有些minor-mode是global在这个意义上,他们会影响到所有的缓冲区,像global-centered-cursor-mode.
Emacs lisp变量可以是global或buffer-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室,希望对你有所帮助.