如何在VIM键映射命令系列中忽略错误?

4

我正在编辑行移动的按键映射,如下所示:

vnoremap <silent> <C-j> :m '>+1<CR>gv
vnoremap <silent> <C-k> :m '<-2<CR>gv

他们应该移动代码行块并在大多数情况下正常工作,但在文件顶部和底部除外。
当我选择第1行和第2行,并输入ctrl-k时,在视觉模式下,它不能再向上移动,而期望的行为是第1行和第2行仍然被突出显示。
当前的情况是,第1行和第2行不再被突出显示。我知道这是因为":m '<-1"失败了,那么gv就不会被执行。
所以我的问题是如何忽略这个错误来确保gv被执行?或者有其他解决方案吗?
请注意,我知道一种解决方案linemovement.vim。它在两个分开的命令和一些函数中运行这些代码。虽然我认为这应该是轻量级的代码。

类似于SU:http://superuser.com/questions/319048/vim-continue-macro-after-error-in-submacro - Ciro Santilli OurBigBook.com
1个回答

12

要抑制输出并跳过错误,您需要使用:silent!:

vnoremap <C-j> :<C-u>silent! '<,'>m '>+1<CR>gv
vnoremap <C-k> :<C-u>silent! '<,'>m '<-2<CR>gv
  • <C-u>会移除Vim自动插入的"选中范围(selection range)",因为:silent不允许使用范围。
  • 我们在:move前面添加'<,'>,以便它仍然适用于可视化选择。

这是应用于我的增强版(添加了自动缩进)的这些映射的修复程序:

nnoremap ,<Up>   :<C-u>silent! move-2<CR>==
nnoremap ,<Down> :<C-u>silent! move+<CR>==
xnoremap ,<Up>   :<C-u>silent! '<,'>move-2<CR>gv=gv
xnoremap ,<Down> :<C-u>silent! '<,'>move'>+<CR>gv=gv

感谢您提出这个想法。


1
这是一个解决方案。非常感谢! - Qiu Yangfan
这是一个很棒的解决方案。在搜索之前,我一直在尝试做类似的事情,但现在我看到了我的错误。自动缩进加1分。非常好的补充。 - Jebby
非常好!非常感谢! - nilsi

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