重映射vim中的箭头键

4

我试图让vim中的箭头键无效,以便习惯使用hjkl

在我的.vimrc文件中添加了几行代码后,一切都可以正常工作,但插入模式的重新映射没有生效。

nnoremap <Down> :echo "No down for you!"<CR>
vnoremap <Down> :<C-u>echo "No down for you!"<CR>
inoremap <Down> :<C-o> echo "No down for you!"<CR>

nnoremap <Up> :echo "No up for you!"<CR>
vnoremap <Up> :<C-u>echo "No up for you!"<CR>
inoremap <Up> :<C-o>echo "No up for you!"<CR>

nnoremap <Left> :echo "No left for you!"<CR>
vnoremap <Left> :<C-u>echo "No left for you!"<CR>
inoremap <Left> :<C-o>echo "No left for you!"<CR>

nnoremap <Right> :echo "No right for you!"<CR>
vnoremap <Right> :<C-u>echo "No right for you!"<CR>
inoremap <Right> :<C-o>echo "No Right for you!"<CR>

问题是,每次按下一个箭头键,它都会将以下字符串插入到我的文件中:

:echo "No **** for you!


1
最好习惯使用 hjkl,这是默认设置的原因。我也是 Vim 的新手,但 hjkl 的默认设置确实很有帮助。最近我发现,在 evince 中,j 和 k 键也是滚动 PDF 文档的默认设置。所以这种习惯不仅在 Vim 中有益,而且在其他地方也很有用。为了适应这种习惯,可以尝试一下这个有趣的方式 - Imran Ali
谢谢@Imran,我已经完成了Vim Adventures。这是一个不错的开始方式。 - Luiz Guilherme Ribeiro
3
在您的插入模式映射中,<C-o> 应该在 : 之后,因此例如左箭头的正确方式是 inoremap <Left> <C-o>:echo "No left for you!"<CR> - dNitro
如果可视模式和正常模式的映射相同,您可以只使用 noremap 命令,它会同时影响这两种模式! - Meninx - メネンックス
已经尝试过了,@dNitro也是同样的错误。此时此刻我的希望开始消失了。 - Luiz Guilherme Ribeiro
1
感谢 @Meninx,会节省几行代码! - Luiz Guilherme Ribeiro
1个回答

5
我们有vi.SE这个平台,专门解答Vim相关问题,如果您有问题可以直接在那里发布。无论如何:

Sardorbek的回答是正确的,映射到<nop> 正确的解决方案。也就是说:

noremap <Up> <nop>
noremap <Down> <nop>
noremap <Left> <nop>
noremap <Right> <nop>

inoremap <Up> <nop>
inoremap <Down> <nop>
inoremap <Left> <nop>
inoremap <Right> <nop>

然而,你的inoremap会将行打印到文件中的原因是因为你在映射的开头使用了:后面加上<c-o>,因此运行的正常模式命令是e(而不是:echo)。我相信你看到的行实际上是:
:cho "No **** for you!

而不是

:echo "No **** for you!

此外,<c-o> 只允许一个普通模式命令,但你需要两个:输出消息并否定箭头键移动。
本质上,以下代码是可行的,但实在太糟糕了(请不要这么做):
inoremap <Down> <esc>:echo "No down for you!"<CR>ki
inoremap <Up> <esc>:echo "No up for you!"<CR>ji
inoremap <Left> <esc>:echo "No left for you!"<CR>li
inoremap <Right> <esc>:echo "No Right for you!"<CR>hi

总的来说,在可能的情况下,使用<esc>比使用<c-o>c-u(在可视模式下)更好。

为什么使用 <esc> 比使用 <c-o><c-u> 更好? - Tom Hale
@TomHale - 我想我会认为这就像在类C语言的if语句中添加花括号,即使if只有一个语句。稍后你会添加更多语句,并忘记你没有花括号,然后想知道为什么第二个语句总是执行。c-o / c-u只允许一个命令,但很容易忘记,几周后再添加另一个命令。 - grochmal

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