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

Workflow Vim:更改脚本中变量的格式,workflow,vim,Workflow,Vim,我正在使用vim编辑一个shell脚本(没有使用正确的编码标准)。我需要将所有变量从驼峰符号startTime更改为大写和下划线符号START\u TIME 我不想改变方法名称的表示方式 我在想这样做的一种方法是编写一个函数并将其映射到一个键。该函数可以执行类似于在命令行上生成的操作: s/<word under cursor>/<leave cursor here to type what to replace with> s// 我认为这个功能可以应用于其他方便的

我正在使用vim编辑一个shell脚本(没有使用正确的编码标准)。我需要将所有变量从驼峰符号
startTime
更改为大写和下划线符号
START\u TIME

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

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

s/<word under cursor>/<leave cursor here to type what to replace with>
s//
我认为这个功能可以应用于其他方便的情况。两个问题:

问题1:我将如何创建该函数

  • 在vim中创建函数之前,我最不清楚的是如何捕捉运动。即,如果在vim中按
    dw
    ,它将删除一个单词的其余部分。你如何捕捉到这一点
  • 您还可以在vim命令行上保留未完成的命令吗

问题2:有更好的解决方案吗?你将如何完成这项任务

我不确定你对“捕捉动作”的理解。那个 比如说,作为一个初学者,我会使用类似这样的函数:

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
然后可在
正常模式下通过按
,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
fu!ChangeWordUndersor()
让l:单词=展开(“”)
“”根据您的规则进行修改
让l:new_var_name='!'。图珀(l:这个词)。”
正常b
设l:col_b=col(“.”)
正态e
设l:col_e=col(“.”)
设l:line=getline(“.”)
exe的/\%。l:上校c、 *\%”。(l:col_e+1)。'c/'。l:新名字。'/'
恩德福
  • 使用插件

    检查页面底部的强制部分:

  • 将:s命令放到命令行中

    :nnoremap\c:%s/

    将光标下的单词获取到命令行

  • 用:s更改光标下的单词

    :nnoremap\c lb:s/\%\\/\=toupper(替换(子匹配(0))'\
    
    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