在启用emacs服务器的情况下,如何使部分emacs配置缓冲区或模式成为本地模式?

在启用emacs服务器的情况下,如何使部分emacs配置缓冲区或模式成为本地模式?,emacs,server,client,Emacs,Server,Client,我听说很多人使用Emacs客户端来提高速度,但当我尝试它时,我遇到了一些问题 这里有一个例子来帮助解释。 我有语义模式钩住C++模式,这意味着如果我打开C++文件,语义模式就会被激活。但是由于语义模式是在服务器中打开的,所以它不会随着客户机而消失。然后,如果我打开一个python脚本,语义模式也会出现,这是不需要的 更一般地说,一个缓冲区中大多数经过评估的lisp函数都会对其他缓冲区产生影响,在大多数情况下,这些影响并不受欢迎 我想知道是否有任何方法可以限制配置的一部分以缓冲本地数据?这样我就可

我听说很多人使用Emacs客户端来提高速度,但当我尝试它时,我遇到了一些问题

这里有一个例子来帮助解释。 我有语义模式钩住C++模式,这意味着如果我打开C++文件,语义模式就会被激活。但是由于语义模式是在服务器中打开的,所以它不会随着客户机而消失。然后,如果我打开一个python脚本,语义模式也会出现,这是不需要的

更一般地说,一个缓冲区中大多数经过评估的lisp函数都会对其他缓冲区产生影响,在大多数情况下,这些影响并不受欢迎


我想知道是否有任何方法可以限制配置的一部分以缓冲本地数据?这样我就可以为所有缓冲区配置一部分,而其他一些缓冲区只在特定的缓冲区内或使用特定的模式?换句话说,当我离开缓冲区时,我想使一些计算函数的效果消失或恢复。搜索Google没有得到任何相关的答案。

客户端只是访问Emacs实例的接口。如果您愿意,可以在服务器上打开一个窗口。他们没有自己的elisp环境;如果需要,您需要运行多个Emacs实例。

从Emacs的角度来看,通过EmacClient执行操作与在普通Emacs中执行操作没有区别。因此,您看到的问题在运行普通emacs时一定也是一个问题

我们需要更多的信息来了解您到底关心什么。语义模式运行的问题是什么?它会导致python编码出现问题吗

并不是说你可以用M-x语义模式转换语义模式

问题在于如何启动语义模式。例如,在引擎盖中对其进行ut是很常见的,但是如果您使用了类似于prog模式钩子而不是c++模式钩子的东西,那么无论何时运行编程模式(或从prog模式派生的模式),它都会启动


如果您提供更多关于如何启动语义模式的详细信息,以及您在尝试切换到python编程时看到的实际问题,我们可能会提供更具体的帮助。

语义模式是一种全局次要模式,这意味着您无法对单个缓冲区或主要模式禁用它。但是,有一个钩子
语义抑制函数可以使用

(defun jpk/semantic-inhibit-function ()
  (eq major-mode 'python-mode))
(add-hook 'semantic-inhibit-functions #'jpk/semantic-inhibit-function)
这基本上与这个答案相反:


一般答案,但并不适用于这个问题:

按主模式进行操作的正常方式是使用挂钩。每个主要模式都有一个挂钩,通常称为
foo模式挂钩
,例如
foo模式
。它是当主模式被激活时被调用的函数列表。还有其他的钩子,比如
prog-modehook
,几乎每种编程主要模式都会调用它;类C语言也有
C-common-mode-hook

(defun jpk/python-mode-hook ()
  (semantic-mode -1))
(add-hook 'python-mode-hook #'jpk/python-mode-hook)
我建议对钩子使用
defun
s而不是
lambda
s,因为这样很容易使用
remove hook


如果要按缓冲区执行操作,请使用文件局部变量,或者查看主模式挂钩中的
(缓冲区名称)

语义模式就是一个示例。对于不同的主要模式,我有一些特定的配置功能,语义是C++模式配置的一部分。即使我切换到不同的主模式,这些配置中的一些仍将持续,而其他一些将消失。所以我想让所有这些配置都像一个局部变量一样,当我进入一个特定的主模式或缓冲区时,它们会被计算,在我离开主模式或缓冲区后,它会恢复到配置函数计算前的状态。或者让两个缓冲区像两个不同的进程一样工作。您需要提供具体的示例。特别是,显示一个模式中的配置如何影响另一个模式——例如,在C++、模式中有键绑定,但不希望在Python模式下绑定该键。通常,如果您对影响不相关模式的模式有一些配置,那么配置是在错误的级别定义/加载的,即错误的钩子、错误的键映射等。有时您只需要在适当的钩子中打开/关闭,但没有具体的示例,我无法提供更多,因此我已经为python模式配置了elpy,如果在python模式下激活语义模式,它将告诉我找不到导入模块。但实际上我在编写python时不需要语义模式,因为我已经有了elpy。另外,如果我在打开python文件之后打开一个c文件,那么虚拟环境就在那里,在用c编写代码时不需要虚拟环境。我要把他们孤立起来。你挑个难对付的例子!Elpy有点不寻常,因为它与其说是一种模式,不如说是一些将许多不同模式粘在一起的代码,这些模式对于在emacs中编写python代码非常有用。这会使itt很难准确地找到需要配置的位。但是,我怀疑其他评论中提到的语义禁止函数方法是在python模式下关闭语义支持的最佳选择。有可能限制特定缓冲区中的效果,比如将变量限制为缓冲区局部?任何变量都可以有缓冲区局部值,但是,您不能对elisp环境进行任意更改,这些更改只能在一个缓冲区(或帧/终端/客户端)中有效,因此您需要询问特定的问题。我建议发布一个新问题,解释你遇到的问题,然后人们可以帮助解决个别问题。我理解这些问题。在我所说的问题中,语义是以C++模式钩住的。但在离开C++模式后,语义模式仍然被激活。抱歉,我不熟悉<代码>语义模式< /代码>。这是一个全局次要模式,所以不能对单个缓冲区关闭它。但我在那里