<?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>Forem: Mikhail Konkov</title>
    <description>The latest articles on Forem by Mikhail Konkov (@mikhkonkov).</description>
    <link>https://forem.com/mikhkonkov</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%2F3897554%2Fe1760050-ee6b-45aa-8b9e-3ddc169fe36c.jpg</url>
      <title>Forem: Mikhail Konkov</title>
      <link>https://forem.com/mikhkonkov</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mikhkonkov"/>
    <language>en</language>
    <item>
      <title>Emacs-команды в Claude Code CLI на русской раскладке для iTerm2</title>
      <dc:creator>Mikhail Konkov</dc:creator>
      <pubDate>Sat, 02 May 2026 13:10:17 +0000</pubDate>
      <link>https://forem.com/mikhkonkov/emacs-komandy-v-claude-code-cli-na-russkoi-raskladkie-dlia-iterm2-23pm</link>
      <guid>https://forem.com/mikhkonkov/emacs-komandy-v-claude-code-cli-na-russkoi-raskladkie-dlia-iterm2-23pm</guid>
      <description>&lt;h2&gt;
  
  
  Проблема
&lt;/h2&gt;

&lt;p&gt;Я уже несколько месяцев работаю с &lt;strong&gt;Claude Code CLI&lt;/strong&gt; в терминале и столкнулся с неприятной мелочью: команды Emacs для редактирования текста (&lt;code&gt;Ctrl+A&lt;/code&gt;, &lt;code&gt;Ctrl+E&lt;/code&gt;, &lt;code&gt;Ctrl+W&lt;/code&gt; и т.д.) &lt;strong&gt;не работают на русской раскладке&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Раньше всё было нормально, так как я работал в терминале только на английском. Но сейчас, когда удобнее вводить промты на родном языке, эта проблема мешает. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Ctrl+A&lt;/code&gt; не прыгает в начало строки&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ctrl+W&lt;/code&gt; не удаляет слово назад&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ctrl+V&lt;/code&gt; для вставки скриншотов тоже мимо&lt;/li&gt;
&lt;li&gt;Переключать раскладку каждый раз ради одной команды — боль&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Решение
&lt;/h2&gt;

&lt;p&gt;Это лечится &lt;strong&gt;одним key mapping файлом для iTerm2&lt;/strong&gt;. Он:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;маппит кириллические позиции клавиш на правильные управляющие коды (Emacs-команды работают и на RU, и на EN);&lt;/li&gt;
&lt;li&gt;добавляет &lt;code&gt;Option+а&lt;/code&gt; / &lt;code&gt;Option+и&lt;/code&gt; как прыжки по словам;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Как применить
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Откройте &lt;strong&gt;iTerm2 → Settings → Profiles → Keys → Key Mappings&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Fd65p0f2pbkyl5fmowt2k.png" class="article-body-image-wrapper"&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%2Fd65p0f2pbkyl5fmowt2k.png" alt="iTerm2 profile key mapping" width="800" height="551"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Нажмите кнопку &lt;strong&gt;Presets... → Import...&lt;/strong&gt; и выберите файл с конфигом ниже (сохраните его как &lt;code&gt;ru-emacs.itermkeymap&lt;/code&gt; или вставьте через JSON-редактор).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Конфиг
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Key Mappings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"0x430-0x40000"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x06"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"0x438-0x40000"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x02"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"0x430-0x80000"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x1b 0x66"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"0x438-0x80000"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x1b 0x62"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"0x444-0x40000"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x01"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"0x443-0x40000"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x05"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"0x43b-0x40000"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x0b"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"0x433-0x40000"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x15"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"0x446-0x40000"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x17"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"0x43c-0x40000"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x16"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"0x43d-0x40000"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x19"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"0x449-0x40000"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x0f"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Touch Bar Items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Шпаргалка по маппингам
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Emacs-навигация на русской раскладке
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Клавиша (RU)&lt;/th&gt;
&lt;th&gt;Что делает&lt;/th&gt;
&lt;th&gt;Эквивалент EN&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+ф&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;в начало строки&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl+A&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+у&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;в конец строки&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl+E&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+а&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;символ вправо&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl+F&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+и&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;символ влево&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl+B&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+л&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;удалить до конца строки&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl+K&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+г&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;удалить всю строку&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl+U&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+ц&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;удалить слово назад&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl+W&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+н&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yank (вставить из kill-буфера)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl+Y&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Option+а&lt;/code&gt; / &lt;code&gt;Option+и&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;прыжок по словам вправо/влево&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Option+F&lt;/code&gt; / &lt;code&gt;Option+B&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+м&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;вставить скриншот в claude code cli&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl+V&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+щ&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;развернуть вывод команд в claude code cli&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl+O&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Почему это работает
&lt;/h2&gt;

