Haskell有一个名为“警卫”的语言特性,看起来如下(从‘|
’开始):
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|
’或类似的东西)上,然后做一些简单的事情来打开一个新的行,然后开始在同一列插入,而不自动缩进使光标退到左边的边缘,并且没有任何混乱的手动对齐。
在同一列的下一行开始插入时,我需要做的简单事情是什么?
发布于 2015-06-29 19:36:18
来回答你的问题
我更喜欢把光标放在第一个“\”(带有‘F\“或类似的东西)上,然后做一些简单的事情,打开一个新行,然后开始在同一列插入
您可以设置virtualedit
。这允许您在任何地方移动光标,无论您是否到达行尾(现在没有它,我就活不下去)。这样,一旦你在|
上,你只需要按下ji
(下去开始插入)。
完成此操作后,使用autoindent
使每个换行符与前一行在相同的缩进处开始。
另一种方法是使用虚拟块Ctrl-V
,向下走几行,然后按r|
。这将绘制|
的垂直线。
发布于 2015-06-29 19:03:49
不久前,我在超级用户上发布了一个非常类似的问题:
不过,还有另一种解决方案,我比较喜欢:这种对齐方式的问题是,如果您更改函数的名称、变量的名称等,则需要更改整个块的缩进,这很麻烦,特别是当向版本控制的项目发送补丁时,另一种方法是添加新行,只需一步缩进。
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
如果模式本身变得过于复杂,比如使用图案护卫时,可以再次缩进方程,如
powMod a p m
| odd p -- some very long pattern
= (a * powMod asq halfp m) `polyMod` m
| otherwise
= powMod asq halfp m
...
发布于 2015-06-29 18:53:12
我使用vim插件表形来对齐。还有其他插件,如Align.vim和易对齐。
如果您想进行自动对齐,那么将以下内容添加到~/.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
这将使您的警卫在插入模式下动态对齐。它需要表格插件。它是以蒂姆·波普的cucumbertables.vim要点为基础的。
有关tabular.vim的更多帮助,请参见以下维姆卡斯特集:用Tabular.vim对齐文本。
https://stackoverflow.com/questions/31121764
复制相似问题