我正在尝试将Ctrl-j键映射为使用逗号连接两行。我的.vimrc文件中有以下行
:map <C-j> A<space>,<ESC>J当我按一次Ctrl-j组合键时,它可以正常工作
Before After
test test , test
test test
test但是,当我试图通过按"2Ctrl-j“一次连接多个行时,我会得到以下结果
Before After
test test , , test
test test
test我做错了什么?如何将多行合并为一个逗号分隔的行?我试着用<C-[>替换<Esc>,但不起作用。
另外,有没有一种方法可以参数化连接符号?例如,如果我想映射Ctrl-k后跟任何字符,以使用指定的字符连接两行,那么对应的映射是什么?
发布于 2013-04-24 13:36:57
你的方法是有缺陷的,因为2<C-j>
2A<space>,)J不会接受计数,因此只工作一次(即使它工作了,J也与2J…相同)。此外,像A<space>,<ESC>J这样的命令序列更适合宏。如果希望映射与计数一起工作,则应该在映射的右侧只使用一个命令( Ex命令是最好的),如果可能的话,使用一个不那么“平凡”的方法。
下面是一个更好的方法:
:nnoremap <C-j> :s/\n/ , <CR>
:xnoremap <C-j> :s/\n/ , <CR>有了这些映射,您可以在普通模式下执行<C-j>和3<C-j>,并在<C-j>中正常运行。以下是Vim在上面三个场景中的操作:
<C-j>将当前行上的EOL替换为,:s/\n/,
3<C-j>将此行和下面两行上的EOL替换为,:.,.+2s/\n/,
<C-j>在视觉选择的每一行上将EOL替换为,:'<,'>s/\n/,
如您所见,使用Ex命令会自动插入正确的范围,并使您的映射更具可预测性。
编辑
基本上,当您在Ex命令之前使用计数时,或者当您在可视模式下发出Ex命令时,Vim会自动在命令之前插入与该计数或可视选择相对应的范围,以省去一些键入操作。
3<C-j>是否:
3:s/\n/ , 它被转换为:
:. " from this line
:., " to
:.,.+2 " two lines below this line
:.,.+2s/\n/ , " do this substitution发布于 2013-04-24 09:46:45
如果您不介意使用一个寄存器,您可以将命令存储在一个寄存器中。
例如,您可以将以下内容添加到vimrc中
let @j = "A,\eJ"
nnoremap <C-j> @j@j使用j寄存器来存储命令。当您输入一个数字,后跟@j或<C-j>时,您将运行该命令n次,该命令将连接以逗号分隔的下n行。
将多行连接在一起的另一种方法是使用下面的函数。
function! CustomJoinLines(delim) range
for i in range(a:firstline, a:lastline)
exec "normal A" . a:delim . "\eJ"
endfor
endfunction此函数将使用您传入的分隔符将多行连接在一起。它还将保留J通常添加的空间。
要映射此命令,请将函数添加到vimrc和以下nnoremap
nnoremap <C-j> :call CustomJoinLines(" ,")<CR>
nnoremap <C-k> :call CustomJoinLines("!")<CR>https://stackoverflow.com/questions/16181489
复制相似问题