在vim键映射中使用变量

6

当我在vim中映射键时,如何使用变量?我试图解决的具体问题是我需要以下这些键映射:

nnoremap <C-1> 1gt
nnoremap <C-2> 2gt
nnoremap <C-3> 3gt

... and so on.

我可以帮您进行翻译,以下为具体内容:

我能否指定一种映射方式,比如说

nnoremap <C-x> xgt

x将取被按下的键值(可以是1..9)

谢谢。

编辑1:根据Peter Rincker的建议解决方案(尚未完成)

我可以使用函数

function gotoTab(num)
   execute "normal" a:num."gt"
endfunction

如果我执行:call goToTab(3),它会跳转到标签页 3。

我如何将 Command-x(D-x)映射到 goToTab(x),其中 x 在 1..9 之间。如何从 Command-x 按键中读取数字?

1个回答

6
我有一个坏消息。你不能映射 <c-1>,等等。你只能绑定 <c-6>,但我不会这样做,因为它非常方便。
另外,你似乎正在使用基于选项卡的工作流程。我知道这可能听起来很奇怪,但也许可以使用更少的选项卡窗格和更多的缓冲区。以下是一些关于此的好帖子: ... 好吧,但我真的想做这个变量映射的事情。你有以下几个选项:
  • 使用 for 循环并使用 :execute 创建映射
  • 更 Vim 的方式是使用计数器,例如 7gt。这里的 7 是计数器。
下面是使用 :for:execute 的示例:
for i in range(1, 9)
  execute "nnoremap \<d-" . i . "> " . i . "gt"
endfor

注意:此处使用的命令语法为<d-...>,仅适用于MacVim,不支持终端(请参见:h <D-)。您可以使用<a-...>来代替Alt键。但是我必须警告您,在终端上使用Alt键可能会有些棘手。
更多帮助请参见:
:h keycodes
:h map-which-keys
:h :for
:h :exe
:h count
:h v:count
:h range(

谢谢关于缓冲区的信息。我是Vim的新手,甚至对它们毫不知情。虽然我会阅读和查找有关缓冲区的资料,但仅出于学习Vim的目的,我想尝试实现上述内容(例如使用命令键而不是控制键)。请参见我上面编辑过的消息。由于您提供的其他指针,我距离解决方案又向前迈进了一步。您或其他人能否帮助我完成下一步(或找到解决方案)。谢谢! - Curious2learn
@Ben 我该如何将数字(无论是Alt还是Command)作为输入读取到循环或函数调用中?希望能够提供一个示例。我认为for循环不起作用,因为它将从当前选项卡开始计数。这不是2gt所做的。谢谢。 - Curious2learn
看起来添加了一个示例。它将不会从当前选项卡开始计数,而且这也不是 2gt 的作用。无论您在哪个选项卡上,2gt 都将始终从最左边的选项卡开始,转到第二个选项卡页。 - Ben
如果你想从当前标签开始计数,可以使用表达式寄存器。将你的 :execute 行修改为:execute "nnoremap \<d-" . i . "> " . i . "@='gt'\<cr>"。更多信息请参考 :h @:h @=,以及这个 Vimcast 的视频:Creating mappings that accept a count - Peter Rincker
@Ben 我误解了for循环。我知道2gt是什么意思,但是我以为for循环从当前标签页开始计数。 - Curious2learn
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接