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
是上述一排纸的替换物。#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
(请注意,
f
和x
之间的空格是空格键,而不是暂停)详细信息:
清除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
评论
实际上,它不是一个宏,而是一个直线,但是您可以将其映射到一个键组合。
– 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