Elm 0.17及更高版本中的键盘组合

Elm 0.17及更高版本中的键盘组合,elm,Elm,如何在Elm应用程序中构建键盘组合,例如“shift+alt+enter”?您可以这样做,以对按下的单个键(例如enter键)做出反应: 但是如何对多个按下的键执行相同的操作?您可以使用所述的键盘.downs,以及设置来跟踪按下的键。您需要查看Keyboard.ups,并了解按键何时释放 以下是一个工作示例: 导入Html公开(…) 导入Html.App(程序) 导入键盘(…) 导入集合(集合) 导入字符 主要= 程序{init=(initialModel,Cmd.none),view=view

如何在Elm应用程序中构建键盘组合,例如“shift+alt+enter”?您可以这样做,以对按下的单个键(例如enter键)做出反应:


但是如何对多个按下的键执行相同的操作?

您可以使用所述的
键盘.downs
,以及
设置来跟踪按下的键。您需要查看
Keyboard.ups
,并了解按键何时释放

以下是一个工作示例:

导入Html公开(…)
导入Html.App(程序)
导入键盘(…)
导入集合(集合)
导入字符
主要=
程序{init=(initialModel,Cmd.none),view=view,update=update,subscriptions=subscriptions}
初始模型=
{keysDown=Set.empty
}
查看:模型->Html消息
视图模型=
正文
({model | keysDown=Set.remove key model.keysDown},Cmd.none)
订阅=
子批次
[键盘,向下键]
,Keyboard.ups KeyUp
]
来自:

从长远来看,帮助跟踪关键点组合和几个其他常见场景是有意义的。如果您认为此库可以更直接地解决特定问题,请将其描述为问题中的SSCCE。请不要建议解决方案。请描述一下情景。一旦人们的意图变得更加清晰,就应该以连贯的方式为这些案例提供支持

所以,至少这意味着它现在不受支持。我不完全确定这是否意味着你应该公开一个问题来鼓励以后的添加

现在,查德的回答对我来说似乎是一个很好的临时解决方案。Sweet建议只跟踪几个修改键,这样看起来更好。请注意,如果采用这种方法,您不需要依赖任何
列表
集合
,但您可以使用4个布尔值的小记录


最后,如果出于某些原因希望跟踪所有关键点(例如,如果希望用户能够链接[F1]对于某些操作,从性能角度来看,使用更有效的集合表示是有意义的。例如,有限集合的任何子集都可以定义为单个数字,每一位都是布尔值,表示缺少或存在一个特定元素。您可以使用库来做这些事情。

您考虑过维护集合的列表吗向下键使用?我想为您创建一个示例应用程序,但我还没有接受0.17中的突破性更改。@pdoherty926是的,我确实接受了,我有点担心最终不得不这样做,我只是觉得“征税”感觉有点不对在写密集型应用程序中,每个按键上的系统都会接收大量按键。例如“在列表中查找并删除按键”关于每一个关键点?我必须说,我不知道这类东西的效率有多高,也许是微不足道的。我认为你的担心是正确的,我只是不知道使用可用API的替代方法。不过,为了跟进我最初的建议,你可能会想使用集合而不是列表。谢谢你的回答g、 你认为在每一个键的上下跟踪和操作都会有性能问题吗?只是出于好奇-为什么要选择集合而不是列表(对它们没有太多作用)集合将提供比这种情况下的列表更好的性能。在一个列表中,您每次需要添加或删除一个项目时都必须遍历该列表。对于其他想要实现相同目标的人,我从Alexlew on Slack那里得到了一个好主意-这可以归结为只添加和删除集合中的修改键,而忽略其余的因为您只需要跟踪三到四个键(ctrl、shift、alt、cmd),并且您只需要对这些特定键的设置进行任何检查就可以了。感谢您对如何使事情变得更加高效的深入了解!
import Keyboard

type Msg
  = KeyDown Keyboard.KeyCode

type alias Model =
  ...

update msg model =
    case msg of
        KeyDown key ->
          handleKeyDown key model

subscriptions model =
    Sub.batch
        [ 
          Keyboard.downs KeyDown
        ]

handleKeyDown key model =
  case key of
    13 -> -- Enter key
      Debug.log "Other key"
      model

    _ -> -- Any other key
      Debug.log "Other key"
      model


view model =
    ...