如何在Vim中将点方法调用更改为字典键访问

如何在Vim中将点方法调用更改为字典键访问,vim,Vim,假设我有以下代码 config.file\u路径 由于重构,我需要重写为 config[“文件路径”] 如何编写一个可重用函数来将一个函数转换为另一个函数 我不反对安装一个软件包来提供帮助,但是纯Vim版本会非常酷。我认为简单的regexp替换应该足够了: :%s/\<\(\h\w*\)\.\(\w\+\)\>/\1["\2"]/g :%s/\/\1[“\2”]/g 这里\表示单词边框\(和\)是子匹配。因此任何形式的word1.word2都将变成word1[“word2”]

假设我有以下代码

config.file\u路径
由于重构,我需要重写为

config[“文件路径”]
如何编写一个可重用函数来将一个函数转换为另一个函数


我不反对安装一个软件包来提供帮助,但是纯Vim版本会非常酷。

我认为简单的regexp替换应该足够了:

:%s/\<\(\h\w*\)\.\(\w\+\)\>/\1["\2"]/g
:%s/\/\1[“\2”]/g
这里
\
表示单词边框<代码>\(和
\)
是子匹配。因此任何形式的
word1.word2
都将变成
word1[“word2”]


如果您认为可能存在一些“误报”(例如注释、文字字符串等),您可以添加
c
标志进行手动确认。

我认为简单的regexp替换就足够了:

:%s/\<\(\h\w*\)\.\(\w\+\)\>/\1["\2"]/g
:%s/\/\1[“\2”]/g
这里
\
表示单词边框<代码>\(和
\)
是子匹配。因此任何形式的
word1.word2
都将变成
word1[“word2”]


如果您认为可能存在一些“误报”(例如注释、文字字符串等),您可以添加
c
标志进行手动确认。

您可以尝试以这种方式解决问题:找到一个有用的泛型转换,然后使其易于重复

寻找有用的转换 如果您在word
文件路径中的某个位置,可以使用:
F.s[“ea”]
应用此转换。(注意:每当我使用
时,您都要按“Esc”键)

分解如下:

  • F.
    :向后移动到光标前的第一个
  • s
    :替换当前字符,这将删除
    ,并进入插入模式
  • [”
    :这是在插入模式下键入的,因此按字面插入到文本中
  • :离开插入模式,回到正常模式
  • e
    :跳转到当前单词的末尾,这将把光标放在单词
    文件路径
    末尾的
    h
  • a
    :Append,这将在当前字符之后进入插入模式。注意,如果
    文件路径
    是行中的最后一个字,这也可以正常工作
  • “]
    :以插入模式按字面插入
  • :离开插入模式,最后一次回到正常模式
这种转换正是您想要的,并且在不同的情况下应用是相当普遍的

现在让我们看看如何重复多次

重复转换。 您可以将一系列命令记录到宏中。您可以通过使用命令并指定寄存器名(小写字母)来实现这一点,以便以后可以调用它

让我们使用
k
寄存器(
k
表示“key”,在“key”转换中),因此您可以使用
qk
开始录制,然后使用单个
k
结束录制

将光标放在适当的位置(在要更改的
文件路径中)并键入:
qkF.s[“ea”]q
。(注意:每当我使用
时,您还是要按“Esc”键)

这将执行转换并将其记录在
k
寄存器中

完成此操作后,您只需导航到要更改的
文件路径
的实例,然后使用它来重播。一旦您使用了该寄存器一次,就可以使用来重播上次使用的寄存器

如果您正在使用搜索,例如
/file\u path
*
文件路径
字的顶部,则可以交替使用
n
@
来继续查找下一个匹配项并应用转换

使用映射生成更持久的键绑定

如果你发现这个操作非常有用,并且想使它更持久,那么考虑把它映射成一个映射并把它添加到你的<代码> .VIMRC/<代码> < /P> 将宏记录到寄存器是可以的,在大多数情况下,它将保留在

.viminfo
文件中(默认情况下,它将被保留),但您可能会意外地用另一个
qk
命令覆盖它,或者可能会使用
“kyy
将这些命令复制到该寄存器中,这些命令使用
使用相同的寄存器。此外,寄存器只有26个字母,所以如果您继续将它们用于您希望长期保存的序列,那么最终您将用完它们

您可以在
.vimrc
中使用类似的内容来创建更持久的映射:

nnoremap <leader>k F.s["<Esc>ea"]<Esc>
细分:

  • /
    :开始搜索
  • \。
    :匹配文字点
  • \zs
    :使匹配从这一点开始,因此光标将在这一点结束,这也是设置
    'hlsearch'
    时高亮显示的部分
  • 文件路径
    :要匹配的单词
  • \>
    :匹配单词边界,以确保仅匹配整个单词
在这样的搜索之后,使用
999@k
使用上面记录的宏,包括最终的
n
,将转换缓冲区中的所有实例(假设不超过999个)

替代方法:使其可重复 第一种方法的一个障碍是,我们不能用
重复它,因为我们在命令的两个不同位置进入插入模式,并且使用
F
命令使用运动

如果我们能够使用单个命令执行整个替换,那么我们就可以使用
重复它(也可以使用单个
u
撤消它!)

事实证明我们可以

这将起作用:
ciw[“-”]
。(注意:按
上的退格键,然后按Cont。)