5

我的 Vim 配置包括set formatoptions=c,q,a. 我对以下问题感到非常恼火(|表示光标位置,它的确切位置无关紧要,因为您可能只知道它在此注释行中存在的事实很重要):

" This is a long line which we would like to wrap. However, something sick is go|ing to happen if we hit "gqip" here!
if has('win32') || has('win64')
  set runtimepath^=~/.vim
  set runtimepath+=~/.vim/after
endif

现在我们打gqip

" This is a long line which we would like to wrap. However, something sick is
" go|ing to happen if we hit "gqip" here!
if has('win32') || has('win64') set runtimepath^=~/.vim set
  runtimepath+=~/.vim/after endif

它的作用是 - 它实际上将整个内容视为一个段落。(是的,我知道用空行分隔可以防止这种行为,但它并不能解决问题!)我希望它确实是:

" This is a long line which we would like to wrap. However, something sick is
" go|ing to happen if we hit "gqip" here!
if has('win32') || has('win64')
  set runtimepath^=~/.vim
  set runtimepath+=~/.vim/after
endif

换句话说,如果gq能以某种方式忘记代码并只使用注释,那就太好了。

奖励:如何一次性在整个缓冲区上进行这种格式化(仅包装评论)?因为,理想情况下,我想将这些东西移到一个特殊的格式化挂钩中以保存文件。

4

5 回答 5

16

它实际上将整个内容视为一个段落

好吧,gqip你告诉它!你需要选择正确的动作。在这种单行的情况下,它将是gqq. 对于 3 行,即gq2j. 如果行数太多,请使用可视模式:Vjjjjjjgq.

于 2012-12-11T07:36:46.527 回答
4

ip正如@IngoKarkat 指出的那样,文本对象的含义相当狭窄:它只是由空行分隔的任何文本段落。

我还创建了一个插件,您可以使用它来解决这个问题。

textobj-comment - 用于评论的文本对象

SameSyntaxMotion插件相比,textobj-comment依赖于特定于文件类型的'comments'设置来识别注释。这意味着即使关闭了语法高亮,它也应该可以工作。

用于gqic格式化评论。

专业提示:首选gwgq因为它保留了光标位置。

于 2013-07-06T12:19:17.277 回答
3

使用我的SameSyntaxMotion 插件,您可以使用ay文本对象来表示光标所在的整个注释块,并使用gqay.

于 2012-12-11T13:58:54.433 回答
2

使用 搜索注释行:g,然后将这些行换行:

:%g/^"/normal gq_
于 2012-12-11T00:37:30.807 回答
0

我知道我参加聚会有点晚了,但我在自己调查同样的问题时发现了这个问题。怎么样:

set formatprg=fmt\ --prefix='\"'

有了那个 gqip 似乎可以按要求行事。不过,我肯定会检查 SameSyntaxMotion 插件。

于 2014-05-27T17:51:50.367 回答