在Vim中滚动长包裹的线条

时间:2015-01-03 03:33:53

标签: vim

问题:使用j向下滚动时,编写散文滚动时会以意想不到的方式运行。当我使用j在文本的两个长段落(vim包裹的行)之间滚动时,当到达下一个长段落(行)时,文本从屏幕底部“跳跃”到顶部,对齐第一个单词段落(行)与屏幕顶部(见下面的截图)。

受影响:喜欢Vim并希望用它来撰写散文的人。

预期:我希望段落(行)跳转到屏幕中间或继续滚动光标位于底部。否则跳跃太刺耳了 - 我失去了背景。两个问题: 1)是否可以更改.vimrc中的默认行为? 2)如果没有,编写一个改变行为的插件有多可行?

相关资源

例如:在这里我向下滚动一些虚拟文本:frame1

jj之后,下一个段落已移至屏幕顶部:frame2

我的.vimrc是here。散文模式是:

command! Prose setlocal linebreak nolist wrap wrapmargin=0
nnoremap k gk
nnoremap j gj

4 个答案:

答案 0 :(得分:2)

有助于向您介绍VIM的动作命令{}是文学文本的好词。但是在你描述的情况下,这些不是段落,而是行。 VIM将它们作为线路进行管理。因此,您必须重新映射jk,这与通常情况相反。我的建议是通过textwidth将这些行划分为段落。

最后,VIM具有操作可视区域的屏幕命令。由于VIM试图向您显示尽可能多的上下文(在您的情况下是一个非常长的行),它占据整个屏幕,您会看到&#34;跳转&#34;要反转此操作,请使用zz(AKA z<Enter>)命令移动屏幕可视区域以匹配中心的光标。其他人zt将可视区域放在顶部,zb将可行区域放在底部。

希望这些建议对VIMing有所帮助。

答案 1 :(得分:2)

正如@denten所提到的那样,他们不是段落的长篇。

使用jk导航时;您正在垂直移动同一列。但是,通过您的映射(jgjkgk),您可以在编辑器的视觉方式下垂直移动。

我建议删除该映射并使用gj&amp; <{1}}根据需要手动设置。

此外,如果滚动是您的要求,请考虑映射gk&amp; PageUp以下内容:

PageDown

或者,如果使用" Slow PageUp/PageDown nnoremap <silent> <PageUp> <c-y> nnoremap <silent> <PageDown> <c-e> PageUp的想法感觉很尴尬,请随意使用实际的键滚动:PageDownControl向上;并yControl向下。

答案 2 :(得分:2)

Vim本质上是一个基于行的编辑器。您正在使用:set wrap来显示整条长线。尽管如此,Vim仍然试图保持当前长行的开始(对于像:set number这样的功能),它显示了整条线的大部分内容。如果线条过长(占据大多数窗口,如截图中所示),则会导致当前行滚动到窗口顶部。我担心没有什么可以阻止的。您只能通过增加Vim窗口的大小或通过在文本中使用硬换行符进行编辑来解决此问题。

答案 3 :(得分:0)

不幸的是,这是Vim的问题之一。存在命令gq,该命令可以帮助您根据设置的文本宽度设置文本格式,从而节省时间。 se formatoptions+=a很有帮助,因为它会在编辑文本时重新格式化文本,因此您不必继续按gq。问题是,当然,现在您必须用空行定义段落,如果由于其他原因(例如,一行上的json对象很长,或日志文件等)。

简单地看一下它,当使用emacs的gnu GUI版本时,看来我实际上可以用鼠标滚轮按屏幕线滚动。这与MacVim不同。因此,看起来emacs至少对此具有某种支持。如果您正在撰写散文,那么也许可以通过emacs的EVIL模式插件获得帮助,该插件虽然不完整,但却是emacs中vim的相当复杂的版本。通常,对于确实喜欢修补并触摸系统的每个部分以进行新操作的人来说,emacs更具柔韧性,因此有人可能为此编写了一些好的散文模式。显然,它不允许您利用现有的Vim脚本。

通过跟踪链接,看来这种按屏幕行滚动的问题已经引起了布拉姆20年的关注。我的猜测是在现有系统中实现它有些棘手。这太糟糕了,因为当有人问这个问题时,不仅人们常常对想要的东西感到困惑,而且还有很多简单的原因使您想要它。它很少出现在代码中,并且经常出现在其他所有类型的文档中。