小编Woj*_*ski的帖子

记录/拦截Vim中的每次击键

我刚开始研究一种工具来帮助我提高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.你是否同意这是最好的方法?如果是这样,有关我如何做到这一点的任何提示?

vim logging tty keylogger

8
推荐指数
1
解决办法
1335
查看次数

在变压器堆栈的基础上插入ErrorT

t (ErrorT String IO) at 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)

error-handling monads haskell monad-transformers

4
推荐指数
2
解决办法
218
查看次数