Linux HowTo: Defining a color to be the same color of comments

Original Source Link

I’m using the indentLine plugin to display line indents with a continuos vertical line, and I’d like to set the color of that line to the same color of my comments.

To get the foreground color of my comments I listed all the color groups with :hi, checked what my colorscheme had set for the guifg of the Comments group, and set it accordingly, i.e. I have this in my init.vim config

let g:indentLine_color_gui='#5c6370'

which works, but if I want to change colorscheme I’d have to do this again. Is there a variable that holds the color of the comments defined by my colorscheme? What I’d like to do is

let g:indentLine_color_gui=<comment_guifg>

There’s :h g:indentLine_defaultGroup specially for this case. So it becomes simply

let g:indentLine_defaultGroup = 'Comment'

In principle, when you need to read in the color from an existing highlight group it’s done like that:

let color = synIDattr(synIDtrans(hlID('Comment')), 'fg')

hlID() returns numerical ID; synIDtrans() follows links if any; synIDattr() returns requested attribute.

This is given as an example in :h hlID() and it’s basically what indentLine plugin does with g:indentLine_defaultGroup for you.

I came up with

execute('highlight Comment')->split('n')->filter({i,v -> v =~# '^Comment'})[0]->split(' ')->filter({i,v -> v =~# 'guifg'})[0]->split('=')

as a way to parse the output of :highlight, but it doesn’t take links into account, so it will probably be wrong. (With dracula it gives Blue, but Comment is linked to DraculaComment which uses a completely different color.)

If the plugin exposes a highlight group, you can just do

augroup myPluginHighlights
  autocmd!
  autocmd ColorScheme * highlight link pluginGroup Comment
augroup END

Tagged : / /

Code Bug Fix: Why is such a big excerpt being returned for Solr search query?

Original Source Link

I am trying to determine why the highlighted excerpt is so large and if there’s a way to reduce it.

Consider the following:

  • Solr version 5.5.5
  • My schema for text field looks like:

    <fieldType name="text" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
        <filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="true"/>
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <!-- in this example, we will only use synonyms at query time
        <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
        -->
        <!-- Case insensitive stop word removal. -->
        <filter class="solr.StopFilterFactory"
                ignoreCase="true"
                words="stopwords.txt"
                />
        <filter class="solr.WordDelimiterFilterFactory"
                protected="protwords.txt"
                generateWordParts="1"
                generateNumberParts="1"
                catenateWords="1"
                catenateNumbers="1"
                catenateAll="0"
                splitOnCaseChange="0"
                preserveOriginal="1"/>
        <filter class="solr.LengthFilterFactory" min="2" max="100" />
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
        <filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="18"/>
      </analyzer>
      <analyzer type="query">
        <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.StopFilterFactory"
                ignoreCase="true"
                words="stopwords.txt"
                />
        <filter class="solr.WordDelimiterFilterFactory"
                protected="protwords.txt"
                generateWordParts="1"
                generateNumberParts="1"
                catenateWords="0"
                catenateNumbers="0"
                catenateAll="0"
                splitOnCaseChange="0"
                preserveOriginal="1"/>
        <filter class="solr.LengthFilterFactory" min="2" max="100" />
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
      </analyzer>
      <analyzer type="multiterm">
        <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.StopFilterFactory"
                ignoreCase="true"
                words="stopwords.txt"
                />
        <filter class="solr.WordDelimiterFilterFactory"
                protected="protwords.txt"
                generateWordParts="1"
                generateNumberParts="1"
                catenateWords="0"
                catenateNumbers="0"
                catenateAll="0"
                splitOnCaseChange="1"
                preserveOriginal="1"/>
        <filter class="solr.LengthFilterFactory" min="2" max="100" />
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
      </analyzer>
    </fieldType>
    
  • Highlight Component for Solr has the following configuration:

    <searchComponent class="solr.HighlightComponent" name="highlight">
      <highlighting>
        <!-- Configure the standard fragmenter -->
        <!-- This could most likely be commented out in the "default" case -->
        <fragmenter name="gap"
                    default="true"
                    class="solr.highlight.GapFragmenter">
          <lst name="defaults">
            <int name="hl.fragsize">30</int>
          </lst>
        </fragmenter>
    
        <!-- A regular-expression-based fragmenter
             (for sentence extraction)
          -->
        <fragmenter name="regex"
                    class="solr.highlight.RegexFragmenter">
          <lst name="defaults">
            <!-- slightly smaller fragsizes work better because of slop -->
            <int name="hl.fragsize">30</int>
            <!-- allow 50% slop on fragment sizes -->
            <float name="hl.regex.slop">0.5</float>
            <!-- a basic sentence pattern -->
            <str name="hl.regex.pattern">[-w ,/n"']{20,200}</str>
          </lst>
        </fragmenter>
    
        <!-- Configure the standard formatter -->
        <formatter name="html"
                   default="true"
                   class="solr.highlight.HtmlFormatter">
          <lst name="defaults">
            <str name="hl.simple.pre"><![CDATA[<strong>]]></str>
            <str name="hl.simple.post"><![CDATA[</strong>]]></str>
          </lst>
        </formatter>
        <!-- Configure the standard fragListBuilder -->
        <fragListBuilder name="simple"
                         default="true"
                         class="solr.highlight.SimpleFragListBuilder"/>
    
        <!-- Configure the single fragListBuilder -->
        <fragListBuilder name="single"
                         class="solr.highlight.SingleFragListBuilder"/>
    
        <!-- default tag FragmentsBuilder -->
        <fragmentsBuilder name="default"
                          default="true"
                          class="solr.highlight.ScoreOrderFragmentsBuilder">
          <!--
          <lst name="defaults">
            <str name="hl.multiValuedSeparatorChar">/</str>
          </lst>
          -->
        </fragmentsBuilder>
    
        <!-- multi-colored tag FragmentsBuilder -->
        <fragmentsBuilder name="colored"
                          class="solr.highlight.ScoreOrderFragmentsBuilder">
          <lst name="defaults">
            <str name="hl.tag.pre"><![CDATA[
                 <b style="background:yellow">,<b style="background:lawgreen">,
                 <b style="background:aquamarine">,<b style="background:magenta">,
                 <b style="background:palegreen">,<b style="background:coral">,
                 <b style="background:wheat">,<b style="background:khaki">,
                 <b style="background:lime">,<b style="background:deepskyblue">]]></str>
            <str name="hl.tag.post"><![CDATA[</b>]]></str>
          </lst>
        </fragmentsBuilder>
    
        <boundaryScanner name="default"
                         default="true"
                         class="solr.highlight.SimpleBoundaryScanner">
          <lst name="defaults">
            <str name="hl.bs.maxScan">10</str>
            <str name="hl.bs.chars">.,!? 	
    
</str>
          </lst>
        </boundaryScanner>
    
        <boundaryScanner name="breakIterator"
                         class="solr.highlight.BreakIteratorBoundaryScanner">
          <lst name="defaults">
            <!-- type should be one of CHARACTER, WORD(default), LINE and SENTENCE -->
            <str name="hl.bs.type">WORD</str>
            <!-- language and country are used when constructing Locale object.  -->
            <!-- And the Locale object will be used when getting instance of BreakIterator -->
            <str name="hl.bs.language">en</str>
            <str name="hl.bs.country">US</str>
          </lst>
        </boundaryScanner>
      </highlighting>
    </searchComponent>
    
  • The query I perform is:

    GET /solr/al_test/select?fl=item_id%2Cindex_id%2Cscore&qf=tm_body%24summary%5E8.0&qf=tm_body%24value%5E3.0&qf=tm_title%5E21.0&start=0&rows=30&sort=score%20desc&hl=true&hl.fl=content&hl.simple.pre=%5BHIGHLIGHT%5D&hl.simple.post=%5B%2FHIGHLIGHT%5D&hl.snippets=3&hl.fragsize=55&hl.mergeContiguous=true&wt=json&json.nl=map&q=%22Jan%22%20AND%20%22Jedli%C4%8Dka%22
    
  • The response is:

    {
      "response": {
        "numFound": 1,
        "start": 0,
        "maxScore": 8.571791,
        "docs": [
          {
            "index_id": "al_global_search_nodes",
            "item_id": "6459",
            "score": 8.571791
          }
        ]
      },
      "highlighting": {
        "9qe7lo-al_global_search_nodes-6459": {
          "content": [
            "<p>Die Auseinandersetzung mit dem Thema der Landschaft spielt im Werk von [HIGHLIGHT]Jan[/HIGHLIGHT] [HIGHLIGHT]Jedlička[/HIGHLIGHT] (*1944, Prag) seit Ende der",
            " Licht, Schatten.<br />Jedlička sammelt in der Maremma (wie auch in Irland oder der Prager Umgebung) Erde und Gestein, um daraus im Atelier Pigmente herzustellen, die er auf einer mit Japanpapier beschichteten Leinwand in freien Formen sedimentieren lässt. Schwer fassbare Elemente wie das reflektierte Licht auf dem Wasser bedürfen der technischen Transformation durch die Kamera oder die Mittel der Druckgrafik (Heliogravur und Mezzotinto). Die Basis für ein Sujet in Photosiebdruck war gar das handfeste Eingreifen des Künstlers in die Landschaft. Mit einem verschmitzten Lächeln erzählt er, wie er eines Tages nach einer langen Trockenperiode eine Schleuse öffnete und das Wasser in die aufgesprungene Lehmkruste fliessen liess. Die Kreise, die sich am zweiten Tag zufällig gebildet hatten, hat er dann fotografiert und für die Siebdrucke verwendet. Die Mezzotinten dagegen sind von Hand in einem langwierigen trockenen Verfahren hergestellt. Auf den aufgerauten Kupferplatten wird das Licht mit einem Polierstahl geduldig und minutiös herausgearbeitet, ‹entwickelt› wie Jedlička es nennt.<br />Die körperliche Anstrengung bei all diesen Arbeitsprozessen - Farbenherstellung, Plattenvorbereitung, lange Streifzüge mit der Kamera - nimmt Jedlička gerne in Kauf. Die Resultate aus den langwierigen Verfahren sind oft erstaunlich: die Strahlkraft der Pigmente, das tiefe Schwarz der Mezzotinten und Heliogravuren, das vielschichtige Grau auf der Leinwand.<br />Jedlička ist fasziniert vom steten Wandel der Phänomene, die sich in jedem Moment neu entfalten. Das Hinterfragen der sichtbaren Oberfläche der Wirklichkeit ist bei ihm tief eingegraben. So werden die achtsamen Bewegungen im Landschaftsraum, das genaue Festhalten der Dinge und ihre mediale Verwandlung elementare Bausteine seiner Kunst, die uns stets von neuem in Bann ziehen.</p>nnnSibyllennJannnJan Jedlička"
          ]
        }
      }
    }
    
  • The source text has the next value:

    <p>Die Auseinandersetzung mit dem Thema der Landschaft spielt im Werk von Jan Jedlička (*1944, Prag) seit Ende der Siebzigerjahre eine zentrale Rolle. Sein künstlerisches Schaffen nährt sich dabei besonders von der Maremma, jener halb von Menschen geschaffenen Küstenlandschaft in der südlichen Toskana. Die Elemente der Landschaft sind geprägt durch die Urbanisierungsarbeiten früherer Jahrhunderte, als in den Sümpfen zwischen Land und Meer Entwässerungskanäle und Dämme angelegt wurden - einige funktionieren bis heute, andere wurden aufgegeben.<br />Es geht dem Künstler aber auch um eine geistige Dimension dieses Landstrichs: Wie sich im Laufe der Geschichte Mensch und Landschaft miteinander entwickelt haben und wie sich diese Vergangenheit in das heutige Angesicht der Landschaft eingeschrieben hat.<br />In der Tat ist die langjährige Beschäftigung mit immer demselben Landstrich ein Nachsinnen über dessen Phänomene, Farben und Lichtverhältnisse; ein langsames, fast körperliches Suchen nach Natur, Licht, Schatten.<br />Jedlička sammelt in der Maremma (wie auch in Irland oder der Prager Umgebung) Erde und Gestein, um daraus im Atelier Pigmente herzustellen, die er auf einer mit Japanpapier beschichteten Leinwand in freien Formen sedimentieren lässt. Schwer fassbare Elemente wie das reflektierte Licht auf dem Wasser bedürfen der technischen Transformation durch die Kamera oder die Mittel der Druckgrafik (Heliogravur und Mezzotinto). Die Basis für ein Sujet in Photosiebdruck war gar das handfeste Eingreifen des Künstlers in die Landschaft. Mit einem verschmitzten Lächeln erzählt er, wie er eines Tages nach einer langen Trockenperiode eine Schleuse öffnete und das Wasser in die aufgesprungene Lehmkruste fliessen liess. Die Kreise, die sich am zweiten Tag zufällig gebildet hatten, hat er dann fotografiert und für die Siebdrucke verwendet. Die Mezzotinten dagegen sind von Hand in einem langwierigen trockenen Verfahren hergestellt. Auf den aufgerauten Kupferplatten wird das Licht mit einem Polierstahl geduldig und minutiös herausgearbeitet, ‹entwickelt› wie Jedlička es nennt.<br />Die körperliche Anstrengung bei all diesen Arbeitsprozessen - Farbenherstellung, Plattenvorbereitung, lange Streifzüge mit der Kamera - nimmt Jedlička gerne in Kauf. Die Resultate aus den langwierigen Verfahren sind oft erstaunlich: die Strahlkraft der Pigmente, das tiefe Schwarz der Mezzotinten und Heliogravuren, das vielschichtige Grau auf der Leinwand.<br />Jedlička ist fasziniert vom steten Wandel der Phänomene, die sich in jedem Moment neu entfalten. Das Hinterfragen der sichtbaren Oberfläche der Wirklichkeit ist bei ihm tief eingegraben. So werden die achtsamen Bewegungen im Landschaftsraum, das genaue Festhalten der Dinge und ihre mediale Verwandlung elementare Bausteine seiner Kunst, die uns stets von neuem in Bann ziehen.</p>
    

As you can see, the response has second snippet pretty much exceeding the fragsize limit (as far as I understand, because I’m not that familiar with Solr).

I’ve read documentation regarding
<fragmenter name="regex" class="solr.highlight.RegexFragmenter"> and tried tweaking the fragsize but that didn’t yield any results.

Also I read about <filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="18"/> and reduced the maxGamSize from 50 to 18, but i think it can affect the search, so that doesn’t sound like a great idea to me.

I have also tried to use debugQuery option, but that only explains me why the given item is being returned.

How can I reduce the excerpt length or maybe tell me how can i debug the excerpt being built?

Update

After i set hl.mergeContiguous parameter to false the actual excerpt is not changed that much.

{
  "response": {
    "numFound": 1,
    "start": 0,
    "maxScore": 8.57209,
    "docs": [
      {
        "index_id": "al_global_search_nodes",
        "item_id": "6459",
        "score": 8.57209
      }
    ]
  },
  "highlighting": {
    "9qe7lo-al_global_search_nodes-6459": {
      "content": [
        " spielt im Werk von [HIGHLIGHT]Jan[/HIGHLIGHT] [HIGHLIGHT]Jedlička[/HIGHLIGHT] (*1944, Prag) seit Ende der",
        " Licht, Schatten.<br />Jedlička sammelt in der Maremma (wie auch in Irland oder der Prager Umgebung) Erde und Gestein, um daraus im Atelier Pigmente herzustellen, die er auf einer mit Japanpapier beschichteten Leinwand in freien Formen sedimentieren lässt. Schwer fassbare Elemente wie das reflektierte Licht auf dem Wasser bedürfen der technischen Transformation durch die Kamera oder die Mittel der Druckgrafik (Heliogravur und Mezzotinto). Die Basis für ein Sujet in Photosiebdruck war gar das handfeste Eingreifen des Künstlers in die Landschaft. Mit einem verschmitzten Lächeln erzählt er, wie er eines Tages nach einer langen Trockenperiode eine Schleuse öffnete und das Wasser in die aufgesprungene Lehmkruste fliessen liess. Die Kreise, die sich am zweiten Tag zufällig gebildet hatten, hat er dann fotografiert und für die Siebdrucke verwendet. Die Mezzotinten dagegen sind von Hand in einem langwierigen trockenen Verfahren hergestellt. Auf den aufgerauten Kupferplatten wird das Licht mit einem Polierstahl geduldig und minutiös herausgearbeitet, ‹entwickelt› wie Jedlička es nennt.<br />Die körperliche Anstrengung bei all diesen Arbeitsprozessen - Farbenherstellung, Plattenvorbereitung, lange Streifzüge mit der Kamera - nimmt Jedlička gerne in Kauf. Die Resultate aus den langwierigen Verfahren sind oft erstaunlich: die Strahlkraft der Pigmente, das tiefe Schwarz der Mezzotinten und Heliogravuren, das vielschichtige Grau auf der Leinwand.<br />Jedlička ist fasziniert vom steten Wandel der Phänomene, die sich in jedem Moment neu entfalten. Das Hinterfragen der sichtbaren Oberfläche der Wirklichkeit ist bei ihm tief eingegraben. So werden die achtsamen Bewegungen im Landschaftsraum, das genaue Festhalten der Dinge und ihre mediale Verwandlung elementare Bausteine seiner Kunst, die uns stets von neuem in Bann ziehen.</p>nnnSibyllennJannnJan Jedlička"
      ]
    }
  }
}

Tagged : /

Linux HowTo: Is it possible to make “???” a keyword that can be highlighted?

Original Source Link

Is it possible to make ??? (3 question marks) a keyword, and highlight it?

I have tried the following in a syntax file. Other strings on the line are highlighted, but not ???. ??? does not work either.

syntax keyword textTodos TODO ??? XXX LLL
highlight default link textTodos Todo

I would recommend to do it with a syntax match like this:

syntax match TQM '???' containedin=ALL
highlight link TQM Todo

If you want to have it always available, you could put the following in your vimrc:

augroup my_syntax_autocmd
    autocmd!
    autocmd Syntax * syntax match TQM '???' containedin=ALL |  highlight link TQM Todo
augroup END

syntax keywords are supposed to be – well – keywords. Initially, this meant, it must match the definition of the ‘iskeyword’ option, which usually does not include the quotation mark. Some years later, the iskeyword option has been de-coupled from the syntax highlighting option and now one can use the :syn iskeyword command to specify the iskeyword option only for syntax highlighting (which falls back to the iskeyword) option, if it is not specified.

To make this possible, you can add the ? to the syntax definition of a keyword by using :syn iskeyword=<c-r>=&iskeyword<cr>,?

This uses the expression-register = to get the current value of the iskeyword option and adds the ? to it.

Note however, this can have unwanted consequences to your syntax highlighting, depending on the patterns used in the syntax definitions.

Tagged : / /