如何在Emacs中使用公共键绑定弹出本地和全局标记

如何在Emacs中使用公共键绑定弹出本地和全局标记,emacs,elisp,configuration-files,key-bindings,keymaps,Emacs,Elisp,Configuration Files,Key Bindings,Keymaps,有没有办法将本地和全球商标结合在一起?我试图做的只是将一个公共键绑定到pop global mark和set mark命令。有点像;“尝试弹出本地标记,如果没有剩余标记,则尝试弹出全局标记” 这需要在代码中向后移动,而不是考虑是否应该按C-u C-SPC或C-x C-SPC,这取决于函数之间的跳转是在同一个文件的内部还是外部。首先,您不能真正在代码中使用,因为它会进行检查,因此无法按预期工作 然而,在检查其代码时,我想到了(未经测试的!): 我想你可能有一种误解,认为C-u C-SPC和C-x

有没有办法将本地和全球商标结合在一起?我试图做的只是将一个公共键绑定到pop global markset mark命令。有点像;“尝试弹出本地标记,如果没有剩余标记,则尝试弹出全局标记”


这需要在代码中向后移动,而不是考虑是否应该按
C-u C-SPC
C-x C-SPC
,这取决于函数之间的跳转是在同一个文件的内部还是外部。首先,您不能真正在代码中使用,因为它会进行检查,因此无法按预期工作

然而,在检查其代码时,我想到了(未经测试的!):


我想你可能有一种误解,认为
C-u C-SPC
C-x C-SPC
实际上“pop”从缩短它们的意义上来说,标记环是。我这样说是因为你写了“如果没有剩余的”

他们没有。他们循环标记环。因此,继续弹出本地标记环不会最终导致其为空,从而允许您设想的命令继续弹出全局标记环

这两个环是分开的,主要是因为它们的用途不同。全局环将您从一个缓冲区转到另一个缓冲区(仅限)。局部环在单个缓冲区内移动(仅限)

所以我的建议是不要寻找你正在寻找的;-)。或者,如果您真的需要它,那么可以定义实际弹出环的命令,即删除标记

FWIW,这两个命令还有其他选择,包括允许您查看与标记关联的文本并使用(例如完成)选择目标的命令


例如,
C-u C-SPC
将标记循环与设置标记结合起来,作为你的介绍句请求(但不是作为你的标题请求——有单独的冰柱命令用于循环本地和全局环)。类似地,
C-xc-SPC
对全局环执行此操作。在Icicle模式下,默认情况下,这些键绑定到
ICICICLE goto marker或set mark command
ICICICLE goto global marker或pop global mark

嗯,我要找的是从一个函数调用跳到另一个函数调用(即使函数在同一个文件中或跨不同的文件)然后以相同的方式返回,但方向相反。顺便说一句,我同时使用语义,所以我使用语义ia快速跳转,并将set mark命令作为参数4传递,以返回。但最后一个只能在同一个本地文件中工作,这就是为什么我需要与pop global mark结合。所以我想找到的是语义-ia-fast-jump的模拟函数。对不起,我不使用语义,所以我不能帮你。希望其他人会。但是,我要补充的是,您也可以使用,包括。只需按一个键即可将某个位置标记为书签;无需提供书签名称。您还可以选择高亮显示位置(例如,条纹中的标记)。你可以在一组书签中看到,我只看到一个奇怪的行为。当我从一个文件返回到另一个文件时,它实际上不会跳到调用函数行,而是从调用函数行所在的同一个本地文件跳到上一个标记。为了重现这一点,我在同一个文件中的函数之间跳转,然后跳转到另一个文件中的函数,然后尝试返回。
(defun pop-local-or-global-mark ()
  "Pop to local mark if it exists or to the global mark if it does not."
  (interactive)
  (if (mark t)
      (pop-to-mark-command)
      (pop-global-mark)))