在VIM中创建新模式(具有特定键绑定)?

时间:2014-04-03 08:10:45

标签: vi vim

假设我在当前标签中有几个打开的缓冲区,我想轻松调整它们的大小,所以我做了这样的映射:

nnoremap <c-j> <c-w><
nnoremap <c-k> <c-w>>
nnoremap <c-l> <c-w>+
nnoremap <c-h> <c-w>-

由于我通常不需要调整它,并且我已经用完了我的ctrl-key映射,我只想在按某个键时启用这种映射。< / p>

例如,我定义了一个&#34; resize-mode&#34;,并启用它。在我按下之后,(和其他人)的键绑定将改为上述;在我再次按下之后,这些键绑定将被更改回来。

如何实现......?

非常感谢

3 个答案:

答案 0 :(得分:3)

我一般都认为分割大小相同,但是当我需要关注特定的分割时,而不是按照你提到的方式重新调整大小,我想推荐一些其他的方法:

  1. 在新标签页中打开当前分组,然后根据需要进行读取/更改,只需:q即可返回上一个标签,所有分割都完好无损。在VIM中,您可以通过:tab split在拆分中执行此操作,只需在新标签页中打开当前拆分,保持较旧的标签保持不变。

  2. VIM有一个:resize [N]:vertical resize [N],其中N分别指定了分割的高度/宽度。如果您觉得它们很尴尬,请使用这些而不是映射。 注意:您还可以使用:resize +N:resize -N:vertical resize +N:vertical resize -N来更改相对于当前值的高度/宽度。

  3. 如果省略:resize [N],VIM :vertical resize [N][N]会将当前分割调整为最大尺寸,因此:resize会使窗口占据整个高度屏幕和:vertical resize将使窗口占据屏幕的整个宽度。 VIM还为这些提供映射,它们是&lt; C-w&gt; _ &lt; C-w&gt; | 。您可以使用这些来临时最大化当前分割并对其进行处理,完成后,只需按&lt; C-w&gt; = 来均等地调整所有分割的大小。

  4. (不推荐)如果您必须定义自己的映射并且之前的选项不适合您,您可以始终在映射前添加&lt; Leader&gt; ,这可以是在vimrc中单独配置。

答案 1 :(得分:2)

您可能没有注意到它,但<C-w>实际上会让您进入&#34;窗口管理&#34;模式以及它的价值,用鼠标调整窗口大小要好得多。

答案 2 :(得分:1)

您可以定义切换命令或映射。在其中,检查映射当前是否处于活动状态,并取消定义(或恢复)/定义它们。当您使用<buffer>定义临时重叠映射时,恢复(我认为这是您想要的,因为您的映射不足)会更容易;这样,原始映射不会丢失,它们只是暂时被覆盖。

function! ToggleMappings()
    if empty(maparg('<C-j>', 'n'))
        nnoremap <buffer> <c-j> <c-w><
        nnoremap <buffer> <c-k> <c-w>>
        nnoremap <buffer> <c-l> <c-w>+
        nnoremap <buffer> <c-h> <c-w>-
    else
        nunmap <buffer> <c-j>
        nunmap <buffer> <c-k>
        nunmap <buffer> <c-l>
        nunmap <buffer> <c-h>
    endif
endfunction
nnoremap <silent> <Leader>w :call ToggleMappings()<CR>
command! ToggleMappings call ToggleMappings()
相关问题