&lt;p&gt;iTerm2 ловит события клавиатуры &lt;strong&gt;до того&lt;/strong&gt;, как macOS успевает решить «эта раскладка не знает Ctrl+a». Мы матчимся на конкретные кодпоинты Unicode (&lt;code&gt;0x444&lt;/code&gt; это &lt;code&gt;ф&lt;/code&gt;, &lt;code&gt;0x443&lt;/code&gt; — &lt;code&gt;у&lt;/code&gt;, и т.д.) с модификатором &lt;code&gt;0x40000&lt;/code&gt; (Control) и руками отправляем в TTY правильный байт (&lt;code&gt;0x01&lt;/code&gt; для &lt;code&gt;Ctrl+A&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Итог
&lt;/h2&gt;

&lt;p&gt;Один импорт пресета — и Claude Code CLI перестаёт быть пыткой при работе на русском. Промт теперь можно набирать, не дёргая &lt;code&gt;Cmd+Space&lt;/code&gt; каждые пять секунд.&lt;/p&gt;

&lt;p&gt;Если у вас другой терминал — подход тот же: ищите в их конфигах секцию key bindings и маппите кириллические кодпоинты на управляющие байты.&lt;/p&gt;

&lt;p&gt;Удачи в промтах.&lt;/p&gt;

</description>
      <category>iterm2</category>
      <category>macos</category>
      <category>emacs</category>
      <category>claude</category>
    </item>
    <item>
      <title>Claude Code CLI: Best Practices</title>
      <dc:creator>Mikhail Konkov</dc:creator>
      <pubDate>Wed, 29 Apr 2026 22:55:19 +0000</pubDate>
      <link>https://forem.com/mikhkonkov/claude-code-cli-best-practices-431j</link>
      <guid>https://forem.com/mikhkonkov/claude-code-cli-best-practices-431j</guid>
      <description>&lt;p&gt;A handful of observations from working with Claude Code day to day — about memory, context, modes, and a couple of useful skills. Nothing groundbreaking, just the things I wish someone had told me earlier.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2F6mukg5vlcdvbvka6wf8u.png" class="article-body-image-wrapper"&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%2F6mukg5vlcdvbvka6wf8u.png" alt="Cover: developer's workbench " width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup once
&lt;/h2&gt;

&lt;p&gt;These are the things you do at the start of a project (or once per machine) and forget about — but they pay back on every single session.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt;.&lt;/strong&gt; Put commands for running tests and linters here, along with an architecture overview, what NOT to touch, and code style conventions. The agent reads this file automatically, so you don't have to repeat the same things in every prompt. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If your project has multiple areas, you can drop a separate &lt;code&gt;CLAUDE.md&lt;/code&gt; into each one: the agent will pick up both the root file and the one closest to the files it's working on.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cultivate auto memory deliberately.&lt;/strong&gt; Auto memory is Claude Code's built-in notebook where the agent stores notes between sessions on its own: build commands, debugging insights, your style preferences. It lives in &lt;code&gt;~/.claude/projects/&amp;lt;project&amp;gt;/memory/&lt;/code&gt; as an index file (&lt;code&gt;MEMORY.md&lt;/code&gt;) plus topic files. The index loads at the start of each session (first 200 lines or 25 KB); deeper notes are pulled in on demand when relevant. Requires Claude Code v2.1.59+, on by default; view and prune via &lt;code&gt;/memory&lt;/code&gt;. Important caveat: this is not model fine-tuning — it's just markdown that gets pulled into context. So the agent gets "better" only as far as its notebook is good, and the notebook needs to be managed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Correct with words, not silent edits. "Don't use &lt;code&gt;var&lt;/code&gt;, we use &lt;code&gt;const&lt;/code&gt;/&lt;code&gt;let&lt;/code&gt; everywhere" is a signal worth remembering. A silent fix in the IDE isn't.&lt;/li&gt;
&lt;li&gt;At the end of a hard task, ask explicitly: "remember how we fixed this" or "save to memory: this repo uses Arel, not raw SQL." Claude will ask whether to save it to project memory or global (&lt;code&gt;~/.claude/&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Every couple of weeks, open &lt;code&gt;/memory&lt;/code&gt; and clean out anything stale (architecture changed — old notes now lie). Move team-wide findings into &lt;code&gt;CLAUDE.md&lt;/code&gt; so they reach the whole team, not just you.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A useful end-of-session prompt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sum up what we did, where we got stuck, and what worked. From that, pick 1–3 notes worth saving for future sessions and suggest where each should go — project or global memory. Don't save them yet; I'll confirm.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  Sum up what we did, where we got stuck, and what worked. From that, pick 1–3 notes worth saving for future sessions and suggest where each should go — project or global memory. Don't save them yet; I'll confirm.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Working on a task
&lt;/h2&gt;

&lt;p&gt;Habits for the actual work — how to brief the agent, how to keep yourself out of trouble.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use git as a safety net.&lt;/strong&gt; Commit often and start agent sessions with a clean working tree — it's much easier to see exactly what the agent changed and to roll back if needed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use plan mode for complex tasks.&lt;/strong&gt; Ask for a plan first — either explicitly ("draft a plan, don't write code yet") or by switching into plan mode (&lt;em&gt;Shift+Tab&lt;/em&gt; cycles through modes: &lt;code&gt;normal → auto-accept → plan&lt;/code&gt;). Read it, adjust it, and only then let the agent execute. This dramatically reduces the chance of the agent spending half an hour doing the wrong thing.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="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%2Fcbmd5blup9rqf33ufw34.png" class="article-body-image-wrapper"&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%2Fcbmd5blup9rqf33ufw34.png" alt="Claude Code in plan mode" width="682" height="176"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Don't default to auto-accept mode.&lt;/strong&gt; Auto-accept — where the agent confirms all its own actions (file edits, shell commands) — is fine for short, contained tasks: rename a variable, run the linter, fix a flaky test. For anything else it's a way to rack up a dozen unreviewed changes in five minutes. Keep the default mode (manual confirmation) and turn on auto-accept consciously, for a specific stretch of work, ideally on top of a clean git state so rolling back is cheap.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="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%2Febetk20qa37jcollttvk.gif" class="article-body-image-wrapper"&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%2Febetk20qa37jcollttvk.gif" alt="GIF: an entire team " width="336" height="306"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Break tasks down.&lt;/strong&gt; Instead of "implement the whole feature," go step by step: schema first, then migration, then the endpoint, then tests. It's cheaper in tokens, easier to review intermediate results, and easier to roll back if the agent went off course.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Managing context
&lt;/h2&gt;

&lt;p&gt;Context is the resource you're actually paying for — both in money and in answer quality. These three pull in the same direction.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Watch your context size.&lt;/strong&gt; The larger it gets, the more expensive each step becomes (the entire context is re-sent every turn) and the worse the agent holds focus. For a separate task, start a new session — or use &lt;code&gt;/compact&lt;/code&gt; to compress the history.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The downside of a new session&lt;/strong&gt; is that the agent loses context and burns tokens getting back up to speed. So move the essentials (project architecture, conventions, frequently used commands) into &lt;code&gt;CLAUDE.md&lt;/code&gt; or package them as a skill — that way they load automatically and don't eat into your context window on every start.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Don't let the agent fix what it just broke in the same session.&lt;/strong&gt; If it's stuck in a hole, it's better to roll back, reformulate the task, and start fresh than to pile more on top. Otherwise mistakes compound and chew through context.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tuning and extras
&lt;/h2&gt;

&lt;p&gt;The fine-tuning knobs and a couple of optional add-ons.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pick the model and &lt;code&gt;/effort&lt;/code&gt; to match the task.&lt;/strong&gt; Sonnet is cheaper and faster — usually enough for routine work (edits, refactoring, tests). Opus is for complex design, gnarly bugs, and architectural decisions. &lt;code&gt;/effort&lt;/code&gt; controls reasoning depth (&lt;code&gt;low | medium | high | xhigh | max&lt;/code&gt;): use &lt;code&gt;low&lt;/code&gt; for mechanical tasks and &lt;code&gt;high&lt;/code&gt;/&lt;code&gt;max&lt;/code&gt; for architecture and heavy debugging.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="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%2Fbvemkf3x4gy9bowdsp06.png" class="article-body-image-wrapper"&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%2Fbvemkf3x4gy9bowdsp06.png" alt="Screenshot: /effort [low|medium|high|xhigh|max|auto] command in the Claude Code prompt" width="800" height="137"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Ffuicap3payyjb2x4v7ju.png" class="article-body-image-wrapper"&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%2Ffuicap3payyjb2x4v7ju.png" alt="Screenshot: /model" width="800" height="189"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Attach screenshots and logs directly.&lt;/strong&gt; For UI bugs, a screenshot saves a ton of back-and-forth; for errors, paste the full stack trace, not a paraphrase. The agent works noticeably better with raw input. (Use &lt;code&gt;Ctrl+V&lt;/code&gt; to paste a screenshot in Claude Code CLI.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Install &lt;a href="https://github.com/JuliusBrussee/caveman" rel="noopener noreferrer"&gt;Caveman&lt;/a&gt;&lt;/strong&gt; — a skill that makes Claude respond in a telegraphic style, without filler phrases or hedging. It cuts up to 75% of output tokens while keeping technical accuracy intact; code, error messages, and commit messages stay normal. Toggle on with &lt;code&gt;/caveman&lt;/code&gt; or "caveman mode," off with "normal mode."&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="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%2Fv5z9r8lm9ezhcnnr3vxr.png" class="article-body-image-wrapper"&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%2Fv5z9r8lm9ezhcnnr3vxr.png" alt="Screenshot: the " width="800" height="511"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;That's the set. None of it is rocket science — most of the wins come from setting up &lt;code&gt;CLAUDE.md&lt;/code&gt; properly, leaning on plan mode, and keeping the context window honest. If you've got your own practices, drop them in the comments — I'm always looking to steal good ones.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>cli</category>
      <category>productivity</category>
    </item>
    <item>
      <title>English Writing Tips for Non-Native Speakers: How to Sound More Natural</title>
      <dc:creator>Mikhail Konkov</dc:creator>
      <pubDate>Mon, 27 Apr 2026 10:00:00 +0000</pubDate>
      <link>https://forem.com/mikhkonkov/english-writing-tips-for-non-native-speakers-how-to-sound-more-natural-cld</link>
      <guid>https://forem.com/mikhkonkov/english-writing-tips-for-non-native-speakers-how-to-sound-more-natural-cld</guid>
      <description>&lt;p&gt;You speak English well. You understand meetings, read articles, follow conversations. But when you write — Slack messages, emails, LinkedIn posts — something feels off. Not wrong, exactly. Just not&lt;br&gt;
quite native.&lt;/p&gt;

&lt;p&gt;Here are the patterns that give away non-native writers, and how to fix them.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Cut the formal opener
&lt;/h2&gt;

&lt;p&gt;Starting with "I hope this email finds you well" or "As per my previous email" — technically correct, but native speakers almost never write this. It reads as bureaucratic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instead:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❌ "I am writing to inquire about the status of my application."&lt;br&gt;
✅ "Just checking in on my application — any updates?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  2. Use contractions in casual contexts
&lt;/h2&gt;

&lt;p&gt;Non-native writers avoid contractions because they learned formal grammar first. "I am," "it is," "do not" — stiff when the context is casual.&lt;/p&gt;

&lt;p&gt;In Slack, casual emails, LinkedIn comments — use contractions. Save full forms for legal documents.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Stop hedging everything
&lt;/h2&gt;

&lt;p&gt;"I was wondering if perhaps it might be possible to..." reads as &lt;em&gt;uncertain&lt;/em&gt;, not polite.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❌ "I was thinking that maybe we could perhaps consider moving the deadline if that would be okay."&lt;br&gt;
✅ "Could we push the deadline by a day? I want to make sure the output is solid."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Direct requests with a brief reason are more respected — not less polite.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Watch for literal translations
&lt;/h2&gt;

&lt;p&gt;Phrases that make sense in your native language produce awkward English word-for-word:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Make a question" → &lt;strong&gt;Ask a question&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;"It depends of" → &lt;strong&gt;It depends on&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;"In the other hand" → &lt;strong&gt;On the other hand&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Vary your sentence length
&lt;/h2&gt;

&lt;p&gt;Non-native writers often write in uniform, medium-length sentences. Each one correct. Each one the same rhythm. Native writing mixes it up — short punches followed by longer sentences that build on the&lt;br&gt;
idea.&lt;/p&gt;

&lt;p&gt;Read your draft out loud. If it sounds like a metronome, break it up.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Articles: the invisible enemy
&lt;/h2&gt;

&lt;p&gt;If your native language has no articles (Russian, Chinese, Japanese, Turkish...), "a," "an," "the" will trip you up for years.&lt;/p&gt;

&lt;p&gt;Highest-impact fix: use &lt;strong&gt;the&lt;/strong&gt; for specific/established things, &lt;strong&gt;a/an&lt;/strong&gt; for introducing something new.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❌ "We need to make decision. Decision will affect entire team."&lt;br&gt;
✅ "We need to make &lt;strong&gt;a&lt;/strong&gt; decision. &lt;strong&gt;The&lt;/strong&gt; decision will affect &lt;strong&gt;the&lt;/strong&gt; entire team."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  7. End emails with action, not formality
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;❌ "Please do not hesitate to contact me should you require any further information."&lt;br&gt;
✅ "Let me know if you have questions." / "Happy to jump on a call if easier."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  8. Read out loud
&lt;/h2&gt;

&lt;p&gt;If you stumble reading it aloud, your reader stumbles mentally. Rewrite until it flows.&lt;/p&gt;




&lt;h2&gt;
  
  
  The shortcut
&lt;/h2&gt;

&lt;p&gt;All of this takes years to internalize. If you need to write professionally in English &lt;em&gt;right now&lt;/em&gt; — in a job interview, a client email, a LinkedIn post — I built &lt;a href="https://limato.app" rel="noopener noreferrer"&gt;Limato&lt;/a&gt;: a Chrome&lt;br&gt;
extension that rewrites your text in a native tone, inline, wherever you type.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://limato.app/blog/english-writing-tips-for-non-native-speakers/" rel="noopener noreferrer"&gt;limato.app&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>english</category>
      <category>productivity</category>
      <category>beginners</category>
      <category>career</category>
    </item>
  </channel>
</rss>
