<p>In <a href="https://github.com/geany/geany-plugins/pull/324#discussion_r49946757">lineoperations/src/lineoperations.c</a>:</p>
<pre style='color:#555'>> +    GtkWidget *sortdesc_item;
> +
> +  main_menu_item = gtk_menu_item_new_with_mnemonic(_("_Line Operations"));
> +  gtk_widget_show(main_menu_item);
> +
> +  submenu = gtk_menu_new();
> +  gtk_widget_show(submenu);
> +  sep1 = gtk_separator_menu_item_new();
> +  sep2 = gtk_separator_menu_item_new();
> +  rmdupst_item  = gtk_menu_item_new_with_mnemonic(_("Remove Duplicate Lines, _Sorted"));
> +  rmdupln_item  = gtk_menu_item_new_with_mnemonic(_("Remove Duplicate Lines, _Ordered"));
> +  rmunqln_item  = gtk_menu_item_new_with_mnemonic(_("Remove _Unique Lines"));
> +  rmemtyln_item = gtk_menu_item_new_with_mnemonic(_("Remove _Empty Lines"));
> +  rmwhspln_item = gtk_menu_item_new_with_mnemonic(_("Remove _Whitespace Lines"));
> +  sortasc_item  = gtk_menu_item_new_with_mnemonic(_("Sort Lines _Ascending"));
> +  sortdesc_item = gtk_menu_item_new_with_mnemonic(_("Sort Lines _Descending"));
</pre>
<p>similarly, there's quite a lot of duplication in the menu building code, while it's basically always exactly the same.  you could easily lower duplication with e.g. representing the items to add like that:</p>

<div class="highlight highlight-source-c"><pre>
    <span class="pl-k">struct</span>
    {
        <span class="pl-k">const</span> gchar *label;
        GCallback cb_activate;
        gpointer cb_data;
    }
    menu_items[] =
    {
        { <span class="pl-c1">N_</span>(<span class="pl-s"><span class="pl-pds">"</span>Remove Duplicate Lines, _Sorted<span class="pl-pds">"</span></span>),
          <span class="pl-c1">G_CALLBACK</span>(action_func_item), rmdupst },
        { <span class="pl-c1">N_</span>(<span class="pl-s"><span class="pl-pds">"</span>Remove Duplicate Lines, _Ordered<span class="pl-pds">"</span></span>),
          <span class="pl-c1">G_CALLBACK</span>(action_func_item), rmdupln },
        { <span class="pl-c1">N_</span>(<span class="pl-s"><span class="pl-pds">"</span>Remove _Unique Lines<span class="pl-pds">"</span></span>),
          <span class="pl-c1">G_CALLBACK</span>(action_func_item), rmunqln },
        { <span class="pl-c1">NULL</span> },
        { <span class="pl-c1">N_</span>(<span class="pl-s"><span class="pl-pds">"</span>Remove _Empty Lines<span class="pl-pds">"</span></span>),
          <span class="pl-c1">G_CALLBACK</span>(action_func_item), rmemtyln },
        { <span class="pl-c1">N_</span>(<span class="pl-s"><span class="pl-pds">"</span>Remove _Whitespace Lines<span class="pl-pds">"</span></span>),
          <span class="pl-c1">G_CALLBACK</span>(action_func_item), rmwhspln },
        { <span class="pl-c1">NULL</span> },
        { <span class="pl-c1">N_</span>(<span class="pl-s"><span class="pl-pds">"</span>Sort Lines _Ascending<span class="pl-pds">"</span></span>),
          <span class="pl-c1">G_CALLBACK</span>(action_sort_item), <span class="pl-c1">GINT_TO_POINTER</span>(<span class="pl-c1">1</span>) },
        { <span class="pl-c1">N_</span>(<span class="pl-s"><span class="pl-pds">"</span>Sort Lines _Descending<span class="pl-pds">"</span></span>),
          <span class="pl-c1">G_CALLBACK</span>(action_sort_item), <span class="pl-c1">GINT_TO_POINTER</span>(<span class="pl-c1">0</span>) }
    };</pre></div>

<p>and adding them in a loop</p>

<div class="highlight highlight-source-c"><pre><span class="pl-k">for</span> (i = <span class="pl-c1">0</span>; i < G_N_ELEMENTS(menu_items); i++)
    {
        GtkWidget *item;

        <span class="pl-k">if</span> (! menu_items[i].<span class="pl-smi">label</span>) <span class="pl-c">/* separator */</span>
            item = <span class="pl-c1">gtk_separator_menu_item_new</span>();
        <span class="pl-k">else</span>
        {
            item = <span class="pl-c1">gtk_menu_item_new_with_mnemonic</span>(<span class="pl-c1">_</span>(menu_items[i].<span class="pl-smi">label</span>));
            <span class="pl-c1">g_signal_connect</span>(item, <span class="pl-s"><span class="pl-pds">"</span>activate<span class="pl-pds">"</span></span>, menu_items[i].<span class="pl-smi">cb_activate</span>, menu_items[i].<span class="pl-smi">cb_data</span>);
            <span class="pl-c1">ui_add_document_sensitive</span>(item);
        }

        <span class="pl-c1">gtk_widget_show</span>(item);
        <span class="pl-c1">gtk_menu_shell_append</span>(<span class="pl-c1">GTK_MENU_SHELL</span>(submenu), item);
    }</pre></div>

<p style="font-size:small;-webkit-text-size-adjust:none;color:#666;">—<br>Reply to this email directly or <a href="https://github.com/geany/geany-plugins/pull/324/files#r49946757">view it on GitHub</a>.<img alt="" height="1" src="https://github.com/notifications/beacon/ABDrJwH1KI7ej6xojlrkJA6KLtB1qiwWks5pa5iIgaJpZM4HBhj7.gif" width="1" /></p>
<div itemscope itemtype="http://schema.org/EmailMessage">
<div itemprop="action" itemscope itemtype="http://schema.org/ViewAction">
  <link itemprop="url" href="https://github.com/geany/geany-plugins/pull/324/files#r49946757"></link>
  <meta itemprop="name" content="View Pull Request"></meta>
</div>
<meta itemprop="description" content="View this Pull Request on GitHub"></meta>
</div>