映射具有意想不到的效果

时间:2014-02-15 22:32:49

标签: vim

我创建了一个映射来将当前行向上移动一行。

:map _ ddkP

它有效,除了在第一行执行时,它删除第一行。

我希望不会发生任何事情,因为我在第一行执行ddkP,没有任何反应。我哪里错了?

2 个答案:

答案 0 :(得分:8)

执行ddkP时,命令会单独执行:

  1. 删除当前行
  2. 光标向上移动一行
  3. 以前拉出的线被粘贴在当前行
  4. 上方

    由于它们是隔离的,因此一个命令中的失败不会阻止执行其他命令。在你的情况下,Vim无法向上移动一行,但它可以完美地粘贴在当前行之上。

    当作为单个命令执行时,作为宏,命令中的失败将停止执行整个宏,并且不执行其他命令。

    在您的示例中,第一步dd有效,但k无法将光标移动到当前行上方的行上,并且一切都已停止:Vim甚至从未尝试执行{ {1}}。

    处理“第一线”问题的一种方法是编写一个像Birei的回答一样的函数。

    另一种方法是使用不同的命令,当你在第一行时抛出错误。

    P

    具有不堵塞剪贴板/寄存器的额外好处。

    请参阅this page on the Vim wiki

答案 1 :(得分:1)

您必须使用map命令来评估表达式,因此您必须添加<expr>并使用一个函数来检查您的光标是否在文件的第一行。

因此,请将此功能添加到vimrc文件中:

function! Swap()
    if line('.') > 1 
        return 'ddkP'
    endif
    return ''
endfunction

并使用以下map命令:

:map <expr> _ Swap()

这样它只会在if条件成功时交换行。

相关问题