Vim键绑定,模仿emacs CTL-K

时间:2017-08-07 03:01:58

标签: vim emacs editor

我正在尝试创建一个模仿emacs CTL-K的vim键绑定:

  
      
  1. 如果在行的末尾使用它,则会终止行结尾的换行符,将下一行合并到当前行中(因此,完全删除空行)。
  2.   
  3. 否则,C-k会杀死从点到行尾的所有文本;
  4.   
  5. 如果点最初位于该行的开头,则会将该行留空。
  6.   

我在https://unix.stackexchange.com/a/301584/137686看到了一个答案,建议如下

inoremap <C-K> <Esc>lDa

它似乎适用于案例2,但不适用于案例1(它不会删除换行符)或3(它会将第一个字符留在行中)。关于如何改进映射以实现所有三个的任何建议?

3 个答案:

答案 0 :(得分:7)

尝试这个expr映射:

inoremap <expr> <c-k> '<c-o>'.(col('.')==col('$')?'J':'D')

它会检查您当前的光标位置,以决定执行DJ

c-o确保在操作后返回插入模式。

注意

插入模式ctrl-k对于输入有向图非常有用。如果要使用映射禁用该功能,请三思。

答案 1 :(得分:4)

我写了一个函数来实现这个目的:

inoremap <C-K> <c-r>=CtrlK()<cr>

function! CtrlK()
    let col = col('.')
    let end = col('$')

    if col == end
        return "\<Del>"
    elseif col == 1
        return "\<Esc>cc"
    else
        return "\<Esc>lc$"
    endif
endfunction

答案 2 :(得分:1)

如果你需要一个单行映射来玩,你可以使用它:

inoremap <C-K> <Esc>:if col(".")==col("$")-1\|exe "normal gJh"\|else\|exe "normal lD"\|endif<Enter>a

我没有测试边缘情况,但我确信这足以让你开始。