Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Vim中的v:count切换线路和n线?_Vim_Keyboard Shortcuts_Move - Fatal编程技术网

如何使用Vim中的v:count切换线路和n线?

如何使用Vim中的v:count切换线路和n线?,vim,keyboard-shortcuts,move,Vim,Keyboard Shortcuts,Move,我想在vim中创建一个映射,将当前行切换为n行 到目前为止,我有这样的想法: :nnoremap gl:<C-U> dd{v:count1}jO<Esc>pjdd{v:count1}o<Esc>p :nnoremap gl:dd{v:count1}jOpjdd{v:count1}op 但它不起作用。如何在此上下文中使用v:count变量?映射的计算结果与类型完全相同。像v:count这样的东西是特殊的Vimscript变量,因此它的值需要以某种方式插入到右

我想在vim中创建一个映射,将当前行切换为
n

到目前为止,我有这样的想法:

:nnoremap gl:<C-U> dd{v:count1}jO<Esc>pjdd{v:count1}o<Esc>p
:nnoremap gl:dd{v:count1}jOpjdd{v:count1}op

但它不起作用。如何在此上下文中使用v:count变量?

映射的计算结果与类型完全相同。像
v:count
这样的东西是特殊的Vimscript变量,因此它的值需要以某种方式插入到右侧的键中。对于映射,有两种可能性:

执行 使用
:execute
,您可以从正常模式(由
:nnoremap
启动)切换到Ex模式并组装命令;你需要
:正常
以运行先前仅作为右侧放置的正常模式命令。由于Vim会自动将提供给映射的任何
[count]
转换为Ex范围,因此必须清除该范围

nnoremap <silent> gl :<C-u>execute 'normal! yyma' . v:count1 . "jVp'aVp"<CR>
您的实现 我假设您选择了
gl
作为左侧,并且
是一种逃避尝试,就像我第一次使用的方法一样。此处缺少分隔左侧和右侧的空间,也缺少
:normal

我对实现做了以下更改:

  • 在它旁边删除和粘贴会使计数复杂化;相反,我在视觉选择上使用了粘贴(
    Vp
    );这会自动将删除的文本放入未命名寄存器中(以便可以在交换的第二部分中重用)
  • 为了简单起见,我设置了一个标记(
    ma
    ),而不是第二次使用计数跳回。您还可以为此使用跳转列表(
其他实现 对于简单的交换,您的实现可能就足够了,但还远远不够完美。可能需要交换多个(例如,目视选择的)行,使用
在其他位置重新交换,并检查目标行是否实际存在

该插件有一个交换映射
[e
。My也有一个健壮和通用的实现(以及许多其他相关的实现)

nnoremap <expr> gl '<Esc>yyma' . v:count1 . "jVp'aVp"