在vim中,使用单个命令切换文本文件中的所有字符

在vim中,使用单个命令切换文本文件中的所有字符,vim,Vim,在Vim中,我需要用一个命令将所有小写字母转换为大写字母,并将所有大写字母转换为小写字母。所以如果我的文本文件看起来像这样 Hello World hELLO wORLD 。。需要进行切换,使其看起来像这样 Hello World hELLO wORLD 我知道:%s/[a-z]/\U和/g会将所有小写字母改为大写字母,而:%s/[a-z]/\L和/g会将所有大写字母改为小写字母。但是我怎么写才能同时做到这两个呢 此外,我知道如果我的光标位于文件的顶部,VG~将切换所有大小写,但这不是我

在Vim中,我需要用一个命令将所有小写字母转换为大写字母,并将所有大写字母转换为小写字母。所以如果我的文本文件看起来像这样

Hello World
hELLO wORLD
。。需要进行切换,使其看起来像这样

Hello World
hELLO wORLD
我知道
:%s/[a-z]/\U和/g
会将所有小写字母改为大写字母,而
:%s/[a-z]/\L和/g
会将所有大写字母改为小写字母。但是我怎么写才能同时做到这两个呢

此外,我知道如果我的光标位于文件的顶部,
VG~
将切换所有大小写,但这不是我需要的答案。谢谢。

1GVG~
<Esc>1GVG~
说明:

<Esc> — return to Normal mode; just in case we're in Insert mode or Command line
1G — jump to the 1st line
V — start Visual mode
G — jump to the last line extending selection
~ — toggle case in the selection
-返回正常模式;以防我们处于插入模式或命令行
1G-跳到第1行
V-启动视觉模式
G-跳到最后一行扩展选择
~-在选择中切换大小写

1Gg~G
运动过程中g~-变化情况;运动为G(跳到最后一行)

医生:

看起来你已经知道你需要的一切了
ggVG~
标记所有代码并切换大小写。如果需要单个命令,可以使用:

:nnoremap <keybinding> ggVG~
切换大小写后,第一个和最后一个
exec
标记您在文件中的位置并将其还原。请参阅:
:h标记

键入
:ToggleCase
以使用该功能。当然,您也可以将其绑定到keybinding

:nnoremap <keybinding> :ToggleCase<cr>
:nnoremap:ToggleCase

既然您提到了使用单个命令,并且提到了一些
:%s/../
替换,我将提供以下内容:

:%normal! g~~

这将运行命令,为缓冲区的每一行切换一行的大小写。

如果您可以使用插件,另一种方法是为整个缓冲区的文本对象使用插件

正如插件README.md文件所述:

尽管这些都是琐碎的操作(例如,
ggVG
),但文本对象版本更方便,因为您不必知道光标的位置(例如,
vae

安装并启用此插件后,您可以使用以下选项切换整个缓冲区的大小写:

g~ae

正如问题中所述,我知道
VG~
可以做到这一点,但我需要知道如何使用单个命令来做到这一点。@Chris我添加了另一个变体,但没有太大不同。定义“单个命令”。
VG~
以何种方式不是一个单一的命令?更容易键入imo:
ggg~G
@D.BenKnoble一点点,但很多。您仍然需要按
Shift+g
:-)
此外,我知道我的光标是否位于文件的顶部,VG~将切换所有大小写,但这不是我需要的答案为什么不能在普通命令中使用此命令?请定义一个单命令!我猜你被否决的原因是你没有说明你需要什么。您想在一行或一个文件上切换大小写,但由于我们未知的原因,
VG~
不够好。试着解释一下你的用例以得到好的答案。现在我正试着决定我是否能比
ggg~G
@D.BenKnoble更快地键入这个问题。像其他一些人一样,这个问题受到了不合理的任意约束。为什么它必须在一个命令中?(不管怎么说,什么是命令?运动算数吗?鼠标点击怎么办?)是的,我可以看出在整个缓冲区中使用文本对象是多么优雅,但它真的比使用
ggg~G
好吗?