Vim键绑定以使用来自用户的输入来调用函数

问题描述 投票:0回答:3

可能有一个简单的解决方案。我找不到任何解决方案(我可能在错误的上下文中搜索)

这是我的要求。

我在vimrc中编写了以下键映射。它应该打印n行“ Hello用户名。”,其中nuser_name是按下键后的用户输入。

autocmd FileType ruby nnoremap <expr> <C-h>  :call FuncPrnt(<-syntax to pass input from user->)        

function! FuncPrnt(count, uname)
  let c=a:count
  let i=0
  while i<c
    call append(line("."), "Hello ".a:uname.".")
    let i+=1
  endwhile
endfunction

在按下键时,用户输入3和'Ironman'。输出将是

Hello Ironman.
Hello Ironman.
Hello Ironman.

提前感谢

vim
3个回答
0
投票

得到答案。以防万一有人在寻找类似的解决方案

autocmd FileType ruby nnoremap <expr> <C-h> input("", ":call FuncPrnt(,\"\")<left><left><left><left>")

将打印命令并等待用户编辑。用户编辑并输入后,将执行


0
投票

一种更简单的方法是仅使用非<expr>映射来准备Ex命令,而无需执行它:

nnoremap <C-h> :call FuncPrnt(,"")<left><left><left><left>

如果将其与文件类型(如您的情况下为“ ruby​​”)相关联,请确保使用local mapping创建一个<buffer>。否则,映射将是全局的,并且将适用于每个缓冲区,而不仅适用于具有Ruby源文件的缓冲区。

如果在vimrc中使用autocmd,请确保将其包装在augroup中,以防止在重新加载vimrc时获得重复的命令。

或者,您可以在文件augroup中添加Ruby的文件类型映射,只要加载了Ruby类型的文件,该文件就会由Vim自动加载。 (这样,您无需使用显式的~/.vim/ftplugin/ruby.vim,Vim会代您处理这些详细信息。)


0
投票

在框外思考(质疑前提),在这种情况下,最好的办法是定义autocmd而不是映射。

您可以在此处定义一个:

user-defined command

这样,您就可以将其用于:

command! -buffer -bar -count=1 -nargs=1 FuncPrnt
  \ call FuncPrnt(<count>, <q-args>)

如果省略计数,将使用1。 (您可以选择其他默认值作为:3FuncPrnt Ironman 的参数。)

您可以对-count=N使用制表符补全,因此FuncPrnt甚至:3Fu<Tab>可能足以完成命令。

这可能比:3F<Tab>更快或更方便的键入,因为它不涉及将手移至箭头键。

© www.soinside.com 2019 - 2024. All rights reserved.