<?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: fuzzy_windfall</title>
    <description>The latest articles on Forem by fuzzy_windfall (@fuzzy_windfall).</description>
    <link>https://forem.com/fuzzy_windfall</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%2F299495%2Fbf0572ae-490c-4bc1-bd38-db857c9c61e1.jpg</url>
      <title>Forem: fuzzy_windfall</title>
      <link>https://forem.com/fuzzy_windfall</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/fuzzy_windfall"/>
    <language>en</language>
    <item>
      <title>Using Circle CI and AWS S3 to Store Images in Hugo</title>
      <dc:creator>fuzzy_windfall</dc:creator>
      <pubDate>Mon, 16 Nov 2020 16:40:00 +0000</pubDate>
      <link>https://forem.com/fuzzy_windfall/using-circle-ci-and-aws-s3-to-store-images-in-hugo-42lj</link>
      <guid>https://forem.com/fuzzy_windfall/using-circle-ci-and-aws-s3-to-store-images-in-hugo-42lj</guid>
      <description>&lt;p&gt;Considering now that the blog has cover images to adhere with the design of the &lt;a href="https://dev.to/fuzzy_windfall/new-theme-chunky-poster-2m82-temp-slug-3208011"&gt;theme&lt;/a&gt; (also with the old &lt;a href="https://github.com/zhaohuabing/hugo-theme-cleanwhite" rel="noopener noreferrer"&gt;theme&lt;/a&gt;), the number of images are getting larger including the repository itself. I've since removed the images from the repository and stored them on AWS S3.&lt;/p&gt;

&lt;p&gt;The idea behind is to sync the images from the local filesystem to a bucket in S3, copy the files from the bucket over to a Circle CI workspace which contains the build files of Hugo, and finally deploy the build files to Netlify.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sync'ing the Images
&lt;/h2&gt;

&lt;p&gt;I've created first a bucket on S3 to store the images for the blog. In order to sync the images from the local filesystem, I have installed and configured &lt;a href="https://aws.amazon.com/cli/" rel="noopener noreferrer"&gt;AWS CLI&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ brew install awscli
$ aws configure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configuration is pretty much straightforward. I think all I needed to do was set the API keys and the region to where to store the images from. Permission was a bit confusing as I haven't used AWS much although I've set it to private since its purpose is only to store the images — Netlify will be the one actually hosting the images.&lt;/p&gt;

&lt;p&gt;After configuring, I've used &lt;code&gt;aws sync&lt;/code&gt; to sync the files from local filesystem to the bucket:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ aws s3 sync . s3://path-to-bucket/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Copy Files Using Circle CI on Deployment
&lt;/h2&gt;

