我有一个单词列表,例如:

these are
some
words that I want
to convert to
camel case


我需要一种方法,例如,将宏中的camel case转换为camelCase(或将每个

我可以根据需要多次使用wgUlhx之类的东西,但是问题是这不适用于长度不一的单词(因此,对于例如,wgUlhxwgUlhx适用于convert this please,但不适用于convert these pretty please)。

上述行的期望输出为

theseAre
some
wordsThatIWant
toConvertTo
camelCase


自动化的方法?

#1 楼

我发现一个简单的内衬

我发现了一个简单的正则表达式替换(假设设置了“魔术”):

:s/ \([a-zA-Z]\)/\u/g


此匹配后的任何单个字母一个空格,保存字母。然后,对于行中的每个匹配项,将其替换为已保存的大写字母(\u =大写, =首次保存的匹配项)。

通过在整个文件之间放置% :s

此解决方案的缺点是它是按行排列的(适用于您的示例),但是如果您只想驼峰写出几行中的几个单词,则可能会失败。

更完整的解决方案

map <leader>g~ :set opfunc=MyCamelCase<CR>g@
function! MyCamelCase(type, ...)
  let searchsave=@/
    silent s/\%>'\[ \([a-zA-Z]\)\%<']/\u/g
  let @/=searchsave
 endfunction


这将创建一个可以对运动进行操作的新操作符。如果将<leader>用作\,则给出以下文本(以|作为光标):

This is some |example text to work with.


键入\g~3w给出

This is some exampleTextTo work with.


也就是说,我们驼峰式地用了3个单词。

替代的描述:

s/开始替代。 \%>'\[有点痛苦。 \%>'m说要匹配标记的右边。我们想要标记[,但是在这种模式下也必须转义。因此,这在给操作员的运动之后开始比赛。 \([a-zA-Z\)与上面的单线相同。 \%<']这是另一端,在运动结束前匹配。 /\u/g是上述一排纸的替换物。

评论


实际上,它不是一个宏,而是一个直线,但是您可以将其映射到一个键组合。

– John O'M。
2015年2月18日在2:48

添加了操作员版本来实现。操作更好。

– John O'M。
2015年2月18日,下午5:52

如果您的答案没有专门使用宏,我认为可以。在我看来,提问者提出了XY问题。

–tommcdo
15年2月18日在12:18

@tommcdo是的,你是对的;它不一定是实际的宏。它只是需要某种自动化方法。

–门把手
2015年2月19日在2:18

#2 楼

作为替代方案,我使用具有强制功能的vim-abolish插件:


想将fooBar转换为foo_bar吗?按crs(强制转到
snake_case)。只需敲击3个键,即可完成MixedCase(crm),camelCase(crc),snake_case
crs)和UPPER_CASE(cru)的操作。这些
命令支持repeat.vim。


评论


+1,因为总有一个我不知道的Tim Pope插件。

– zool
2015年9月8日,11:59

#3 楼

您可以使用以下按键操作为单行创建一个递归宏:

qqqqqf xgUl@qq


(请注意,fx之间的空格是空格键,而不是暂停)

详细信息:


清除q寄存器。这是必需的,因为我们正在创建一个递归宏。 (请参阅第5步。):qqq
开始在寄存器q中记录宏:qq
此处不能使用w运动,因为您希望宏在到达末尾时中止。行,而不是跳到下一行。而是通过按f键和空格键跳到该行的下一个空格字符:f<space>
删除空格,并大写以下字母:xgUl
递归。由于我们在步骤1中清除了q寄存器,因此它什么都没有,因此将无济于事:@q
保存宏:q

然后您可以将该宏应用于多行:使用范围:

将宏应用于文件中的每一行:

:%normal @q


将宏应用于2-5行(包括2和5):

:2,5normal @q

进行视觉选择,然后键入:normal @q。当您按:键时,这将预填充命令行,从而导致将宏应用到所选内容的每一行的命令:

:'<,'>normal @a


评论


不必清除q寄存器,因为qq刚开始记录击键之前就这样做了。实际上,这正是qqq清除q寄存器的原因:)

–tommcdo
15年2月18日在12:13

当然,如果您要执行需要附加到q寄存器的操作(即使用qQ),则可能有必要先将其清除。

–tommcdo
15年2月18日在12:15

@tommcdo在我的Vim副本中绝对不是这样。 (Vim 7.3.87,用vim -u NONE调用)。仅在步骤6中保存寄存器时,才会清除现有内容。因此,如果要递归,则必须在开始之前清除寄存器。

–丰富
2015年2月18日在12:19



@tommcdo我已经更新了答案,以使您更加清楚为什么需要执行此步骤。

–丰富
15年2月18日在12:22

我的错,我有点把枪跳到那里了。优秀的澄清!

–tommcdo
2015年2月19日,下午1:41

#4 楼

请参见http://vim.wikia.com/wiki/Changing_case_with_regular_expressions
它非常清楚,简洁地说明了\ U,\ L,\ u,\ l修饰符!

其实质是following:

有时您可能想要遍历文件并更改匹配某些任意条件的字符的大小写。如果您很好地理解了正则表达式,则实际上可以很容易地做到这一点。

就像将\ U或\ L放在要更改大小写的反向引用前面,而\ E一样简单。结束。 Vim将使反向引用的文本分别大写或小写。使用\ u和\ l(末尾没有\ E)来更改反向引用中第一个字符的大小写。

(“反向引用”是正则表达式的一部分,引用正则表达式的前一部分,最常见的反向引用是&,\ 1,\ 2,\ 3,...,\ 9)。

一些示例演示了此功能的强大功能方法:

将整个文件小写/>
对所有以<开头的单词(即打开HTML标记名称):

:%s/.*/\L&/g


还要注意gu和gU命令。

,例如,ggguG将小写整个文件。
(gg =转到顶部,gu =小写,G =转到EOF)。

通过使用\ 0个常规backref而不是名称(\ 1,\ 2等),您可以在正则表达式的替换节上保存一些键入内容。

此正则表达式将大写的一组显式单词大写在文件中:

:%s/<\(\w*\)/<\U/g


不是火箭科学,但否则您必须这样做:

:%s/\(select\)\|\(order)\|\(by\)\|\(from\)\|\(where\)/\U
:%s/\(select\)\|\(order)\|\(by\)\|\(from\)\|\(where\)/\U\U\U\U\U/g
/g


评论


您能否总结一下您在回答中提到的文章?

–EvergreenTree
2015年9月8日在16:08

再见?非常重要,如果单链接答案可以,那么几年后,此站点将充满已删除的链接。但是,如果您仅复制所引用链接的重要部分,并且还提供该链接,OP可以从中获取更多信息,那就可以了。

–peterh-恢复莫妮卡
2015年9月8日在21:00