<?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: Robert Herdzik</title>
    <description>The latest articles on DEV Community by Robert Herdzik (@robertherdzik).</description>
    <link>https://dev.to/robertherdzik</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%2F238167%2F6bd527a2-9d24-475c-b95b-4ce4d113cb9e.png</url>
      <title>DEV Community: Robert Herdzik</title>
      <link>https://dev.to/robertherdzik</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/robertherdzik"/>
    <language>en</language>
    <item>
      <title>What is `&amp;+` operator for, and why Int8(127) &amp;+ 1 is equal to -128</title>
      <dc:creator>Robert Herdzik</dc:creator>
      <pubDate>Sat, 02 Jan 2021 09:21:58 +0000</pubDate>
      <link>https://dev.to/robertherdzik/what-is-operator-for-and-why-int8-127-1-is-equal-to-128-1b8k</link>
      <guid>https://dev.to/robertherdzik/what-is-operator-for-and-why-int8-127-1-is-equal-to-128-1b8k</guid>
      <description>&lt;h2&gt;
  
  
  Long story short
&lt;/h2&gt;

&lt;p&gt;Scrolling through Apple &lt;a href="https://docs.swift.org/swift-book/LanguageGuide/AdvancedOperators.html"&gt;Advanced Swift Operators&lt;/a&gt; documentation I encountered something 'interesting’. The case is that I have never used it, and neither see in the production code of the project to which I participated so far. I thought, let's play with this ‘just in case’.&lt;/p&gt;

&lt;p&gt;My attention was caught by following operators:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;&amp;amp;+&lt;/code&gt; - Overflow addition &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;amp;-&lt;/code&gt; - Overflow subtraction&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;amp;*&lt;/code&gt; - Overflow multiplication &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of them has been created to deal with &lt;a href="https://en.wikipedia.org/wiki/Integer_overflow#:~:text=In%20computer%20programming%2C%20an%20integer,than%20the%20minimum%20representable%20value."&gt;Integer overflow&lt;/a&gt; scenarios in our codebase.&lt;/p&gt;

&lt;p&gt;What is Integer Overflow you may ask... is situation where: "an arithmetic operation attempts to create a numeric value that is outside of the range that can be represented with a given number of digits – either higher than the maximum or lower than the minimum representable value.", we are going to explain it using example later on 😎.&lt;/p&gt;

&lt;p&gt;I know that is not a common case, but it is good to have at least an idea that some API for handling mentioned computation in Swift is waiting for us. In this article we are going to focus only on &lt;code&gt;&amp;amp;+&lt;/code&gt;, since rest of them works in the simmilar manner.&lt;/p&gt;

&lt;h2&gt;
  
  
  YouTube already failed with &lt;code&gt;Integer overflow&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Researching quickly about the topic of Integer overflow, I found one funny story related to the YouTube website, and how they failed with assumption, that 'Int32' is going to be enough to store ‘view count’ for each video. Yep, they took the following assumption, and it was working for them for a long time, but suddenly crazy viral &lt;a href="https://www.youtube.com/watch?v=9bZkp7q19f0"&gt;Psy’s “Gangnam Style”&lt;/a&gt; video came, and destroyed they ‘view count’ layout, because mentioned video exceeded value, which is able to be stored by 'Int32' variable, mean that music video surpassed over 2,147,483,647 views. After admitting that they made a mistake, the view counter type has been switched to 'Int64' which can store enormous 9,223,372,036,854,775,807 (gosh… that’s over 9 quintillion) views. &lt;/p&gt;

&lt;h2&gt;
  
  
  Scenarios in which simple &lt;code&gt;+&lt;/code&gt; operator is not enough
&lt;/h2&gt;

&lt;p&gt;As an example we can use 'Int8' (signed 8-bit integer) type, which can store values from -128 to 127. &lt;/p&gt;

&lt;p&gt;Normally if we do simple calculation like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let a: Int8 = 127
let b: Int8 = 1
let sum = a + b // Compilation error 💥
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We get a smart compilation error which says that: “Arithmetic operation ‘127 + 1’ (on type ‘Int8’) results in an overflow”, that is great! Seems that we are covered… unfortunately, compilator is going to help us only in that kind of static/obvious scenario, let's consider other scenarios where he won't be that helpful:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func makeValue() -&amp;gt; Int8 { 1 }

let a: Int8 = 127
let b: Int8 = makeValue()
let sum = a + b // Runtime error 💥
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That scenario is giving us "Thread 1: Swift runtime failure: arithmetic overflow” runtime error, plus beautiful app crash. 😪&lt;/p&gt;

&lt;h2&gt;
  
  
  Overflow addition to the rescue!
&lt;/h2&gt;

