Vim:开始在与光标相同的列中的新行上插入

时间:2015-06-29 17:19:37

标签: haskell vim

Haskell有一个名为guards的语言功能,看起来像这样(从'|'开始):

powMod a p m | odd p = (a * powMod asq halfp m) `polyMod` m
             | otherwise = powMod asq halfp m
    where
        halfp = p `div` 2
        asq = (a*a) `polyMod` m

正确的风格要求您将防护装置保持在多条线条中。当我输入源代码时,我倾向于用一个后卫输入一个函数定义的第一行,然后按下Enter键,然后在我的方式中弄乱tabspacebackspace直到我将光标对齐在第一个“|”下面。我宁愿将光标放在第一个'|'(带有'F|'或类似的东西)上,然后做一些简单的事情来打开一个新行并开始插入同一列,没有自动注册强制光标退回到左边距,没有任何杂乱的手动对齐。

我需要做什么才能在同一列的下一行开始插入?

3 个答案:

答案 0 :(得分:3)

回答您的确切问题

  

我更愿意将光标放在第一个' |' (使用' F |'或类似的东西),然后做一些简单的事情来打开一个新行并开始在同一列插入

您可以设置virtualedit。这允许您将光标移动到任何地方,无论您是否到达行尾(我现在不能没有它)。这样,一旦您使用|,您只需按ji(向下并开始插入)。

完成此操作后,使用autoindent会使每个换行符以与上一行相同的缩进开始。

另一种方法是使用虚拟区块Ctrl-V,向下走几行并按r|。这将绘制一条|的垂直线。

答案 1 :(得分:2)

我前段时间在超级用户上发布了一个非常类似的问题:

  

How to align the cursor under a specific character?

还有另一个解决方案,我有点喜欢:这种对齐方式的问题是,如果更改函数的名称,变量的名称等,则需要更改整个块的缩进,这在将版本发送到版本控制项目等时尤其麻烦。另一种方法是添加新行,只需一步缩进,如

powMod a p m
    | odd p = (a * powMod asq halfp m) `polyMod` m
    | otherwise = powMod asq halfp m
  where
    halfp = p `div` 2
    asq = (a*a) `polyMod` m

如果模式本身变得过于复杂,就像使用pattern guards时一样,方程式可以再次缩进,如

powMod a p m
    | odd p -- some very long pattern
      = (a * powMod asq halfp m) `polyMod` m
    | otherwise
      = powMod asq halfp m
  ...

答案 2 :(得分:1)

我使用vim插件tabular进行对齐。还有其他插件,例如Align.vimvim-easy-align

如果您想进行自动对齐,请将以下内容添加到~/.vim/after/ftplugin/haskell.vim

inoremap <silent> <buffer> <bar> <bar><esc>:call <SID>align()<cr>a
function! s:align()
  if exists(':Tabularize') && line('.') > 1 && getline(line('.') - 1) =~ '|' && getline('.')[0:col('.')] =~ '^\s*|$'
    if getline(line('.') - 1) =~ '^\s*|'
      Tabularize/^\s*\zs|/
    else
      Tabularize/^[^|]*\zs|/
    endif
    normal! 0f|
  endif
endfunction

这将使您的警卫在插入模式下即时对齐。它需要表格插件。它基于Tim Pope的cucumbertables.vim gist

有关tabular.vim的更多帮助,请参阅以下Vimcasts剧集:Aligning text with Tabular.vim