首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么Emacs的local- set -key不覆盖模式钩子中的全局set- key?

Emacs 的 local-set-keyglobal-set-key 是用于设置键盘快捷键的两个命令,它们的作用范围不同。理解它们的工作原理有助于解释为什么 local-set-key 不会覆盖模式钩子中的 global-set-key

基础概念

  1. Global Keybindings(全局键绑定):
    • 使用 global-set-key 设置的键绑定在整个 Emacs 环境中都有效。
    • 这些键绑定对所有模式都适用,除非在特定模式中被覆盖。
  • Local Keybindings(局部键绑定):
    • 使用 local-set-key 设置的键绑定仅对当前缓冲区的模式有效。
    • 当切换到另一个模式或缓冲区时,这些键绑定不再生效。
  • Mode Hooks(模式钩子):
    • 模式钩子是在进入特定模式时运行的函数列表。
    • 在模式钩子中设置的键绑定通常是局部的,仅在该模式下有效。

为什么 local-set-key 不覆盖模式钩子中的 global-set-key

  • 作用域限制: local-set-key 设置的键绑定仅对当前缓冲区的特定模式有效,而 global-set-key 设置的键绑定在整个 Emacs 环境中都有效。
  • 执行顺序: 当 Emacs 进入一个模式时,它会首先应用该模式的局部键绑定,然后应用全局键绑定。如果在模式钩子中设置了全局键绑定,这些设置会在局部键绑定之前生效。

解决方法

如果你希望 local-set-key 覆盖模式钩子中的 global-set-key,可以考虑以下方法:

  1. 在模式钩子中移除全局键绑定: 在进入特定模式时,先移除全局键绑定,再设置局部键绑定。
  2. 在模式钩子中移除全局键绑定: 在进入特定模式时,先移除全局键绑定,再设置局部键绑定。
  3. 使用 define-key 直接在模式映射中设置键绑定: 这种方法直接在模式的键映射中设置键绑定,确保优先级高于全局键绑定。
  4. 使用 define-key 直接在模式映射中设置键绑定: 这种方法直接在模式的键映射中设置键绑定,确保优先级高于全局键绑定。

应用场景

  • 避免冲突: 在不同的模式下使用相同的快捷键,但希望它们的行为不同。
  • 提高效率: 为特定任务或编辑模式定制快捷键,提升工作效率。

示例代码

假设你有一个全局快捷键 C-c a,但在 my-mode 中希望它执行不同的功能:

