<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ahandsel</title>
    <description>The latest articles on DEV Community by ahandsel (@ahandsel).</description>
    <link>https://dev.to/ahandsel</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F254295%2F0b77f2a3-d3c0-4d7b-b084-9af25e28d4cd.png</url>
      <title>DEV Community: ahandsel</title>
      <link>https://dev.to/ahandsel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ahandsel"/>
    <language>en</language>
    <item>
      <title>VitePress debug: "frontmatter.title" is appearing in search results</title>
      <dc:creator>ahandsel</dc:creator>
      <pubDate>Thu, 20 Nov 2025 05:56:28 +0000</pubDate>
      <link>https://dev.to/ahandsel/vitepress-debug-frontmattertitle-is-appearing-in-search-results-k60</link>
      <guid>https://dev.to/ahandsel/vitepress-debug-frontmattertitle-is-appearing-in-search-results-k60</guid>
      <description>&lt;p&gt;How to fix the issue of &lt;code&gt;frontmatter.title&lt;/code&gt; appearing in VitePress search results instead of the actual content.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem
&lt;/h2&gt;

&lt;p&gt;When you first set up VitePress and use frontmatter to define titles and other metadata for your pages, you may notice that the built-in local search shows the literal template expression used in your Markdown instead of the resolved title.&lt;/p&gt;

&lt;p&gt;For example, if your page heading uses the &lt;code&gt;$frontmatter&lt;/code&gt; template global, the local search index can treat the expression as plain text. Your search results may then show something like &lt;code&gt;{{ $frontmatter.title }}&lt;/code&gt; instead of the actual page title.&lt;/p&gt;

&lt;p&gt;Example Markdown file (&lt;code&gt;docs/markdown-examples.md&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;My&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Awesome&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Page"&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;This&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;is&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;an&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;awesome&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;page&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;about&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;VitePress."&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# {{ $frontmatter.title }}&lt;/span&gt;

{{ $frontmatter.description }}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example, when you search for an article on your VitePress site, the result can show:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fize4hx7nz44q7ytqezfr.png" alt="Screenshot showing a VitePress search result with frontmatter.title appearing" width="800" height="416"&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This happens because the local search plugin renders Markdown to HTML without running Vue. Vue template expressions such as &lt;code&gt;{{ $frontmatter.title }}&lt;/code&gt; are not evaluated at index time, so they remain as plain text in the search index.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;If you are using the VitePress local search provider and see &lt;code&gt;{{ $frontmatter.title }}&lt;/code&gt; (or similar expressions) in your search results, you can customize the local search renderer so that frontmatter-based headings are resolved to plain text before the content is indexed.&lt;/p&gt;

&lt;p&gt;VitePress exposes a &lt;a href="https://vitepress.dev/reference/default-theme-search#custom-content-renderer" rel="noopener noreferrer"&gt;&lt;code&gt;search.options._render&lt;/code&gt; hook&lt;/a&gt; for the built-in local search provider. You can use this hook to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Let VitePress render the Markdown once to populate &lt;code&gt;env.frontmatter&lt;/code&gt; and other metadata.&lt;/li&gt;
&lt;li&gt;Rewrite the source Markdown to replace &lt;code&gt;{{ $frontmatter.title }}&lt;/code&gt; in headings with the actual frontmatter title.&lt;/li&gt;
&lt;li&gt;Render the rewritten Markdown again, and return that HTML for indexing.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Edit &lt;code&gt;docs/.vitepress/config.mts&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;In your VitePress configuration file (&lt;code&gt;docs/.vitepress/config.mts&lt;/code&gt;), make sure you are using the local search provider, then add a custom &lt;code&gt;_render&lt;/code&gt; implementation.&lt;/p&gt;

&lt;p&gt;Here is a typical base configuration:&lt;br&gt;
&lt;em&gt;docs/.vitepress/config.mts&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vitepress&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="c1"&gt;// https://vitepress.dev/reference/site-config&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;My Awesome Project&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;A VitePress Site&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;themeConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// https://vitepress.dev/reference/default-theme-config&lt;/span&gt;
    &lt;span class="na"&gt;nav&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Home&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;link&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Examples&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;link&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/markdown-examples&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;

    &lt;span class="na"&gt;sidebar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Examples&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Markdown Examples&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;link&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/markdown-examples&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Runtime API Examples&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;link&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api-examples&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;

    &lt;span class="na"&gt;socialLinks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;github&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;link&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://github.com/vuejs/vitepress&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Update the &lt;code&gt;themeConfig&lt;/code&gt; object to include the local search configuration with a custom &lt;code&gt;_render&lt;/code&gt; function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vitepress&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;My Awesome Project&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;A VitePress Site&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;themeConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;nav&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Home&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;link&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Examples&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;link&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/markdown-examples&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;

    &lt;span class="c1"&gt;// ... other themeConfig options ...&lt;/span&gt;

    &lt;span class="na"&gt;search&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;local&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;_render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="c1"&gt;// First pass: render to populate env.frontmatter and other metadata&lt;/span&gt;
          &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;md&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;renderAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

          &lt;span class="c1"&gt;// Use empty object as fallback if frontmatter is undefined&lt;/span&gt;
          &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;frontmatter&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

          &lt;span class="c1"&gt;// Honor per-page opt out: `search: false` in frontmatter&lt;/span&gt;
          &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;

          &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;rewritten&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;

          &lt;span class="c1"&gt;// Replace headings like "# {{ $frontmatter.title }}" with a concrete title&lt;/span&gt;
          &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;fm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;fm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Replace H1 that is exactly an interpolation of frontmatter.title&lt;/span&gt;
            &lt;span class="nx"&gt;rewritten&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;rewritten&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
              &lt;span class="sr"&gt;/^#&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;\{\{\s&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="sr"&gt;frontmatter&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sr"&gt;title&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;\}\}\s&lt;/span&gt;&lt;span class="sr"&gt;*$/m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="s2"&gt;`# &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;fm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="c1"&gt;// Drop any other heading levels that interpolate frontmatter.title&lt;/span&gt;
            &lt;span class="nx"&gt;rewritten&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;rewritten&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
              &lt;span class="sr"&gt;/^#&lt;/span&gt;&lt;span class="se"&gt;{2,6}\s&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;\{\{\s&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="sr"&gt;frontmatter&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sr"&gt;title&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;\}\}\s&lt;/span&gt;&lt;span class="sr"&gt;*$/gm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="dl"&gt;''&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;

          &lt;span class="c1"&gt;// Strip any remaining $frontmatter interpolations from indexable text&lt;/span&gt;
          &lt;span class="nx"&gt;rewritten&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;rewritten&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\{\{\s&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="sr"&gt;frontmatter&lt;/span&gt;&lt;span class="se"&gt;\.[^&lt;/span&gt;&lt;span class="sr"&gt;}&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;\}\}&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

          &lt;span class="c1"&gt;// Final render used for indexing&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;md&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;renderAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rewritten&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="c1"&gt;// end of search options&lt;/span&gt;
    &lt;span class="c1"&gt;// ... other themeConfig options ...&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// end of themeConfig&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Key points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;_render&lt;/code&gt; is called only when building the local search index. It does not change how your pages render in the browser.&lt;/li&gt;
&lt;li&gt;You must call &lt;code&gt;md.renderAsync(src, env)&lt;/code&gt; at least once before reading &lt;code&gt;env.frontmatter&lt;/code&gt;. VitePress populates &lt;code&gt;env&lt;/code&gt; during rendering.&lt;/li&gt;
&lt;li&gt;When you provide a custom &lt;code&gt;_render&lt;/code&gt; function, you are responsible for handling &lt;code&gt;search: false&lt;/code&gt; in frontmatter, as shown above.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After you save the file, restart your VitePress development server. When you use the local search now, the index will contain the resolved titles instead of the raw &lt;code&gt;{{ $frontmatter.title }}&lt;/code&gt; expression, and your search UI will show the correct text.&lt;/p&gt;

&lt;h3&gt;
  
  
  Result
&lt;/h3&gt;

&lt;p&gt;After implementing the above changes, your search results should display the correct titles and content. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4zive1braux9hlhrzcjc.png" alt="Screenshot showing a VitePress search result with the correct title rendered" width="800" height="430"&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The search index now sees the actual title string (for example, &lt;code&gt;My Awesome Page&lt;/code&gt;) instead of the Vue template expression, so both relevance and readability improve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;By customizing the local search renderer in your VitePress configuration file, you can ensure that frontmatter-based headings are resolved before indexing. This makes your search results more accurate, improves readability, and helps visitors find the content they are looking for more easily.&lt;/p&gt;

&lt;p&gt;If you prefer not to index a page at all, you can add &lt;code&gt;search: false&lt;/code&gt; to that page's frontmatter, and have your &lt;code&gt;_render&lt;/code&gt; hook return an empty string for those pages, as shown in the configuration example above.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vitepress.dev/reference/default-theme-search#search" rel="noopener noreferrer"&gt;Search - VitePress docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vitepress.dev/guide/frontmatter" rel="noopener noreferrer"&gt;Frontmatter - VitePress docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/vuejs/vitepress/issues/2344" rel="noopener noreferrer"&gt;Question: Exclude from Local Search and display Frontmatter data · Issue #2344 · vuejs/vitepress&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>vitepress</category>
      <category>frontmatter</category>
      <category>debug</category>
    </item>
    <item>
      <title>Script to generate ASCII, Full-width, and Half-Width characters</title>
      <dc:creator>ahandsel</dc:creator>
      <pubDate>Mon, 07 Jul 2025 10:12:53 +0000</pubDate>
      <link>https://dev.to/ahandsel/script-to-generate-ascii-full-width-and-half-width-characters-4la8</link>
      <guid>https://dev.to/ahandsel/script-to-generate-ascii-full-width-and-half-width-characters-4la8</guid>
      <description>&lt;p&gt;Here is a quick script I created to test the max character limits for a project. I needed to verify whether it worked as expected for ASCII, Japanese full-width, and Japanese half-width characters.&lt;/p&gt;

&lt;p&gt;Hope it can be helpful for your project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-euo&lt;/span&gt; pipefail

&lt;span class="c"&gt;#-----------------------------------------------------------------------------#&lt;/span&gt;
&lt;span class="c"&gt;# Script Name   : generate-test-string.sh&lt;/span&gt;
&lt;span class="c"&gt;# Usage         : ./generate-test-string.sh [length] [character_type]&lt;/span&gt;
&lt;span class="c"&gt;# Purpose       : Generate a cyclic string of given length using ASCII digits,&lt;/span&gt;
&lt;span class="c"&gt;#                 full-width digits, or half-width Katakana characters.&lt;/span&gt;
&lt;span class="c"&gt;# Version       : 1.3.0&lt;/span&gt;
&lt;span class="c"&gt;#-----------------------------------------------------------------------------#&lt;/span&gt;

&lt;span class="nv"&gt;LOG_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"./generate-test-string.log"&lt;/span&gt;

&lt;span class="c"&gt;#-------------------------------------------------------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# Utility functions&lt;/span&gt;
&lt;span class="c"&gt;#-------------------------------------------------------------------------------&lt;/span&gt;

die&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Error: &lt;/span&gt;&lt;span class="nv"&gt;$msg&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# Trap interrupts and errors&lt;/span&gt;
&lt;span class="nb"&gt;trap&lt;/span&gt; &lt;span class="s1"&gt;'die "Script interrupted by user."'&lt;/span&gt; INT TERM
&lt;span class="nb"&gt;trap&lt;/span&gt; &lt;span class="s1"&gt;'die "An unexpected error occurred."'&lt;/span&gt; ERR

&lt;span class="c"&gt;# Ensure the log file is writable&lt;/span&gt;
&lt;span class="nb"&gt;touch&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/null 2&amp;gt;&amp;amp;1 &lt;span class="o"&gt;||&lt;/span&gt; die &lt;span class="s2"&gt;"Cannot write to log file '&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;'."&lt;/span&gt;

log&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="c"&gt;# Replace home directory with '~'&lt;/span&gt;
    &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;message&lt;/span&gt;&lt;span class="p"&gt;//&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="p"&gt;/~&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="s1"&gt;'+%Y-%m-%d %H:%M:%S'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; - &lt;/span&gt;&lt;span class="nv"&gt;$msg&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

usage&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
Usage: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="p"&gt;##*/&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt; [length] [character_type]
Generate a cyclic string of given length using:
  ASCII       - digits 1-0
  full-width  - digits １-０  (or "full")
  half-width  - Katakana ｱ-ﾝ  (or "half")

Options:
  -h, --help    Show this help message and exit.
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

validate_length&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;~ ^[0-9]+&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; die &lt;span class="s2"&gt;"Length must be a positive integer."&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

get_next_filename&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;base&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"test-string-v"&lt;/span&gt;
    &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;ext&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;".txt"&lt;/span&gt;
    &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;num&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
    &lt;span class="nb"&gt;local &lt;/span&gt;fname
    &lt;span class="k"&gt;while&lt;/span&gt; :&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
        &lt;/span&gt;&lt;span class="nv"&gt;fname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;base&lt;/span&gt;&lt;span class="k"&gt;}${&lt;/span&gt;&lt;span class="nv"&gt;num&lt;/span&gt;&lt;span class="k"&gt;}${&lt;/span&gt;&lt;span class="nv"&gt;ext&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$fname&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$fname&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;return
        &lt;/span&gt;&lt;span class="nv"&gt;num&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;num &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;done&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

generate_string&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;local type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;local&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; chars

    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$type&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;in
        &lt;/span&gt;ASCII&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nv"&gt;chars&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;1 2 3 4 5 6 7 8 9 0&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;;;&lt;/span&gt;
        full-width&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nv"&gt;chars&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;１ ２ ３ ４ ５ ６ ７ ８ ９ ０&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;;;&lt;/span&gt;
        half-width&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nv"&gt;chars&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;ｱ ｲ ｳ ｴ ｵ ｶ ｷ ｸ ｹ ｺ  &lt;span class="se"&gt;\&lt;/span&gt;
                   ｻ ｼ ｽ ｾ ｿ ﾀ ﾁ ﾂ ﾃ ﾄ  &lt;span class="se"&gt;\&lt;/span&gt;
                   ﾅ ﾆ ﾇ ﾈ ﾉ ﾊ ﾋ ﾌ ﾍ ﾎ  &lt;span class="se"&gt;\&lt;/span&gt;
                   ﾏ ﾐ ﾑ ﾒ ﾓ ﾗ ﾘ ﾙ ﾚ ﾛ  &lt;span class="se"&gt;\&lt;/span&gt;
                   ﾜ ｦ ﾝ&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;;;&lt;/span&gt;
        &lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            die &lt;span class="s2"&gt;"Unsupported character type: '&lt;/span&gt;&lt;span class="nv"&gt;$type&lt;/span&gt;&lt;span class="s2"&gt;'."&lt;/span&gt;
            &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="k"&gt;esac&lt;/span&gt;

    &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;total&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${#&lt;/span&gt;&lt;span class="nv"&gt;chars&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
    &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;((&lt;/span&gt; &lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0&lt;span class="p"&gt;;&lt;/span&gt; i&amp;lt;length&lt;span class="p"&gt;;&lt;/span&gt; i++ &lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
        &lt;/span&gt;output+&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;chars&lt;/span&gt;&lt;span class="p"&gt;[i % total]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;done
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$output&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;#-------------------------------------------------------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# Main&lt;/span&gt;
&lt;span class="c"&gt;#-------------------------------------------------------------------------------&lt;/span&gt;

main&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;# Parse options&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="k"&gt;:-}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; -&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
        case&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
            &lt;span class="nt"&gt;-h&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="nt"&gt;--help&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; usage&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;0 &lt;span class="p"&gt;;;&lt;/span&gt;
            &lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; die &lt;span class="s2"&gt;"Unknown option: &lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;. Use --help."&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
        &lt;span class="k"&gt;esac&lt;/span&gt;
    &lt;span class="k"&gt;done

    &lt;/span&gt;&lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;length_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="k"&gt;:-}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;char_type_raw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="k"&gt;:-}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    &lt;span class="c"&gt;# Prompt for length if not provided&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$length_input&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-rp&lt;/span&gt; &lt;span class="s2"&gt;"Enter the length of the string to generate: "&lt;/span&gt; length_input
    &lt;span class="k"&gt;fi
    &lt;/span&gt;validate_length &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$length_input&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    &lt;span class="c"&gt;# Prompt for character type if not provided&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$char_type_raw&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Select character type (default: ASCII):"&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"  ASCII       - digits 1-0"&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"  full-width  - digits １-０  (or 'full')"&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"  half-width  - Katakana ｱ-ﾝ  (or 'half')"&lt;/span&gt;
        &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-rp&lt;/span&gt; &lt;span class="s2"&gt;"Enter character type [ASCII|full-width|half-width]: "&lt;/span&gt; char_type_raw
        : &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;char_type_raw&lt;/span&gt;:&lt;span class="p"&gt;=ASCII&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;fi

    &lt;/span&gt;&lt;span class="nb"&gt;local &lt;/span&gt;lower
    &lt;span class="nv"&gt;lower&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$char_type_raw&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="s1"&gt;'[:upper:]'&lt;/span&gt; &lt;span class="s1"&gt;'[:lower:]'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$lower&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;in
        &lt;/span&gt;ascii&lt;span class="p"&gt;)&lt;/span&gt;        &lt;span class="nv"&gt;char_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"ASCII"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
        full|full-width&lt;span class="p"&gt;)&lt;/span&gt;
                      &lt;span class="nv"&gt;char_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"full-width"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
        half|half-width&lt;span class="p"&gt;)&lt;/span&gt;
                      &lt;span class="nv"&gt;char_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"half-width"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
        &lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;            die &lt;span class="s2"&gt;"Invalid character type: '&lt;/span&gt;&lt;span class="nv"&gt;$char_type_raw&lt;/span&gt;&lt;span class="s2"&gt;'. Must be ASCII, full(-width), or half(-width)."&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="k"&gt;esac&lt;/span&gt;

    &lt;span class="c"&gt;# Generate the string&lt;/span&gt;
    &lt;span class="nb"&gt;local &lt;/span&gt;result
    &lt;span class="nv"&gt;result&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;generate_string &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$length_input&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$char_type&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    &lt;span class="c"&gt;# Find next available filename&lt;/span&gt;
    &lt;span class="nb"&gt;local &lt;/span&gt;filename
    &lt;span class="nv"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;get_next_filename&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    &lt;span class="c"&gt;# Write to file&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$filename&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;die &lt;span class="s2"&gt;"Failed to write output to '&lt;/span&gt;&lt;span class="nv"&gt;$filename&lt;/span&gt;&lt;span class="s2"&gt;'."&lt;/span&gt;
    &lt;span class="k"&gt;fi&lt;/span&gt;

    &lt;span class="c"&gt;# Determine relative script path&lt;/span&gt;
    &lt;span class="nb"&gt;local &lt;/span&gt;script_abs
    &lt;span class="nv"&gt;script_abs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;dirname&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BASH_SOURCE&lt;/span&gt;&lt;span class="p"&gt;[0]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;basename&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BASH_SOURCE&lt;/span&gt;&lt;span class="p"&gt;[0]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;rel_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;script_abs&lt;/span&gt;&lt;span class="p"&gt;/#&lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;&lt;span class="p"&gt;\//./&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    &lt;span class="c"&gt;# Log the action&lt;/span&gt;
    log &lt;span class="s2"&gt;"Generated &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;length_input&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-character string of type '&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;char_type&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;' to file '&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;filename&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;' from &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;rel_path&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"String written to ./&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;filename&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
