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键,然后在我的方式中弄乱tab
,space
和backspace
直到我将光标对齐在第一个“|
”下面。我宁愿将光标放在第一个'|
'(带有'F|
'或类似的东西)上,然后做一些简单的事情来打开一个新行并开始插入同一列,没有自动注册强制光标退回到左边距,没有任何杂乱的手动对齐。
我需要做什么才能在同一列的下一行开始插入?
答案 0 :(得分:3)
回答您的确切问题
我更愿意将光标放在第一个' |' (使用' F |'或类似的东西),然后做一些简单的事情来打开一个新行并开始在同一列插入
您可以设置virtualedit
。这允许您将光标移动到任何地方,无论您是否到达行尾(我现在不能没有它)。这样,一旦您使用|
,您只需按ji
(向下并开始插入)。
完成此操作后,使用autoindent
会使每个换行符以与上一行相同的缩进开始。
另一种方法是使用虚拟区块Ctrl-V
,向下走几行并按r|
。这将绘制一条|
的垂直线。
答案 1 :(得分:2)
我前段时间在超级用户上发布了一个非常类似的问题:
还有另一个解决方案,我有点喜欢:这种对齐方式的问题是,如果更改函数的名称,变量的名称等,则需要更改整个块的缩进,这在将版本发送到版本控制项目等时尤其麻烦。另一种方法是添加新行,只需一步缩进,如
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.vim和vim-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。