我正在使用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:我将如何创建该功能。
dw
,它将删除一个单词的其余部分。你是如何捕获的?问题2:为我找到更好的解决方案?你将如何处理这项任务?
答案 0 :(得分:2)
使用插件
检查页面底部的COERCION部分:
获取:s命令到命令行
:nnoremap \c :%s/<C-r><C-w>/
&lt; C-r&gt;&lt; C-w&gt; 获取光标下的单词到命令行
使用: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; ,这意味着整场比赛
更改光标下的字词,文件中的所有匹配项
:nnoremap \a :%s/<C-r><C-w>/\=toupper(substitute(submatch(0), '\<\@!\u', '_&', 'g'))/g<Cr>
请参阅 3。以获取解释。
使用普通模式命令更改光标下的单词
/ \ u&lt; Cr&gt; 找到下一个大写字符
i _ 插入下划线。
nn 搜索最后搜索到的字符串两次(两次,因为在退出插入模式后,您向后移动一个字符)。
。重复上一次更改,在这种情况下插入下划线。
重复 nn。直到所有camelcases都在它们之前添加了下划线,即FooBarBaz变为Foo_Bar_Baz
gUiw 大写当前内部词
答案 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