可能有一个简单的解决方案。我找不到任何解决方案(我可能在错误的上下文中搜索)
这是我的要求。
我在vimrc中编写了以下键映射。它应该打印n行“ Hello用户名。”,其中n和user_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.
提前感谢
得到答案。以防万一有人在寻找类似的解决方案
autocmd FileType ruby nnoremap <expr> <C-h> input("", ":call FuncPrnt(,\"\")<left><left><left><left>")
将打印命令并等待用户编辑。用户编辑并输入后,将执行
一种更简单的方法是仅使用非<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会代您处理这些详细信息。)
在框外思考(质疑前提),在这种情况下,最好的办法是定义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>
更快或更方便的键入,因为它不涉及将手移至箭头键。