Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim:;gq“;命令硬包装注释,但不包装代码(即使中间没有空行)_Vim_Format_Comments - Fatal编程技术网

Vim:;gq“;命令硬包装注释,但不包装代码(即使中间没有空行)

Vim:;gq“;命令硬包装注释,但不包装代码(即使中间没有空行),vim,format,comments,Vim,Format,Comments,我的Vim配置包括set formatoptions=c、q、a。我对以下问题感到非常恼火(|表示光标位置,它的确切位置并不重要,因为您可能只知道它出现在这条注释行中的事实): 现在我们点击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

我的Vim配置包括
set formatoptions=c、q、a
。我对以下问题感到非常恼火(
|
表示光标位置,它的确切位置并不重要,因为您可能只知道它出现在这条注释行中的事实):

现在我们点击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
能够以某种方式忘记代码,只处理注释,那就太好了


额外奖励:如何一次对整个缓冲区进行格式化(仅包装注释)?因为,理想情况下,我希望将这些内容移动到一个特殊的格式挂钩以保存文件。

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

:%g/^"/normal gq_
它实际上把整件事当作一个段落


好吧,有了gqip,你告诉它的!你需要选择正确的动作。在这种情况下,只有一行,它将是
gqq
。对于3行,这是
gq2j
。如果要计数的行太多,请使用视觉模式:
vjjjgq

对于my,您可以使用
ay
文本对象来表示光标所在的整个注释块,并使用
gqay
对其重新格式化
ip
文本对象的含义非常狭窄,正如@IngoKarkat所指出的:它只是由空行分隔的任何文本段落

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

-注释的文本对象

与SameSyntaxMotion插件不同,textobj comment依赖于特定于文件类型的
“comments”
设置来识别注释。这意味着即使关闭了语法突出显示,它也应该可以工作

使用
gqic
格式化注释


专业提示:优先于gq,因为它保留了光标位置。

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

set formatprg=fmt\--前缀='\''


gqip的行为似乎符合要求。不过,我肯定会检查SameSyntaxMotion插件。

在这种情况下,这是违反直觉的。在这种情况下,您真正希望Vim做的是考虑多行注释(中间没有空行)作为其自身的段落,无论它们是否用空行分隔(上方和下方)从代码看。代码就是代码,注释就是注释。计算每次要包装的注释行数很烦人,而且浪费时间,即使这看起来像是快速行动——时间实际上往往会累积,你知道。有什么方法可以教Vim将注释视为一个段落,而不考虑分隔?我真的希望看到由于
formatoptions
中的
q
,这种行为是开箱即用的,但事实并非如此,我认为这是一个很大的不幸。正如你提到的,另一种方法是提供正确的动作。你能想出一个通用的动作吗(使用任何语言处理注释,可能使用一些表示当前注释引线的变量)运动,这样当我在注释块内时,它会转到该块的开头(当上面没有相邻的注释行时),并选择文本直到结尾(当下面没有相邻的注释行时)这确实会起作用。Vim没有更好地支持这一点,这确实令人惊讶。注释只是语法高亮显示的一种特殊情况,很少有核心支持。有趣的是,我已经编写了一个插件来定义基于语法高亮显示的文本对象。请查看我的另一个答案。您的解决方案包含了ines,而主要目标是包装注释段落-这更通用。另一个缺点是您已经为VimL硬编码了注释标题
。最好为任何编程语言(或至少任何编程语言)提供通用解决方案,如果可以访问存储当前注释标题的变量,这是很简单的。我自己也不知道变量的名称以及它是否存在。Sick stuff man,干得好,感谢您共享此插件。只需一句话-由于使用pa进行打包,安装它有点麻烦thogen.另外,我觉得一个更好的名字应该是
SyntaxGroupMotion
,它将更容易找到,也更直观。现在有一个问题-它可以与默认的映射
y
y
,但我尝试将它重新映射到
g
g
(在“组”助记符之后)我运气不好。这里的诀窍是什么?啊,对不起,它确实会将它重新映射到
g
。问题是像这样映射组合
nnoremap gwag
。小心,人们应该像这样映射它
nmap gwag
,否则它无法捕获插件的
g
映射。加上1用于包含病原体安装行,这样我就可以把它们直接剪切粘贴到终端上。如果它能在行的末尾留下注释,然后缩进到那个位置,那就好了
:%g/^"/normal gq_