在 Vim 中,我想绑定一个键,它将插入一个换行符并将该换行符缩进到柱子光标曾经所在的位置。这有点奇怪,让我举例说明:
例如:之前和之后,光标位于|
前:
a = str "Hello |World"
后:
a = str "Hello
|World"
这个概念与 vim 的“copyindent”或“preserveindent”设置无关(这些设置涉及前一行的前导缩进,而不是光标的列)。
答案1
尝试一下这个映射。
:inoremap <F2> <CR><C-R>=repeat(' ',col([line('.')-1,'$'])-col('.'))<CR><C-O>:.retab<CR>
当你按下 F2(或者你选择的任何映射键)时,Vim 会插入一个换行符(<CR>
),后跟一定数量的空格(<C-R>=repeat(' ',...)
),这些空格的数量等于上一行末尾的列号(col([line('.')-1,'$'])
)与当前列号(col('.')
)之差,然后会:retab
在当前行执行,根据你对“expandtab”的设置在当前行将这些空格替换为制表符和/或空格。
编辑
该映射要求您处于插入模式。我原以为您会在输入 Hello 之后、输入 World 之前输入映射键。要在正常模式下返回并插入换行符,请使用此映射。
nnoremap <F2> i<CR><C-R>=repeat(' ',col([line('.')-1,'$'])-col('.'))<CR><Esc>:.retab<CR>
答案2
我目前无法获得vim
(甚至)的副本来测试这一点,但可以尝试类似vi
i
EnterEsc-Yp:s/./ /g
EnterJ
它能做什么:
- 插入换行符(无需思考)。
- 返回该
a = str "Hello
行并复制一份。 - 将复制的行中的每个字符更改为空格 - 因此现在应该有 15 个空格。
- 将此行(15 个空格)合并到该
|World"
行,因此现在缩进 15 个空格。
您可能需要删除一个空格(因为连接操作可能会添加一个空格)。如果行中可能有制表符,您可能需要在该行第一部分的副本中添加将制表符扩展为空格的功能。并且您可能还想添加将空格压缩为制表符的功能。!_expandEnter
!_unexpandEnter