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

时间:2018-02-19 18:23:36

标签: vim

我是一位有一周经验的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@

然后我重构了一下以避免重复输入(&#34;变量名:&#34;)但是现在我从命令调用函数时有一个奇怪的(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

(因错误代码而重新编辑)

1 个答案:

答案 0 :(得分:1)

使用this answer我已经能够在没有命令和一个功能的情况下使其工作。我学会了该参数的用途,如何使用可选参数和func-range修饰符:

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

我发布这个作为答案,因为它是我所寻求的那种改进。欢迎任何其他建议,谢谢。