&lt;p&gt;I've used the orb &lt;a href="https://circleci.com/orbs/registry/orb/circleci/aws-s3" rel="noopener noreferrer"&gt;&lt;code&gt;aws-s3&lt;/code&gt;&lt;/a&gt; for Circle CI and added a job &lt;code&gt;images&lt;/code&gt; to do the execution. The files are then persisted to a workspace. The &lt;code&gt;build&lt;/code&gt; job is the one responsible for building Hugo and so I've attached the workspace over to this job and finally copied the files over to “content/images”. The &lt;code&gt;images&lt;/code&gt; job is also a dependency for the &lt;code&gt;build&lt;/code&gt; job.&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;orbs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="c1"&gt;# The rest of the orbs.&lt;/span&gt;
&lt;span class="na"&gt;hugo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;circleci/hugo@0&lt;/span&gt;
&lt;span class="na"&gt;aws-s3&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;circleci/aws-s3@1&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2.1&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;images&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;docker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;circleci/python:2.7&lt;/span&gt;
&lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;aws-s3/copy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s3://path-to-bucket'&lt;/span&gt;
&lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;images&lt;/span&gt;
&lt;span class="na"&gt;arguments&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;--recursive&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;persist_to_workspace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;root&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;images&lt;/span&gt;
&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;docker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cibuilds/hugo:latest&lt;/span&gt;
&lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;attach_workspace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;at&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;~/images&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;checkout&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cp -r ~/images/images/* content/images&lt;/span&gt;
&lt;span class="c1"&gt;# The rest of the steps.&lt;/span&gt;
&lt;span class="na"&gt;workflows&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;images&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;requires&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;images&lt;/span&gt;
&lt;span class="c1"&gt;# The rest of the jobs.&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;The required environment variables to configure the &lt;code&gt;aws-s3&lt;/code&gt; orb are the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AWS_ACCESS_KEY_ID&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AWS_SECRET_ACCESS_KEY&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AWS_REGION&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These can be configured through Circle CI under Project Settings » Build Settings » Environment Variables.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.strict-panda.com/images/project-settings.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.strict-panda.com%2Fimages%2Fproject-settings.png"&gt;&lt;/a&gt;&lt;br&gt;
Project Settings&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;So far, that is it. I just removed the images from the repository and added a &lt;code&gt;.gitignore&lt;/code&gt; file to ignore the images under “content/images”.&lt;/p&gt;

&lt;p&gt;I still need to include the static images though but will probably do it sometime in the future.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>aws</category>
    </item>
    <item>
      <title>Debugging Drupal in Lando using (Neo)vim and Vdebug</title>
      <dc:creator>fuzzy_windfall</dc:creator>
      <pubDate>Mon, 16 Nov 2020 03:06:31 +0000</pubDate>
      <link>https://forem.com/fuzzy_windfall/debugging-drupal-in-lando-using-neo-vim-and-vdebug-2cch</link>
      <guid>https://forem.com/fuzzy_windfall/debugging-drupal-in-lando-using-neo-vim-and-vdebug-2cch</guid>
      <description>&lt;p&gt;With the introduction of OOP on Drupal 8, it has become a bit difficult for me to track how Drupal processes each request. Most of the time, you’ll be dealing with different objects, track down which class were instantiated and methods that were called, and inspect the variables.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools
&lt;/h2&gt;

&lt;p&gt;So what are the tools that I am using? I’ve been a long time user of &lt;a href="https://www.vim.org/" rel="noopener noreferrer"&gt;vim&lt;/a&gt; and recently just switched to &lt;a href="https://neovim.io/" rel="noopener noreferrer"&gt;Neovim&lt;/a&gt;. For development environment, I mostly jump between different methods for building Drupal but recently been using &lt;a href="https://lando.dev/" rel="noopener noreferrer"&gt;Lando&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lando
&lt;/h3&gt;

&lt;p&gt;For the configuration, simply setting &lt;code&gt;xdebug&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; so that Lando would &lt;a href="https://docs.lando.dev/config/php.html#configuration" rel="noopener noreferrer"&gt;enable xdebug&lt;/a&gt; in the environment:&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;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;drupal&lt;/span&gt;
&lt;span class="na"&gt;recipe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;drupal8&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;appserver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;webroot&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;web&lt;/span&gt;
&lt;span class="na"&gt;xdebug&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;php&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;config/php.ini&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For &lt;code&gt;config/php.ini&lt;/code&gt;, I simply followed the one from &lt;a href="https://docs.lando.dev/guides/lando-with-vscode.html#getting-started" rel="noopener noreferrer"&gt;setting up vscode&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[PHP]&lt;/span&gt;
&lt;span class="c"&gt;; Xdebug
&lt;/span&gt;&lt;span class="py"&gt;xdebug.max_nesting_level&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;256&lt;/span&gt;
&lt;span class="py"&gt;xdebug.show_exception_trace&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;0&lt;/span&gt;
&lt;span class="py"&gt;xdebug.collect_params&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;0&lt;/span&gt;
&lt;span class="c"&gt;; Extra custom Xdebug setting for debug to work in VSCode.
&lt;/span&gt;&lt;span class="py"&gt;xdebug.remote_enable&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;1&lt;/span&gt;
&lt;span class="py"&gt;xdebug.remote_autostart&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;1&lt;/span&gt;
&lt;span class="py"&gt;xdebug.remote_host&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;${LANDO_HOST_IP}&lt;/span&gt;
&lt;span class="c"&gt;; xdebug.remote_connect_back = 1
&lt;/span&gt;&lt;span class="py"&gt;xdebug.remote_log&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;/tmp/xdebug.log&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  (Neo)vim
&lt;/h3&gt;

&lt;p&gt;For (Neo)vim, &lt;a href="https://github.com/vim-vdebug/vdebug" rel="noopener noreferrer"&gt;Vdebug&lt;/a&gt; seems to be the only option for using Xdebug in PHP. A minimal configuration can be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="k"&gt;call&lt;/span&gt; plug#begin&lt;span class="p"&gt;(&lt;/span&gt;stdpath&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'data'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'/plugged'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
Plug &lt;span class="s1"&gt;'vim-vdebug/vdebug'&lt;/span&gt;
&lt;span class="k"&gt;call&lt;/span&gt; plug#end&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'g:vdebug_options'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:vdebug_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;endif&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:vdebug_options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;path_maps &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="se"&gt;\&lt;/span&gt; &lt;span class="s1"&gt;'/app'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;getcwd&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="se"&gt;\&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:vdebug_options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;break_on_open &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:vdebug_options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;watch_window_style &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'compact'&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'g:vdebug_features'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:vdebug_features&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="k"&gt;endif&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:vdebug_features&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;max_children &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;128&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;vdebug_options.path_maps&lt;/code&gt; sets the paths so that it works with Lando.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;vdebug_features.max_children&lt;/code&gt; allows inspecting variables from Drupal most of the time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For other options, they can be found on &lt;code&gt;:h Vdebug&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Debugging
&lt;/h2&gt;

&lt;p&gt;Consider the scenario where you are viewing a node and wanted to debug the method &lt;code&gt;\Drupal\node\Entity\Node::getType()&lt;/code&gt;. To start debugging, open the file &lt;code&gt;core/modules/node/src/Entity/Node.php&lt;/code&gt; and set a breakpoint using F10, start the debugger using F5, and finally visit the a single node.&lt;/p&gt;

&lt;p&gt;I’m not entirely sure of the actual definitions for step debugging although in my own words, I can probably explain them like these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Step over: continue to the next line in the source.&lt;/li&gt;
&lt;li&gt;Step into: if the line calls a certain function/method, then go over to that function/method where you can then continue debugging.&lt;/li&gt;
&lt;li&gt;Step out: skip the remaining lines and proceed to the next step.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Bindings
&lt;/h3&gt;

&lt;p&gt;From the configuration above, it mostly just relies on the default bindings (&lt;code&gt;:h VdebugKeys&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:vdebug_keymap&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="se"&gt;\&lt;/span&gt; &lt;span class="s2"&gt;"run"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;F5&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;\&lt;/span&gt; &lt;span class="s2"&gt;"run_to_cursor"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;F9&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;\&lt;/span&gt; &lt;span class="s2"&gt;"step_over"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;F2&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;\&lt;/span&gt; &lt;span class="s2"&gt;"step_into"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;F3&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;\&lt;/span&gt; &lt;span class="s2"&gt;"step_out"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;F4&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;\&lt;/span&gt; &lt;span class="s2"&gt;"close"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;F6&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;\&lt;/span&gt; &lt;span class="s2"&gt;"detach"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;F7&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;\&lt;/span&gt; &lt;span class="s2"&gt;"set_breakpoint"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;F10&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;\&lt;/span&gt; &lt;span class="s2"&gt;"get_context"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;F11&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;\&lt;/span&gt; &lt;span class="s2"&gt;"eval_under_cursor"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;F12&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;\&lt;/span&gt; &lt;span class="s2"&gt;"eval_visual"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;Leader&amp;gt;e"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  User interface
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://blog.strict-panda.com/images/vdebug-ui.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.strict-panda.com%2Fimages%2Fvdebug-ui.png"&gt;&lt;/a&gt;&lt;br&gt;
Vdebug UI&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;The explanation for each window can be found at &lt;code&gt;:h VdebugUI&lt;/code&gt;. I find the “Watch” window very helpful since I can inspect the different variables with their context. Pressing Enter on a variable would expand/collapse their trees.&lt;/p&gt;

&lt;p&gt;So far, I think these are the basic things to debugging with (Neo)vim using Vdebug. Vdebug has a lot of other features such as evaluating although I haven’t gone much further with the other features yet.&lt;/p&gt;

</description>
      <category>vim</category>
      <category>php</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
