vim 映射键 + 列表字符

vim mapping keys + listchars

我是 vim 的新手,有几件事我不会做。

1) 列表字符。我设置 vim 以在尾随空格处放置点,但我希望 vim 将文件中的空格替换为点,因为现在 vim 仅在行尾的最后一个单词之后保存点。此外,我希望 vim 在当前行的开头放置一个 > 标记并放置一些内容而不是 TAB。

2) 如何覆盖默认键绑定?例如,如果 Vim 有自己的绑定 [Ctrl + A] 做某事,而我希望 Shift + T 做同样的事情 - 我应该怎么办?该问题的扩展:默认情况下,要在 vim 中的 split windows 之间移动,有一个绑定 [CTRL+W, arrow] (就像两次一致的点击)。我怎样才能覆盖它?我想使用 alt + arr 而不是 [ctrl+w, arrow]

3) 我做到了:

nmap <C-Space> :NERDTreeToggle<CR>

切换侧边栏,但不起作用。我读到 ctrl-space 不容易覆盖,但我仍然想用它来切换侧边栏。

1) 如果您阅读 vim help on 'listchars', you'll see that it provides a trail:c option that can be used to mark trailing spaces with a custom character c. I assume that's the option you are currently using. Fortunately, as of patch 7.4.711 (also see the changelog), 'listchars' 现在支持 space:c 选项,可用于标记所有 spaces 带有字符 c。所以你可以使用它,如果你的 vim 版本足够新的话。 (请注意,我刚刚链接到的在线 vim 帮助页面目前似乎有点过时,因此它没有提到 space:c 选项。)例如:

:set lcs+=space:.

关于将>放在当前行的开头,我认为这是不可能的。所以恐怕你运气不好,除非其他人知道我不知道的把戏。

最后,您可以使用 tab:xy 选项来放置一些东西而不是制表符。我实际上喜欢为此使用几个 Unicode 字符:

:set lcs+=tab:•·

2) 你在这里找的是mapping。您应该注意到 "Shift + T" 实际上只是大写 T,因为在所有现代计算机上移动字母键都会发送字母的大写变体。所以你可以用这个做你想做的事:

nmap T <C-a>

这会设置T使光标下的数字递增,这是^a.[=27的正常功能=]

最后,关于映射 alt-modified 箭头键,这可能很棘手,因为它取决于您 运行ning vim 在哪个平台上,例如无论您是 运行ning gvim on Windows 还是在 Unix 平台上构建的终端。如果gvim,可以直接使用<M-...>代码:

nmap <M-Left> <C-w>h
nmap <M-Down> <C-w>j
nmap <M-Up> <C-w>k
nmap <M-Right> <C-w>l

但在其他平台上,您需要找出在按下经过元修改的箭头键时可能发送的转义序列,并将其映射。例如,当我 运行 Cygwin vim in mintty on Windows 时,我可以这样使用:

nmap <Esc>[1;3D <C-w>h
nmap <Esc>[1;3B <C-w>j
nmap <Esc>[1;3A <C-w>k
nmap <Esc>[1;3C <C-w>l

您应该能够通过在缓冲区中进入插入模式(或命令行模式也应该有效)来找出组合键发送的转义序列,按 ^v,然后按组合键。插入的字符是组合键发送的转义序列。

3)我从来没有用过NERD树插件,也没有尝试过mapping control-space,所以我不能和这个说话。或许你可以提出一个新问题来关注这个问题。

1)

如果你刚刚这样做:

set listchars=...

这将不起作用,因为您还必须打开列表选项:

set list

我误解了你的问题。你应该像 bgoldst 推荐的那样使用 trail:.

2)

首先,您必须决定您希望重新映射如何工作,因为重新映射是模态的,例如他们以某些模式工作。例如,如果您希望 <shift-t> 在正常模式下等于 <C-a>,则必须执行 nnoremap.

nnoremap T <C-a>

您也可以使用

在可视、插入或命令模式下执行此操作
vnoremap
inoremap
cnoremap

推荐阅读:What is the difference between the remap, noremap, nnoremap and vnoremap mapping commands in vim?

3)

<C-space> 不映射到真正的 ASCII 字符,因此很难映射。但是,您仍然可以这样做。进入插入模式,输入

<C-v><C-space>

(ctrl+v 然后 ctrl+space) 这将插入当您按 ctrl+space 时 vim 看到的值。您很可能会看到 ^@,例如一个空字节。如果是这种情况,你可以映射到 ctrl+space with

nnoremap <NUL> :NERDTreeToggle<CR>