1

这是我的数据:

1.333840,2,3,4,5,6,7,8
1.xxxxxx,2,3,4,5,6,7,8
1.yyyyyy,2,3,4,5,6,7,8
1.zzzzzz,2,3,4,5,6,7,8 

我想做的是让 Vim 记住我插入的列的位置。这在处理我上面的固定条目表时会很方便。我希望保持插入 替换模式,但尽量减少光标的使用,覆盖上面的模板数据。

xxxxxx 应该是 444444 yyyyyy 应该是 555555 zzzzzz 应该是 666666

我想要做的是从第 1 行第 3 列位置开始并输入 i444444<spreadsheetenter>555555<spreadsheetenter>666666<esc>

是否有特殊模式或键绑定可以帮助我做到这一点?当我重新进入插入模式时,基本上将返回值保持在同一固定列。

4

3 回答 3

5
  • 如果你想“覆盖”模板数据,你不想在 INSERT 模式下进行,你需要替换模式。按R
  • 很多 vim 魔法都是在 NORMAL 模式下完成的,你应该考虑一下。

例如,对于您的问题,我会:

  • cursor( *) at *333840, 按R, 开始覆盖
  • 完成后,按<ESC>jbR,您的光标将转到*xxxxxx,并准备替换

您可以为此类工作创建映射,例如:

inoremap <leader>g <esc>jbR

它的工作原理如下:

在此处输入图像描述

于 2013-08-01T23:22:37.717 回答
1

您可以为您的 尝试以下映射<spreadsheetenter>

:nnoremap <S-CR> g`[j
:inoremap <S-CR> <Esc>g`[jR

奖金

这是一个更复杂的插入模式变体,它保持模式(插入与(虚拟)替换):

function! s:GetCurrentInsertMode()
    let s:currentInsertMode = mode()
    return ''
endfunction
function! s:RestartCurrentInsertMode()
    if s:currentInsertMode ==# 'i'
        startinsert
    elseif s:currentInsertMode ==# 'R'
        startreplace
    elseif s:currentInsertMode ==# 'Rv'
        startgreplace
    else
        throw 'ASSERT: Unknown mode: ' . string(s:currentInsertMode)
    endif
endfunction
inoremap <silent> <expr> <SID>(GetCurrentInsertMode) <SID>GetCurrentInsertMode()
inoremap <silent> <script> <S-CR> <SID>(GetCurrentInsertMode)<C-\><C-n>g`[j:call <SID>RestartCurrentInsertMode()<CR>
于 2013-08-02T06:49:40.413 回答
1

试试 csv 插件。默认情况下,它在(虚拟)替换模式下执行此操作。

于 2013-08-03T11:49:59.613 回答