2014-09-27 86 views
1

我编辑的行移动键映射如下:如何忽略VIM密钥映射命令系列中的错误?

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

他们应该招行块上下的工作在大多数情况下,除了罚款在文件的顶部和底部。

当我选择第1行1 2,并输入ctrl-k,当然,它不能再向上移动,而预期的行为是行1 2在视觉模式下仍然是高亮的。

当前的样子是,行1 2不再高亮显示。我知道这是因为“:m'< -1”失败,那么gv将不会被执行。

所以我的问题是如何忽略这个错误,以确保无论如何执行gv?还是其他解决方案?

请注意,我知道解决方案linemovement.vim。它用两个分开的命令和一些函数来运行这些命令。虽然我认为这应该是一个轻量级的代码。

+0

与SU相似:http://superuser.com/questions/319048/vim-continue-macro-after-error-in-submacro – 2015-02-12 07:33:42

回答

4

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

vnoremap <C-j> :<C-u>silent! '<,'>m '>+1<CR>gv 
vnoremap <C-k> :<C-u>silent! '<,'>m '<-2<CR>gv 
  • <C-u>删除的Vim自动插入因为: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 

感谢您的想法。

+0

这是一个解决方案。非常感谢! – 2014-09-28 06:08:55