【问题标题】:Scrolling long wrapped lines in Vim在 Vim 中滚动长换行
【发布时间】:2015-01-03 03:33:53
【问题描述】:

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

受影响:喜欢 Vim 并想用它写散文的人。

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

相关资源

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

jj 之后,下一段移到了屏幕顶部:

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

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

【问题讨论】:

  • 那些不是真正的段落。它们是非常长的包裹线。
  • @FDinoff 你还怎么输入段落?
  • @Jivan 段落是由空行分隔的文本块。恰好图片中的行长 941 个字符,前面有一个空行,后面有一个空行。所以虽然是的,但它是一个段落。这是一个非常糟糕的段落。
  • @OllieFord 有很多换行符。您可以强制 vim 使用 set textwidth=80gq<motion> 插入它们

标签: vim


【解决方案1】:

这将有助于简要介绍 VIM 的运动命令 {} 是带有文学文本的好命令。但是,在您描述的情况下,这些不是段落,它们是行。 VIM 将它们作为行来管理。因此,您不得不重新映射jk,这与往常相反。我的建议是通过textwidth 将这些行分成几段。

VIM 终于有了屏幕命令来操作可视区域。由于 VIM 试图向您显示尽可能多的上下文(在您的情况下是一条非常长的行),它占据了整个屏幕,您会看到“跳转” 要扭转这种情况,请使用 zz (AKA z<Enter>) 命令来移动屏幕可视区域以匹配中心的光标。其他的是zt 将可视区域放置在顶部,zb 将可行区域放置在底部。

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

【讨论】:

  • 谢谢!我仍在寻求改变这种行为。有没有办法改变跳屏的行?
【解决方案2】:

正如@denten 所说,它们不是段落,而是长行。

当您使用jk 导航时;您正在垂直移动通过​​同一列。但是通过您的映射(jgjkgk),您正在垂直移动,就像被编辑器视觉包裹一样。

我建议删除该映射并根据需要手动使用gjgk

另外,如果 滚动 是您的要求,请考虑使用以下映射 PageUpPageDown

" Slow PageUp/PageDown
nnoremap <silent> <PageUp> <c-y>
nnoremap <silent> <PageDown> <c-e>

或者,如果使用PageUpPageDown 的想法觉得别扭,请随意使用实际的键来滚动:Controly 向上;和Controle 用于向下。

【讨论】:

  • 我使用 &lt;C-d&gt; / &lt;C-u&gt;&lt;C-f&gt; / &lt;C-b&gt; 进行基于键盘的滚动。
  • 好吧,那就忽略滚动部分。刚刚写了你提到的滚动。
  • 谢谢Jukku!使用 j 时,我仍然想更改屏幕下方的行向上移动到屏幕顶部的行为。
【解决方案3】:

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

【讨论】:

  • 嗯,我不认为这是它的逻辑,@IngoKarkat。该行的开头将在屏幕底部可见。我认为 Vim 正试图尽可能多地展示这条线。似乎应该有一个设置来禁用该行为。
  • 是的,我就是这个意思;对不起,如果我不清楚。一个选项当然会很好,但我只知道稍微相关的:set display=lastline
【解决方案4】:

不幸的是,这是 Vim 的问题之一。存在gq 命令,可以帮助您根据设置的文本宽度格式化文本,这样可以节省一些时间。 se formatoptions+=a 很有帮助,因为它会在您编辑文本时重新格式化文本,因此您不必一直按 gq。当然,问题是,现在你必须用空行来定义你的段落,如果你因为某些其他原因需要按屏幕行滚动(例如一行很长的 json 对象,或日志文件或其他)。

简单看一下,当使用 gnu GUI 版本的 emacs 时,似乎我实际上可以用鼠标滚轮滚动屏幕行。这与 MacVim 不同。所以看起来emacs至少对它有某种支持。如果你正在写散文,你可以只使用 emacs 的 EVIL 模式插件,它并不完整,但它是 emacs 中一个非常复杂的 vim 版本。一般来说,emacs对于那些真正喜欢修补和触摸系统的每个部分来做新事情的人来说更容易一些,所以有人可能已经为它写了一些很好的散文模式。不过,显然它不允许您利用现有的 vimscript。

根据您的链接,这个按屏幕行滚动的问题似乎已经在 Bram 的雷达上出现了 20 年。我的猜测是在现有系统中实现它有些棘手。这太糟糕了,因为当有人问这个问题时,人们不仅经常对想要的东西感到困惑,而且还有很多简单的理由你想要它。它很少出现在代码中,并且经常出现在所有其他类型的文档中。

【讨论】:

    猜你喜欢
    • 2011-08-01
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 2010-12-24
    • 2011-01-05
    • 2017-05-03
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多