一次运行一个定制的vim map键绑定就可以了,但是运行x次就不行了';行不通

一次运行一个定制的vim map键绑定就可以了,但是运行x次就不行了';行不通,vim,Vim,我正在尝试将Ctrl-j键映射为使用逗号连接两行。我的.vimrc文件中有以下行 :map <C-j> A<space>,<ESC>J 但当我试图通过按“2Ctrl-j”一次连接多行时,我得到以下结果 Before After test test , , test test test test 我做错了什么?如何将多行连接到一个逗号分隔的行中?我试着用替换,但没用 此外,是否有方法参数化连

我正在尝试将Ctrl-j键映射为使用逗号连接两行。我的.vimrc文件中有以下行

:map <C-j> A<space>,<ESC>J
但当我试图通过按“2Ctrl-j”一次连接多行时,我得到以下结果

Before           After
test             test , , test
test             test
test
我做错了什么?如何将多行连接到一个逗号分隔的行中?我试着用
替换
,但没用


此外,是否有方法参数化连接符号?例如,如果我想将Ctrl-k后跟任意字符映射为使用指定字符连接两行,那么映射结果会是什么?

如果您不介意使用某个寄存器,则可以将命令存储在寄存器中

例如,您可以将以下内容添加到vimrc中

let @j = "A,\eJ"
nnoremap <C-j> @j
此函数将使用传入的分隔符将多行连接在一起。它还将保留
J
通常添加的空间

要映射此命令,请将该函数添加到vimrc和以下nnoremaps

nnoremap <C-j> :call CustomJoinLines(" ,")<CR>
nnoremap <C-k> :call CustomJoinLines("!")<CR>
nnoremap:调用CustomJoinLines(“,”)
nnoremap:调用CustomJoinLines(!)

如果您不介意使用某个寄存器,可以将命令存储在寄存器中

例如,您可以将以下内容添加到vimrc中

let @j = "A,\eJ"
nnoremap <C-j> @j
此函数将使用传入的分隔符将多行连接在一起。它还将保留
J
通常添加的空间

要映射此命令,请将该函数添加到vimrc和以下nnoremaps

nnoremap <C-j> :call CustomJoinLines(" ,")<CR>
nnoremap <C-k> :call CustomJoinLines("!")<CR>
nnoremap:调用CustomJoinLines(“,”)
nnoremap:调用CustomJoinLines(!)

您的方法有缺陷,因为
2

  • 告诉Vim在当前行中添加逗号两次(
    2A,
  • 而且
    J
    不会进行计数,因此只工作一次(即使这样,
    J
    2J
    相同)
另外,像
A,J
这样的命令序列更适合宏。如果希望映射使用计数,则应在映射的右侧仅使用一个命令(最好使用Ex命令),如果可能,还应使用较少的“行人”方法

以下是一个更好的方法:

:nnoremap <C-j> :s/\n/ , <CR>
:xnoremap <C-j> :s/\n/ , <CR>
  • 正常模式
    3
    将下线替换为
    在此行和下面两行

    :.,.+2s/\n/ , <CR>
    
  • 如您所见,使用Ex命令会自动插入正确的范围,并使映射更加可预测

    编辑

    基本上,当您在Ex命令之前使用计数或在可视模式下发出Ex命令时,Vim会自动插入与该计数或该可视选择相对应的范围,以保存您的一些键入

    3<C-j>
    
    转化为:

    :.             " from this line
    :.,            " to
    :.,.+2         " two lines below this line
    :.,.+2s/\n/ ,  " do this substitution
    

    您的方法有缺陷,因为
    2

    • 告诉Vim在当前行中添加逗号两次(
      2A,
    • 而且
      J
      不会进行计数,因此只工作一次(即使这样,
      J
      2J
      相同)
    另外,像
    A,J
    这样的命令序列更适合宏。如果希望映射使用计数,则应在映射的右侧仅使用一个命令(最好使用Ex命令),如果可能,还应使用较少的“行人”方法

    以下是一个更好的方法:

    :nnoremap <C-j> :s/\n/ , <CR>
    :xnoremap <C-j> :s/\n/ , <CR>
    
  • 正常模式
    3
    将下线替换为
    在此行和下面两行

    :.,.+2s/\n/ , <CR>
    
  • 如您所见,使用Ex命令会自动插入正确的范围,并使映射更加可预测

    编辑

    基本上,当您在Ex命令之前使用计数或在可视模式下发出Ex命令时,Vim会自动插入与该计数或该可视选择相对应的范围,以保存您的一些键入

    3<C-j>
    
    转化为:

    :.             " from this line
    :.,            " to
    :.,.+2         " two lines below this line
    :.,.+2s/\n/ ,  " do this substitution
    

    运动不是这样的。2使你重复A,两次,但J只执行一次。但是,我不确定如何使用运动来实现这一点。
    J
    默认情况下假设最小计数为2。因为它连接了接下来的两行。如果你通过打字3,你会得到三行joined@FDinoff不。加上3只会给我3个逗号<代码>测试,测试动作不是这样工作的。2使你重复A,两次,但J只执行一次。但是,我不确定如何使用运动来实现这一点。
    J
    默认情况下假设最小计数为2。因为它连接了接下来的两行。如果你通过打字3,你会得到三行joined@FDinoff不。加上3只会给我3个逗号<代码>测试,测试
    您的两个建议都非常有效。很难选择接受哪一个答案,但罗梅因的答案似乎更简单。你的两个建议都非常有效。很难选择接受哪一个答案,但罗梅因的答案似乎更简单。谢谢。我想澄清一下,当你说“Ex command”时,你的意思是通过按“:”来输入命令,对吗?我也不确定我是否理解你的第二个要点。我原以为它只是在循环中运行了3次命令,不确定
    ,.2
    被插入
    :,.2s/\n/,
    的位置。这个解决方案非常有效,我只是想了解一下。是的,“Ex commands”是您在
    提示符下输入的命令。如果在映射结束时删除
    ,您可以看到Vim做了什么,这非常有趣。请看我的编辑。谢谢。我想澄清一下,当你说“Ex command”时,你的意思是通过按“:”来输入命令,对吗?我也不确定我是否理解你的第二个要点。我原以为它只是在循环中运行了3次命令,不确定
    ,.2
    被插入
    :,.2s/\n/,
    的位置。这个解决方案非常有效,我只是想了解一下。是的,“Ex commands”是您在