我正在尝试创建一个模仿emacs CTL-K的vim键绑定:
- 如果在行的末尾使用它,则会终止行结尾的换行符,将下一行合并到当前行中(因此,完全删除空行)。
- 否则,C-k会杀死从点到行尾的所有文本;
- 如果点最初位于该行的开头,则会将该行留空。
醇>
我在https://unix.stackexchange.com/a/301584/137686看到了一个答案,建议如下
inoremap <C-K> <Esc>lDa
它似乎适用于案例2,但不适用于案例1(它不会删除换行符)或3(它会将第一个字符留在行中)。关于如何改进映射以实现所有三个的任何建议?
答案 0 :(得分:7)
尝试这个expr
映射:
inoremap <expr> <c-k> '<c-o>'.(col('.')==col('$')?'J':'D')
它会检查您当前的光标位置,以决定执行D
或J
。
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
我没有测试边缘情况,但我确信这足以让你开始。