我刚开始研究一种工具来帮助我提高Vim的工作效率.我希望它将每个击键记录到一个文件,然后识别低效的使用模式.我希望它为每次击键存储一个时间戳.
我尝试使用-w和-W vim选项将每个击键转储到管道.但是,Vim不会在线报告击键,因此我无法获得可靠的时间戳.
我也尝试拦截来自tty的输入,将其写入管道并将其重定向为Vim的stdin.但随后Vim退出:
Vim: Warning: Input is not from a terminal
Run Code Online (Sandbox Code Playgroud)
我也发现了捕获每个键的技巧:http://vim.wikia.com/wiki/Capture_all_keys.我对vimscript一无所知,但我觉得这不是我想要的.
所以我现在的想法是:我需要拦截来自tty的输入,处理它然后将它写入Vim将用作输入的一些假tty.你是否同意这是最好的方法?如果是这样,有关我如何做到这一点的任何提示?
t (ErrorT String IO) a在t IO amonad中运行带有类型的代码的最佳方法是什么?请考虑以下代码:
module Sample where
import System.IO
import Control.Monad.Reader
import Control.Monad.Error
type Env = String
inner :: ReaderT Env (ErrorT String IO) ()
inner = do
s <- ask
fail s
outer :: ReaderT Env IO ()
outer = do
env <- ask
res <- lift $ runErrorT $ runReaderT inner env
case res of
Left err -> liftIO $ hPutStrLn stderr err
Right _ -> return ()
outer
Run Code Online (Sandbox Code Playgroud)
这有效,但我一直在寻找一种更优雅的方式在我的堆栈底部插入ErrorT.特别是我在我的项目中使用了几个不同的monad变换器堆栈,并且为每个变换器堆栈编写上面的内容非常繁琐.
我在寻找类似的东西:
outer …Run Code Online (Sandbox Code Playgroud)