我在vim中写了一个地图命令,它根据我的口味过于复杂。我想:
该命令使用vim-pandoc插件从当前pandoc文件创建一个Html文件并将其复制到剪贴板。
nnoremap <leader><leader>11 :w<cr>:Pandoc html<cr>:sleep 100m<cr>:e <c-r>=expand('%:r')<cr>.html<cr>ggVG"+y:b#<cr>:bd #<cr>
我的第一次尝试是:
nnoremap <expr> <leader><leader>22 MyFunc()
func! MyFunc()
let save = ':w<cr>'
let runPandoc = ':Pandoc html<cr>'
let sleep = ':sleep 100m<cr>'
let viewResult = ':e ' . expand('%:r') . '.html' . '<cr>'
let copyAll = 'ggVG"+y'
let backToPrevBuf = ':b#<cr>'
return save . runPandoc . sleep . viewResult . copyAll . backToPrevBuf
endfunc
但是,这不起作用,因为它在返回的值中有<cr>
而不是实际执行enter。
使用这个我可以将一个arg传递给MyFunc,它会将html
部分更改为其他文件类型。
我的两个问题是:
<cr>
而不是实际意义的问题“按输入按钮”。感谢您的帮助!
编辑:
获得建议后我现在有了当前的版本,看起来有点冗长。 虽然我可以使用'n'参数将feedkeys包装成一个较短的名称,但还有什么我可以做的吗?
func! MyFunc()
call feedkeys(":w\<cr>",'n')
call feedkeys(":Pandoc html\<cr>",'n')
call feedkeys(":sleep 100m\<cr>",'n')
call feedkeys(':e ' . expand('%:r') . '.html' . "\<cr>",'n')
"TODO read about :%y+ understand why it copies the entire file
call feedkeys('ggVG"+y','n')
call feedkeys(":b#\<cr>",'n')
endfunc
编辑:
最后,我已经明白了摆脱feedkeys意味着什么,现在我到达了最终目的地:
nnoremap <silent> <leader><leader>22 :call MyFunc()<cr><cr>
func! MyFunc()
w
Pandoc html
sleep 100m
execute 'e' (expand('%:r') . '.html')
%y+
b#
endfunc
感谢您的帮助!
答案 0 :(得分:2)
是否有更好,更直接的方式来抽象掉部分内容 长地图?
由于你已经调用了一个函数,并且该函数只是连接了rhs
映射,为什么不只是在你的函数中进行实际的工作,而只是映射执行如下函数:nnoremap whatever :call yourFunc()<cr>
< / p>
如何解决结果中出现的
<cr>
问题? 而不是实际意义&#34;按下输入按钮&#34;。
使用"\<cr>"