提取JavaScript变量(功能示例):如何改进它



我是一个拥有一周经验的VIM新手,我已经很喜欢。

我已经成功编写了一个(丑陋的(命令 函数 映射,我可以将一些代码提取到JavaScript中的新变量。这是第一个版本,可与动作( jsexviw(一起使用,并在视觉模式下进行选择:

command! -range -nargs=1 JsExVar normal `<v`>d^[i<args>^[Ovar <args> = (^[pa);^[
function! FnJsExVar(type)
    silent exec 'JsExVar '.input("Variable name: ")
endfunction
vnoremap <silent> <expr> <Leader>jsexv ":JsExVar ".input("Variable name: ")."<cr>"
nnoremap <silent> <Leader>jsexv :set opfunc=FnJsExVar<CR>g@

然后,我对此进行了一些重新分配以避免重复的输入("变量名:"(,但是现在我从命令调用函数时有一个奇怪的(0(参数:

command! -range JsExVar call ExecJsExVar(0) 
vnoremap <silent> <expr> <Leader>jsexv ":JsExVar<cr>"
nnoremap <silent> <Leader>jsexv :set opfunc=ExecJsExVar<CR>g@
function! ExecJsExVar(type)
    let varname = input("Variable name: ")
    silent exec "normal `<v`>di".varname."^["
    silent exec "normal Ovar ".varname." = ^["
    silent exec "normal pa;^["
endfunction

我仍然不完全理解执行事物的不同方式,因此我认为代码可以得到很多改进和清洁。谢谢您的任何更正和建议。

-----编辑-------

好吧,它并没有真正与动作一起使用。我认为这有效...但是问题是:可以通过一个功能完成吗?

command! -range JsExVar call JavascriptExtractVariable(0) 
vnoremap <silent> <Leader>jsxv :JsExVar<cr>
nnoremap <silent> <Leader>jsxv :set opfunc=JavascriptExtractVariable2<CR>g@
function! JavascriptExtractVariable(type)
    let varname = input("Variable name: ")
    silent exec "normal `<v`>di".varname.""
    silent exec "normal Ovar ".varname." = ("
    silent exec "normal pa);"
endfunction
function! JavascriptExtractVariable2(type)
    let varname = input("Variable name: ")
    silent exec "normal `[v`]di".varname.""
    silent exec "normal Ovar ".varname." = ("
    silent exec "normal pa);"
endfunction

(由于编码错误而重新编辑(

使用此答案,我能够在没有命令和一个函数的情况下使其正常工作。我学会了该论点是为了什么,如何使用可选论证和功能范围的修饰符:

vnoremap <silent> <Leader>jsxv :call JsExtractVariable(visualmode(), 1)<cr>
nnoremap <silent> <Leader>jsxv :set opfunc=JsExtractVariable<CR>g@
function! JsExtractVariable(vt, ...) range
    let varname = input("Variable name: ")
    silent exec "normal ".SelectByMode(a:0)."di".varname."^["
    silent exec "normal Ovar ".varname." = (^[pa);^["
endfunction
function! SelectByMode(isvisual)
    return (a:isvisual ? "`<v`>" : "`[v`]")
endfunction

我将其发布为答案,因为这是我一直在寻找的改进。欢迎其他任何建议,谢谢。

最新更新