如何从Yi编辑器中添加绑定到搜索Hoogle?

时间:2014-09-18 03:16:33

标签: haskell editor yi-editor

我正在尝试学习 Yi 文本编辑器。我使用Vim绑定提供的默认配置,但我想开始尝试自己的配置。

我可以看到Gwern's configuration基于Emacs键映射,并添加绑定以搜索Hoogle。我想创建与Vim绑定类似的东西,但是配置API上没有大量文档,并且大多数example configs对于初学者来说很难理解。例如,使用来自cleverMode的{​​{1}}和来自Yi.Mode.Haskell的{​​{1}}创建的绑定之间的区别是什么?

开始攻击Yi配置的最简单方法是什么?哪个API文档最适合初学者入门?

1 个答案:

答案 0 :(得分:3)

此信息将进入文档页面,很快就会出现。文档最终应该在http://yi-editor.github.io/处提供。一旦启动并运行,这应该是初学者的最佳文档。由于这可能需要一段时间,我会在这里尝试为你解答。

这应该是一个很好的配置开始。

import           Yi
import           Yi.Keymap.Vim
import qualified Yi.Keymap.Vim2        as V2
import qualified Yi.Keymap.Vim2.Common as V2
import qualified Yi.Keymap.Vim2.Utils  as V2

import           Yi.Hoogle (hoogleSearch)

main = yi $ myConfig

myConfig = defaultVimConfig { defaultKm = myKeymap }

myKeymap = v2KeymapSet $ myBindings

myBindings :: (String -> EditorM ()) -> [V2.VimBinding]
myBindings eval =
  [ nmap  "Y"          (eval "yy")
  , nmap' (leader "h") (hoogleSearch)
  , imap  "<End>"      (withBuffer0 moveToEol)
  ]

-- Don't read the following, it's not important.
-- Boilerplate begins here

v2KeymapSet :: ((String -> EditorM ()) -> [V2.VimBinding]) -> KeymapSet
v2KeymapSet myBindings = V2.mkKeymapSet $ V2.defVimConfig `override` \super this ->
    let eval = V2.pureEval this
    in super {
          V2.vimBindings = myBindings eval ++ V2.vimBindings super
        }

nmap  x y = V2.mkStringBindingE V2.Normal V2.Drop (x, y, id)
imap  x y = V2.VimBindingE (\evs state -> case V2.vsMode state of
                            V2.Insert _ ->
                                fmap (const (y >> return V2.Continue))
                                     (evs `V2.matchesString` x)
                            _ -> V2.NoMatch)
nmap'  x y = V2.mkStringBindingY V2.Normal (x, y, id)

leader str = "\\" ++ str

-- Boilerplate ends here

不要担心样板。我真的认为应该把它嵌入到易建联。忽略样板,配置看起来非常简单。

了解nmap,imap,nmap',eval和leader非常重要。

nmap和imap与你在真实vim中使用的类似。 nmap在vim的普通模式下映射一个键,imap在vim的插入模式下映射一个键。

eval可以评估击键。因此,使用nmap“Y”的行使正常模式下的Y执行与“yy”在正常模式下完成的操作相同的操作。这是重新绑定密钥的好方法。

领导者,只需将领导者密钥定义为\。所以,现在,(领导者“h”)只是意味着按下\ h。

nmap'是必需的,因为有EditorM函数和YiM函数。 nmap适用于EditorM,而nmap'适用于YiM。理解这一点需要一些关于易如何工作的知识,我不会理解。为了简单起见,hoogleSearch函数的类型为YiM,因此您需要nmap'。

这应该为您提供使用Vim键映射扩展Yi的基本布局。

使用此配置,\ h应该触发hoogleSearch,因为我们使用nmap'绑定它。

将键映射添加到mkKeymap和cleverMode之间的区别在于,将其添加到cleverMode只能在haskell文件中启用键映射,而将其添加到mkKeymap会将其添加到Yi,而不管您正在编辑哪个文件。当你刚开始使用Yi时,你可能并不在乎这个。

我希望有所帮助。如果您有任何疑问,请随时在github上提及它,或者在IRC上跳到#yi。