我正在尝试学习 Yi 文本编辑器。我使用Vim绑定提供的默认配置,但我想开始尝试自己的配置。
我可以看到Gwern's configuration基于Emacs键映射,并添加绑定以搜索Hoogle。我想创建与Vim绑定类似的东西,但是配置API上没有大量文档,并且大多数example configs对于初学者来说很难理解。例如,使用来自cleverMode
的{{1}}和来自Yi.Mode.Haskell
的{{1}}创建的绑定之间的区别是什么?
开始攻击Yi配置的最简单方法是什么?哪个API文档最适合初学者入门?
答案 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。