2010-04-22 63 views
3

我正在使用vim编辑shell脚本(没有使用正确的编码标准)。我需要将所有变量从驼峰符号startTime更改为caps-and-underscore-notation START_TIMEVim:更改脚本中变量的格式

我不想改变方法名称的表示方式。

我在想这样做的一种方法是编写一个函数并将其映射到一个键。该功能可以做类似的命令行上产生这样的:

s/<word under cursor>/<leave cursor here to type what to replace with> 

我认为这个功能可能是applyable到这将是很方便的其他情形。两个问题:

问题1:我将如何去创建该功能。

  • 我在vim之前创建了一些函数,之前我无能为力的是如何捕捉运动。也就是说,如果您在vim中按dw,它将删除单词的其余部分。你如何捕捉?
  • 也可以在vim命令行上留下未完成的命令吗?

问题2:对我有更好的解决方案吗?你将如何处理这项任务?

回答

0

我不确定你在'捕捉动作'下的理解。这 说,对于一个首发,我会使用像这样的功能:

fu! ChangeWord() 

    let l:the_word = expand('<cword>') 

    " Modify according to your rules 
    let l:new_var_name = toupper(l:the_word) 

    normal b 
    let l:col_b = col(".") 

    normal e 
    let l:col_e = col(".") 

    let l:line = getline(".") 

    let l:line = substitute(
    \ l:line, 
    \ '^\(' . repeat('.', l:col_b-1) . '\)' . repeat('.', l:col_e - l:col_b+1), 
    \ '\1' . l:new_var_name, 
    \ '') 

    call setline(".", l:line) 

endfu 

在Vim命令行上留下未完成的命令,我认为你是后

:map ,x :call ChangeWord(

然后可以通过按,xnormal mode中调用。

更新

考虑这件事之后,这下面的函数是一个有点短:

fu! ChangeWordUnderCursor() 

    let l:the_word = expand('<cword>') 

    "" Modify according to your rules 
    let l:new_var_name = '!' . toupper(l:the_word) . '!' 

    normal b 
    let l:col_b = col(".") 

    normal e 
    let l:col_e = col(".") 

    let l:line = getline(".") 

    exe 's/\%' . l:col_b . 'c.*\%' . (l:col_e+1) .'c/' . l:new_var_name . '/' 

endfu 
2
  1. 使用插件

    检查胁迫部分底部的页面:

    http://www.vim.org/scripts/script.php?script_id=1545

  2. 获取:s命令来命令行

    :nnoremap \c :%s/<C-r><C-w>/

    <铬> <CW>获取光标下的单词的命令行

  3. 更改光标与下一句话:■

    :nnoremap \c lb:s/\%#<C-r><C-w>/\=toupper(substitute(submatch(0), '\<\@!\u', '_&', 'g'))/<Cr>

    向右移动,然后到单词的开头。我们需要这样做,我们希望改变这个单词之前得到 光标,因为我们只想改变 光标下的单词,并且正则表达式被锚定到当前光标 的位置。移动需要完成,因为b在 一个单词的开始移动到前一个单词的开始处。

    \%#匹配当前光标位置

    \ =当替代字符串起始 “\ =” 余数被解释为表达。 :h sub-replace-\=

    子匹配(0)了整场比赛:指挥,我们正在处理

    \ <字边界

    \ @!与先前的原子不匹配(这与 字的开头不匹配。没有这一点,FooBar的将改为_FOO_BAR)

    &在更换表情,这意味着整个比赛

  4. 改变光标下的单词,文件中的所有比赛

    :nnoremap \a :%s/<C-r><C-w>/\=toupper(substitute(submatch(0), '\<\@!\u', '_&', 'g'))/g<Cr>

    请参阅3.的解释。光标与正常模式下

  5. 更改字命令

    /\Ú<铬>找到下一个大写字符

    I_插入下划线。

    nn搜索上次搜索的字符串两次(两次,因为在退出插入模式后,您将移回一个字符)。

    重复上次更改,在这种情况下插入下划线。

    重复nn。直到所有camelcases面前有加下划线,就是FooBarBaz已成为Foo_Bar_Baz

    gUiw大写电流内环字

  6. http://vim.wikia.com/wiki/Converting_variables_to_camelCase