&lt;p&gt;We can consider once again the first example but with &lt;code&gt;&amp;amp;+&lt;/code&gt; operator in action.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let a: Int8 = 127
let b: Int8 = 1
let sum = a &amp;amp;+ b // Compilator is OK with this 🤓 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As we can see, compilation went smoothly, but the result of the calculation is quite unexpected at the first glance, because after checking 'sum' constant value, we see -128, what the heck! &lt;/p&gt;

&lt;p&gt;To understand better this operator, we can do manual 'Int8' addition with the deliberate overflow, bit by bit. &lt;/p&gt;

&lt;p&gt;Taking our 127 number, which is the maximum positive value of 'Int8' type, where binary representation is: 0111 1111 , most significant bit (MSB) has 0 value (0 for positive, and 1 for negative numbers). And 'Int8(1)' binary representation is: 0000 0001. Knowing this let`s do Overflow addition:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--F4Mj7-pq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7k2yc7weqq65qucs6w8m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--F4Mj7-pq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7k2yc7weqq65qucs6w8m.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ok! Everything is now clear, &lt;code&gt;&amp;amp;+&lt;/code&gt; operator in this calculation flipped to 1 our MSB bit, and in result we get a binary value of 1000 0000 which in context of 'Int8' type has -128 value.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is there any easy way to react in Unit Tests on type Overflow cases?
&lt;/h2&gt;

&lt;p&gt;For creating Unit Tests which can check Type Overflows, we could use the 'addingReportingOverflow' method, which as a result returns a tuple of operation value, and 'Bool' value which indicates whether operation has been finished with overflow or not. &lt;br&gt;
&lt;code&gt;let result = Int8.max.addingReportingOverflow(1)&lt;/code&gt;&lt;br&gt;
'result' is an tuple, which has following values for presented scenario: &lt;code&gt;(partialValue -128, overflow true)&lt;/code&gt;&lt;/p&gt;




&lt;p&gt;Original article source: &lt;a href="https://herdzikrobert.com/posts/overflow_operators_2021_1_2/"&gt;LINK&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=vA0Rl6Ne5C8"&gt;How Gangnam Style Broke YouTube View Counter?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Integer_overflow"&gt;Integer overflow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>programming</category>
      <category>swift</category>
      <category>ios</category>
    </item>
    <item>
      <title>SkrybaMD - generate project documentation with ease</title>
      <dc:creator>Robert Herdzik</dc:creator>
      <pubDate>Sun, 25 Oct 2020 14:02:18 +0000</pubDate>
      <link>https://dev.to/robertherdzik/skrybamd-generate-project-documentation-with-ease-2ea9</link>
      <guid>https://dev.to/robertherdzik/skrybamd-generate-project-documentation-with-ease-2ea9</guid>
      <description>&lt;p&gt;Github project source: &lt;a href="https://github.com/robertherdzik/SkrybaMD"&gt;LINK&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  intro
&lt;/h2&gt;

&lt;p&gt;Let's start first from the point which will clarify whether this blog post is for you, or is a total waste of your precious time, having this established, you can dive deep into it, or go back to your favorite 9gag section ;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You should spend your time reading this article if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;you want to maintain your documentation in &lt;a href="https://en.wikipedia.org/wiki/Markdown#:~:text=Markdown%20is%20a%20lightweight%20markup,using%20a%20plain%20text%20editor."&gt;Markdown&lt;/a&gt; (.md) format&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;if you want to have clear process to generate .md documentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;you work in the team (more than one dev which would like to take care of documenting stuff), or you just love to manage your .md document in consistent/ease way&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;you are tired of manual intended management in your documentation content&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;many times you were blocked to add some point of your documentation, straight in the middle, due to the necessity to modify manually further sections punctuation in the doc (I have facet this a lot!)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;...ok, now we have clear, and you can decide whether to read further or just skip it.&lt;/p&gt;

&lt;h2&gt;
  
  
  what is SkrybaMD for?
&lt;/h2&gt;

&lt;p&gt;SkrybaMD is a very simple, Swift powered documentation generator. Is fully open source, so you are able to contribute, or post your ideas related to the script there. Look for it &lt;a href="https://github.com/robertherdzik/SkrybaMD"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  is it hard to use it?
&lt;/h2&gt;

&lt;p&gt;Honestly I need to say, that is really straightforward to use! &lt;/p&gt;

&lt;p&gt;Steps to follow:&lt;br&gt;
1 . install it using e.g. brew:&lt;br&gt;
&lt;code&gt;$ brew install robertherdzik/homebrew-SkrybaMD/SkrybaMD&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Note, that more installation options you can find in the github repo Readme&lt;/em&gt;&lt;br&gt;
2 . create shape &lt;code&gt;doc_shape.txt&lt;/code&gt; file&lt;br&gt;
3 . in &lt;code&gt;doc_shape.txt&lt;/code&gt; create corresponding three structure with your sub document files names, like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;i || General || general.md
i || Architecture || architecture_config.md
ii || Our Approach || our_approach.md
i || CI and Rest || ci_and_rest.md
i || Summary || summary.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4 . execute in your &lt;code&gt;doc_shape.txt&lt;/code&gt; directory &lt;code&gt;$ SkrybaMD MySuperDocumentationFileName&lt;/code&gt; terminal command, and you are done!&lt;br&gt;
Skryba will generate, final documentation output file, with consistent look and feel, as well you will get e.g. Table of Content for free there. Now each time you or your team member wants to modify, he needs to only update ‘shape’ file and regenerate documentation using mentioned terminal command. &lt;/p&gt;

&lt;p&gt;You can find in &lt;a href="https://github.com/robertherdzik/SkrybaMD/blob/master/Example/StyleGuide.md"&gt;here&lt;/a&gt; how automatically generated documentation looks like base on the &lt;code&gt;doc_shape.txt&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;NOTE&lt;/em&gt;&lt;br&gt;
Additionally you can specify some more parameters once you use SkrybaMD, please check &lt;a href="https://github.com/robertherdzik/SkrybaMD"&gt;README&lt;/a&gt; to see the latest functionalities of the scrypt. &lt;/p&gt;

&lt;h2&gt;
  
  
  is it hard to get rid of it, once I decide to do so?
&lt;/h2&gt;

&lt;p&gt;The case is that, since as an output, you get a final .md documentation file, you just stop using SkrybaMD, and can go back to manual documentation shaping. So as you can see, this script is totally not addictive at all for your project/workflow. &lt;/p&gt;




&lt;p&gt;Original article source &lt;a href="https://herdzikrobert.com/posts/skrybamd_generate_project_documentation_with_ease_2020_10_25/"&gt;LINK&lt;/a&gt;&lt;/p&gt;

</description>
      <category>documentation</category>
      <category>generator</category>
      <category>md</category>
      <category>markdown</category>
    </item>
    <item>
      <title>Saying sorry to Vim</title>
      <dc:creator>Robert Herdzik</dc:creator>
      <pubDate>Fri, 02 Oct 2020 10:07:59 +0000</pubDate>
      <link>https://dev.to/robertherdzik/saying-sorry-to-vim-14dk</link>
      <guid>https://dev.to/robertherdzik/saying-sorry-to-vim-14dk</guid>
      <description>&lt;h1&gt;
  
  
  Saying sorry to Vim
&lt;/h1&gt;

&lt;p&gt;Some time ago, I decided to stop being ignorant in the area of Vim text editor, mainly due to playing with my raspberryPi or pushing myself more into using git via terminal mainly, you have to believe me, that Vim skills are welcome not only for these use cases. &lt;/p&gt;

&lt;p&gt;Key thing to know is that this powerful editor is available on most Linux distributions by default, if not, you can easily install it. &lt;/p&gt;

&lt;p&gt;Do you see this... learn it once, and you are using it everywhere. There is also a crazy amount of plugins which you can additionally install, to make your flow even more pleasant.&lt;/p&gt;

&lt;p&gt;C'mon, also as an engineer, we need to know at least how to ‘exit’ from the vi document. I believe that even basic knowledge of Vim will buy you a lot of time in your day to day work, and for sure you will look more ‘pro’.&lt;/p&gt;

&lt;h2&gt;
  
  
  First step
&lt;/h2&gt;

&lt;p&gt;With a very fundamental level of Vim knowledge, I started to explore the quickest paths to learn more, and I have found a nice tweet, which was promoting very cool looking platform game, using which, in easy, and funny way I was able to refresh my memory, and learn more shortcuts. The name of the game is VIM Adventures, and you can find it &lt;a href="https://vim-adventures.com/"&gt;here&lt;/a&gt; #highlyRecommend. After some time with the game, I started to feel comfortable with the editor once again, and in this way I could force myself more toward Vim, during my day to day work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gluing a short cheat sheet, base on my needs
&lt;/h2&gt;

&lt;p&gt;We can't estimate how much you need to know upfront, so I didn't even want to create a collection of cheat sheet shortcuts upfront, I decided that I do it, once I face the need to use a particular feature of Vim (incremental approach to creating my personal cheat sheet). This technique is commonly known as &lt;a href="https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it"&gt;YAGNI&lt;/a&gt; in software development, funny thing, but I apply this rule quite often, even in my life.&lt;/p&gt;

&lt;p&gt;Please find below all shortcuts which I have found useful for me, for sure list is going to grow with the time (maybe good idea would be to put it in github repo 🤔).&lt;/p&gt;

&lt;h2&gt;
  
  
  My base cheat sheet
&lt;/h2&gt;




&lt;h3&gt;
  
  
  Help
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;:help keyword&lt;/code&gt; - open help for keyword&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Create/save file
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;vi {fileName}&lt;/code&gt; - create/open file from Terminal&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;:q&lt;/code&gt; - exit without saving&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;:q!&lt;/code&gt; - force exit without saving (in case you have changes, which needs to be ignored)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;:wq&lt;/code&gt; - save and exit&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;:w&lt;/code&gt; - save only&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Navigation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;h, j, k, l&lt;/code&gt; - move cursor&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;H&lt;/code&gt; - move cursor to top of visible page&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;M&lt;/code&gt; - move cursor to middle of visible page&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;L&lt;/code&gt; - move cursor to bottom of current page&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;w&lt;/code&gt; - jump to the beginning of next word&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;b&lt;/code&gt; - jump to the beginning of the current word&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;e&lt;/code&gt; - jump to the end of current word&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;G&lt;/code&gt;  - end of file&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gg&lt;/code&gt; - beginning of file&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$&lt;/code&gt; - end line&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;0&lt;/code&gt; - beginning of line &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;A&lt;/code&gt; - end of line + edit mode&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Deletion
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;dd&lt;/code&gt; - delete whole line&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dw&lt;/code&gt; - delete word&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;x&lt;/code&gt; - remove character&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  New line
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;o&lt;/code&gt; - insert new line below &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;O&lt;/code&gt; - insert new line above&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Undo/reUndo
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;u&lt;/code&gt; - undo&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ctrl + r&lt;/code&gt; - reUndo&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Find Word
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;:set hlsearch&lt;/code&gt; - enable highlight search matches&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;:nohlsearch&lt;/code&gt; - disable highlight search matches&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;:/{Word to match}&lt;/code&gt; - &lt;code&gt;n&lt;/code&gt; navigate forward, &lt;code&gt;N&lt;/code&gt; navigate backward&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Copy/paste terminal internally
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;v&lt;/code&gt; select block&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;y&lt;/code&gt; copy&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;P&lt;/code&gt; to paste before the cursor, or &lt;code&gt;p&lt;/code&gt; to paste after&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Cut/paste internally
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Position the cursor where you want to begin cutting.&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;v&lt;/code&gt; to select characters (or uppercase &lt;code&gt;V&lt;/code&gt; to select whole lines).&lt;/li&gt;
&lt;li&gt;Move the cursor to the end of what you want to cut.&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;d&lt;/code&gt; to cut (or &lt;code&gt;y&lt;/code&gt; to copy).&lt;/li&gt;
&lt;li&gt;Move to where you would like to paste.&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;P&lt;/code&gt; to paste before the cursor, or &lt;code&gt;p&lt;/code&gt; to paste after.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Select
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;V&lt;/code&gt; - whole block&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;v&lt;/code&gt; - and navigate (using &lt;code&gt;h&lt;/code&gt;, &lt;code&gt;j&lt;/code&gt;, &lt;code&gt;k&lt;/code&gt;, &lt;code&gt;l&lt;/code&gt;) to select part of the text&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Visual features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;:set number&lt;/code&gt; - show line number&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;:set nonumber&lt;/code&gt;  - hide number&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Practicing
&lt;/h2&gt;

&lt;p&gt;The most important thing of course, is to practice! At the beginning it was very hard to start, because there is a huge temptation to move back to the UI driven text editor, but with time you will cross this thin line, and then Vim becomes quite intuitive, and is going to be your ‘go to’ editor. &lt;br&gt;
I’m constantly learning, and extending my knowledge in this area, I’m so excited each time, when I notice that it has an feature which I was missing using e.g. Sublime. &lt;/p&gt;

&lt;h2&gt;
  
  
  More sources to explore Vim
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vim.rtorr.com/"&gt;Home | Vim Cheat Sheet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For sure, that someone else created Vim Cheat Sheet before, here you can find quite broad library of shortcuts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.openvim.com/"&gt;Tutorial with main combination&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Another interactive way of learning, I didn’t use it, but I believe that is worth mentioning here. It presents the editor in a very easy to digest way!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vim-adventures.com/"&gt;VIM Adventures game&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yep, I have just mentioned this game in the post.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Scp0rhN3usU"&gt;Cristopher Okhravi tutorial &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you prefer to learn from video, Christopher Okhravi, has a crazy nice YT series about Vim, also I strongly recommend to check his other videos where e.g. he is explaining SOLID principles in a very precise way. &lt;/p&gt;




&lt;p&gt;Original post: &lt;a href="https://herdzikrobert.com/posts/saying_sorry_to_vim_2020_05_22/"&gt;Link&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vim</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
