【问题标题】:vim comment syntax coloring that resets based on columns value without linebreaksvim 注释语法着色,基于列值重置,没有换行符
【发布时间】:2016-02-13 02:02:44
【问题描述】:

我使用不使用链接中断的 FITS 文件。 这是一个此类文件的 sn-p:

SIMPLE  =                    T / file does conform to FITS standard             BITPIX  =                    8 / number of bits per data pixel                  NAXIS   =                    0 / number of data axes                            EXTEND  =                    T / FITS dataset may contain extensions            COMMENT   FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT   and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H TELESCOP= 'TELESCOP'           / Telescope (mission) name                       INSTRUME= 'INST    '           / Instrument name                                OBS_ID  = '00000000000'        / Observation ID                                 TARG_ID =                00000 / Target ID                                      SEG_NUM =                    0 / Segment number                                 TIMESYS = 'TT      '           / time measured from                             

当我查看这些文件时,我使用set numberwidth=6set columns=86

SIMPLE  =                    T / file does conform to FITS standard            
BITPIX  =                    8 / number of bits per data pixel                  
NAXIS   =                    0 / number of data axes                            
EXTEND  =                    T / FITS dataset may contain extensions            
COMMENT   FITS (Flexible Image Transport System) format is defined in 'Astronomy
COMMENT   and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H
TELESCOP= 'TELESCOP'           / Telescope (mission) name                  
INSTRUME= 'INST    '           / Instrument name                              
OBS_ID  = '00000000000'        / Observation ID                                 
TARG_ID =                00000 / Target ID                                      
SEG_NUM =                    0 / Segment number                                 
TIMESYS = 'TT      '           / time measured from                             

问题是syntax match myComment " / .*$" 显然不尊重set columns,它会在第一条评论之后突出显示所有内容。我想让它知道第一条评论只能延伸到第 80 列,第二条评论在第 160 列结束,依此类推。

编辑:

我已经创建了一个 vim 语法文件:

if exists("b:current_syntax")
    finish
endif

syn match fitsComment1 " / .*\%80c"
hi link fitsComment1 Comment
syn match fitsComment2 "COMMENT.*\%400c"
hi link fitsComment2 Comment
syn match fitsComment2 "COMMENT.*\%480c"
hi link fitsComment2 Comment

let c1 = 80
let c2 = 160
let c = 1
while c <= 8
    let regex = '" \%>' . c1 . 'c/ .*\%' . c2 . 'c"'
    execute 'syn match fitsComment2 '.regex
    hi link fitsComment2 Comment
    let c1 += 80
    let c2 += 80
    let c += 1
endwhile

let b:current_syntax = "fits"

此文件会产生所需的突出显示,但有一些注意事项: “多行” cmets 以 COMMENT 开头。 我加了

syn match fitsComment2 "COMMENT.*\%400c"
hi link fitsComment2 Comment
syn match fitsComment2 "COMMENT.*\%480c"
hi link fitsComment2 Comment

在我的示例中明确处理它们,但这不是真正的解决方法,因为我并不总是知道这些多行 cmets 将在哪里发生。

有没有办法在没有while 循环的情况下做到这一点?循环使读取文件非常慢(这些文件可能相当长)。

【问题讨论】:

    标签: vim syntax


    【解决方案1】:

    你可以这样做:

    syn match myComment1 " / .*\%80c"
    syn match myComment2 " \%>80c/ .*\%180c"
    hi link myComment1 Comment 
    hi link myComment2 Comment
    

    这使用\%c 正则表达式原子将正则表达式锚定到特定列。您必须创建一个新的同步匹配规则,直到您需要的所有列都被覆盖。请注意,第二条评论规则明确锚定在第 80 列之后开始,否则它将从第一个评论字符开始直到最后一个(贪婪匹配)。

    【讨论】:

    • 我使用您的建议创建了一个语法文件并更新了我的问题。我也有造成问题的多行 cmets,我当前通过循环的方法非常耗费资源。
    猜你喜欢
    • 2016-08-03
    • 2010-11-07
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2013-05-08
    • 1970-01-01
    相关资源
    最近更新 更多