首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行一次自定义vim map快捷键就可以了,但是运行x次就不行了。

运行一次自定义vim map快捷键就可以了,但是运行x次就不行了。
EN

Stack Overflow用户
提问于 2013-04-24 08:38:56
回答 2查看 308关注 0票数 0

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

代码语言:javascript
复制
:map <C-j> A<space>,<ESC>J

当我按一次Ctrl-j组合键时,它可以正常工作

代码语言:javascript
复制
Before           After
test             test , test
test             test
test

但是,当我试图通过按"2Ctrl-j“一次连接多个行时,我会得到以下结果

代码语言:javascript
复制
Before           After
test             test , , test
test             test
test

我做错了什么?如何将多行合并为一个逗号分隔的行?我试着用<C-[>替换<Esc>,但不起作用。

另外,有没有一种方法可以参数化连接符号?例如,如果我想映射Ctrl-k后跟任何字符,以使用指定的字符连接两行,那么对应的映射是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-24 13:36:57

你的方法是有缺陷的,因为2<C-j>

  • 告诉Vim在当前行后面添加两次逗号(2A<space>,)
  • and J不会接受计数,因此只工作一次(即使它工作了,J也与2J…相同)。

此外,像A<space>,<ESC>J这样的命令序列更适合宏。如果希望映射与计数一起工作,则应该在映射的右侧只使用一个命令( Ex命令是最好的),如果可能的话,使用一个不那么“平凡”的方法。

下面是一个更好的方法:

代码语言:javascript
复制
:nnoremap <C-j> :s/\n/ , <CR>
:xnoremap <C-j> :s/\n/ , <CR>

有了这些映射,您可以在普通模式下执行<C-j>3<C-j>,并在<C-j>中正常运行。以下是Vim在上面三个场景中的操作:

  • normal模式<C-j>将当前行上的EOL替换为,

:s/\n/,

  • normal mode 3<C-j>将此行和下面两行上的EOL替换为,

:.,.+2s/\n/,

  • 视觉模式<C-j>在视觉选择的每一行上将EOL替换为,

:'<,'>s/\n/,

如您所见,使用Ex命令会自动插入正确的范围,并使您的映射更具可预测性。

编辑

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

代码语言:javascript
复制
3<C-j>

是否:

代码语言:javascript
复制
3:s/\n/ , 

它被转换为:

代码语言:javascript
复制
:.             " from this line
:.,            " to
:.,.+2         " two lines below this line
:.,.+2s/\n/ ,  " do this substitution
票数 2
EN

Stack Overflow用户

发布于 2013-04-24 09:46:45

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

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

代码语言:javascript
复制
let @j = "A,\eJ"
nnoremap <C-j> @j

@j使用j寄存器来存储命令。当您输入一个数字,后跟@j<C-j>时,您将运行该命令n次,该命令将连接以逗号分隔的下n行。

将多行连接在一起的另一种方法是使用下面的函数。

代码语言:javascript
复制
function! CustomJoinLines(delim) range
    for i in range(a:firstline, a:lastline) 
        exec "normal A" . a:delim . "\eJ"
    endfor
endfunction

此函数将使用您传入的分隔符将多行连接在一起。它还将保留J通常添加的空间。

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

代码语言:javascript
复制
nnoremap <C-j> :call CustomJoinLines(" ,")<CR>
nnoremap <C-k> :call CustomJoinLines("!")<CR>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16181489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档