在 Pharo 中重新加载键盘快捷键定义

Reloading keyboard shortcut definitions in Pharo

我一直在使用 Pharo 7.0 中的键盘快捷键。我想在 Smalltalk 编辑器中修改 #jumpToNextKeywordOfIt 的绑定,所以我在 buildShortcutsOn 方法的定义中进行了以下更改:

(aBuilder shortcut: #jumpToNextKeywordOfIt)
    category: RubSmalltalkEditor name
    default: $y meta shift
    do: [ :target | target editor jumpToNextKeywordOfIt: true ]
    description: 'Jump to next keyword'.    

我的第一个想法是只保存这个定义应该会立即生效,但事实并非如此。然后我想,也许既然这是方法定义的一部分,那么在编辑器 class 上调用这个方法就可以了。现在,该方法接受一个参数 aBuilder,我真的不知道那是什么。于是出现两个问题:

  1. 这是将键绑定更改应用于 运行 编辑器的正确方法吗?
  2. 在此上下文中,aBuilder 是什么?如何获得它?

让我给你一些关于如何找到解决方案的提示(因为这可能比立即给出解决方案更有价值)

问题是 aBuilder 对吗?好吧,从表达式

(aBuilder shortcut: #jumpToNextKeywordOfIt)

我们推断 aBuilder 是响应 #shortcut: 的人。 Cmd+m 你会得到 #shortcut: 的 9 个实现者。其中之一,KMBuilder 有一个有趣的名字。而且,它对shortcut:的实现是

shortcut: aKeymapName
  ^KMKeymapBuilder 
    for: aKeymapName
    platform: platform

意味着它会用 KMKeymapBuilder 的实例来回答。浏览此 class 并验证它是否理解您的表达式中的下一条消息:

category: RubSmalltalkEditor name
default: $y meta shift
do: [ :target | target editor jumpToNextKeywordOfIt: true ]
description: 'Jump to next keyword'.

确实如此!所以一定是这个!要检查这一点,我们仍然需要一个 KMBuilder 的实例。浏览 class,转到 class 端并找到一元消息 #keymap.

这意味着我们可以通过评估

得到aBuilder
KMBuilder keymap

我喜欢一元消息。特别是当他们站在 class 一边时!

现在转到您已经调整的方法的实现者 #buildShortcutsOn:。它在 class 端实现,我们现在可以评估:

RubTextEditor buildShortcutsOn: KMBuilder keymap

为确保它有效,现在转到所需的处理程序 #jumpToNextKeywordOfIt: 并在其中插入 halt。这是在同一个class,实例端。

现在让我们按 Cmd+Shift+y 看看我们是否能停止……宾果游戏!我的意思是,停止!