main &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Spotify URI to open the desktop app's settings</title>
      <dc:creator>ahandsel</dc:creator>
      <pubDate>Tue, 10 Dec 2024 06:56:21 +0000</pubDate>
      <link>https://dev.to/ahandsel/spotify-uri-to-open-the-desktop-apps-settings-5gh4</link>
      <guid>https://dev.to/ahandsel/spotify-uri-to-open-the-desktop-apps-settings-5gh4</guid>
      <description>&lt;p&gt;&lt;code&gt;spotify:preferences&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;In case you needed it for your Apple Shortcuts&lt;/p&gt;

</description>
      <category>random</category>
    </item>
    <item>
      <title>Easily Bulk Edit Files in Visual Studio Code</title>
      <dc:creator>ahandsel</dc:creator>
      <pubDate>Wed, 30 Oct 2024 13:51:00 +0000</pubDate>
      <link>https://dev.to/ahandsel/easily-bulk-edit-files-in-visual-studio-code-4pp1</link>
      <guid>https://dev.to/ahandsel/easily-bulk-edit-files-in-visual-studio-code-4pp1</guid>
      <description>&lt;h1&gt;
  
  
  Easily Bulk Edit Files in Visual Studio Code
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Learn how to bulk edit files in Visual Studio Code (VS Code) using the &lt;strong&gt;Change All Occurrences&lt;/strong&gt; and &lt;strong&gt;Multi-Cursor Editing&lt;/strong&gt; features.&lt;/li&gt;
&lt;li&gt;Customize keybindings to tailor these features to your workflow.&lt;/li&gt;
&lt;li&gt;This guide is for beginner VS Code users on macOS.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Overview&lt;/li&gt;
&lt;li&gt;Table of Contents&lt;/li&gt;
&lt;li&gt;Introduction&lt;/li&gt;
&lt;li&gt;Preparations&lt;/li&gt;
&lt;li&gt;
Steps to Bulk Edit Files in VS Code

&lt;ul&gt;
&lt;li&gt;Using Change All Occurrences&lt;/li&gt;
&lt;li&gt;Using Multi-Cursor Editing&lt;/li&gt;
&lt;li&gt;Using Add Cursors to Line Ends&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Customizing Keybindings for Bulk Editing&lt;/li&gt;

&lt;li&gt;Restrictions&lt;/li&gt;

&lt;li&gt;Support and References&lt;/li&gt;

&lt;li&gt;FAQs&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;This guide will walk you through using the &lt;strong&gt;Change All Occurrences&lt;/strong&gt; and &lt;strong&gt;Multi-Cursor Editing&lt;/strong&gt; features to efficiently modify multiple lines or text snippets. It is intended for users looking to enhance their editing speed. By the end of this guide, you will be able to &lt;strong&gt;make bulk edits across multiple lines of text quickly&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📝 Windows users can follow these steps; however, specific keybindings may differ. Please refer to the &lt;a href="https://code.visualstudio.com/shortcuts/keyboard-shortcuts-windows.pdf" rel="noopener noreferrer"&gt;Keyboard shortcuts for Windows&lt;/a&gt; VS Code document.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Preparations
&lt;/h2&gt;

&lt;p&gt;Before beginning, make sure to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open Visual Studio Code&lt;/strong&gt; - Install &lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;Visual Studio Code&lt;/a&gt; if you have not already done so.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Have a Workspace or File Open&lt;/strong&gt; - You need an open file or project to work with bulk edit features. A long file with repeated text or similar lines is ideal for practice.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Steps to Bulk Edit Files in VS Code
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Using Change All Occurrences
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Change All Occurrences&lt;/strong&gt; feature in VS Code allows you to select all instances of a word or selection and edit them simultaneously. This feature is helpful for fixing typos or changing variable names across the entire document.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Select the Word or Text&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Highlight the text snippet you want to edit with your cursor.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Invoke Change All Occurrences&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Press &lt;code&gt;Command (⌘) + Shift + L&lt;/code&gt; to highlight all occurrences of the selected text.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Edit the Text&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
With all instances selected, type to edit. Changes you make will apply to each selected instance.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;⚡ You can also use the &lt;strong&gt;Change All Occurrences&lt;/strong&gt; feature by right-clicking on the selected text and choosing &lt;strong&gt;Change All Occurrences&lt;/strong&gt; from the context menu.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Using Multi-Cursor Editing
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Multi-Cursor Editing&lt;/strong&gt; allows you to place multiple cursors in different parts of your file, enabling simultaneous editing in those locations. This feature is useful for making similar changes, such as to Markdown lists or CSS properties.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Place Multiple Cursors&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
To place a cursor on multiple lines, hold &lt;code&gt;Option&lt;/code&gt; and click on each line where you want a cursor. You can also hold &lt;code&gt;Command (⌘) + Option + Down Arrow&lt;/code&gt; or &lt;code&gt;Command (⌘) + Option + Up Arrow&lt;/code&gt; to add a cursor on the line below or above, respectively.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Edit the Lines Simultaneously&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Once your cursors are in place, type to make changes. Each cursor will apply your edits to its position.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Using Add Cursors to Line Ends
&lt;/h3&gt;

