Vim:更改脚本中变量的格式

时间:2010-04-22 18:40:14

标签: workflow vim

我正在使用vim编辑shell脚本(没有使用正确的编码标准)。我需要将所有变量从camel-hum-notation startTime更改为caps-and-underscore-notation START_TIME

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

我在想这样做的一种方法是编写一个函数并将其映射到一个键。该函数可以在命令行上执行此操作:

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

我认为这个功能可以应用于其他方便的情况。两个问题:

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

  • 我在vim中创建了函数之前我无能为力的最重要的事情是如何捕获运动。即如果你在vim中按dw,它将删除一个单词的其余部分。你是如何捕获的?
  • 你还可以在vim命令行上留下未完成的命令吗?

问题2:为我找到更好的解决方案?你将如何处理这项任务?

2 个答案:

答案 0 :(得分:2)

  1. 使用插件

    检查页面底部的COERCION部分:

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

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

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

    &lt; C-r&gt;&lt; C-w&gt; 获取光标下的单词到命令行

  3. 使用:s

    更改光标下的字词

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

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

    \%#匹配当前光标位置

    \ = 当替换字符串以“\ =”开头时,余数被解释为表达式。 :h sub-replace-\=

    submatch(0)我们正在处理的:s命令的整个匹配

    \&lt; 字边界

    \ @!与前一个原子不匹配(这是在一开始时不匹配     字。如果没有这个,FooBar将改为_FOO_BAR)

    替换表达式中的

    &amp; ,这意味着整场比赛

  4. 更改光标下的字词,文件中的所有匹配项

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

    请参阅 3。以获取解释。

  5. 使用普通模式命令更改光标下的单词

    / \ u&lt; Cr&gt; 找到下一个大写字符

    i _ 插入下划线。

    nn 搜索最后搜索到的字符串两次(两次,因为在退出插入模式后,您向后移动一个字符)。

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

    重复 nn。直到所有camelcases都在它们之前添加了下划线,即FooBarBaz变为Foo_Bar_Baz

    gUiw 大写当前内部词

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

答案 1 :(得分: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(

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

<强>更新

在考虑之后,这个以下功能有点短:

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