在vimrc

时间:2017-02-16 09:02:58

标签: vim

我在vim中写了一个地图命令,它根据我的口味过于复杂。我想:

  1. 摘要部分,或者至少将它们分成多行并解释每一行。
  2. 只使用2件东西重复使用它,每次只改变2件事。
  3. 该命令使用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部分更改为其他文件类型。

    我的两个问题是:

    1. 是否有更好,更直接的方法来抽象掉长地图的部分内容?
    2. 如何解决结果中出现<cr>而不是实际意义的问题“按输入按钮”。
    3. 感谢您的帮助!

      编辑:

      获得建议后我现在有了当前的版本,看起来有点冗长。 虽然我可以使用'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
      

      感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

  

是否有更好,更直接的方式来抽象掉部分内容   长地图?

由于你已经调用了一个函数,并且该函数只是连接了rhs映射,为什么不只是在你的函数中进行实际的工作,而只是映射执行如下函数:nnoremap whatever :call yourFunc()<cr> < / p>

  

如何解决结果中出现的<cr>问题?   而不是实际意义&#34;按下输入按钮&#34;。

使用"\<cr>"