如何在vim中连接几行

sta*_*ant 4 vim configuration screen kdb

我使用的vim-screen插件使我能够编写脚本,在同一窗口中启动解释器并向解释器发送行.问题是解释器不接受写在几行上的语句.

例如:这将有效 f:{[x] y:y+1; Z:y+1; :Z; };

但这不会

f:{[x] y:y+1;
    Z:y+1;
    :Z;
 };
Run Code Online (Sandbox Code Playgroud)

如何编写一个vim函数,我可以调用它来重塑行以便发送给解释器?

编辑:我没有成功完成这个功能,我想创建一个函数,从这样的输入(可视化选择)

F:{[a;b;r]
//ccc1
   aaa1;
aaa2;
  //ccc2
    aaa3;
};
Run Code Online (Sandbox Code Playgroud)

输出这样的东西F:{[a;b;r] aaa1; aaa2; aaa3; }; 所以我创造了一个赏金

Ing*_*kat 6

如果你想实际修改缓冲区,J/ :join做那个.如果您只想加入发送到解释器的行(但保持它们在缓冲区中分割),您可以使用getline(),然后检索所选行join().这是一个示例命令:

:command! -range Invoke echomsg join(getline(<line1>,<line2>), '')
Run Code Online (Sandbox Code Playgroud)

编辑

基于此,您可以"按摩"返回的行列表getline().例如,忽略注释行:

:command! -range Invoke echomsg join(filter(getline(<line1>,<line2>), 'v:val !~# "^\\s*//"'), '')
Run Code Online (Sandbox Code Playgroud)

另外剥离前导空格(这在单行中变得难以处理;现在更好地使用函数):

:command! -range Invoke echomsg join(map(filter(getline(<line1>,<line2>), 'v:val !~# "^\\s*//"'), 'substitute(v:val, "^\\s\\+", " ", "g")'), '')
Run Code Online (Sandbox Code Playgroud)