电子表格样式进入vim?

时间:2013-08-01 22:31:47

标签: vim insert

这是我的数据:

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记住我插入的列的位置。这对于处理我上面的固定条目表非常方便。我希望保持插入 REPLACE 模式,但最大限度地减少光标的使用,覆盖上面的模板数据。

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

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

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

3 个答案:

答案 0 :(得分:5)

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

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

  • 光标(*)位于*333840,按R,开始覆盖
  • 完成后,按<ESC>jbR,光标将转到*xxxxxx,然后准备替换

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

inoremap <leader>g <esc>jbR

它的工作原理如下:

enter image description here

答案 1 :(得分: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>

答案 2 :(得分:1)

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