某些Vim命令可以将表达式作为前缀,如100j
或20k
,如何映射整个命令?我想在调用给定命令之前调用Vim函数。
编辑:我想将j / k的先前输入数保留为重复次数,调用函数可能不相关。例如,我想在每个j或k命令之前做一些簿记,但我不想打破数字前缀。
答案 0 :(得分:1)
每个问题都可以通过添加另一层间接来解决 除了有太多间接层的问题 - David Wheeler和Kevlin Henney的错误引用
那么我们如何解决这个问题呢?添加一层间接!
实现此目的的一种方法是使用一个映射表达式,该表达式调用一个执行“簿记”的函数并返回该命令。
let s:bookkeeping = {}
function! s:bookkeeping(count, cmd)
let s:bookkeeping[a:cmd] = get(s:bookkeeping, a:cmd, 0) + a:count
return a:cmd
endfunction
nnoremap <expr> j <SID>bookkeeping(v:count1, 'j')
就我个人而言,我认为他们收集这些命令的数据几乎没有收获,因为它们不是上下文,但是看看如何做地图表达可能会很好。有关详细信息,请参阅:h :map-<expr>
。