&lt;p&gt;Similar to multi-cursor editing, you can add cursors to the end of each line in a selection. This is useful when you want to edit a section of a file in the same way (for example, adding a period at the end of each line).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Select the Lines&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Highlight the lines you want to edit.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Add Cursors to Line Ends&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Open the command palette by pressing &lt;code&gt;Command (⌘) + Shift + P&lt;/code&gt; and type &lt;code&gt;Add Cursors to Line Ends&lt;/code&gt;. Select this option to place a cursor at the end of each line.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Edit the Lines Simultaneously&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Type to make changes. Each cursor will apply your edits to its position.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Customizing Keybindings for Bulk Editing
&lt;/h2&gt;

&lt;p&gt;VS Code allows you to customize keybindings for nearly all features, including &lt;strong&gt;Change All Occurrences&lt;/strong&gt; and &lt;strong&gt;Multi-Cursor Editing&lt;/strong&gt;. By assigning custom shortcuts, you can streamline your workflow and make bulk editing even more efficient.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Open Keyboard Shortcuts&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Go to &lt;code&gt;Code &amp;gt; Preferences &amp;gt; Keyboard Shortcuts&lt;/code&gt; or use the shortcut &lt;code&gt;Command (⌘) + K, Command (⌘) + S&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Search for Change All Occurrences&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
In the search bar, type &lt;code&gt;Change All Occurrences&lt;/code&gt; to locate this feature. Right-click and select &lt;strong&gt;Change Keybinding&lt;/strong&gt; to assign a new shortcut.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Search for Multi-Cursor Keybindings&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Search for &lt;code&gt;Add Cursor Above&lt;/code&gt; or &lt;code&gt;Add Cursor Below&lt;/code&gt; to adjust multi-cursor shortcuts. Right-click and select &lt;strong&gt;Change Keybinding&lt;/strong&gt; to modify these as well.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Search for Add Cursors to Line Ends&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Search for &lt;code&gt;Add Cursors to Line Ends&lt;/code&gt; to adjust the shortcut for this feature. Right-click and select &lt;strong&gt;Change Keybinding&lt;/strong&gt; to assign a new shortcut.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Save and Test the New Keybindings&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
After adjusting your shortcuts, test them in a file to ensure they work as expected.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;⚡ You can easily export your custom keybindings to a file for backup or sharing with others by using the &lt;code&gt;Preferences: Open Keyboard Shortcuts (JSON)&lt;/code&gt; command from the command palette to access the &lt;code&gt;keybindings.json&lt;/code&gt; file.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Restrictions
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Change All Occurrences&lt;/strong&gt; and &lt;strong&gt;Multi-Cursor Editing&lt;/strong&gt; features are limited to individual files. They do not apply across multiple open files or the entire project. For project-wide modifications, consider using &lt;strong&gt;Find and Replace&lt;/strong&gt; across files (&lt;code&gt;Command (⌘) + Shift + F&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Support and References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;For more information on macOS-specific VS Code keybindings, refer to the &lt;a href="https://code.visualstudio.com/shortcuts/keyboard-shortcuts-macos.pdf" rel="noopener noreferrer"&gt;Visual Studio Code Keyboard Shortcuts Reference for macOS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;For more information on VS Code editing features, refer to the &lt;a href="https://code.visualstudio.com/docs/editor/codebasics#_multiple-selections-multicursor" rel="noopener noreferrer"&gt;Basic Editing in Visual Studio Code&lt;/a&gt; documentation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQs
&lt;/h2&gt;

&lt;p&gt;Here are some frequently asked questions about bulk editing in VS Code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q1. Why is this article written in a super-rigid structure?
&lt;/h3&gt;

&lt;p&gt;I am testing out a Help-Guide template for a different project and decided to post it here as well.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q2. Why write about something so basic as bulk editing in VS Code?
&lt;/h3&gt;

&lt;p&gt;There were a few times where I noticed coworkers manually editing multiple lines of text in their documents and figured I should put together something specifically about bulk editing. Despite being a basic feature, it is not something you become aware of until you see someone else using it. Hopefully, this guide helps someone in a similar situation.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>vscode</category>
      <category>writing</category>
    </item>
    <item>
      <title>VS Code Setup - Recommended Extensions</title>
      <dc:creator>ahandsel</dc:creator>
      <pubDate>Mon, 19 Aug 2024 05:44:35 +0000</pubDate>
      <link>https://dev.to/ahandsel/vs-code-setup-recommended-extensions-4877</link>
      <guid>https://dev.to/ahandsel/vs-code-setup-recommended-extensions-4877</guid>
      <description>&lt;p&gt;This is a list of Visual Studio Code extensions that I recommend.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Markdown Related Extensions&lt;/li&gt;
&lt;li&gt;Writing (in General) Related Extensions&lt;/li&gt;
&lt;li&gt;GitHub Related Extensions&lt;/li&gt;
&lt;li&gt;CSV Related Extensions&lt;/li&gt;
&lt;li&gt;Japanese Language Related Extensions&lt;/li&gt;
&lt;li&gt;Styling and Themes Related Extensions&lt;/li&gt;
&lt;li&gt;Utility Extensions&lt;/li&gt;
&lt;li&gt;
Easy Installation Method

&lt;ul&gt;
&lt;li&gt;extensions.json&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Markdown Related Extensions
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Extension&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=jerriepelser.copy-markdown-as-html" rel="noopener noreferrer"&gt;Copy Markdown as HTML&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Converts Markdown to HTML.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one" rel="noopener noreferrer"&gt;Markdown All in One&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;A comprehensive tool with all the features you need for writing Markdown files.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=bierner.markdown-footnotes" rel="noopener noreferrer"&gt;Markdown Footnotes&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Adds [^footnote] syntax support to VS Code's built-in markdown preview.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=telesoho.vscode-markdown-paste-image" rel="noopener noreferrer"&gt;Markdown Paste&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Easily paste images into Markdown with the &lt;code&gt;Markdown Paste&lt;/code&gt; command.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=yzane.markdown-pdf" rel="noopener noreferrer"&gt;Markdown PDF&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Convert Markdown to PDF.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=shd101wyy.markdown-preview-enhanced" rel="noopener noreferrer"&gt;Markdown Preview Enhanced&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;An enhanced Markdown preview for VS Code.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=davidanson.vscode-markdownlint" rel="noopener noreferrer"&gt;Markdownlint&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Linting and style checking for Markdown files.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=mushan.vscode-paste-image" rel="noopener noreferrer"&gt;Paste Image&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Easily paste images into Markdown and HTML.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=unifiedjs.vscode-mdx" rel="noopener noreferrer"&gt;MDX&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Language support for MDX.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=christian-kohler.path-intellisense" rel="noopener noreferrer"&gt;Path IntelliSense&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Auto-completes filenames.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Writing (in General) Related Extensions
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Extension&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker" rel="noopener noreferrer"&gt;Code Spell Checker&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;A great spell checker for programmers, with good support for camelCase and low false positives.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=viablelab.capitalize" rel="noopener noreferrer"&gt;Capitalize&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Capitalizes your text.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=wmaurer.change-case" rel="noopener noreferrer"&gt;Change Case&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Easily change the case of text.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=andersliu.insert-line-number" rel="noopener noreferrer"&gt;Insert Line Number&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Insert line numbers to selected lines or the whole document.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=jianbingfang.dupchecker" rel="noopener noreferrer"&gt;DupChecker&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Checks for and removes duplicate lines in the file content or selection.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=bierner.emojisense" rel="noopener noreferrer"&gt;:emojisense:&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Autocomplete for emoji.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=jinhyuk.replace-curly-quotes" rel="noopener noreferrer"&gt;Replace Curly Quotes&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Replaces curly quotes (&lt;code&gt;‘&lt;/code&gt;, &lt;code&gt;’&lt;/code&gt;, &lt;code&gt;“&lt;/code&gt;, &lt;code&gt;”&lt;/code&gt;) in a document with straight quotes (&lt;code&gt;'&lt;/code&gt;, &lt;code&gt;"&lt;/code&gt;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=Tyriar.sort-lines" rel="noopener noreferrer"&gt;Sort lines&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Sorts lines of text.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  GitHub Related Extensions
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Extension&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=bierner.github-markdown-preview" rel="noopener noreferrer"&gt;GitHub Markdown Preview&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;View Markdown files as they would appear on GitHub.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=GitHub.copilot-chat" rel="noopener noreferrer"&gt;GitHub Copilot Chat&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;AI chat features powered by GitHub Copilot.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=GitHub.copilot" rel="noopener noreferrer"&gt;GitHub Copilot&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;AI-powered code completion tool.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=wraith13.open-in-github-desktop" rel="noopener noreferrer"&gt;Open in GitHub Desktop&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Open the &lt;a href="https://desktop.github.com/" rel="noopener noreferrer"&gt;GitHub Desktop App&lt;/a&gt; easily from VS Code.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=wengerk.highlight-bad-chars" rel="noopener noreferrer"&gt;Highlight Bad Chars&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Makes zenkaku spaces (double-byte whitespace) visible.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=possan.nbsp-vscode" rel="noopener noreferrer"&gt;NBSP&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Visualizes suspicious Unicode characters and trailing whitespaces.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  CSV Related Extensions
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Extension&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=phplasma.csv-to-table" rel="noopener noreferrer"&gt;CSV to Table&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Convert a CSV/TSV/PSV file to an ASCII formatted table.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=mechatroner.rainbow-csv" rel="noopener noreferrer"&gt;Rainbow CSV&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Makes it easier to read and edit CSV and TSV files.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Japanese Language Related Extensions
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Extension&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=ICS.japanese-proofreading" rel="noopener noreferrer"&gt;テキスト校正くん&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Extension to check Japanese sentences in text files and Markdown files in VS Code.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=sifue.japanese-word-count" rel="noopener noreferrer"&gt;Japanese Word Count&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Count Japanese characters, words, and lines.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=mosapride.zenkaku" rel="noopener noreferrer"&gt;Zenkaku&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Show double-byte whitespace.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Styling and Themes Related Extensions
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Extension&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=wayou.vscode-todo-highlight" rel="noopener noreferrer"&gt;TODO Highlight&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Highlight TODOs, FIXMEs, and any other keywords or annotations.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=ginfuru.ginfuru-better-solarized-dark-theme" rel="noopener noreferrer"&gt;Better Solarized&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;A solarized theme for Visual Studio Code, including light and dark versions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme" rel="noopener noreferrer"&gt;Material Icon Theme&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Material Design Icons for Visual Studio Code.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=danielgjackson.auto-dark-mode-windows" rel="noopener noreferrer"&gt;Toggle Light/Dark Theme&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Command to toggle the theme between light and dark.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Utility Extensions
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Extension&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=Google.arb-editor" rel="noopener noreferrer"&gt;ARB Editor&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Editor for Application Resource Bundle files used for localization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=formulahendry.code-runner" rel="noopener noreferrer"&gt;Code Runner&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Run Python and JavaScript code locally for quick checks.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint" rel="noopener noreferrer"&gt;ESLint&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Integrates ESLint JavaScript into VS Code.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=sleistner.vscode-fileutils" rel="noopener noreferrer"&gt;File Utils&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;A convenient way of creating, duplicating, moving, renaming, and deleting files and directories.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=abusaidm.html-snippets" rel="noopener noreferrer"&gt;HTML Snippets&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Full HTML tags including HTML5 snippets.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=Zignd.html-css-class-completion" rel="noopener noreferrer"&gt;IntelliSense for CSS class names in HTML&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;CSS class name completion for the HTML class attribute based on the definitions found in your workspace.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer" rel="noopener noreferrer"&gt;Live Server&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Launch a local development server with live reload feature for static &amp;amp; dynamic pages. Perfect when working on HTML.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=fabiospampinato.vscode-open-in-finder" rel="noopener noreferrer"&gt;Open in Finder&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Adds commands for opening the current file or project in Finder.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode" rel="noopener noreferrer"&gt;Prettier - Code Formatter&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Code formatter using Prettier.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=shardulm94.trailing-spaces" rel="noopener noreferrer"&gt;Trailing Spaces&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Highlights trailing spaces and allows for a simple "delete all trailing spaces" command.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml" rel="noopener noreferrer"&gt;YAML&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;YAML language support by Red Hat, with built-in Kubernetes syntax support.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Easy Installation Method
&lt;/h2&gt;

&lt;p&gt;You can install all the recommended extensions easily by creating an &lt;code&gt;extensions.json&lt;/code&gt; file in your &lt;code&gt;.vscode&lt;/code&gt; directory and following these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the VS Code project where you want to install the recommended extensions.&lt;/li&gt;
&lt;li&gt;Open the command palette

&lt;ul&gt;
&lt;li&gt;macOS: &lt;code&gt;Cmd+Shift+P&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Windows/Linux: &lt;code&gt;Ctrl+Shift+P&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Type and select &lt;code&gt;Configure Recommended Extensions (Workspace Folder)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Copy and paste the contents of the &lt;code&gt;extensions.json&lt;/code&gt; file below into your &lt;code&gt;extensions.json&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;Type and select &lt;code&gt;Extensions: Show Recommended Extensions&lt;/code&gt; in the command palette.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  extensions.json
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
json
{
  "recommendations": [
    "Google.arb-editor",
    "danielgjackson.auto-dark-mode-windows",
    "viablelab.capitalize",
    "wmaurer.change-case",
    "formulahendry.code-runner",
    "streetsidesoftware.code-spell-checker",
    "GitHub.copilot-chat",
    "GitHub.copilot",
    "jerriepelser.copy-markdown-as-html",
    "phplasma.csv-to-table",
    "jianbingfang.dupchecker",
    "bierner.emojisense",
    "ginfuru.ginfuru-better-solarized-dark-theme",
    "bierner.github-markdown-preview",
    "wengerk.highlight-bad-chars",
    "abusaidm.html-snippets",
    "Zignd.html-css-class-completion",
    "andersliu.insert-line-number",
    "ICS.japanese-proofreading",
    "sifue.japanese-word-count",
    "ritwickdey.LiveServer",
    "bierner.markdown-footnotes",
    "shd101wyy.markdown-preview-enhanced",
    "yzane.markdown-pdf",
    "yzhang.markdown-all-in-one",
    "PKief.material-icon-theme",
    "possan.nbsp-vscode",
    "wraith13.open-in-github-desktop",
    "christian-kohler.path-intellisense",
    "esbenp.prettier-vscode",
    "mechatroner.rainbow-csv",
    "jinhyuk.replace-curly-quotes",
    "Tyriar.sort-lines",
    "shardulm94.trailing-spaces",
    "davidanson.vscode-markdownlint",
    "dbaeumer.vscode-eslint",
    "fabiospampinato.vscode-open-in-finder",
    "mushan.vscode-paste-image",
    "redhat.vscode-yaml",
    "sleistner.vscode-fileutils",
    "telesoho.vscode-markdown-paste-image",
    "unifiedjs.vscode-mdx",
    "wayou.vscode-todo-highlight",
    "mosapride.zenkaku"
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>vscode</category>
      <category>recommendation</category>
    </item>
    <item>
      <title>Apple Shortcuts - Import &amp; Delete Calendar Files Automation</title>
      <dc:creator>ahandsel</dc:creator>
      <pubDate>Thu, 06 Jun 2024 08:36:35 +0000</pubDate>
      <link>https://dev.to/ahandsel/apple-shortcuts-import-delete-calendar-files-automation-3p3b</link>
      <guid>https://dev.to/ahandsel/apple-shortcuts-import-delete-calendar-files-automation-3p3b</guid>
      <description>&lt;p&gt;Here is a walkthrough of how I built a shortcut to import and delete calendar files from my iCloud calendar.&lt;/p&gt;

&lt;p&gt;I hope this can be useful for you in building your own shortcuts or modifying this one to suit your needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Apple Shortcuts: &lt;a href="https://www.icloud.com/shortcuts/ceb35c3d1b524af5a65b40d8bc07c598" rel="noopener noreferrer"&gt;Import &amp;amp; Delete Calendar Files&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Click the link above to download the Apple Shortcut to your Mac and set the folder path to your &lt;code&gt;Downloads&lt;/code&gt; folder.&lt;/li&gt;
&lt;li&gt;Download calendar files (&lt;code&gt;.ics&lt;/code&gt;) to the &lt;code&gt;Downloads&lt;/code&gt; folder.&lt;/li&gt;
&lt;li&gt;Run the shortcut to import the events to your Apple Calendar and delete the files from the &lt;code&gt;Downloads&lt;/code&gt; folder.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Apple Shortcut's Structure
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Open the Calendar App
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use the &lt;code&gt;Open App&lt;/code&gt; action to open the Calendar app.

&lt;ul&gt;
&lt;li&gt;The shortcut works smoother if the Calendar app is open at the start.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Find and Get the Calendar Files
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use the &lt;code&gt;Get Contents of Folder&lt;/code&gt; action to get the files from the &lt;code&gt;Downloads&lt;/code&gt; folder.&lt;/li&gt;
&lt;li&gt;Use the &lt;code&gt;Filter Files&lt;/code&gt; action to filter the files with the &lt;code&gt;.ics&lt;/code&gt; extension.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Notify the User
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use the &lt;code&gt;Count&lt;/code&gt; action to count the number of files.&lt;/li&gt;
&lt;li&gt;Use the &lt;code&gt;Show Notification&lt;/code&gt; action to display the number of files found.

&lt;ul&gt;
&lt;li&gt;This gives the user an estimate of how long the import will take.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Import the Calendar Files
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use the &lt;code&gt;Repeat with Each&lt;/code&gt; action to loop through the files.&lt;/li&gt;
&lt;li&gt;Use the &lt;code&gt;Open File&lt;/code&gt; action to open the file (&lt;code&gt;Repeat Item&lt;/code&gt;) in the Calendar app.&lt;/li&gt;
&lt;li&gt;Use the &lt;code&gt;Run AppleScript&lt;/code&gt; action to execute the script to automate clicking the &lt;code&gt;OK&lt;/code&gt; button when prompted by the Calendar app.

&lt;ul&gt;
&lt;li&gt;The script is provided in the section below.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;End the &lt;code&gt;Repeat with Each&lt;/code&gt; action.&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Delete the Calendar Files
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Repeat the steps to find and get the calendar files.&lt;/li&gt;
&lt;li&gt;Use the &lt;code&gt;Delete File&lt;/code&gt; action to delete the files from the &lt;code&gt;Downloads&lt;/code&gt; folder.&lt;/li&gt;
&lt;li&gt;Why duplicate the shortcut steps? For some reason, using the &lt;code&gt;Delete File&lt;/code&gt; action after the &lt;code&gt;Open File&lt;/code&gt; action does not work smoothly after the &lt;code&gt;Run AppleScript&lt;/code&gt; action.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Hide the Calendar App
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use the &lt;code&gt;Hide App&lt;/code&gt; action to hide the Calendar app.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  AppleScript to Automate Importing Calendar Events
&lt;/h2&gt;

&lt;p&gt;This AppleScript automates the process of importing calendar events in the Calendar app on macOS. It mainly clicks the &lt;code&gt;OK&lt;/code&gt; button when prompted by the Calendar app to import an event or skip already-imported events.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ahandsel/articles/blob/main/calendar-import-automation/calendar-event-importer.applescript" rel="noopener noreferrer"&gt;calendar-event-importer.applescript&lt;/a&gt;&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight applescript"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c1"&gt;-- Script Name: Calendar Event Importer&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
&lt;/span&gt;&lt;span class="c1"&gt;-- Version: 1.1 - Improved script with timeout mechanism&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
&lt;/span&gt;&lt;span class="c1"&gt;-- Usage: Use this script to automate importing calendar events in the Calendar app on macOS.&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c1"&gt;-- Function: Check if the Calendar event window is open&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
&lt;/span&gt;&lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="nv"&gt;isEventWindowOpen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;timeoutSeconds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
    &lt;/span&gt;&lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;startTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;current date&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
    &lt;/span&gt;&lt;span class="k"&gt;repeat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;until&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;existsEventWindow&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nb"&gt;current date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;startTime&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;timeoutSeconds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
        &lt;/span&gt;&lt;span class="nb"&gt;delay&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
    &lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;repeat&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
    &lt;/span&gt;&lt;span class="nb"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;existsEventWindow&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
&lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;isEventWindowOpen&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c1"&gt;-- Function: Check if the event window exists&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
&lt;/span&gt;&lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="nv"&gt;existsEventWindow&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
    &lt;/span&gt;&lt;span class="k"&gt;tell&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;application&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"System Events"&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
        &lt;/span&gt;&lt;span class="k"&gt;tell&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;process&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Calendar"&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
            &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exists&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;button&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"OK"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;window&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
                &lt;/span&gt;&lt;span class="nb"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
            &lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
        &lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;tell&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
    &lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;tell&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
    &lt;/span&gt;&lt;span class="nb"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
&lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;existsEventWindow&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c1"&gt;-- Main script execution&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
    &lt;/span&gt;&lt;span class="c1"&gt;-- Adjust the delay as necessary to ensure the event window has time to open&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
    &lt;/span&gt;&lt;span class="nb"&gt;delay&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;/span&amp;gt;&amp;lt;span class="c1"&amp;gt;-- Set timeout period (in seconds) for event window to open&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt;
&amp;lt;/span&amp;gt;&amp;lt;span class="k"&amp;gt;set&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span class="nv"&amp;gt;timeoutPeriod&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span class="k"&amp;gt;to&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span class="mi"&amp;gt;10&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt;

&amp;lt;/span&amp;gt;&amp;lt;span class="c1"&amp;gt;-- Check if the event window is open within the timeout period&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt;
&amp;lt;/span&amp;gt;&amp;lt;span class="k"&amp;gt;if&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span class="nv"&amp;gt;isEventWindowOpen&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="nv"&amp;gt;timeoutPeriod&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span class="k"&amp;gt;then&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt;
    &amp;lt;/span&amp;gt;&amp;lt;span class="k"&amp;gt;tell&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span class="nb"&amp;gt;application&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span class="s2"&amp;gt;"System Events"&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt;
        &amp;lt;/span&amp;gt;&amp;lt;span class="k"&amp;gt;tell&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span class="nv"&amp;gt;process&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span class="s2"&amp;gt;"Calendar"&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt;
            &amp;lt;/span&amp;gt;&amp;lt;span class="nv"&amp;gt;click&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span class="nb"&amp;gt;button&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span class="s2"&amp;gt;"OK"&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span class="k"&amp;gt;of&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span class="na"&amp;gt;window&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span class="mi"&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt;
        &amp;lt;/span&amp;gt;&amp;lt;span class="k"&amp;gt;end&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span class="k"&amp;gt;tell&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt;
    &amp;lt;/span&amp;gt;&amp;lt;span class="k"&amp;gt;end&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span class="k"&amp;gt;tell&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt;
&amp;lt;/span&amp;gt;&amp;lt;span class="k"&amp;gt;else&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt;
    &amp;lt;/span&amp;gt;&amp;lt;span class="c1"&amp;gt;-- Event window did not open within timeoutPeriod. Skipping event.&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt;
&amp;lt;/span&amp;gt;&amp;lt;span class="k"&amp;gt;end&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span class="k"&amp;gt;if&amp;lt;/span&amp;gt;&amp;lt;span class="w"&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  How to Import and Use the Apple Shortcut&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;This automation uses the &lt;a href="https://support.apple.com/guide/shortcuts-mac/intro-to-shortcuts-apdf22b0444c/mac" rel="noopener noreferrer"&gt;Shortcuts on Mac&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can get it on your Mac by clicking on the &lt;a href="https://www.icloud.com/shortcuts/ceb35c3d1b524af5a65b40d8bc07c598" rel="noopener noreferrer"&gt;Import &amp;amp; Delete Calendar Files&lt;/a&gt; link.&lt;/p&gt;

&lt;p&gt;You will be prompted with three questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Which folder do you want to import the calendar files from? (Default: Downloads)&lt;/li&gt;
&lt;li&gt;Folder path (same as above)&lt;/li&gt;
&lt;li&gt;Do you want to delete the calendar files after importing them? (Default: Yes)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After answering the questions, the shortcut will be added to your Shortcuts app on your Mac.&lt;/p&gt;

&lt;p&gt;To run the shortcut:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download the calendar files (&lt;code&gt;.ics&lt;/code&gt;) to the folder you specified.&lt;/li&gt;
&lt;li&gt;Open the Shortcuts app and run the shortcut.&lt;/li&gt;
&lt;li&gt;The events will be imported to your Apple Calendar, and the files will be deleted from the folder.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Apple Shortcut Screenshot
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj1pqk48o9ihegnlnf1yw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj1pqk48o9ihegnlnf1yw.png" alt="calendar-event-importer-screenshot.png"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>applescript</category>
      <category>ica</category>
      <category>calendar</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Phrase CLI Debug locale_mapping Error</title>
      <dc:creator>ahandsel</dc:creator>
      <pubDate>Tue, 16 Apr 2024 04:26:15 +0000</pubDate>
      <link>https://dev.to/ahandsel/phrase-cli-debug-localemapping-error-4ipd</link>
      <guid>https://dev.to/ahandsel/phrase-cli-debug-localemapping-error-4ipd</guid>
      <description>&lt;p&gt;The &lt;code&gt;locale_mapping&lt;/code&gt; parameter is required when using the &lt;code&gt;phrase push&lt;/code&gt; command to upload a CSV file to update a Phrase Strings project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Problem&lt;/li&gt;
&lt;li&gt;Solution&lt;/li&gt;
&lt;li&gt;How to Configure &lt;code&gt;locale_mapping&lt;/code&gt; Parameter&lt;/li&gt;
&lt;li&gt;Warning - Plural Forms&lt;/li&gt;
&lt;li&gt;Background &amp;amp; Environment&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Problem
&lt;/h2&gt;

&lt;p&gt;When using the &lt;code&gt;phrase push&lt;/code&gt; command to upload a CSV file to update a Phrase Strings project, I kept encountering the following error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API response: {"message":"Validation failed","errors":[{"resource":"Upload","field":"locale_mapping","message":"You must provide a locale_mapping parameter."}]}
ERROR: 422 Unprocessable Entity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;Contrary to what the Phrase Strings &lt;a href="https://developers.phrase.com/api/#post-/projects/-project_id-/uploads" rel="noopener noreferrer"&gt;Upload a new file&lt;/a&gt; API documentation suggests, the &lt;code&gt;locale_mapping&lt;/code&gt; parameter is mandatory when using the &lt;code&gt;phrase push&lt;/code&gt; command with a CSV file.&lt;/p&gt;

&lt;p&gt;Here is the correct configuration for the &lt;code&gt;.phrase.yml&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;phrase&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;access_token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;#access_token&lt;/span&gt;
  &lt;span class="na"&gt;project_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;#project_id&lt;/span&gt;
  &lt;span class="na"&gt;file_format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;csv&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;sources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./upload-translations.csv&lt;/span&gt;
        &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;file_format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;csv&lt;/span&gt;
          &lt;span class="na"&gt;locale_mapping&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;en"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2"&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;pull&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;targets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./&amp;lt;locale_name&amp;gt;-translations.csv&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How to Configure &lt;code&gt;locale_mapping&lt;/code&gt; Parameter
&lt;/h2&gt;

&lt;p&gt;Below is a snippet from the &lt;code&gt;.phrase.yml&lt;/code&gt; template file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;locale_mapping&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;LANGUAGE_CODE"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;COLUMN"&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt; &lt;span class="s"&gt;(object)&lt;/span&gt; &lt;span class="c1"&gt;#Optional, format specific (Excel, CSV) mapping between locale names and the columns the translations to those locales are contained in.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In my case, I had to map the &lt;code&gt;en&lt;/code&gt; locale to the &lt;code&gt;2&lt;/code&gt; column in the CSV file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;locale_mapping&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;en"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2"&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you need to map multiple locales, you can configure it as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;locale_mapping&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;en"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ja"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3"&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Warning - Plural Forms
&lt;/h2&gt;

&lt;p&gt;⚠️ &lt;strong&gt;Warning&lt;/strong&gt;: If you are working with &lt;a href="https://support.phrase.com/hc/en-us/articles/5819838743964" rel="noopener noreferrer"&gt;plural forms&lt;/a&gt;, ensure you use the correct plural suffixes for each language specified in the &lt;code&gt;locale_mapping&lt;/code&gt; parameter.&lt;/p&gt;

&lt;p&gt;For example, English and Japanese have different plural forms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For English, use &lt;code&gt;zero&lt;/code&gt;, &lt;code&gt;one&lt;/code&gt;, and &lt;code&gt;other&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;For Japanese, use &lt;code&gt;zero&lt;/code&gt; and &lt;code&gt;other&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Adding a Japanese translation for the &lt;code&gt;one&lt;/code&gt; plural form generates a new key instead of updating the existing key for the &lt;code&gt;other&lt;/code&gt; plural form.&lt;/p&gt;

&lt;h2&gt;
  
  
  Background &amp;amp; Environment
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/phrase/phrase-cli" rel="noopener noreferrer"&gt;Phrase CLI version&lt;/a&gt;: 2.23.2&lt;/li&gt;
&lt;li&gt;Device:

&lt;ul&gt;
&lt;li&gt;ProductName: macOS&lt;/li&gt;
&lt;li&gt;ProductVersion: 14.4.1&lt;/li&gt;
&lt;li&gt;BuildVersion: 23E224&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

</description>
      <category>phrasestrings</category>
      <category>localization</category>
      <category>phrasecli</category>
      <category>internationalization</category>
    </item>
    <item>
      <title>Phrase CLI Config YAML</title>
      <dc:creator>ahandsel</dc:creator>
      <pubDate>Tue, 09 Apr 2024 09:33:00 +0000</pubDate>
      <link>https://dev.to/ahandsel/phrase-cli-config-yaml-3pdh</link>
      <guid>https://dev.to/ahandsel/phrase-cli-config-yaml-3pdh</guid>
      <description>&lt;p&gt;This is a quick breakdown into the &lt;code&gt;.phrase.yml&lt;/code&gt; file used for configuring the Phrase CLI and the various options available for pushing and pulling translations.&lt;br&gt;
I found it strangely challenging to locate the &lt;code&gt;.phrase.yml&lt;/code&gt; configuration file template on &lt;a href="https://support.phrase.com/hc/en-us/articles/5784118494492" rel="noopener noreferrer"&gt;Phrase's Help Website&lt;/a&gt;, and their documentation is not always straightforward.&lt;/p&gt;

&lt;p&gt;You can find the &lt;code&gt;.phrase.yml&lt;/code&gt; configuration file template on &lt;a href="https://github.com/ahandsel/articles/blob/main/phrase-cli/phrase-configuration-overview.yml" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; or in this article's Phrase CLI Config YAML Template section.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
Configuration Options Breakdown

&lt;ul&gt;
&lt;li&gt;Phrase CLI - Header Options&lt;/li&gt;
&lt;li&gt;Phrase CLI Push - Parameters&lt;/li&gt;
&lt;li&gt;Phrase CLI Push - Format Options&lt;/li&gt;
&lt;li&gt;Phrase CLI Pull - Parameters&lt;/li&gt;
&lt;li&gt;Phrase CLI Pull - Format Options&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Phrase CLI Config YAML Template&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Configuration Options Breakdown
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Phrase CLI - Header Options
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Value (Type)&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;access_token&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ACCESS_TOKEN (string)&lt;/td&gt;
&lt;td&gt;Add personal access token to authenticate.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;abc123&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;project_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;PROJECT_ID (string)&lt;/td&gt;
&lt;td&gt;The Project ID (Copy from Project Settings &amp;gt; API tab).&lt;/td&gt;
&lt;td&gt;&lt;code&gt;123456&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;file_format&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;FORMAT_API_EXTENSION (string)&lt;/td&gt;
&lt;td&gt;Specify a &lt;a href="https://help.phrase.com/help/supported-platforms-and-formats" rel="noopener noreferrer"&gt;supported file type&lt;/a&gt; for the entire configuration file.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;csv&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Tip: If the &lt;code&gt;file_format&lt;/code&gt; is specified in the header, it is no longer required in the &lt;code&gt;push&lt;/code&gt; and &lt;code&gt;pull&lt;/code&gt; commands.&lt;/p&gt;

&lt;p&gt;Additional notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For instructions on generating an access token, refer to the &lt;a href="https://help.phrase.com/help/access-tokens" rel="noopener noreferrer"&gt;Generate API Access Token&lt;/a&gt; help doc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phrase CLI Push - Parameters
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;push&lt;/code&gt; command uploads files to Phrase via the &lt;a href="https://developers.phrase.com/api/#post-/projects/%7Bproject_id%7D/uploads" rel="noopener noreferrer"&gt;upload API endpoint&lt;/a&gt;. The parameters you can use when uploading files to Phrase are as follows:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Value (Type)&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;file_format&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;FORMAT_API_EXTENSION (string)&lt;/td&gt;
&lt;td&gt;Specify the upload file type.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;csv&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;locale_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;LOCALE_ID (string)&lt;/td&gt;
&lt;td&gt;Locale name or public ID (via Language settings -&amp;gt; API).&lt;/td&gt;
&lt;td&gt;&lt;code&gt;en-US&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tags&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;TAG_1, TAG_2 (string)&lt;/td&gt;
&lt;td&gt;Tags to be used for the new keys in the upload.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tag1, tag2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;update_translations&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false (boolean)&lt;/td&gt;
&lt;td&gt;If true, existing translations will be updated with the upload's content.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;update_descriptions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false (boolean)&lt;/td&gt;
&lt;td&gt;If true, the upload's key descriptions (including empty descriptions) will overwrite existing ones.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;skip_upload_tags&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false (boolean)&lt;/td&gt;
&lt;td&gt;If true, upload will not create upload tags.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;skip_unverification&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false (boolean)&lt;/td&gt;
&lt;td&gt;If true, updated translations will be unverified.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;file_encoding&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ENCODING (string)&lt;/td&gt;
&lt;td&gt;Enforces a specific file encoding. Options: &lt;code&gt;UTF-8&lt;/code&gt;, &lt;code&gt;UTF-16&lt;/code&gt;, &lt;code&gt;UTF-16BE&lt;/code&gt;, &lt;code&gt;UTF-16LE&lt;/code&gt;, &lt;code&gt;ISO-8859-1&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;UTF-8&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;locale_mapping&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;{"LANGUAGE_CODE": "COLUMN"} (object)&lt;/td&gt;
&lt;td&gt;Optional, format-specific (Excel, CSV) mapping between locale names and column locations.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{"en": "2"}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;autotranslate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false (boolean)&lt;/td&gt;
&lt;td&gt;If true, the &lt;a href="https://support.phrase.com/hc/en-us/articles/5822187934364" rel="noopener noreferrer"&gt;pre-translation feature&lt;/a&gt; will be used to generate translations.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mark_reviewed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false (boolean)&lt;/td&gt;
&lt;td&gt;If true, the imported translations will be marked as reviewed.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Additional notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;file_format&lt;/code&gt; is required if the file type is not specified in the source or target entries.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mark_reviewed&lt;/code&gt; is only available if the review workflow is enabled for the project.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phrase CLI Push - Format Options
&lt;/h3&gt;

&lt;p&gt;Here are the format options you can use when uploading files to Phrase:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Format Option&lt;/th&gt;
&lt;th&gt;Value (Type)&lt;/th&gt;
&lt;th&gt;Only for&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ignore_source_translations&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false (boolean)&lt;/td&gt;
&lt;td&gt;XLIFF/XLIFF 2.0&lt;/td&gt;
&lt;td&gt;If true, source translations in the file will be ignored during the upload.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ignore_target_translations&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false (boolean)&lt;/td&gt;
&lt;td&gt;XLIFF/XLIFF 2.0&lt;/td&gt;
&lt;td&gt;If true, target translations in the file will be ignored during the upload.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;msgid_as_default&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false (boolean)&lt;/td&gt;
&lt;td&gt;Gettext POT&lt;/td&gt;
&lt;td&gt;If true, the key name (msgid) will be used as a translation.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;strip_placeholder_delimiters&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false (boolean)&lt;/td&gt;
&lt;td&gt;XLIFF&lt;/td&gt;
&lt;td&gt;If true, &lt;code&gt;&amp;lt;ph&amp;gt;&lt;/code&gt; tags will be removed from translations.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;override_file_language&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false (boolean)&lt;/td&gt;
&lt;td&gt;XLIFF/XLIFF 2.0&lt;/td&gt;
&lt;td&gt;If true, the specified language will override the language in the file.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;key_index&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://dev.tointeger"&gt;empty&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Excel/CSV&lt;/td&gt;
&lt;td&gt;Index of the column containing key names (1-based index).&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;comment_index&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://dev.tointeger"&gt;empty&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Excel/CSV&lt;/td&gt;
&lt;td&gt;Index of the column containing key descriptions (1-based index).&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tag_column&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://dev.tointeger"&gt;empty&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Excel/CSV&lt;/td&gt;
&lt;td&gt;Index of the column containing tags (1-based index).&lt;/td&gt;
&lt;td&gt;&lt;code&gt;4&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;column_separator&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;,&lt;/code&gt; (string)&lt;/td&gt;
&lt;td&gt;CSV&lt;/td&gt;
&lt;td&gt;Character used to separate columns.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;,&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;quote_char&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;"&lt;/code&gt; (string)&lt;/td&gt;
&lt;td&gt;CSV&lt;/td&gt;
&lt;td&gt;Character used to quote newlines and column separators.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;header_content_row&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false (boolean)&lt;/td&gt;
&lt;td&gt;CSV&lt;/td&gt;
&lt;td&gt;If true, the first row is the header, so it will be skipped.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;first_content_row&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1 (integer)&lt;/td&gt;
&lt;td&gt;Excel&lt;/td&gt;
&lt;td&gt;Index of the first row containing translation content (1-based index).&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;enable_pluralization&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;true (boolean)&lt;/td&gt;
&lt;td&gt;Simple/Nested JSON&lt;/td&gt;
&lt;td&gt;If true, pluralized keys will be detected and persisted.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;unescape_linebreaks&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false (boolean)&lt;/td&gt;
&lt;td&gt;Android XML&lt;/td&gt;
&lt;td&gt;If true, all &lt;code&gt;\n&lt;/code&gt; will be imported as newlines.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;escape_single_quotes&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false (boolean)&lt;/td&gt;
&lt;td&gt;Java Properties&lt;/td&gt;
&lt;td&gt;If true, single quotes will be escaped with another single quote.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Phrase CLI Pull - Parameters
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;pull&lt;/code&gt; command downloads files from Phrase via the &lt;a href="https://developers.phrase.com/api/#get-/projects/%7Bproject_id%7D/locales/%7Bid%7D/download" rel="noopener noreferrer"&gt;locales download API endpoint&lt;/a&gt;. The parameters you can use when downloading files from Phrase are as follows:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Value (Type)&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;file_format&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;FORMAT_API_EXTENSION (string)&lt;/td&gt;
&lt;td&gt;Specify the download file type.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;csv&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;locale_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;LOCALE_ID (string)&lt;/td&gt;
&lt;td&gt;Locale name or public ID (via Language settings -&amp;gt; API).&lt;/td&gt;
&lt;td&gt;&lt;code&gt;en-US&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tags&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;TAG_1, TAG_2 (string)&lt;/td&gt;
&lt;td&gt;Tags to limit results to keys tagged with a list of comma-separated tag names.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tag1, tag2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;include_empty_translations&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false (boolean)&lt;/td&gt;
&lt;td&gt;If true, keys without translations will be included in the download.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;exclude_empty_zero_forms&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false (boolean)&lt;/td&gt;
&lt;td&gt;If true, zero forms will be included when empty in pluralized keys.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;include_translated_keys&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;true (boolean)&lt;/td&gt;
&lt;td&gt;If true, translated keys will be included in the locale file.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;keep_notranslate_tags&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false (boolean)&lt;/td&gt;
&lt;td&gt;If true, [NOTRANSLATE] tags will be retained.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;encoding&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ENCODING (string)&lt;/td&gt;
&lt;td&gt;Enforces a specific file encoding. Options: &lt;code&gt;UTF-8&lt;/code&gt;, &lt;code&gt;UTF-16&lt;/code&gt;, &lt;code&gt;UTF-16BE&lt;/code&gt;, &lt;code&gt;UTF-16LE&lt;/code&gt;, &lt;code&gt;ISO-8859-1&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;UTF-8&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;include_unverified_translations&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;true (boolean)&lt;/td&gt;
&lt;td&gt;If true, unverified translations will be included.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;use_last_reviewed_version&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false (boolean)&lt;/td&gt;
&lt;td&gt;If true, the last reviewed version of a translation will be used.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fallback_locale_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;LOCALE_ID (string)&lt;/td&gt;
&lt;td&gt;Locale name or public ID (via Language settings -&amp;gt; API).&lt;/td&gt;
&lt;td&gt;&lt;code&gt;en-US&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Tip: To download only untranslated keys, set &lt;code&gt;include_empty_translations&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; and &lt;code&gt;include_translated_keys&lt;/code&gt; to &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Additional notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;file_format&lt;/code&gt; is required if the file type is not specified in the source or target entries.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;use_last_reviewed_version&lt;/code&gt; is only available if the review workflow is enabled for the project.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phrase CLI Pull - Format Options
&lt;/h3&gt;

&lt;p&gt;Here are the format options you can use when downloading files from Phrase:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Format Option&lt;/th&gt;
&lt;th&gt;Value (Type)&lt;/th&gt;
&lt;th&gt;Only for&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;document_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;DOCUMENT_ID (string)&lt;/td&gt;
&lt;td&gt;HTML&lt;/td&gt;
&lt;td&gt;Specifies the document ID of existing HTML documents for export.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;12345&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;enclose_in_cdata&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false (boolean)&lt;/td&gt;
&lt;td&gt;XLIFF/Symfony XLIFF/Android XML&lt;/td&gt;
&lt;td&gt;If true, translations with HTML tags will be enclosed in CDATA.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;include_translation_state&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false (boolean)&lt;/td&gt;
&lt;td&gt;XLIFF/Symfony XLIFF&lt;/td&gt;
&lt;td&gt;If true, the state of translations will be included in the target locale.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;indent_size&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;4 (integer)&lt;/td&gt;
&lt;td&gt;XLIFF/Android XML&lt;/td&gt;
&lt;td&gt;Specifies the number of indentation characters.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;4&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;indent_style&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;space (string)&lt;/td&gt;
&lt;td&gt;XLIFF/Android XML&lt;/td&gt;
&lt;td&gt;Specifies the indentation character (allowed values: space, tab).&lt;/td&gt;
&lt;td&gt;&lt;code&gt;space&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;export_key_id_as_resname&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;true/false (boolean)&lt;/td&gt;
&lt;td&gt;XLIFF&lt;/td&gt;
&lt;td&gt;If true, the Key ID will be exported as the "resname" attribute.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;export_key_name_hash_as_extradata&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;true/false (boolean)&lt;/td&gt;
&lt;td&gt;XLIFF&lt;/td&gt;
&lt;td&gt;If true, the Key Name hash will be exported as the "extradata" attribute.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;delimit_placeholders&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false (boolean)&lt;/td&gt;
&lt;td&gt;XLIFF&lt;/td&gt;
&lt;td&gt;If true, &lt;code&gt;&amp;lt;ph&amp;gt;&lt;/code&gt; tags will be removed from translations.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;convert_placeholder&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false (boolean)&lt;/td&gt;
&lt;td&gt;iOS/Android XML&lt;/td&gt;
&lt;td&gt;If true, placeholders will be converted to match format-specific requirements.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;include_pluralized_keys&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false (boolean)&lt;/td&gt;
&lt;td&gt;iOS&lt;/td&gt;
&lt;td&gt;If true, pluralized keys will be included in the locale file.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;export_tags&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false (boolean)&lt;/td&gt;
&lt;td&gt;Excel/CSV&lt;/td&gt;
&lt;td&gt;If true, tags will be exported along with keys and translations.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;export_max_characters_allowed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false (boolean)&lt;/td&gt;
&lt;td&gt;Excel/CSV&lt;/td&gt;
&lt;td&gt;If true, the key character limit will be exported with keys and translations.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;escape_linebreaks&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false (boolean)&lt;/td&gt;
&lt;td&gt;Android XML&lt;/td&gt;
&lt;td&gt;If true, all line breaks will be escaped as &lt;code&gt;'\n'&lt;/code&gt;.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;escape_single_quotes&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false (boolean)&lt;/td&gt;
&lt;td&gt;Java/Play Framework Properties&lt;/td&gt;
&lt;td&gt;If true, single quotes will be escaped with another single quote.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;omit_separator_space&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false (boolean)&lt;/td&gt;
&lt;td&gt;Java Properties&lt;/td&gt;
&lt;td&gt;If true, the space before and after the separator sign (&lt;code&gt;=&lt;/code&gt;) will be skipped.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;crlf_line_terminators&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false (boolean)&lt;/td&gt;
&lt;td&gt;Java Properties&lt;/td&gt;
&lt;td&gt;If true, CRLF (Windows) line terminator characters will be used.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Phrase CLI Config YAML Template
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Updated on 2024-10-31&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ahandsel/articles/blob/main/phrase-cli/phrase-configuration-overview.yml" rel="noopener noreferrer"&gt;phrase-configuration-overview.yml on GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;phrase&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;access_token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ACCESS_TOKEN&lt;/span&gt; &lt;span class="c1"&gt;#Add your personal access token to authenticate, you can find the steps on how to create one here: https://help.phrase.com/help/access-tokens&lt;/span&gt;
  &lt;span class="na"&gt;project_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PROJECT_ID&lt;/span&gt; &lt;span class="c1"&gt;#The public Project ID which can be found in the Project Settings (API tab)&lt;/span&gt;
  &lt;span class="na"&gt;file_format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;FORMAT_API_EXTENSION&lt;/span&gt; &lt;span class="c1"&gt;#Find the format you want to use here: https://help.phrase.com/help/supported-platforms-and-formats , access the article and copi the API extension&lt;/span&gt;

  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;sources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./path/to/file/file.format&lt;/span&gt; &lt;span class="c1"&gt;#Provide the path to the file(s) you want to push here, starting from the location of the configuration file. You can use the placeholders &amp;lt;locale_name&amp;gt;, &amp;lt;locale_code&amp;gt; and &amp;lt;tags&amp;gt; in the path or file-name&lt;/span&gt;
      &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;file_format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;FORMAT_API_EXTENSION (string)&lt;/span&gt; &lt;span class="c1"&gt;#See above. Only required if you deviate from the default format set in the header&lt;/span&gt;
        &lt;span class="na"&gt;locale_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;LOCALE_ID (string)&lt;/span&gt; &lt;span class="c1"&gt;#Can be the name (e.g. en-US) or public id (via Language settings -&amp;gt; API) of the locale. Preferred is the public id.&lt;/span&gt;
        &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;TAG_1, TAG_2 (string)&lt;/span&gt; &lt;span class="c1"&gt;#List of tags separated by comma to be associated with the new keys contained in the upload.&lt;/span&gt;
        &lt;span class="na"&gt;update_translations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#Indicates whether existing translations should be updated with the file content.&lt;/span&gt;
        &lt;span class="na"&gt;update_descriptions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#Existing key descriptions will be updated with the file content. Empty descriptions overwrite existing descriptions.&lt;/span&gt;
        &lt;span class="na"&gt;skip_upload_tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#Indicates whether the upload should not create upload tags.&lt;/span&gt;
        &lt;span class="na"&gt;skip_unverification&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#Indicates whether the upload should unverify updated translations.&lt;/span&gt;
        &lt;span class="na"&gt;file_encoding&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ENCODING (string)&lt;/span&gt; &lt;span class="c1"&gt;#Enforces a specific encoding on the file contents. Valid options are "UTF-8", "UTF-16", "UTF-16BE", "UTF-16LE" and "ISO-8859-1".&lt;/span&gt;
        &lt;span class="na"&gt;locale_mapping&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;LANGUAGE_CODE"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;COLUMN"&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt; &lt;span class="s"&gt;(object)&lt;/span&gt; &lt;span class="c1"&gt;#Optional, format specific (Excel, CSV) mapping between locale names and the columns the translations to those locales are contained in.&lt;/span&gt;
        &lt;span class="na"&gt;autotranslate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#If set, translations for the uploaded language will be fetched automatically.  &lt;/span&gt;
        &lt;span class="na"&gt;mark_reviewed&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#Indicated whether the imported translations should be marked as reviewed. This setting is available if the review workflow (currently beta) is enabled for the project.&lt;/span&gt;
        &lt;span class="c1"&gt;#-------------&lt;/span&gt;
        &lt;span class="na"&gt;format_options&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;ignore_source_translations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#XLIFF/XLIFF 2.0 only. Ignores the source translations in the file during the upload (to avoid accidental source language updates)&lt;/span&gt;
          &lt;span class="na"&gt;ignore_target_translations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#XLIFF/XLIFF 2.0 only. Ignores the target translations in the file during the upload (to avoid accidental target language updates)&lt;/span&gt;
          &lt;span class="na"&gt;msgid_as_default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#Gettext template POT files. Use the key name (msgid) as translation (key names equal source translation in that format)&lt;/span&gt;
          &lt;span class="na"&gt;strip_placeholder_delimiters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#XLIFF only. Removes &amp;lt;ph&amp;gt; tags from translations&lt;/span&gt;
          &lt;span class="na"&gt;override_file_language&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#XLIFF/XLIFF 2.0 only. This file format typically contains language information in the file itself. Use this option to override the language with one you specify.&lt;/span&gt;
          &lt;span class="na"&gt;key_index&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;empty&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;&lt;span class="s"&gt;(integer)&lt;/span&gt; &lt;span class="c1"&gt;#Excel/CSV only. Index of the column containing the key names. Column indexes start at 1.&lt;/span&gt;
          &lt;span class="na"&gt;comment_index&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;empty&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;&lt;span class="s"&gt;(integer)&lt;/span&gt; &lt;span class="c1"&gt;#Excel/CSV only. Index of the column containing description for the key. Column indexes start at 1.&lt;/span&gt;
          &lt;span class="na"&gt;tag_column&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;empty&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;&lt;span class="s"&gt;(integer)&lt;/span&gt; &lt;span class="c1"&gt;#Excel/CSV only. Index of the column containing a tag for the key. Column indexes start at 1 .&lt;/span&gt;
          &lt;span class="na"&gt;column_separator&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="s"&gt;(string)&lt;/span&gt; &lt;span class="c1"&gt;#CSV only. Char that is used to separate columns.&lt;/span&gt;
          &lt;span class="na"&gt;quote_char&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;"'&lt;/span&gt; &lt;span class="s"&gt;(string)&lt;/span&gt; &lt;span class="c1"&gt;#CSV only. Char that is used to quote newlines and column separator.&lt;/span&gt;
          &lt;span class="na"&gt;header_content_row&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#CSV only. Indicates whether the first row contains only header information and should be skipped.&lt;/span&gt;
          &lt;span class="na"&gt;first_content_row&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1 (integer)&lt;/span&gt; &lt;span class="c1"&gt;#Excel only. Index of first row to contain translation content.&lt;/span&gt;
          &lt;span class="na"&gt;enable_pluralization&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#Simple/Nested JSON only. Enables detection of pluralized keys. All matching keys will be persisted as pluralized keys.&lt;/span&gt;
          &lt;span class="na"&gt;unescape_linebreaks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#Android XML only. All \n will be imported as true newlines&lt;/span&gt;
          &lt;span class="na"&gt;escape_single_quotes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#Java Properties only. Escape single quotes with another single quote (e.g. I'm -&amp;gt; I''m ).&lt;/span&gt;

  &lt;span class="na"&gt;pull&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;targets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./path/to/file/file.format&lt;/span&gt;
      &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;file_format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;FORMAT_API_EXTENSION (string)&lt;/span&gt; &lt;span class="c1"&gt;#See above. Only required if you deviate from the default format set in the header&lt;/span&gt;
        &lt;span class="na"&gt;locale_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;LOCALE_ID (string)&lt;/span&gt; &lt;span class="c1"&gt;#Can be the name (e.g. en-US) or public id (via Language settings -&amp;gt; API) of the locale. Preferred is the public id.&lt;/span&gt;
        &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;TAG_1, TAG_2 (string)&lt;/span&gt; &lt;span class="c1"&gt;#Limit results to keys tagged with a list of comma separated tag names.&lt;/span&gt;
        &lt;span class="na"&gt;include_empty_translations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#Indicates whether keys without translations should be included in the output as well.&lt;/span&gt;
        &lt;span class="na"&gt;exclude_empty_zero_forms&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#Indicates whether zero forms should be included when empty in pluralized keys.&lt;/span&gt;
        &lt;span class="na"&gt;include_translated_keys&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#Include translated keys in the locale file. Use in combination with include_empty_translations to obtain only untranslated keys.&lt;/span&gt;
        &lt;span class="na"&gt;keep_notranslate_tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#Indicates whether [NOTRANSLATE] tags should be kept.&lt;/span&gt;
        &lt;span class="na"&gt;encoding&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ENCODING (string)&lt;/span&gt; &lt;span class="c1"&gt;#Enforces a specific encoding on the file contents. Valid options are "UTF-8", "UTF-16", "UTF-16BE", "UTF-16LE" and "ISO-8859-1".&lt;/span&gt;
        &lt;span class="na"&gt;include_unverified_translations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#If set to false unverified translations are excluded&lt;/span&gt;
        &lt;span class="na"&gt;use_last_reviewed_version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#If set to true the last reviewed version of a translation is used. This is only available if the review workflow is enabled for the project.&lt;/span&gt;
        &lt;span class="na"&gt;fallback_locale_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;LOCALE_ID (string)&lt;/span&gt; &lt;span class="c1"&gt;#Can be the name (e.g. en-US) or public id (via Language settings -&amp;gt; API) of the locale. Preferred is the public id.&lt;/span&gt;
        &lt;span class="c1"&gt;#-------------&lt;/span&gt;
        &lt;span class="na"&gt;format_options&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;document_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DOCUMENT_ID (string)&lt;/span&gt; &lt;span class="c1"&gt;#Takes the document ID of the existing HTML documents in your project the export should be based on.&lt;/span&gt;
          &lt;span class="na"&gt;enclose_in_cdata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#XLIFF/Symfony XLIFF/Android XML only. Encloses translations containing html tags in CDATA&lt;/span&gt;
          &lt;span class="na"&gt;include_translation_state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#XLIFF/Symfony XLIFF only. Include state of translations in the target locale&lt;/span&gt;
          &lt;span class="na"&gt;indent_size&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;4 (integer)&lt;/span&gt; &lt;span class="c1"&gt;#XLIFF/Android XML only. Specifies number of indentation characters&lt;/span&gt;
          &lt;span class="na"&gt;indent_style&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;space (string)&lt;/span&gt; &lt;span class="c1"&gt;#XLIFF/Android XML only.Specifies indentation character. Allowed values are space and tab&lt;/span&gt;
          &lt;span class="na"&gt;export_key_id_as_resname&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="s"&gt;/false (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#XLIFF only. Exports the Key ID as the "resname" attribute.&lt;/span&gt;
          &lt;span class="na"&gt;export_key_name_hash_as_extradata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="s"&gt;/false (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#XLIFF only. Exports the Key Name hash as the "extradata" attribute.&lt;/span&gt;
          &lt;span class="na"&gt;delimit_placeholders&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#XLIFF only. Removes &amp;lt;ph&amp;gt; tags from translations&lt;/span&gt;
          &lt;span class="na"&gt;convert_placeholder&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#iOS/Android XML only. Placeholder will be converted to match format specific requirements. Example: '$s' =&amp;gt; '$@'&lt;/span&gt;
          &lt;span class="na"&gt;include_pluralized_keys&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#iOS only. Also include pluralized keys in the locale file.&lt;/span&gt;
          &lt;span class="na"&gt;export_tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#Excel/CSV only. Exports tags along with keys and translations.&lt;/span&gt;
          &lt;span class="na"&gt;export_max_characters_allowed&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#Excel/CSV only.Exports the key character limit along with keys and translations.&lt;/span&gt;
          &lt;span class="na"&gt;escape_linebreaks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#Android XML only. All line breaks will be escaped as '\n'&lt;/span&gt;
          &lt;span class="na"&gt;escape_single_quotes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#Java/Play Framework Properties only. Escape single quotes with another single quote (e.g. I'm -&amp;gt; I''m ).&lt;/span&gt;
          &lt;span class="na"&gt;omit_separator_space&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#Java Properties only. Skip the space before and after the separator sign (= ).&lt;/span&gt;
          &lt;span class="na"&gt;crlf_line_terminators&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; (boolean)&lt;/span&gt; &lt;span class="c1"&gt;#Java Properties only. Use CRLF (Windows) line terminator chars.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>phrasestrings</category>
      <category>phrasecli</category>
      <category>localization</category>
      <category>internationalization</category>
    </item>
    <item>
      <title>Curly Quotes, Phrase Strings, &amp; ARB</title>
      <dc:creator>ahandsel</dc:creator>
      <pubDate>Fri, 05 Apr 2024 10:13:27 +0000</pubDate>
      <link>https://dev.to/ahandsel/curly-quotes-phrase-strings-arb-1cdh</link>
      <guid>https://dev.to/ahandsel/curly-quotes-phrase-strings-arb-1cdh</guid>
      <description>&lt;p&gt;This is a friendly reminder that all single quotes will be converted to a curly quote (smart quote) when Phrase Strings exports as an ARB file.&lt;/p&gt;

&lt;p&gt;I hope this post can prevent another person from spending time debugging their system 🍀.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://support.phrase.com/hc/en-us/articles/6111361660188--ARB-Application-Resource-Bundle-Strings" rel="noopener noreferrer"&gt;.ARB - Application Resource Bundle (Strings) – Phrase&lt;/a&gt;&lt;/p&gt;

</description>
      <category>phrasestrings</category>
      <category>phrasecli</category>
      <category>localization</category>
      <category>internationalization</category>
    </item>
    <item>
      <title>ChatGPT Prompts I Use</title>
      <dc:creator>ahandsel</dc:creator>
      <pubDate>Tue, 27 Feb 2024 01:25:47 +0000</pubDate>
      <link>https://dev.to/ahandsel/chatgpt-prompts-i-use-3h0k</link>
      <guid>https://dev.to/ahandsel/chatgpt-prompts-i-use-3h0k</guid>
      <description>&lt;h2&gt;
  
  
  Note Taking
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;You are NotesGPT, an AI language model skilled at taking detailed, concise, and easy-to-understand notes on various subjects in bullet-point format. When provided with a "Message Thread to Summarize", use it as input, and your task is to:
&lt;span class="p"&gt;1.&lt;/span&gt; Create advanced bullet-point notes summarizing the important parts of the reading or topic.
&lt;span class="p"&gt;2.&lt;/span&gt; Include all essential information, such as vocabulary terms and key concepts, which should be bolded with asterisks.
&lt;span class="p"&gt;3.&lt;/span&gt; Remove any extraneous language, focusing only on the critical aspects of the passage or topic.
&lt;span class="p"&gt;4.&lt;/span&gt; Strictly base your notes on the provided information without adding any external information.
&lt;span class="p"&gt;5.&lt;/span&gt; Conclude your notes with "End_of_Notes" to indicate completion.

Message Thread to Summarize:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Proofread - General
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;I want you to act as a proofreader.
Review my markdown file for any spelling, grammar, or punctuation errors.
Once you have finished reviewing the markdown file, provide me with any necessary corrections or suggestions for improvement.
Finally, provide me with the edited markdown file.

Markdown:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Proofread - Polite
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;I want you to act as a proofreader. I have written a markdown file that I intend to use in a professional setting.
Review my markdown file and list suggestions to make it sound more professional and polite. Focus on word choice and overall tone.
While I am open to adjustments, keep the changes to a minimum, preserving the original structure and the fundamental message as much as possible.
After listing the suggestions, provide me with the edited markdown file.

Markdown file:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Convert Discussion into Comprehensive Notes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Convert the provided discussion into comprehensive notes that highlight key points, decisions, action items, and important discussions.

Steps to Follow:
&lt;span class="p"&gt;1.&lt;/span&gt; Read through the provided discussion to understand the context, the participants, and the flow of conversation.
&lt;span class="p"&gt;2.&lt;/span&gt; Identify and extract key points discussed, including any questions raised, solutions proposed, decisions made, and important insights shared.
&lt;span class="p"&gt;3.&lt;/span&gt; Organize the information into relevant sections. Suggested sections might include:
&lt;span class="p"&gt;   -&lt;/span&gt; Introduction: A 1 sentence overview of the discussion's purpose and main objectives.
&lt;span class="p"&gt;   -&lt;/span&gt; Summary of Discussion: List the main points and highlights of the conversation as bullet points.
&lt;span class="p"&gt;   -&lt;/span&gt; Decisions Made (if applicable): Any conclusions or decisions reached.
&lt;span class="p"&gt;   -&lt;/span&gt; Action Items (if applicable): List tasks to be done, who is responsible for each, and any deadlines.
&lt;span class="p"&gt;   -&lt;/span&gt; Unresolved issues (if applicable): List any unresolved issues.
&lt;span class="p"&gt;4.&lt;/span&gt; Write the comprehensive notes using clear, concise language. Ensure the notes are structured logically, following the organization outlined above.

Discussion Input:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>promptengineering</category>
      <category>chatgpt</category>
    </item>
    <item>
      <title>Checking and Updating NPM Packages</title>
      <dc:creator>ahandsel</dc:creator>
      <pubDate>Tue, 23 Jan 2024 08:35:30 +0000</pubDate>
      <link>https://dev.to/ahandsel/checking-and-updating-npm-packages-20gb</link>
      <guid>https://dev.to/ahandsel/checking-and-updating-npm-packages-20gb</guid>
      <description>&lt;h1&gt;
  
  
  Checking and Updating npm Packages
&lt;/h1&gt;

&lt;p&gt;This is a quick rundown on how to check and update npm packages and package.json.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;npm commands to check and update packages.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;npm outdated&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Check for outdated packages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;npm update --save&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Update packages and save to package.json&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;npm update --save-dev --save&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Update dev packages and save to package.json&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;npm update -g&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Update global packages&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Alternatively, you can use &lt;a href="https://github.com/raineorshine/npm-check-updates" rel="noopener noreferrer"&gt;&lt;code&gt;npm-check-updates&lt;/code&gt;&lt;/a&gt; to check and update packages.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;npm install -g npm-check-updates&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Install [npm-check-updates] globally&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;npx npm-check-updates&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Check for outdated packages without installing [npm-check-updates]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ncu -u&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Update packages and save to package.json&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ncu -g -u&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Update global packages&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
npm Commands to Check and Update Packages

&lt;ul&gt;
&lt;li&gt;Listing Outdated Packages&lt;/li&gt;
&lt;li&gt;Updating package.json and Packages&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

[npm-check-updates] Commands to Check and Update Packages

&lt;ul&gt;
&lt;li&gt;Install and Run Globally&lt;/li&gt;
&lt;li&gt;Run with npx&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  npm Commands to Check and Update Packages
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Listing Outdated Packages
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm outdated
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command checks the registry to see if any specific installed packages are currently outdated. By default, only the root project's direct dependencies and your configured workspaces' direct dependencies are shown.&lt;/p&gt;

&lt;p&gt;npm Documentation: &lt;a href="https://docs.npmjs.com/cli/v7/commands/npm-outdated" rel="noopener noreferrer"&gt;npm-outdated&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Updating package.json and Packages
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm update &lt;span class="nt"&gt;--save&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command updates all the packages listed to the latest version (specified by the tag config), respecting the semver constraints of both your package and its dependencies (if they also require the same package).&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;--save&lt;/code&gt; flag updates the &lt;code&gt;package.json&lt;/code&gt; file with the new version as well.&lt;/p&gt;

&lt;p&gt;Add the &lt;code&gt;--dev&lt;/code&gt; flag to update dev packages like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm update &lt;span class="nt"&gt;--save-dev&lt;/span&gt; &lt;span class="nt"&gt;--save&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the &lt;code&gt;-g&lt;/code&gt; flag to update global packages like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm update &lt;span class="nt"&gt;-g&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;npm Documentation: &lt;a href="https://docs.npmjs.com/cli/v7/commands/npm-update" rel="noopener noreferrer"&gt;npm-update&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  [npm-check-updates] Commands to Check and Update Packages
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/raineorshine/npm-check-updates" rel="noopener noreferrer"&gt;&lt;code&gt;npm-check-updates&lt;/code&gt;&lt;/a&gt; upgrades your package.json dependencies to the latest versions, ignoring specified versions.&lt;/p&gt;

&lt;p&gt;There are two options for using &lt;code&gt;npm-check-updates&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install it globally and run it as a command-line app.&lt;/li&gt;
&lt;li&gt;Simply run with &lt;code&gt;npx&lt;/code&gt; to use it as a one-off command.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Install and Run Globally
&lt;/h3&gt;

&lt;p&gt;First, install [npm-check-updates] globally.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; npm-check-updates
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run &lt;code&gt;npm-check-updates&lt;/code&gt; with the &lt;code&gt;-u&lt;/code&gt; or &lt;code&gt;--upgrade&lt;/code&gt; flag to upgrade your &lt;code&gt;package.json&lt;/code&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ncu &lt;span class="nt"&gt;-u&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For global packages, run with the &lt;code&gt;-g&lt;/code&gt; flag.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ncu &lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Run with npx
&lt;/h3&gt;

&lt;p&gt;Alternatively, use &lt;code&gt;npx&lt;/code&gt; to run &lt;code&gt;npm-check-updates&lt;/code&gt; without installing it globally.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx npm-check-updates
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>npm</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Instagram URL Schemes</title>
      <dc:creator>ahandsel</dc:creator>
      <pubDate>Mon, 22 Jan 2024 08:40:02 +0000</pubDate>
      <link>https://dev.to/ahandsel/instagram-url-schemes-1k6n</link>
      <guid>https://dev.to/ahandsel/instagram-url-schemes-1k6n</guid>
      <description>&lt;p&gt;Here are the known URL schemes for Instagram that can be used to link directly to specific parts of the Instagram app. It is useful for Apple Shortcuts.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;URL Scheme&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;instagram://&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Open the Instagram app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;instagram://settings&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Open the Instagram settings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;instagram://direct-inbox&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Open direct messages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;instagram://camera&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Open the camera or create a new post&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;instagram://explore&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Open the explore tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;instagram://user?username=[username]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Open a specific user's profile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;instagram://location?id=[location_id]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Open a specific location&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;instagram://tag?name=[hashtag]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Open a specific hashtag&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Open the Instagram App Settings via Apple Shortcuts
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Use the "Text" Action to store &lt;code&gt;instagram://settings&lt;/code&gt; in a text variable&lt;/li&gt;
&lt;li&gt;Use the "Get URLs from Input" to convert the text variable to a URL&lt;/li&gt;
&lt;li&gt;Use the "Open URLs" Action to open the URL&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Apple Shortcuts: &lt;a href="https://www.icloud.com/shortcuts/5fd2b8567505424080239aebdb06989b" rel="noopener noreferrer"&gt;Example - Open Instagram Settings&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Open a Specific User's Instagram Profile via Apple Shortcuts
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Use the "Ask for Input" Action to ask for a username&lt;/li&gt;
&lt;li&gt;Use the "Text" Action to store &lt;code&gt;instagram://user?username=&lt;/code&gt; in a text variable&lt;/li&gt;
&lt;li&gt;Use the "Combine Text" Action to combine the username to the text variable:

&lt;ul&gt;
&lt;li&gt;Combine &lt;code&gt;instagram://user?username=&lt;/code&gt; with the username's Provided Input with "Custom" set to `` (nothing)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Use the "Get URLs from Input" to convert the "Combine Text" value to a URL&lt;/li&gt;
&lt;li&gt;Use the "Open URLs" Action to open the URL&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Apple Shortcuts: &lt;a href="https://www.icloud.com/shortcuts/fbc84a967b044b539cf9603f7a7dc1a6" rel="noopener noreferrer"&gt;Example - Open A Instagram Profile&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Search for a Specific Hashtag on Instagram via Apple Shortcuts
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Use the "Ask for Input" Action to ask for a hashtag&lt;/li&gt;
&lt;li&gt;Use the "Text" Action to store &lt;code&gt;instagram://tag?name=&lt;/code&gt; in a text variable&lt;/li&gt;
&lt;li&gt;Use the "Combine Text" Action to combine the hashtag to the text variable:

&lt;ul&gt;
&lt;li&gt;Combine &lt;code&gt;instagram://tag?name=&lt;/code&gt; with the hashtag's Provided Input with "Custom" set to `` (nothing)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Use the "Get URLs from Input" to convert the "Combine Text" value to a URL&lt;/li&gt;
&lt;li&gt;Use the "Open URLs" Action to open the URL&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Apple Shortcuts: &lt;a href="https://www.icloud.com/shortcuts/fb76c58b97194b909611d61a90e00609" rel="noopener noreferrer"&gt;Example - Search For A Hashtag&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Loggy/instagram-deeplink" rel="noopener noreferrer"&gt;Loggy/instagram-deeplink&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bhagyas/app-urls" rel="noopener noreferrer"&gt;bhagyas/app-urls: A long list of App URLs for iOS, macOS and Android&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/shortcuts/comments/xnrz7t/comment/ipvnubg/" rel="noopener noreferrer"&gt;tristinDLC's Reddit Post&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>appleshortcuts</category>
      <category>instagram</category>
      <category>urlschemes</category>
    </item>
  </channel>
</rss>