代码语言:txt
复制
;; 全局设置
(global-set-key (kbd "C-c a") 'global-function)

;; 在 my-mode 中覆盖
(defun my-mode-setup ()
  (local-unset-key (kbd "C-c a"))
  (local-set-key (kbd "C-c a") 'my-mode-function))

(add-hook 'my-mode-hook 'my-mode-setup)

通过这种方式,你可以在 my-mode 中使用 C-c a 执行 my-mode-function,而在其他模式下仍然执行 global-function

希望这些解释和示例代码能帮助你理解 Emacs 中键绑定的工作原理及解决方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 2022必会的vue高频面试题(附答案)

    为什么vue组件中data必须是一个函数?...Vue 为什么要用 vm.$set() 解决对象新增属性不能响应的问题 ?你能说说如下代码的实现原理么?1)Vue为什么要用vm....动更新,让开发者从繁琐的⼿动dom中解放缺点:Bug很难被调试: 因为使⽤双向绑定的模式,当你看到界⾯异常了,有可能是你View的代码有Bug,也可能是Model的代码有问题。...vue-router 路由钩子函数是什么 执行顺序是什么路由钩子的执行流程, 钩子函数种类有:全局守卫、路由守卫、组件守卫完整的导航解析流程:导航被触发。...在被激活的组件里调用 beforeRouteEnter。调用全局的 beforeResolve 守卫 (2.5+)。导航被确认。调用全局的 afterEach 钩子。触发 DOM 更新。

    2.9K40

    告别Vuex,发挥compositionAPI的优势,打造Vue3专用的轻量级状态 定义main.jscontroller组件设置监听和钩子局部状态

    、组件、代码位置(开发模式)、修改时间、状态、属性名(含路径)、原值、新值。...changeLog: [], // 内部钩子,key:数组 _watch: {}, // 外部函数,设置钩子,key:回调函数 watch: {}, // 状态的初始化回调函数...,不拦截 get: function (target, key, receiver) { const __path = getPath(key) _getPath = _...set 操作,实现记录日志、改变状态的函数、组件、位置等功能。...我们可以直接指定要监听的状态,不会影响其他状态,在钩子里面可以获取当前 set产生的日志,从而获得各种信息。 还可以通过返回值的方式来影响状态的改变: 没有返回值:允许状态的改变。

    1.1K20

    19 道高频 vue 面试题解答(下)

    ,但是在不同的场景中,该行为有不同的实现方案-比如选项的合并策略...其他模式欢迎补充生命周期钩子是如何实现的Vue 的生命周期钩子核心实现是利用发布订阅模式先把用户传入的的生命周期钩子订阅好(内部采用数组的方式存储...为什么Vue采用异步渲染呢?Vue 是组件级更新,如果不采用异步更新,那么每次更新数据都会对当前组件进行重新渲染,所以为了性能,Vue 会在本轮数据更新后,在异步更新视图。核心思想nextTick 。...hash模式下,仅hash符号之前的url会被包含在请求中,后端如果没有做到对路由的全覆盖,也不会返回404错误;history模式下,前端的url必须和实际向后端发起请求的url一致,如果没有对用的路由处理...$set() 解决对象新增属性不能响应的问题 ?你能说说如下代码的实现原理么?1)Vue为什么要用vm....在将要进入的路由组件中调用 beforeRouteEnter调用全局解析守卫 beforeResolve导航被确认。调用全局后置钩子的 afterEach 钩子。触发DOM更新(mounted)。

    1.9K00

    【面试题】973- 一篇由简到难的 Vue 面试题+详解答案

    9 v-if 与 v-for 为什么不建议一起使用 v-for 和 v-if 不要在同一个标签中使用,因为解析时先解析 v-for 再解析 v-if。...[7] 19 vue-router 路由钩子函数是什么 执行顺序是什么 路由钩子的执行流程, 钩子函数种类有:全局守卫、路由守卫、组件守卫 「完整的导航解析流程:」 导航被触发。...在被激活的组件里调用 beforeRouteEnter。 调用全局的 beforeResolve 守卫 (2.5+)。 导航被确认。 调用全局的 afterEach 钩子。 触发 DOM 更新。...vuex 的个人理解 vuex 是专门为 vue 提供的全局状态管理系统,用于多个组件中数据共享、数据缓存等。...Vue 的生命周期钩子核心实现是利用发布订阅模式先把用户传入的的生命周期钩子订阅好(内部采用数组的方式存储)然后在创建组件实例的过程中会一次执行对应的钩子方法(发布) 相关代码如下 export function

    90821

    前端vue面试题2020及答案_c++ 面试题

    117.Vue.set 改变数组和对象中的属性 118.vm.$set(obj, key, val) 做了什么? 119.第一次页面加载会触发哪几个钩子?...36.v-if和v-for为什么不建议一起使用?...钩子函数种类有: 全局的路由钩子函数:beforeEach、afterEach(一般用于全局进行权限跳转) 单个的路由钩子函数:beforeEnter、beforeLeave(路由内部钩子,一般在路由表里...1.全局路由 全局导航钩子主要有两种钩子:前置守卫(beforeEach)、后置钩子(afterEach) 2....Vue中组件神兵利器,插槽Slot 128.v-for 为什么要加上 key key 的主要功能是提高 vdom 的更新速度;因为 vue 在 patch (补丁)过程中的 diff 算法对新旧节点比对时是可以通过

    4.2K10

    【Vuejs】1146- 这些 Vue 的技巧你都掌握了吗?

    Hash模式中Hash变化会被浏览器记录(onhashchange事件),History模式利用 H5 新增的pushState和replaceState方法可改变浏览器历史记录栈。...* 如果是根组件,走当前 else 分支 * 合并 Vue 的全局配置到根组件中,如 Vue.component 注册的全局组件合并到根组件的 components 的选项中...组件中的 data 为什么是个函数 对象在栈中存储的都是地址,函数的作用就是属性私有化,保证组件修改自身属性时不会影响其他复用组件。...$set 如何解决对象新增属性不能响应的问题 Vue.$set的出现是由于Object.defineProperty的局限性:无法检测对象属性的新增或删除。...mixin 混入分全局混入和局部混入,本质是 JS 对象,如 data、components、computed、methods 等。 全局混入不推荐使用,会影响后续每个Vue实例的创建。

    1.7K20

    上帝视角看Vue源码整体架构+相关源码问答

    beforeCreate 钩子函数前完成了什么?父子组件中,子组件调用执行本身注册的自定义事件 A(),那么父子组件中,谁监听事件 A() 的执行调用?created 钩子函数前完成了什么?...思考问题后,答案在下方,根据自己阅读整理源码,对自己提出有意义的问题并自我回答。不确保是面试热点题噢(切勿入题太深)致命五答一答问:什么是 MVVM 模式?...三答问:Vue 中当父子组件配置选项发生冲突时,是如何处理?答:Vue 混合父子组件配置选项时,采用配置项的 key 值作为标识,若 key 值相等冲突,则子组件的配置选项将覆盖父组件的配置选项。...若节点 key 值相等且节点不同,新节点会覆盖旧节点吗?vnode 是什么?有什么用?Vue 如何处理 Vnode 上的属性?...undefined最后新老数组中某一数组遍历完成,则进行添加或删除节点操作。五答问:若节点 key 值相等且节点不同,新节点会覆盖旧节点吗?

    1.8K10

    前端一面经典vue面试题(持续更新中)

    因此,我们有必要把组件的共享状态抽取出来,以一个全局单例模式管理。通过定义和隔离状态管理中的各种概念并通过强制规则维持视图和状态间的独立性,我们的代码将会变得更结构化且易维护。.../src/views/xxx.vue'), meta:{ keepAlive: true // 需要被缓存 }},v-for 为什么要加 key如果不使用 key,Vue 会使用一种最大限度减少动态元素并且尽可能的尝试就地修改...set, // 当修改属性时调用此方法};对 React 和 Vue 的理解,它们的异同相似之处:都将注意力集中保持在核心库,而将其他功能如路由和全局状态管理交给相关的库;都有自己的构建工具,能让你得到一个根据最佳实践设置的项目模板...mixin,但是如果不滥用的话也是很有帮助的,比如可以全局混入封装好的 ajax 或者一些工具函数等等。...Vue生命周期钩子是如何实现的vue的生命周期钩子就是回调函数而已,当创建组件实例的过程中会调用对应的钩子方法内部会对钩子函数进行处理,将钩子函数维护成数组的形式Vue 的生命周期钩子核心实现是利用发布订阅模式先把用户传入的的生命周期钩子订阅好

    91830

    面试官:说说你对vue的mixin的理解,有哪些应用场景?

    ,当组件使用 mixins对象时所有mixins对象的选项都将被混入该组件本身的选项中来 在Vue中我们可以局部混入跟全局混入 局部混入 定义一个mixin对象,有组件options的data、methods...里面的方法,在自动执行create生命钩子,执行hello方法 全局混入 通过Vue.mixin()进行全局的混入 Vue.mixin({ created: function () {...,进行递归合并的时候组件的选项会覆盖mixin的选项 但是如果相同选项为生命周期钩子的时候,会合并成一个数组,先执行mixin的钩子,再执行组件的钩子 二、使用场景 在日常的开发中,我们经常会遇到在不同的组件中经常会需要用到一些相同或者相似的代码...hasOwn(parent, key)) { // 如果parent已经处理过某个key 就不处理了 mergeField(key) // 处理child中的key 也就parent中没有处理过的...data 的所有属性,然后根据不同情况进行合并: 当目标 data 对象不包含当前属性时,调用 set 方法进行合并(set方法其实就是一些合并重新赋值的方法) 当目标 data 对象包含当前属性并且当前值为纯对象时

    1.9K10

    进程间通讯(五).message queue(2)

    @ubuntu:~/c$ 编译执行过程中没有报错,从结果来看,符合预期 ---- ftok 此函数的原型在 sys/ipc.h 中 /* Generates key for System V style...type System V IPC key 此函数把从pathname导出的信息与id的低序8位组合成一个整数IPC键 ---- key_t emacs@ubuntu:/usr/include$ grep...如果不指定这个参数,那么进程将被阻塞直到函数可以从队列中得到符合条件的消息为止。如果一个client 正在等待消息的时候队列被删除,EIDRM 就会被返回。...如果不指定这个参数,E2BIG 将被返回,而消息则留在队列中不被取出。当消息从队列内取出后,相应的消息就从队列中删除了。...' options. */ //把msgid_ds结构中的数据设置为消息队列的当前关联值,即用消息队列的当前关联值覆盖msgid_ds的值 __buf msqid_ds 结构体指针 对删除消息队列的处理不是很完善

    83920

    前端一面高频react面试题(持续更新中)

    ,只是合成事件和钩子函数中没法立马拿到更新后的值,形成了所谓的异步。...当然可以通过 setState 的第二个参数中的 callback 拿到更新后的结果setState 的批量更新优化也是建立在异步(合成事件、钩子函数)之上的,在原生事件和 setTimeout 中不会批量更新...,在异步中如果对同一个值进行多次 setState,setState 的批量更新策略会对其进行覆盖,去最后一次的执行,如果是同时 setState 多个不同的值,在更新时会对其进行合并批量更新合成事件中是异步钩子函数中的是异步原生事件中是同步...\local- cli\server\server.js文件配置中的 default端口值。...它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。通过自定义hook,可以复用代码逻辑。

    1.8K20

    【Vuejs】778- 超全 Vuejs 知识点(基础到进阶)

    如果应用够简单,最好不要使用 Vuex,一个简单的 store 模式即可 需要构建一个中大型单页应用时,使用Vuex能更好地在组件外部管理状态 Vuex和单纯的全局对象有什么区别?...为什么 Vuex 的 mutation 中不能做异步操作?...为什么 v-for 和 v-if 不建议用在一起 当 v-for 和 v-if 处于同一个节点时,v-for 的优先级比 v-if 更高,这意味着 v-if 将分别重复运行于每个 v-for 循环中。...更快速:利用 key 的唯一性生成 map 对象来获取对应节点,比遍历方式更快 为什么不建议用index作为key不建议 用index 作为 key,和没写基本上没区别,因为不管你数组的顺序怎么颠倒,index.../Foo.vue') 复制代码 Vue-router 导航守卫有哪些 全局前置/钩子:beforeEach、beforeResolve、afterEach 路由独享的守卫:beforeEnter 组件内的守卫

    3.3K51

    从源码解读 - Vue常考面试题

    6、Vue.set 方法是如何实现的? 7、Vue中模板编译原理?...一般在哪一步发起请求及原因 2、生命周期钩子是如何实现的? 3、Vue 的父组件和子组件生命周期钩子执行顺序 三、常考-组件通信 1、Vue中的组件的data 为什么是一个函数?...核心是一个发布订阅模式,将钩子订阅好(内部采用数组的方式存储),在对应的阶段进行发布。...四、常考-路由 ---- Vue-router有几种钩子函数?具体是什么及执行流程是怎样的? ---- 核心答案: 路由钩子的执行流程,钩子函数种类有:全局守卫、路由守卫、组件守卫。...10.调用全局的afterEach钩子; 11.DOM更新; 12.用创建好的实例调用beforeRouteEnter守卫中传给next的回调函数。

    3K22

    Python 键盘鼠标监听

    如下: HookManager() 创建一个“钩子”管家,便于接下的全局设置 HookManager.onMouseEvent + HookManager.HookMouse() 监听鼠标事件...# 写一个保存到本地文件的方法,而且应该以写二进制的方式来写入,设置result为全局的,避免文件被覆盖 global result file = open(r'F:/log.txt...可以直接设置而空而使用默认值 pythoncom.PumpMessages() # 我也不知道为什么直接放置到main函数中不管用 if __name__ == "__main__":...这是实时的检测结果,是我在程序中添加设置result为全局的,避免文件被覆盖 时所截获的数据流。 问题分析 在上面的代码中,注释已经做的很详细了。...使用了全局变量result: 这里就是为了防止在向文件中写入数据的时候覆盖之前的文件信息 。 在判断键盘按下Q键的时候,停止键盘事件的记录。

    3.2K10
    领券