<?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: hardyweb</title>
    <description>The latest articles on DEV Community by hardyweb (@hardyweb).</description>
    <link>https://dev.to/hardyweb</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F879715%2Fc1fc8a79-e567-4098-9a15-f1e401fcdb47.png</url>
      <title>DEV Community: hardyweb</title>
      <link>https://dev.to/hardyweb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hardyweb"/>
    <language>en</language>
    <item>
      <title>Incus Lab: Belajar Rangkaian Dengan Cara Mencuba</title>
      <dc:creator>hardyweb</dc:creator>
      <pubDate>Fri, 18 Sep 2026 13:30:59 +0000</pubDate>
      <link>https://dev.to/hardyweb/incus-lab-belajar-rangkaian-dengan-cara-mencuba-5fla</link>
      <guid>https://dev.to/hardyweb/incus-lab-belajar-rangkaian-dengan-cara-mencuba-5fla</guid>
      <description>&lt;p&gt;Belajar tentang rangkaian kadang-kadang agak sukar apabila semuanya hanya diterangkan melalui rajah, nota dan teori.&lt;/p&gt;

&lt;p&gt;Apa sebenarnya berlaku apabila kita melakukan ping?&lt;/p&gt;

&lt;p&gt;Kenapa satu port boleh dibuka tetapi port yang lain tidak?&lt;/p&gt;

&lt;p&gt;Bagaimana nmap mengenal pasti perkhidmatan yang sedang berjalan? Dan apabila kita menggunakan dig, dari mana sebenarnya maklumat DNS itu datang?&lt;/p&gt;

&lt;p&gt;Incus Lab dibangunkan sebagai satu ruang kecil untuk pelajar mencuba dan melihat sendiri perkara-perkara tersebut.&lt;/p&gt;

&lt;p&gt;Incus Lab menggunakan Incus, iaitu platform untuk menjalankan system container dan virtual machine. Dalam projek ini, beberapa container Linux digunakan sebagai persekitaran latihan rangkaian.&lt;/p&gt;

&lt;p&gt;Konsepnya mudah.&lt;/p&gt;

&lt;p&gt;Pelajar tidak perlu membayangkan bahawa terdapat sebuah server di sebelah sana atau sebuah network di belakang sesuatu rajah. Sebaliknya, mereka boleh melihat dan berinteraksi dengan persekitaran tersebut secara langsung.&lt;/p&gt;

&lt;p&gt;Dalam Incus Lab terdapat container seperti lab-scanner dan lab-target. Daripada persekitaran ini, pelajar boleh mencuba beberapa perkara asas seperti:&lt;/p&gt;

&lt;p&gt;ping dan pemeriksaan connectivity&lt;br&gt;
ip addr, ip route dan ip neigh&lt;br&gt;
nmap untuk melihat port dan service&lt;br&gt;
ss, nc dan curl&lt;br&gt;
dig dan nslookup untuk memahami DNS&lt;br&gt;
kemudian berkembang kepada traceroute, packet inspection dan troubleshooting&lt;/p&gt;

&lt;p&gt;Setiap percubaan boleh menjadi satu soalan kecil.&lt;/p&gt;

&lt;p&gt;"Apa yang berlaku kalau port ini ditutup?"&lt;/p&gt;

&lt;p&gt;"Kenapa ping berjaya tetapi sambungan ke port tertentu gagal?"&lt;/p&gt;

&lt;p&gt;"Apa yang sebenarnya berlaku apabila kita membuat DNS lookup?"&lt;/p&gt;

&lt;p&gt;Daripada situ, pelajar boleh melihat hubungan antara arahan yang mereka jalankan dengan keadaan sebenar dalam network.&lt;/p&gt;

&lt;p&gt;Satu lagi perkara yang cuba diketengahkan ialah command yang sebenar. Incus Lab bukan sekadar memaparkan keputusan akhir. Command yang dijalankan turut boleh dilihat melalui command log, supaya pelajar boleh menghubungkan apa yang mereka klik pada antaramuka dengan arahan Linux yang berlaku di belakangnya.&lt;/p&gt;

&lt;p&gt;Pendekatan ini diharapkan dapat menjadikan pembelajaran lebih dekat dengan pengalaman sebenar seorang system atau network engineer.&lt;/p&gt;

&lt;p&gt;Tidak perlu bermula dengan memahami semuanya.&lt;/p&gt;

&lt;p&gt;Cuba satu command.&lt;/p&gt;

&lt;p&gt;Lihat hasilnya.&lt;/p&gt;

&lt;p&gt;Buat perubahan kecil.&lt;/p&gt;

&lt;p&gt;Cuba lagi.&lt;/p&gt;

&lt;p&gt;Kemudian mula bertanya "kenapa?"&lt;/p&gt;

&lt;p&gt;Itulah idea ringkas di sebalik Incus Lab — menyediakan ruang yang selamat untuk belajar network melalui percubaan, pemerhatian dan sedikit rasa ingin tahu.&lt;/p&gt;

&lt;p&gt;Projek ini masih berkembang. Beberapa topik seperti routing, packet inspection dan troubleshooting dirancang untuk ditambah secara berperingkat.&lt;/p&gt;

&lt;p&gt;Jika anda seorang pelajar IT dan ingin mencuba, projek ini boleh dilihat di GitHub:&lt;/p&gt;

&lt;p&gt;github.com/hardyweb/incus-lab&lt;/p&gt;

&lt;p&gt;Mungkin daripada satu ping yang ringkas, kita mula nampak bahawa network sebenarnya mempunyai banyak cerita di sebaliknya.&lt;/p&gt;

</description>
      <category>network</category>
      <category>operation</category>
      <category>ping</category>
      <category>curl</category>
    </item>
    <item>
      <title>Nginx Load Balancing with DNS-Based Service Discovery on Incus</title>
      <dc:creator>hardyweb</dc:creator>
      <pubDate>Sun, 30 Aug 2026 06:31:30 +0000</pubDate>
      <link>https://dev.to/hardyweb/nginx-load-balancing-with-dns-based-service-discovery-on-incus-2kom</link>
      <guid>https://dev.to/hardyweb/nginx-load-balancing-with-dns-based-service-discovery-on-incus-2kom</guid>
      <description>&lt;h1&gt;
  
  
  Nginx Load Balancing with DNS-Based Service Discovery on Incus
&lt;/h1&gt;

&lt;p&gt;Hari ini saya buat satu practical lab untuk memahami &lt;strong&gt;Nginx Load Balancing&lt;/strong&gt;, &lt;strong&gt;DNS-based Service Discovery&lt;/strong&gt;, dan &lt;strong&gt;operational logging&lt;/strong&gt; dalam persekitaran self-hosted menggunakan Incus.&lt;/p&gt;

&lt;p&gt;Lab ini bermula dengan architecture yang simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
   │
   ▼
Nginx LB
   │
   ├──► web01
   └──► web02
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kemudian saya tambah satu DNS server supaya backend tidak perlu bergantung sepenuhnya kepada hard-coded IP address.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Architecture
&lt;/h2&gt;

&lt;p&gt;Final architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                         DNS
                    dns / dnsmasq
                    10.107.109.18
                         ▲
                         │
                  DNS lookup:
                   web.incus
                         │
                         │
                    Nginx LB
                   10.107.109.69
                         │
                  Load Balancing
              ┌──────────┼──────────┐
              ▼          ▼          ▼
            web01      web02      web03
            .100        .253        .xxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ada dua jenis communication flow dalam architecture ini.&lt;/p&gt;

&lt;h3&gt;
  
  
  DNS resolution
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nginx LB ──────► DNS
                  │
                  └── web.incus
                       ↓
                  .100, .253, .xxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;DNS hanya digunakan untuk mengetahui IP address backend.&lt;/p&gt;

&lt;h3&gt;
  
  
  HTTP traffic
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
  │
  ▼
Nginx LB
  │
  ├────► web01
  ├────► web02
  └────► web03
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;DNS &lt;strong&gt;tidak membawa HTTP traffic&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;DNS hanya menjawab:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Where is &lt;code&gt;web.incus&lt;/code&gt;?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nginx kemudian menggunakan IP yang diperoleh daripada DNS untuk melakukan load balancing.&lt;/p&gt;




&lt;h1&gt;
  
  
  2. Static / Hard-Coded Upstream
&lt;/h1&gt;

&lt;p&gt;Cara paling mudah untuk configure Nginx Load Balancer ialah dengan meletakkan IP backend secara terus.&lt;/p&gt;

&lt;p&gt;Contoh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;upstream&lt;/span&gt; &lt;span class="s"&gt;backend&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="mf"&gt;10.107&lt;/span&gt;&lt;span class="s"&gt;.109.100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="mf"&gt;10.107&lt;/span&gt;&lt;span class="s"&gt;.109.253&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;Architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nginx LB
   │
   ├──► 10.107.109.100
   │
   └──► 10.107.109.253
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Kelebihan
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Simple&lt;/li&gt;
&lt;li&gt;Mudah difahami&lt;/li&gt;
&lt;li&gt;Predictable&lt;/li&gt;
&lt;li&gt;Sesuai untuk environment kecil&lt;/li&gt;
&lt;li&gt;Tidak memerlukan DNS service discovery&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Kekurangan
&lt;/h3&gt;

&lt;p&gt;Kalau tambah &lt;code&gt;web03&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;web01
web02
web03
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nginx configuration perlu diubah:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;upstream&lt;/span&gt; &lt;span class="s"&gt;backend&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="mf"&gt;10.107&lt;/span&gt;&lt;span class="s"&gt;.109.100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="mf"&gt;10.107&lt;/span&gt;&lt;span class="s"&gt;.109.253&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="mf"&gt;10.107&lt;/span&gt;&lt;span class="s"&gt;.109.xxx&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;Kemudian configuration perlu divalidasi dan biasanya Nginx perlu di-reload.&lt;/p&gt;




&lt;h1&gt;
  
  
  3. DNS-Based Service Discovery
&lt;/h1&gt;

&lt;p&gt;Pendekatan kedua ialah menggunakan hostname sebagai service identity.&lt;/p&gt;

&lt;p&gt;Contohnya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;web.incus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;DNS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;web.incus
 ├── 10.107.109.100
 ├── 10.107.109.253
 └── 10.107.109.xxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nginx tidak perlu mengetahui backend IP secara hard-coded.&lt;/p&gt;

&lt;p&gt;Contoh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;resolver&lt;/span&gt; &lt;span class="mf"&gt;10.107&lt;/span&gt;&lt;span class="s"&gt;.109.18&lt;/span&gt; &lt;span class="s"&gt;valid=5s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;upstream&lt;/span&gt; &lt;span class="s"&gt;backend&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;zone&lt;/span&gt; &lt;span class="s"&gt;backend&lt;/span&gt; &lt;span class="mi"&gt;64k&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="s"&gt;web.incus&lt;/span&gt; &lt;span class="s"&gt;resolve&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;Konsepnya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;             DNS
              │
              │ web.incus
              ▼
         ┌─────────────┐
         │  Nginx LB   │
         └──────┬──────┘
                │
       ┌────────┼────────┐
       ▼        ▼        ▼
     web01    web02    web03
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  4. Why Use DNS?
&lt;/h1&gt;

&lt;p&gt;DNS memberikan abstraction layer antara Load Balancer dan backend server.&lt;/p&gt;

&lt;p&gt;Tanpa DNS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nginx
  │
  ├── 10.107.109.100
  ├── 10.107.109.253
  └── 10.107.109.xxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dengan DNS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nginx
  │
  └── web.incus
         │
         ├── .100
         ├── .253
         └── .xxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ini bermaksud &lt;strong&gt;service identity&lt;/strong&gt; dipisahkan daripada &lt;strong&gt;server identity&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Contohnya, kalau &lt;code&gt;web01&lt;/code&gt; mendapat IP baru:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;web.incus
    ↓
10.107.109.200
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nginx tidak perlu mempunyai IP tersebut secara hard-coded.&lt;/p&gt;

&lt;p&gt;DNS menjadi source of information mengenai lokasi service.&lt;/p&gt;




&lt;h1&gt;
  
  
  5. dnsmasq
&lt;/h1&gt;

&lt;p&gt;Dalam lab ini saya menggunakan &lt;code&gt;dnsmasq&lt;/code&gt; sebagai DNS service.&lt;/p&gt;

&lt;p&gt;DNS server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10.107.109.18
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nginx LB menggunakan DNS tersebut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;resolver&lt;/span&gt; &lt;span class="mf"&gt;10.107&lt;/span&gt;&lt;span class="s"&gt;.109.18&lt;/span&gt; &lt;span class="s"&gt;valid=5s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test DNS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig @10.107.109.18 web.incus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;web.incus.    0    IN    A    10.107.109.100
web.incus.    0    IN    A    10.107.109.253
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apabila &lt;code&gt;web03&lt;/code&gt; ditambah:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;web.incus.    0    IN    A    10.107.109.100
web.incus.    0    IN    A    10.107.109.253
web.incus.    0    IN    A    10.107.109.xxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  6. Dynamic DNS Resolution in Nginx
&lt;/h1&gt;

&lt;p&gt;Bahagian penting dalam configuration ialah:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;resolver&lt;/span&gt; &lt;span class="mf"&gt;10.107&lt;/span&gt;&lt;span class="s"&gt;.109.18&lt;/span&gt; &lt;span class="s"&gt;valid=5s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;dan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="s"&gt;web.incus&lt;/span&gt; &lt;span class="s"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;resolver&lt;/code&gt; memberitahu Nginx DNS server yang perlu digunakan.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;valid=5s&lt;/code&gt; menentukan tempoh DNS result dianggap valid oleh Nginx.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;resolve&lt;/code&gt; membolehkan Nginx resolve hostname backend secara dynamic.&lt;/p&gt;

&lt;p&gt;Konsep:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DNS changes
     │
     ▼
web.incus
     │
     ▼
Nginx re-resolves
     │
     ▼
Backend pool updated
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ini lebih flexible berbanding hard-coded IP.&lt;/p&gt;




&lt;h1&gt;
  
  
  7. Adding a New Backend
&lt;/h1&gt;

&lt;p&gt;Salah satu test penting ialah menambah &lt;code&gt;web03&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Sebelum:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;web.incus
 ├── web01
 └── web02
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selepas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;web.incus
 ├── web01
 ├── web02
 └── web03
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yang menarik ialah Nginx configuration tidak perlu ditukar untuk menambah backend baru.&lt;/p&gt;

&lt;p&gt;DNS yang berubah.&lt;/p&gt;

&lt;p&gt;Kemudian Nginx akan mendapatkan DNS information yang baru berdasarkan konfigurasi &lt;code&gt;resolver&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ini menunjukkan salah satu kelebihan utama DNS-based service discovery.&lt;/p&gt;




&lt;h1&gt;
  
  
  8. Important Lesson: DNS Discovery Is Not Health Checking
&lt;/h1&gt;

&lt;p&gt;Satu perkara yang saya belajar ialah:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;DNS Service Discovery ≠ Health Checking&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;DNS memberitahu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;web.incus
    ↓
IP addresses
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tetapi DNS tidak semestinya tahu sama ada HTTP service pada IP tersebut sedang berfungsi.&lt;/p&gt;

&lt;p&gt;Contohnya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;web.incus
 ├── web01 ✅
 ├── web02 ❌
 └── web03 ✅
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;DNS mungkin masih return:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.100
.253
.xxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;walaupun &lt;code&gt;web02&lt;/code&gt; tidak boleh menerima HTTP connection.&lt;/p&gt;

&lt;p&gt;Oleh itu, production architecture mungkin memerlukan additional health-checking atau failure-handling mechanism.&lt;/p&gt;




&lt;h1&gt;
  
  
  9. Load Balancing vs High Availability
&lt;/h1&gt;

&lt;p&gt;Saya juga belajar bahawa &lt;strong&gt;Load Balancing dan High Availability bukan perkara yang sama&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Load Balancing
&lt;/h3&gt;

&lt;p&gt;Tujuan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
  │
  ▼
Nginx LB
 ├──► web01
 ├──► web02
 └──► web03
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ia mengagihkan traffic.&lt;/p&gt;

&lt;h3&gt;
  
  
  High Availability
&lt;/h3&gt;

&lt;p&gt;Tujuan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;           LB / HA
          /       \
       LB01      LB02
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ia memastikan service masih tersedia jika salah satu infrastructure component gagal.&lt;/p&gt;

&lt;p&gt;Contohnya, Keepalived boleh digunakan untuk menyediakan virtual IP dan failover antara Load Balancer.&lt;/p&gt;

&lt;p&gt;Jadi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Load Balancing
    ≠
High Availability
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tetapi kedua-duanya boleh digunakan bersama.&lt;/p&gt;




&lt;h1&gt;
  
  
  10. Nginx Operational Logging
&lt;/h1&gt;

&lt;p&gt;Selepas Load Balancing berfungsi, saya tambah logging untuk melihat backend mana yang menerima request.&lt;/p&gt;

&lt;p&gt;Contoh log format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;log_format&lt;/span&gt; &lt;span class="s"&gt;lb&lt;/span&gt; &lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="nv"&gt;$remote_addr&lt;/span&gt; &lt;span class="s"&gt;-&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt; &lt;span class="s"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$time_local&lt;/span&gt;&lt;span class="s"&gt;]&lt;/span&gt; &lt;span class="s"&gt;'&lt;/span&gt;
              &lt;span class="s"&gt;'"&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="nv"&gt;$status&lt;/span&gt; &lt;span class="nv"&gt;$body_bytes_sent&lt;/span&gt; &lt;span class="s"&gt;'&lt;/span&gt;
              &lt;span class="s"&gt;'upstream=&lt;/span&gt;&lt;span class="nv"&gt;$upstream_addr&lt;/span&gt; &lt;span class="s"&gt;'&lt;/span&gt;
              &lt;span class="s"&gt;'upstream_status=&lt;/span&gt;&lt;span class="nv"&gt;$upstream_status&lt;/span&gt; &lt;span class="s"&gt;'&lt;/span&gt;
              &lt;span class="s"&gt;'request_time=&lt;/span&gt;&lt;span class="nv"&gt;$request_time&lt;/span&gt; &lt;span class="s"&gt;'&lt;/span&gt;
              &lt;span class="s"&gt;'upstream_response_time=&lt;/span&gt;&lt;span class="nv"&gt;$upstream_response_time&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kemudian:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;access_log&lt;/span&gt; &lt;span class="n"&gt;/var/log/nginx/lb_access.log&lt;/span&gt; &lt;span class="s"&gt;lb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Log boleh mengandungi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;upstream=10.107.109.100:80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;atau:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;upstream=10.107.109.253:80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;atau:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;upstream=10.107.109.xxx:80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ini memberikan visibility kepada Load Balancer behaviour.&lt;/p&gt;




&lt;h1&gt;
  
  
  11. Testing
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Test DNS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig @10.107.109.18 web.incus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Test backend
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--noproxy&lt;/span&gt; &lt;span class="s1"&gt;'*'&lt;/span&gt; http://10.107.109.100/
curl &lt;span class="nt"&gt;--noproxy&lt;/span&gt; &lt;span class="s1"&gt;'*'&lt;/span&gt; http://10.107.109.253/
curl &lt;span class="nt"&gt;--noproxy&lt;/span&gt; &lt;span class="s1"&gt;'*'&lt;/span&gt; http://10.107.109.xxx/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Test Nginx configuration
&lt;/h3&gt;



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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Inspect effective configuration
&lt;/h3&gt;



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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Test Load Balancer
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--noproxy&lt;/span&gt; &lt;span class="s1"&gt;'*'&lt;/span&gt; http://10.107.109.69/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Watch Load Balancer logs
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/nginx/lb_access.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  12. Troubleshooting Lesson
&lt;/h1&gt;

&lt;p&gt;Satu masalah yang berlaku dalam lab ialah default Nginx configuration masih aktif.&lt;/p&gt;

&lt;p&gt;Contohnya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/etc/nginx/conf.d/default.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configuration tersebut menyebabkan Nginx default welcome page dipaparkan.&lt;/p&gt;

&lt;p&gt;Walaupun Load Balancer configuration telah dibuat dengan betul, request masih boleh masuk ke default server.&lt;/p&gt;

&lt;p&gt;Penyelesaian ialah memastikan hanya configuration yang diperlukan digunakan.&lt;/p&gt;

&lt;p&gt;Ini mengajar satu perkara penting:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Jangan hanya melihat configuration file yang kita edit. Periksa &lt;strong&gt;effective configuration&lt;/strong&gt; yang sebenarnya digunakan oleh Nginx.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Command yang berguna:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Kemudian:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;sebelum reload.&lt;/p&gt;




&lt;h1&gt;
  
  
  13. Configuration Validation Workflow
&lt;/h1&gt;

&lt;p&gt;Workflow yang saya gunakan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Edit Configuration
       │
       ▼
    nginx -t
       │
       ▼
   Configuration OK?
      /       \
    NO         YES
    │           │
    ▼           ▼
 Fix config   Reload
                │
                ▼
             Test
                │
                ▼
              Logs
                │
                ▼
            Verify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ini lebih baik daripada terus restart service setiap kali membuat perubahan.&lt;/p&gt;




&lt;h1&gt;
  
  
  14. Security Perspective
&lt;/h1&gt;

&lt;p&gt;Walaupun lab ini fokus kepada Load Balancing, terdapat beberapa security principles yang boleh dipelajari.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuration Management
&lt;/h3&gt;

&lt;p&gt;Configuration perlu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dikenal pasti&lt;/li&gt;
&lt;li&gt;diubah secara terkawal&lt;/li&gt;
&lt;li&gt;divalidasi&lt;/li&gt;
&lt;li&gt;diuji&lt;/li&gt;
&lt;li&gt;didokumentasikan&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Network Security
&lt;/h3&gt;

&lt;p&gt;Perlu memahami:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
  ↓
Load Balancer
  ↓
Backend network
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;dan service mana yang boleh berkomunikasi antara satu sama lain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Logging
&lt;/h3&gt;

&lt;p&gt;Load Balancer logs membantu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;troubleshooting&lt;/li&gt;
&lt;li&gt;monitoring&lt;/li&gt;
&lt;li&gt;incident investigation&lt;/li&gt;
&lt;li&gt;performance analysis&lt;/li&gt;
&lt;li&gt;verification&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Availability
&lt;/h3&gt;

&lt;p&gt;Multiple backend servers boleh mengurangkan dependency kepada single server.&lt;/p&gt;




&lt;h1&gt;
  
  
  15. ISO/IEC 27001 Perspective
&lt;/h1&gt;

&lt;p&gt;Lab ini bukan implementation penuh ISO/IEC 27001.&lt;/p&gt;

&lt;p&gt;Sebaliknya, ISO/IEC 27001 digunakan sebagai reference framework untuk memahami bagaimana technical infrastructure berkait dengan information security.&lt;/p&gt;

&lt;p&gt;Beberapa control yang relevan untuk pembelajaran:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Control&lt;/th&gt;
&lt;th&gt;Relevance&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A.8.9 Configuration Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Nginx, DNS dan network configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A.8.15 Logging&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Nginx Load Balancer logs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A.8.16 Monitoring Activities&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Monitoring behaviour dan troubleshooting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A.8.20 Networks Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Network architecture dan communication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A.8.21 Security of Network Services&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DNS, HTTP dan Load Balancing services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A.8.32 Change Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Controlled configuration changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A.5.30 ICT Readiness for Business Continuity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Redundancy dan availability concepts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Penting untuk difahami bahawa control mapping sahaja tidak bermaksud sesuatu environment itu compliant.&lt;/p&gt;

&lt;p&gt;Dalam audit sebenar, auditor masih memerlukan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Risk
 ↓
Control
 ↓
Implementation
 ↓
Evidence
 ↓
Monitoring
 ↓
Review
 ↓
Improvement
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  16. Key Lessons
&lt;/h1&gt;

&lt;p&gt;Antara perkara utama yang saya pelajari:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Load Balancing dan High Availability adalah dua fungsi yang berbeza.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Nginx boleh digunakan sebagai HTTP Load Balancer.&lt;/li&gt;
&lt;li&gt;Backend boleh dirujuk menggunakan IP secara static.&lt;/li&gt;
&lt;li&gt;Backend juga boleh ditemui menggunakan DNS-based service discovery.&lt;/li&gt;
&lt;li&gt;DNS memberikan abstraction layer antara service dan server IP.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;resolver&lt;/code&gt; dan &lt;code&gt;resolve&lt;/code&gt; membolehkan Nginx menggunakan dynamic DNS resolution.&lt;/li&gt;
&lt;li&gt;DNS discovery tidak sama dengan health checking.&lt;/li&gt;
&lt;li&gt;Logging penting untuk visibility dan troubleshooting.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nginx -T&lt;/code&gt; sangat berguna untuk melihat effective configuration.&lt;/li&gt;
&lt;li&gt;Configuration changes perlu divalidasi sebelum reload.&lt;/li&gt;
&lt;li&gt;Redundancy pada backend membantu meningkatkan availability.&lt;/li&gt;
&lt;li&gt;Technical implementation boleh dianalisis menggunakan perspektif ISO/IEC 27001 tanpa mendakwa bahawa lab tersebut sendiri merupakan ISMS.&lt;/li&gt;
&lt;/ol&gt;




&lt;h1&gt;
  
  
  17. Final Architecture
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                         DNS
                    dns / dnsmasq
                    10.107.109.18
                         ▲
                         │
                  DNS lookup
                   web.incus
                         │
                         │
                    Nginx LB
                   10.107.109.69
                         │
                  Load Balancing
              ┌──────────┼──────────┐
              ▼          ▼          ▼
            web01      web02      web03
            .100        .253        .xxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key concept is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DNS = Service Discovery

Nginx = Load Balancer

Web01/Web02/Web03 = Backend Services

Nginx Logs = Operational Visibility
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;The practical exercise demonstrated two fundamental approaches to Nginx Load Balancing.&lt;/p&gt;

&lt;p&gt;The first approach uses &lt;strong&gt;static IP addresses&lt;/strong&gt;, which is simple and suitable for small, stable environments.&lt;/p&gt;

&lt;p&gt;The second approach uses &lt;strong&gt;DNS-based service discovery&lt;/strong&gt;, where Nginx resolves a service name such as &lt;code&gt;web.incus&lt;/code&gt; to determine the backend servers.&lt;/p&gt;

&lt;p&gt;The second approach introduces additional flexibility but also introduces dependencies on DNS availability, DNS caching, TTL behaviour and backend health handling.&lt;/p&gt;

&lt;p&gt;The most important lesson is that infrastructure components should not be viewed independently. &lt;strong&gt;DNS, Load Balancing, networking, configuration management, logging, availability and security all interact with each other.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;From an ISO/IEC 27001 perspective, the exercise demonstrates how technical controls can be understood through the broader cycle of &lt;strong&gt;risk, control, implementation, evidence, monitoring and continual improvement&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>devops</category>
      <category>infrastructure</category>
      <category>networking</category>
    </item>
    <item>
      <title>Building a PDF from Markdown with Pandoc: Images, Code Blocks, TOC and Mermaid</title>
      <dc:creator>hardyweb</dc:creator>
      <pubDate>Wed, 19 Aug 2026 05:45:12 +0000</pubDate>
      <link>https://dev.to/hardyweb/building-a-pdf-from-markdown-with-pandoc-images-code-blocks-toc-and-mermaid-5f8j</link>
      <guid>https://dev.to/hardyweb/building-a-pdf-from-markdown-with-pandoc-images-code-blocks-toc-and-mermaid-5f8j</guid>
      <description>&lt;p&gt;Pandoc is one of those tools that looks simple at first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pandoc input.md &lt;span class="nt"&gt;-o&lt;/span&gt; output.pdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But when Markdown becomes a real document, things become more interesting.&lt;/p&gt;

&lt;p&gt;Images may disappear, long shell commands can overflow the page, Mermaid diagrams need additional processing, and the generated table of contents may contain sections that we do not want.&lt;/p&gt;

&lt;p&gt;This note documents the practical techniques for building a clean PDF from Markdown using Pandoc.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Example Project Structure
&lt;/h2&gt;

&lt;p&gt;Let's use a fictional project called &lt;strong&gt;Internal API Deployment Guide&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The directory structure is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docs/
├── assets/
│   ├── architecture.png
│   └── logo.png
├── chapters/
│   ├── introduction.md
│   ├── installation.md
│   └── deployment.md
└── main.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important point is that image paths are relative to the Markdown file or the working directory used by Pandoc.&lt;/p&gt;

&lt;p&gt;For example:&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="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;System Architecture&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;assets/architecture.png&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the image is located elsewhere:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docs/
├── assets/
│   └── architecture.png
└── chapters/
    └── deployment.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then the path from &lt;code&gt;deployment.md&lt;/code&gt; would be:&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="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;System Architecture&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;../assets/architecture.png&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Cover Image
&lt;/h2&gt;

&lt;p&gt;A cover image can simply be inserted using Markdown:&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="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;Cover&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;assets/logo.png&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, if the intention is to create a proper PDF title page, it is often cleaner to use YAML metadata and a dedicated LaTeX template.&lt;/p&gt;

&lt;p&gt;For example:&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="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;Internal&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;API&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Deployment&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Guide"&lt;/span&gt;
&lt;span class="na"&gt;author&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Example&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Engineering&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Team"&lt;/span&gt;
&lt;span class="na"&gt;date&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026"&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pandoc main.md &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--pdf-engine&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;xelatex &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; deployment-guide.pdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important lesson is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Pandoc does not treat a Markdown image as a special "cover page". It is simply an image in the document flow.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you need a dedicated cover page, control the layout using LaTeX/template mechanisms.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Image Paths
&lt;/h2&gt;

&lt;p&gt;One common problem is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Image not found
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or the image simply does not appear in the PDF.&lt;/p&gt;

&lt;p&gt;Consider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;project/
├── main.md
└── assets/
    └── architecture.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Markdown should use:&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="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;Architecture&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;assets/architecture.png&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run Pandoc from the &lt;code&gt;project&lt;/code&gt; directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pandoc main.md &lt;span class="nt"&gt;-o&lt;/span&gt; output.pdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A useful debugging technique is to verify the file first:&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="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lh&lt;/span&gt; assets/architecture.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then test Pandoc:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pandoc main.md &lt;span class="nt"&gt;-o&lt;/span&gt; test.pdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the image still does not appear, check the actual working directory:&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="nb"&gt;pwd&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Relative paths are one of the easiest things to overlook when working with Pandoc.&lt;/p&gt;




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

&lt;p&gt;Pandoc can automatically generate a table of contents:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pandoc main.md &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--toc&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; output.pdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The heading levels included in the TOC can be controlled:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pandoc main.md &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--toc&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--toc-depth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; output.pdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With:&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="gh"&gt;# Deployment Guide&lt;/span&gt;

&lt;span class="gu"&gt;## Installing Dependencies&lt;/span&gt;

&lt;span class="gu"&gt;### Installing PHP&lt;/span&gt;

&lt;span class="gu"&gt;### Installing Composer&lt;/span&gt;

&lt;span class="gu"&gt;## Configuring Nginx&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using:&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="nt"&gt;--toc-depth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the TOC will contain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Deployment Guide
  Installing Dependencies
  Configuring Nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;but not:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Installing PHP
Installing Composer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is useful for keeping a technical PDF readable.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Removing Unwanted Sections from the TOC
&lt;/h2&gt;

&lt;p&gt;Sometimes the document contains front matter:&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="gh"&gt;# Front Matter&lt;/span&gt;

&lt;span class="gu"&gt;## Title Page&lt;/span&gt;

&lt;span class="gu"&gt;## Copyright&lt;/span&gt;

&lt;span class="gu"&gt;## Disclaimer&lt;/span&gt;

&lt;span class="gh"&gt;# Chapter 1&lt;/span&gt;

&lt;span class="gu"&gt;## Installation&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You may not want every front-matter section appearing in the TOC.&lt;/p&gt;

&lt;p&gt;One approach is to control the heading hierarchy carefully.&lt;/p&gt;

&lt;p&gt;For example, instead of:&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="gh"&gt;# Front Matter&lt;/span&gt;

&lt;span class="gu"&gt;## Title Page&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;use a custom LaTeX structure or unnumbered headings:&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="gh"&gt;# Title Page {.unnumbered}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&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="gh"&gt;# Copyright {.unnumbered}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depending on the output format and template, this can prevent unwanted numbering and help keep the document structure clean.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Code Blocks
&lt;/h2&gt;

&lt;p&gt;Pandoc handles fenced code blocks naturally:&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="p"&gt;```&lt;/span&gt;&lt;span class="nl"&gt;bash
&lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart nginx
&lt;span class="p"&gt;```&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example:&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="nb"&gt;sudo &lt;/span&gt;systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Language identifiers are useful:&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="p"&gt;```&lt;/span&gt;&lt;span class="nl"&gt;php
&lt;/span&gt;&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/health'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&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="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'status'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'ok'&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;Pandoc can then pass the code through syntax highlighting when configured.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pandoc main.md &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--highlight-style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tango &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; output.pdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7. The Long Bash Command Problem
&lt;/h2&gt;

&lt;p&gt;Technical documentation often contains commands such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--name&lt;/span&gt; production-api &lt;span class="nt"&gt;--restart&lt;/span&gt; unless-stopped &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:8080 &lt;span class="nt"&gt;-v&lt;/span&gt; /opt/application/config:/app/config:ro &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;APP_ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;production example/api-server:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The problem is that this line may be wider than the printable area of an A4 page.&lt;/p&gt;

&lt;p&gt;LaTeX may produce an overfull line.&lt;/p&gt;

&lt;p&gt;A better solution is to format the command over multiple lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; production-api &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--restart&lt;/span&gt; unless-stopped &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:8080 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; /opt/application/config:/app/config:ro &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;APP_ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;production &lt;span class="se"&gt;\&lt;/span&gt;
  example/api-server:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not only better for PDF generation.&lt;/p&gt;

&lt;p&gt;It is also easier for humans to read.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Long Inline Commands
&lt;/h2&gt;

&lt;p&gt;Inline code can also cause problems:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Run &lt;span class="sb"&gt;`docker run --name production-api --restart unless-stopped -p 8080:8080 example/api-server:latest`&lt;/span&gt;.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For short commands this is fine.&lt;/p&gt;

&lt;p&gt;For long commands, use a fenced block instead:&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="p"&gt;```&lt;/span&gt;&lt;span class="nl"&gt;bash
&lt;/span&gt;docker run &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; production-api &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--restart&lt;/span&gt; unless-stopped &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:8080 &lt;span class="se"&gt;\&lt;/span&gt;
  example/api-server:latest
&lt;span class="p"&gt;```&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A useful documentation rule is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If a command is difficult to read in Markdown, it will probably be even worse in PDF.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  9. Mermaid Diagrams
&lt;/h2&gt;

&lt;p&gt;Pandoc does not natively turn every Mermaid code block into a rendered diagram.&lt;/p&gt;

&lt;p&gt;For example:&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="p"&gt;```&lt;/span&gt;&lt;span class="nl"&gt;mermaid
&lt;/span&gt;&lt;span class="sb"&gt;flowchart TB
    Client --&amp;gt; API
    API --&amp;gt; Database&lt;/span&gt;
&lt;span class="p"&gt;```&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Markdown parser can understand the fenced block, but a PDF engine such as XeLaTeX does not automatically know how to render Mermaid.&lt;/p&gt;

&lt;p&gt;A common solution is to convert Mermaid separately.&lt;/p&gt;

&lt;p&gt;Create:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;architecture.mmd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TB
    Client --&amp;gt; API
    API --&amp;gt; Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then generate an image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mmdc &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-i&lt;/span&gt; architecture.mmd &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; architecture.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now include the generated image:&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="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;System Architecture&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;assets/architecture.png&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This separates diagram generation from PDF generation.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Mermaid Workflow
&lt;/h2&gt;

&lt;p&gt;A practical workflow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mermaid source
      |
      v
   mmdc
      |
      v
 PNG / SVG
      |
      v
   Markdown
      |
      v
   Pandoc
      |
      v
    PDF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mmdc &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-i&lt;/span&gt; assets/architecture.mmd &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; assets/architecture.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pandoc main.md &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--toc&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--pdf-engine&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;xelatex &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; output.pdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach is easier to troubleshoot than trying to make every component work inside one command.&lt;/p&gt;




&lt;h2&gt;
  
  
  11. PNG vs SVG
&lt;/h2&gt;

&lt;p&gt;Mermaid can generate both PNG and SVG.&lt;/p&gt;

&lt;p&gt;PNG:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mmdc &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-i&lt;/span&gt; architecture.mmd &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; architecture.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SVG:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mmdc &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-i&lt;/span&gt; architecture.mmd &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; architecture.svg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SVG is useful because it is vector-based.&lt;/p&gt;

&lt;p&gt;However, the complete toolchain matters.&lt;/p&gt;

&lt;p&gt;If SVG rendering causes problems in the LaTeX/PDF pipeline, PNG is often the simpler solution.&lt;/p&gt;

&lt;p&gt;For technical documentation, a good starting point is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mermaid → PNG → Pandoc → XeLaTeX → PDF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the pipeline is stable, SVG can be introduced if higher-quality vector diagrams are required.&lt;/p&gt;




&lt;h2&gt;
  
  
  12. Using XeLaTeX
&lt;/h2&gt;

&lt;p&gt;For modern technical documents, XeLaTeX is a useful PDF engine.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pandoc main.md &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--pdf-engine&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;xelatex &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; output.pdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It provides better control over fonts and Unicode than some older LaTeX workflows.&lt;/p&gt;

&lt;p&gt;You can specify a main font:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pandoc main.md &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--pdf-engine&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;xelatex &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-V&lt;/span&gt; &lt;span class="nv"&gt;mainfont&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"DejaVu Serif"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; output.pdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For code:&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="nt"&gt;-V&lt;/span&gt; &lt;span class="nv"&gt;monofont&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"DejaVu Sans Mono"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  13. Unicode Problems
&lt;/h2&gt;

&lt;p&gt;Technical documentation often contains symbols such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✓
→
⚠
✅
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the selected font does not contain these glyphs, XeLaTeX may display warnings such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Missing character
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[WARNING] Missing character: There is no ✅
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The problem is usually not Pandoc itself.&lt;/p&gt;

&lt;p&gt;It is a font coverage problem.&lt;/p&gt;

&lt;p&gt;One solution is to use a font with better Unicode coverage.&lt;/p&gt;

&lt;p&gt;Another is to avoid unnecessary emoji in PDF source documents.&lt;/p&gt;

&lt;p&gt;For technical books, simple ASCII characters are often safer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[OK]
[WARNING]
[ERROR]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✅
⚠️
❌
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  14. A Simple Build Command
&lt;/h2&gt;

&lt;p&gt;Once the document is ready, a simple build command might be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pandoc main.md &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--toc&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--toc-depth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--pdf-engine&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;xelatex &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--highlight-style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tango &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; output.pdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives us:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Markdown input&lt;/li&gt;
&lt;li&gt;automatic TOC&lt;/li&gt;
&lt;li&gt;maximum TOC depth of 2&lt;/li&gt;
&lt;li&gt;XeLaTeX PDF generation&lt;/li&gt;
&lt;li&gt;syntax-highlighted code&lt;/li&gt;
&lt;li&gt;PDF output&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  15. Separate the Build Process
&lt;/h2&gt;

&lt;p&gt;Instead of remembering a long command, create a script:&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;-e&lt;/span&gt;

pandoc main.md &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--toc&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--toc-depth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--pdf-engine&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;xelatex &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--highlight-style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tango &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; output.pdf

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"PDF generated: output.pdf"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save it as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;build.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&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="nb"&gt;chmod&lt;/span&gt; +x build.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./build.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes the document reproducible.&lt;/p&gt;




&lt;h2&gt;
  
  
  16. A Better Project Layout
&lt;/h2&gt;

&lt;p&gt;For a larger documentation project, a structure like this works well:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;documentation/
├── assets/
│   ├── architecture.png
│   ├── database.png
│   └── logo.png
├── diagrams/
│   ├── architecture.mmd
│   └── database.mmd
├── chapters/
│   ├── introduction.md
│   ├── installation.md
│   └── deployment.md
├── main.md
├── build.sh
└── output/
    └── documentation.pdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The responsibilities are clear:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chapters/   → Markdown content
diagrams/   → Mermaid source
assets/     → generated/static images
main.md     → document entry point
build.sh    → reproducible build
output/     → generated PDF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  17. The Important Lesson
&lt;/h2&gt;

&lt;p&gt;Pandoc itself is only one part of the pipeline.&lt;/p&gt;

&lt;p&gt;A real Markdown-to-PDF workflow can look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Markdown
   |
   +---- Images
   |
   +---- Code
   |
   +---- Mermaid
   |
   v
Pandoc
   |
   v
XeLaTeX
   |
   v
PDF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When something goes wrong, debug the pipeline one component at a time.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Image missing
    ↓
Check Markdown path

Mermaid missing
    ↓
Check Mermaid conversion

Unicode warning
    ↓
Check font

Code overflowing page
    ↓
Reformat long command

TOC incorrect
    ↓
Check heading hierarchy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This mindset is much more useful than trying random Pandoc options.&lt;/p&gt;




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

&lt;p&gt;Pandoc is powerful because Markdown can remain the source of truth while the final document can be generated in different formats.&lt;/p&gt;

&lt;p&gt;For a reliable technical-documentation workflow, keep the pipeline simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Markdown
    ↓
Pandoc
    ↓
XeLaTeX
    ↓
PDF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And treat external content such as Mermaid diagrams as separate build inputs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mermaid
    ↓
PNG/SVG
    ↓
Markdown
    ↓
Pandoc
    ↓
PDF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key is not finding one giant Pandoc command.&lt;/p&gt;

&lt;p&gt;The key is building a &lt;strong&gt;reproducible document pipeline that is easy to debug&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>pandoc</category>
      <category>mermaid</category>
      <category>pdf</category>
    </item>
    <item>
      <title>Run Simple Web Server On The Spot</title>
      <dc:creator>hardyweb</dc:creator>
      <pubDate>Sun, 02 Aug 2026 07:19:19 +0000</pubDate>
      <link>https://dev.to/hardyweb/run-simple-server-on-the-spot-3eji</link>
      <guid>https://dev.to/hardyweb/run-simple-server-on-the-spot-3eji</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;PHP php &lt;span class="nt"&gt;-S&lt;/span&gt; localhost:8000

PHP &lt;span class="o"&gt;(&lt;/span&gt;public&lt;span class="o"&gt;)&lt;/span&gt;    php &lt;span class="nt"&gt;-S&lt;/span&gt; localhost:8000 &lt;span class="nt"&gt;-t&lt;/span&gt; public

Python  python3 &lt;span class="nt"&gt;-m&lt;/span&gt; http.server 8000

Node    npx serve &lt;span class="nt"&gt;-p&lt;/span&gt; 8000

BusyBox busybox httpd &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 8000

Ruby    ruby &lt;span class="nt"&gt;-run&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; httpd &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 8000

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

&lt;/div&gt;



</description>
      <category>node</category>
      <category>php</category>
      <category>python</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Panduan Teknikal: Compile llama.cpp di Debian 12/13 dan Cross Compile ARM64</title>
      <dc:creator>hardyweb</dc:creator>
      <pubDate>Tue, 14 Jul 2026 07:52:24 +0000</pubDate>
      <link>https://dev.to/hardyweb/panduan-teknikal-compile-llamacpp-di-debian-1213-dan-cross-compile-arm64-1pj3</link>
      <guid>https://dev.to/hardyweb/panduan-teknikal-compile-llamacpp-di-debian-1213-dan-cross-compile-arm64-1pj3</guid>
      <description>&lt;p&gt;&lt;strong&gt;1. Pengenalan&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;llama.cpp ialah runtime inference LLM berasaskan C/C++ yang popular kerana ringan, pantas, dan sesuai untuk menjalankan model GGUF secara local. Ia boleh digunakan pada:&lt;/p&gt;

&lt;p&gt;Server x86_64&lt;br&gt;
Workstation Linux&lt;br&gt;
Mini PC&lt;br&gt;
Raspberry Pi&lt;br&gt;
Orange Pi&lt;br&gt;
SBC ARM64&lt;br&gt;
Container Linux&lt;/p&gt;

&lt;p&gt;Dalam deployment sebenar, terdapat dua pendekatan utama:&lt;/p&gt;

&lt;p&gt;Native build&lt;br&gt;
Compile terus pada mesin yang akan menjalankan llama.cpp.&lt;br&gt;
Cross compile&lt;br&gt;
Compile pada mesin lebih laju (contohnya PC x86_64), tetapi menghasilkan binary untuk platform lain (contohnya ARM64 Orange Pi).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bahagian 1 — Persediaan Debian 12/13&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1.1 Install dependency asas&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="nb"&gt;sudo &lt;/span&gt;apt update

&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    git &lt;span class="se"&gt;\&lt;/span&gt;
    build-essential &lt;span class="se"&gt;\&lt;/span&gt;
    cmake &lt;span class="se"&gt;\&lt;/span&gt;
    ninja-build &lt;span class="se"&gt;\&lt;/span&gt;
    pkg-config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Komponen utama:&lt;/p&gt;

&lt;p&gt;Package Fungsi&lt;br&gt;
git Ambil source code&lt;br&gt;
build-essential GCC, G++, make&lt;br&gt;
cmake   Build configuration&lt;br&gt;
ninja-build Build engine lebih pantas&lt;br&gt;
pkg-config  Cari library dependency&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bahagian 2 — Clone llama.cpp&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/ggml-org/llama.cpp.git

&lt;span class="nb"&gt;cd &lt;/span&gt;llama.cpp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Semak versi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git log &lt;span class="nt"&gt;-1&lt;/span&gt; &lt;span class="nt"&gt;--oneline&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Bahagian 3 — Compile Native (Mesin Sama)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Contoh:&lt;/p&gt;

&lt;p&gt;Debian 12/13 x86_64&lt;br&gt;
Debian ARM64&lt;br&gt;
Orange Pi&lt;br&gt;
Raspberry Pi&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.1 Configure CMake&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Build menggunakan Ninja:

cmake &lt;span class="nt"&gt;-B&lt;/span&gt; build &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-G&lt;/span&gt; Ninja &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-DCMAKE_BUILD_TYPE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Release
3.2 Compile
ninja &lt;span class="nt"&gt;-C&lt;/span&gt; build &lt;span class="nt"&gt;-j&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;nproc&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;atau:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;cmake --build build
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
plaintext&lt;br&gt;
&lt;strong&gt;3.3 Hasil build&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Semak:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ls build/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
plaintext&lt;br&gt;
Contoh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;llama-cli
llama-server
llama-bench
llama-perplexity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
shell&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bahagian 4 — Enable OpenBLAS (Pilihan)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;OpenBLAS boleh membantu operasi matrix CPU.&lt;/p&gt;

&lt;p&gt;Install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install libopenblas-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
cmake&lt;br&gt;
Build:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cmake -B build \
    -G Ninja \
    -DCMAKE_BUILD_TYPE=Release \
    -DGGML_BLAS=ON \
    -DGGML_BLAS_VENDOR=OpenBLAS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
shell&lt;br&gt;
Kemudian:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ninja &lt;span class="nt"&gt;-C&lt;/span&gt; build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nota Penting: CMake Cache&lt;/p&gt;

&lt;p&gt;Jika pernah configure dengan:&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="nt"&gt;-DGGML_BLAS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ON
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;kemudian buang option tersebut, CMake masih menyimpan konfigurasi lama.&lt;/p&gt;

&lt;p&gt;Contoh masalah:&lt;/p&gt;

&lt;p&gt;BLAS not found&lt;br&gt;
missing: BLAS_LIBRARIES&lt;/p&gt;

&lt;p&gt;Penyelesaian:&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="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kemudian configure semula.&lt;/p&gt;

&lt;p&gt;Sentiasa ingat:&lt;/p&gt;

&lt;p&gt;CMakeCache.txt menyimpan konfigurasi lama.&lt;br&gt;
&lt;strong&gt;Bahagian 5 — Cross Compile x86_64 → ARM64&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Contoh:&lt;/p&gt;

&lt;p&gt;PC Debian 12 x86_64&lt;br&gt;
        |&lt;br&gt;
        |&lt;br&gt;
        v&lt;br&gt;
Orange Pi ARM64&lt;/p&gt;

&lt;p&gt;Kelebihan:&lt;/p&gt;

&lt;p&gt;Compile lebih cepat&lt;br&gt;
Tidak membebankan SBC&lt;br&gt;
Sesuai untuk production image&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5.1 Install ARM64 cross compiler&lt;/strong&gt;&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="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    gcc-12-aarch64-linux--gnu&lt;span class="se"&gt;\&lt;/span&gt;
    g++-12-aarch64-linux-gnu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    gcc-13-aarch64-linux--gnu&lt;span class="se"&gt;\&lt;/span&gt;
    g++-13-aarch64-linux-gnu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Semak:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aarch64-linux-gnu-gcc &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5.2 Configure cross build&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Bersihkan dahulu:&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="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; build-arm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kemudian:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cmake"&gt;&lt;code&gt;cmake -B build-arm \
    -G Ninja \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_SYSTEM_NAME=Linux \
    -DCMAKE_SYSTEM_PROCESSOR=aarch64 \
    -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc \
    -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++
5.3 Compile
ninja -C build-arm -j$&lt;span class="p"&gt;(&lt;/span&gt;nproc&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hasil:&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="nb"&gt;ls &lt;/span&gt;build-arm/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Bahagian 6 — Semak Architecture Binary&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Gunakan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;file build-arm/bin/llama-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh output berjaya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ELF 64-bit LSB pie executable,
ARM aarch64,
dynamically linked
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Maksud:&lt;/p&gt;

&lt;p&gt;Output  Maksud&lt;br&gt;
ELF 64-bit  Binary 64-bit&lt;br&gt;
ARM aarch64 Untuk ARM64&lt;br&gt;
dynamically linked  Perlukan shared library&lt;br&gt;
PIE executable  Linux security hardening&lt;br&gt;
Bahagian 7 — Semak Dependency .so&lt;br&gt;
Jangan guna ldd untuk cross binary&lt;/p&gt;

&lt;p&gt;Jika compile ARM64 tetapi check pada PC x86:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ldd llama-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;boleh gagal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;not a dynamic executable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sebab:&lt;/p&gt;

&lt;p&gt;PC:&lt;/p&gt;

&lt;p&gt;x86_64 loader&lt;/p&gt;

&lt;p&gt;Binary:&lt;/p&gt;

&lt;p&gt;ARM64 loader&lt;br&gt;
Gunakan readelf&lt;br&gt;
aarch64-linux-gnu-readelf \&lt;br&gt;
-d build-arm/bin/llama-server | grep NEEDED&lt;/p&gt;

&lt;p&gt;Contoh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Shared library: [libllama.so]
Shared library: [libggml.so]
Shared library: [libstdc++.so.6]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cari semua .so&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;find build-arm &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.so"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;libllama.so
libggml.so
libggml-base.so
libggml-cpu.so
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Semak architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;file build-arm/bin/&lt;span class="k"&gt;*&lt;/span&gt;.so
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ARM aarch64
Bahagian 8 — Dynamic vs Static Binary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Semak:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;file llama-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh dynamic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dynamically linked
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perlu:&lt;/p&gt;

&lt;p&gt;lib*.so&lt;/p&gt;

&lt;p&gt;Contoh static:&lt;/p&gt;

&lt;p&gt;statically linked&lt;/p&gt;

&lt;p&gt;Tidak perlu .so.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bahagian 9 — Installation ke Linux&lt;/strong&gt;&lt;br&gt;
Pilihan standard&lt;/p&gt;

&lt;p&gt;Binary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/usr/local/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Library:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/usr/local/lib
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh:&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="nb"&gt;sudo cp &lt;/span&gt;llama-server /usr/local/bin/
&lt;span class="nb"&gt;sudo cp &lt;/span&gt;llama-cli /usr/local/bin/

&lt;span class="nb"&gt;sudo cp&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;.so /usr/local/lib/

&lt;span class="nb"&gt;sudo &lt;/span&gt;ldconfig
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pilihan appliance / embedded&lt;/p&gt;

&lt;p&gt;Untuk SBC:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/opt/llama.cpp/

    llama-server
    llama-cli
    libllama.so
    libggml.so
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kemudian:&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="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/opt/llama.cpp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sesuai untuk:&lt;/p&gt;

&lt;p&gt;Orange Pi&lt;br&gt;
kiosk AI&lt;br&gt;
edge inference node&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bahagian 10 — Deploy ke Orange Pi&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Copy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;scp build-arm/bin/llama-server &lt;span class="se"&gt;\&lt;/span&gt;
orangepi:/usr/local/bin/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;scp build-arm/bin/llama-cli &lt;span class="se"&gt;\&lt;/span&gt;
orangepi:/usr/local/bin/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika perlu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;scp build-arm/bin/&lt;span class="k"&gt;*&lt;/span&gt;.so &lt;span class="se"&gt;\&lt;/span&gt;
orangepi:/usr/local/lib/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pada Orange Pi:&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="nb"&gt;sudo &lt;/span&gt;ldconfig
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Semak:&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="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aarch64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Bahagian 11 — Cadangan Production Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Untuk sistem AI agent:&lt;/p&gt;

&lt;p&gt;+----------------+&lt;br&gt;
| Go Agent       |&lt;br&gt;
| Tool Router    |&lt;br&gt;
+-------+--------+&lt;br&gt;
        |&lt;br&gt;
        |&lt;br&gt;
 HTTP API&lt;br&gt;
        |&lt;br&gt;
        v&lt;br&gt;
+----------------+&lt;br&gt;
| llama-server   |&lt;br&gt;
| llama.cpp      |&lt;br&gt;
+----------------+&lt;br&gt;
        |&lt;br&gt;
        |&lt;br&gt;
      GGUF&lt;br&gt;
      Model&lt;/p&gt;

&lt;p&gt;Kelebihan:&lt;/p&gt;

&lt;p&gt;Go agent tidak perlu embed model&lt;br&gt;
Model boleh tukar tanpa rebuild&lt;br&gt;
llama.cpp boleh upgrade sendiri&lt;br&gt;
Mudah scale ke banyak node&lt;br&gt;
Kesimpulan&lt;/p&gt;

&lt;p&gt;Workflow yang stabil:&lt;/p&gt;

&lt;p&gt;Native&lt;br&gt;
cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release&lt;/p&gt;

&lt;p&gt;ninja -C build&lt;br&gt;
Cross Compile ARM64&lt;br&gt;
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu&lt;/p&gt;

&lt;p&gt;rm -rf build-arm&lt;/p&gt;

&lt;p&gt;cmake -B build-arm \&lt;br&gt;
-G Ninja \&lt;br&gt;
-DCMAKE_SYSTEM_NAME=Linux \&lt;br&gt;
-DCMAKE_SYSTEM_PROCESSOR=aarch64 \&lt;br&gt;
-DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc \&lt;br&gt;
-DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++&lt;/p&gt;

&lt;p&gt;ninja -C build-arm&lt;br&gt;
Verification&lt;br&gt;
file llama-server&lt;/p&gt;

&lt;p&gt;aarch64-linux-gnu-readelf -d llama-server | grep NEEDED&lt;/p&gt;

&lt;p&gt;find . -name "*.so"&lt;/p&gt;

&lt;p&gt;Dengan proses ini, satu mesin Debian 12/13 boleh menjadi build server untuk menghasilkan node AI ARM64 seperti Orange Pi, Raspberry Pi, atau edge inference appliance.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>linux</category>
      <category>llm</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Kaedah Saliran Pasif Menggunakan Struktur Sumbu Kapilari Berasaskan Cable Tie</title>
      <dc:creator>hardyweb</dc:creator>
      <pubDate>Tue, 23 Jun 2026 02:56:10 +0000</pubDate>
      <link>https://dev.to/hardyweb/kaedah-saliran-pasif-menggunakan-struktur-sumbu-kapilari-berasaskan-cable-tie-2o7o</link>
      <guid>https://dev.to/hardyweb/kaedah-saliran-pasif-menggunakan-struktur-sumbu-kapilari-berasaskan-cable-tie-2o7o</guid>
      <description>&lt;ol&gt;
&lt;li&gt;Abstrak&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Dokumen ini membentangkan satu mekanisme saliran pasif berskala mikro menggunakan cable tie yang dibentuk sebagai struktur gelung (loop) untuk bertindak sebagai medium sumbu kapilari. Sistem ini membolehkan pemindahan air dari takungan ke saluran keluar melalui gabungan tindakan kapilari, adhesi, kohesi, serta graviti tanpa penggunaan tenaga luaran.&lt;/p&gt;

&lt;p&gt;Kaedah ini sesuai untuk aplikasi DIY, pengurusan air bertakung kecil, serta demonstrasi pendidikan dalam bidang mekanik bendalir.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Latar Belakang Masalah&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Dalam sistem saliran berskala kecil, kegagalan aliran sering berlaku walaupun terdapat perbezaan aras cecair yang sepatutnya mencukupi secara teori. Antara punca utama:&lt;/p&gt;

&lt;p&gt;Pembentukan air lock dalam saluran kecil&lt;br&gt;
Tegangan permukaan menghalang kemasukan awal bendalir&lt;br&gt;
Ketiadaan medium “wetting path” awal untuk memulakan aliran&lt;br&gt;
Ketidakstabilan aliran pada bukaan kecil (intermittent flow)&lt;/p&gt;

&lt;p&gt;Fenomena ini menyebabkan sistem gagal “start flow” walaupun graviti tersedia.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Objektif
Menyediakan mekanisme saliran pasif tanpa tenaga luaran
Mengatasi masalah permulaan aliran (flow initiation problem)
Mengurangkan kesan air lock dan tegangan permukaan
Mewujudkan laluan basah berterusan sebagai pemangkin aliran&lt;/li&gt;
&lt;li&gt;Prinsip Fizik Terlibat
4.1 Graviti&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Mendorong aliran akhir dari kawasan berpotensi tinggi ke rendah.&lt;/p&gt;

&lt;p&gt;4.2 Tekanan Hidrostatik&lt;br&gt;
P=ρgh&lt;/p&gt;

&lt;p&gt;Perbezaan aras cecair menghasilkan tekanan pendorong aliran.&lt;/p&gt;

&lt;p&gt;4.3 Tegangan Permukaan&lt;/p&gt;

&lt;p&gt;Menentang kemasukan air ke dalam bukaan kecil tanpa bantuan awal.&lt;/p&gt;

&lt;p&gt;4.4 Tindakan Kapilari&lt;br&gt;
 h∝r1​&lt;br&gt;
    ​&lt;/p&gt;

&lt;p&gt;Air merambat melalui permukaan kabel berdasarkan interaksi molekul.&lt;/p&gt;

&lt;p&gt;4.5 Adhesi &amp;amp; Kohesi&lt;br&gt;
Adhesi: air melekat pada permukaan cable tie&lt;br&gt;
Kohesi: molekul air mengekalkan kesinambungan aliran&lt;br&gt;
4.6 Interaksi Multi-Fasa&lt;/p&gt;

&lt;p&gt;Peralihan daripada fasa “wetting initiation” → “continuous flow”&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reka Bentuk Sistem&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sistem terdiri daripada cable tie yang dibentuk menjadi gelung dan diposisikan merentasi lubang saliran.&lt;/p&gt;

&lt;p&gt;Ciri reka bentuk:&lt;/p&gt;

&lt;p&gt;Gelung separa terendam dalam takungan&lt;br&gt;
Titik sentuhan di kawasan lubang bertindak sebagai “wick transfer point”&lt;br&gt;
Kepala cable tie bertindak sebagai pengunci mekanikal&lt;br&gt;
Skema Konsep&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fafpqihxir5dadvu56w1k.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fafpqihxir5dadvu56w1k.png" alt=" " width="800" height="470"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Mekanisme Operasi&lt;br&gt;
Air bersentuhan dengan permukaan cable tie&lt;br&gt;
Molekul air membentuk lapisan awal melalui adhesi&lt;br&gt;
Laluan basah terbentuk sepanjang gelung (capillary propagation)&lt;br&gt;
Air mencapai titik lubang saliran&lt;br&gt;
Graviti mengambil alih dan mengekalkan aliran berterusan&lt;br&gt;
Sistem mencapai keadaan steady-state micro flow&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ciri Sistem&lt;br&gt;
Tanpa tenaga elektrik&lt;br&gt;
Kos hampir sifar&lt;br&gt;
Struktur mudah dan boleh diulang&lt;br&gt;
Boleh dipasang tanpa modifikasi besar sistem asal&lt;br&gt;
Sesuai untuk prototaip pantas (rapid prototyping)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Had Sistem&lt;br&gt;
Aliran rendah (micro-scale throughput)&lt;br&gt;
Sensitif kepada minyak, habuk, dan kontaminasi permukaan&lt;br&gt;
Tidak sesuai untuk volum besar&lt;br&gt;
Prestasi bergantung pada material (surface energy &amp;amp; roughness)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Aplikasi Potensi&lt;br&gt;
Sistem saliran air hujan mikro&lt;br&gt;
Sistem tanaman pasif (hybrid wicking-drainage)&lt;br&gt;
Pengurusan kondensasi (AC / cooling drip control)&lt;br&gt;
Demonstrasi fizik bendalir untuk pendidikan STEM&lt;br&gt;
Prototaip sistem IoT pasif (no-power fluid indicator)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Kesimpulan&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Kaedah ini menunjukkan bahawa sistem saliran mikro tidak bergantung sepenuhnya kepada graviti, tetapi kepada interaksi kompleks antara tegangan permukaan, kapilari, dan sifat bahan.&lt;/p&gt;

&lt;p&gt;Struktur gelung cable tie bertindak sebagai “capillary bridge” yang menstabilkan permulaan aliran, sekaligus mengatasi masalah air lock dalam sistem bukaan kecil.&lt;/p&gt;

</description>
      <category>stem</category>
      <category>fizik</category>
      <category>bendalir</category>
      <category>kejuruteraan</category>
    </item>
    <item>
      <title>Setting Incus S3 Storage Locally</title>
      <dc:creator>hardyweb</dc:creator>
      <pubDate>Wed, 06 May 2026 07:50:50 +0000</pubDate>
      <link>https://dev.to/hardyweb/setting-incus-s3-storage-locally-499b</link>
      <guid>https://dev.to/hardyweb/setting-incus-s3-storage-locally-499b</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;incus config &lt;span class="nb"&gt;set &lt;/span&gt;core.storage_buckets_address&lt;span class="o"&gt;=&lt;/span&gt;:8555
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;incus storage list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;let say , storage list set as default&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;incus storage bucket create default backup
Storage bucket "backup" created
Admin access key: 4Z0EDQO8J23CCMHBAVXJ
Admin secret key: 9mGM1HTP+9IdhJ9Sv/jx7oQnSM36O92+Rcjae1pE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mc &lt;span class="nb"&gt;alias set &lt;/span&gt;incus https://127.0.0.1:8555 4Z0EDQO8J23CCMHBAVXJ  9mGM1HTP+9IdhJ9Sv/jx7oQnSM36O92+Rcjae1pE   &lt;span class="nt"&gt;--insecure&lt;/span&gt; &lt;span class="nt"&gt;--api&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;S3v4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mc &lt;span class="nb"&gt;cp &lt;/span&gt;linux.png incus/backup &lt;span class="nt"&gt;--insecure&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mc &lt;span class="nb"&gt;ls &lt;/span&gt;incus/backup &lt;span class="nt"&gt;--insecure&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;jika mahu guna server.crt dari incus . ini untuk internal infra sahaja.&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="nb"&gt;cp&lt;/span&gt; /var/lib/incus/server.crt ~/incus-ca.crt 
&lt;span class="nb"&gt;sudo cp&lt;/span&gt; ~/incus-ca.crt /usr/local/share/ca-certificates/incus-ca.crt
&lt;span class="nb"&gt;sudo &lt;/span&gt;update-ca-certificate
mc &lt;span class="nb"&gt;alias set &lt;/span&gt;incus https://127.0.0.1:8555 4Z0EDQO8J23CCMHBAVXJ  9mGM1HTP+9IdhJ9Sv/jx7oQnSM36O92+Rcjae1pE   &lt;span class="nt"&gt;--api&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;S3v4
mc &lt;span class="nb"&gt;cp &lt;/span&gt;linux.png incus/backup
mc &lt;span class="nb"&gt;ls &lt;/span&gt;incus/backup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>incus</category>
      <category>s3</category>
      <category>storage</category>
    </item>
    <item>
      <title>Cross Platform Application</title>
      <dc:creator>hardyweb</dc:creator>
      <pubDate>Thu, 25 Dec 2025 06:09:30 +0000</pubDate>
      <link>https://dev.to/hardyweb/cross-platform-application-493n</link>
      <guid>https://dev.to/hardyweb/cross-platform-application-493n</guid>
      <description>&lt;h1&gt;
  
  
  Cross Platform application
&lt;/h1&gt;

&lt;p&gt;Membangunkan aplikasi merentas beberapa platform seperti Linux dan Windows agak mencabor jugok lah, ia &lt;br&gt;
bukan dalam bentuk native, tapi dalam bentuk web apps. &lt;/p&gt;
&lt;h2&gt;
  
  
  Image Optimizer
&lt;/h2&gt;

&lt;p&gt;Aku ada bangunkan satu aplikasi menggunakan golang yang boleh dijalankan dalam linux dan windows, &lt;br&gt;
cabaran dia adalah, bila run dalam Linux, semua fungsi ok, tapi bila run di dalam windows. ada beberapa &lt;br&gt;
fungsi tidak jalan&lt;/p&gt;
&lt;h2&gt;
  
  
  Path
&lt;/h2&gt;

&lt;p&gt;Ia berkait dengan path , dalam linux , semua program disimpan dalam /usr/bin atau usr/local/bin manakala &lt;br&gt;
dalam windows pula, semua program diinstall dalam c:\Program Files. &lt;/p&gt;

&lt;p&gt;Jika kita perasan, slash dan back slash dalam linux dan windows pun boleh menyebabkan ada path yang tidak djumpai. &lt;br&gt;
jadi kena ada satu fungsi penyesuaian untuk membaca path tersebut.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;
&lt;span class="c"&gt;// kena buat satu manipulasi dalam folder windows bernama bin dan kemudian letak nama program &lt;/span&gt;
&lt;span class="c"&gt;// &lt;/span&gt;
   &lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;binPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;runtime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GOOS&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"windows"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;filepath&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"bin"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s"&gt;".exe"&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;



</description>
      <category>go</category>
      <category>linux</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Neovim 0.12 autocomplete and native plugin manager for laravel and go</title>
      <dc:creator>hardyweb</dc:creator>
      <pubDate>Mon, 13 Oct 2025 07:58:54 +0000</pubDate>
      <link>https://dev.to/hardyweb/neovim-012-native-autocomplete-and-native-plugin-manager-for-laravel-and-go-5ccp</link>
      <guid>https://dev.to/hardyweb/neovim-012-native-autocomplete-and-native-plugin-manager-for-laravel-and-go-5ccp</guid>
      <description>&lt;p&gt;update 3/12/2025 &lt;/p&gt;

&lt;p&gt;mason has changed their url &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mason-org/mason.nvim" rel="noopener noreferrer"&gt;https://github.com/mason-org/mason.nvim&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mason-org/mason-lspconfig.nvim" rel="noopener noreferrer"&gt;https://github.com/mason-org/mason-lspconfig.nvim&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;create init.lua file inside .config/nvim , but before that, please back up  all configuration files and folders first.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;--  NeoVim 0.12+ Native Pack + LSP Config&lt;/span&gt;
&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;

&lt;span class="c1"&gt;-- Bootstrap plugins (native pack)&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/williamboman/mason.nvim.git"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/neovim/nvim-lspconfig.git"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/nvim-treesitter/nvim-treesitter.git"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;":TSUpdate"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/hrsh7th/nvim-cmp.git"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/hrsh7th/cmp-nvim-lsp.git"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/hrsh7th/cmp-buffer.git"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/L3MON4D3/LuaSnip.git"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/saghen/blink.cmp.git"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/echasnovski/mini.pairs.git"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/echasnovski/mini.icons.git"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/nvim-lualine/lualine.nvim.git"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/ibhagwan/fzf-lua.git"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/nvim-tree/nvim-web-devicons.git"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/folke/tokyonight.nvim.git"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/akinsho/toggleterm.nvim.git"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;--  Mason setup&lt;/span&gt;
&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"mason"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;--  LSP (New Native API)&lt;/span&gt;
&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;lsp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lsp&lt;/span&gt;

&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;servers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"lua_ls"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"html"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"intelephense"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"ts_ls"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"gopls"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"pyright"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;ipairs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;servers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;lsp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;capabilities&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"cmp_nvim_lsp"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;default_capabilities&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;settings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="n"&gt;lsp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;enable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;--  Autocompletion (nvim-cmp + blink)&lt;/span&gt;
&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;cmp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"cmp"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;cmp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="n"&gt;mapping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cmp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mapping&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;preset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;CR&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cmp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mapping&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nb"&gt;select&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;Tab&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cmp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mapping&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;select_next_item&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;S-Tab&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cmp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mapping&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;select_prev_item&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="n"&gt;sources&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"nvim_lsp"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"buffer"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;experimental&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;ghost_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nb"&gt;pcall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"blink.cmp"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;--  Treesitter (Syntax Highlight)&lt;/span&gt;
&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"nvim-treesitter.configs"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="n"&gt;ensure_installed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"lua"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"php"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"blade"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"html"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"javascript"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"go"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;highlight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;enable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;--  UI &amp;amp; Aesthetic&lt;/span&gt;
&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;colorscheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"tokyonight"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"lualine"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;theme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"tokyonight"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"mini.pairs"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"mini.icons"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"nvim-web-devicons"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"toggleterm"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;open_mapping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;[[&amp;lt;c-\&amp;gt;]]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;-- Default: Ctrl + \&lt;/span&gt;
    &lt;span class="n"&gt;shade_terminals&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;shading_factor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;direction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"float"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;-- or 'horizontal' / 'vertical' / 'tab'&lt;/span&gt;
    &lt;span class="n"&gt;float_opts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;border&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"curved"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;winblend&lt;/span&gt; &lt;span class="o"&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="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;-- Helper: Toggle lazygit (if installed)&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;Terminal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"toggleterm.terminal"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;Terminal&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;lazygit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Terminal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"lazygit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hidden&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;direction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"float"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;_lazygit_toggle&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;lazygit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;toggle&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;-- Keymaps for ToggleTerm&lt;/span&gt;

&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;--  Display Settings&lt;/span&gt;
&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relativenumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cursorline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;signcolumn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"yes"&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;termguicolors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scrolloff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sidescrolloff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;

&lt;span class="c1"&gt;-- Dynamic relative numbers (like LazyVim)&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nvim_create_autocmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"InsertEnter"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;callback&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relativenumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nvim_create_autocmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"InsertLeave"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;callback&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relativenumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;--  Clipboard Integration (WSL)&lt;/span&gt;
&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;-- Yank to Windows clipboard (requires `clip.exe` in WSL)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"wsl"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nvim_create_autocmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"TextYankPost"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;callback&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"clip.exe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getreg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'"'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clipboard&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"unnamedplus"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;--  Diagnostics / Auto Lint + Format&lt;/span&gt;
&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;diagnostic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="n"&gt;virtual_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ΓùÅ"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;signs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;underline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;update_in_insert&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="n"&gt;severity_sort&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;lsp_format_group&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nvim_create_augroup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"LspAutoFormat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;clear&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nvim_create_autocmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"BufWritePre"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lsp_format_group&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;callback&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lsp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_clients&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="n"&gt;bufnr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt; &lt;span class="p"&gt;})[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;supports_method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"textDocument/formatting"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
            &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lsp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="n"&gt;async&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="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;--  Keymaps&lt;/span&gt;
&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mapleader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;" "&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;maplocalleader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;" "&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;keymap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;noremap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;silent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;-- LazyVim-style FZF bindings&lt;/span&gt;
&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;ff"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"fzf-lua"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Find files"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unpack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;fg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"fzf-lua"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;live_grep&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Live grep"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unpack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;fb"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"fzf-lua"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;buffers&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Find buffers"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unpack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;fh"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"fzf-lua"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;help_tags&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Find help"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unpack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;-- Format &amp;amp; Diagnostics&lt;/span&gt;
&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;lf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lsp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="n"&gt;async&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Format file"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unpack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;ld"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;diagnostic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open_float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Show diagnostics"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unpack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;ln"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;diagnostic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;goto_next&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Next diagnostic"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unpack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;lp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;diagnostic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;goto_prev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Prev diagnostic"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unpack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;-- Quick actions&lt;/span&gt;
&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;w"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;cmd&amp;gt;w&amp;lt;CR&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Save file"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unpack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;q"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;cmd&amp;gt;q&amp;lt;CR&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Quit Neovim"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unpack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;ft"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;cmd&amp;gt;ToggleTerm&amp;lt;CR&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Toggle terminal"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;fu"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;cmd&amp;gt;lua _lazygit_toggle()&amp;lt;CR&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Toggle Lazygit (if available)"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"t"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;Esc&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;[[&amp;lt;C-\&amp;gt;&amp;lt;C-n&amp;gt;]]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Exit terminal mode"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;bb"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;cmd&amp;gt;bnext&amp;lt;CR&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Next buffer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unpack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;bp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;cmd&amp;gt;bprevious&amp;lt;CR&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Previous buffer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unpack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;bd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;cmd&amp;gt;bd&amp;lt;CR&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Delete current buffer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unpack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opts&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;--  NeoVim 0.12+ Native LSP (no cmp)&lt;/span&gt;
&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;

&lt;span class="c1"&gt;-- Basic editor settings&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relativenumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tabstop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;softtabstop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"set completeopt+=noselect"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;--  Plugins (native vim.pack)&lt;/span&gt;
&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/neovim/nvim-lspconfig"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/mason-org/mason.nvim"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/mason-org/mason-lspconfig.nvim"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/WhoIsSethDaniel/mason-tool-installer.nvim"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;--  Mason setup&lt;/span&gt;
&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"mason"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"mason-lspconfig"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"mason-tool-installer"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="n"&gt;ensure_installed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;-- Core language servers&lt;/span&gt;
        &lt;span class="s2"&gt;"lua_ls"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"html"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"cssls"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"intelephense"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"emmet_ls"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="c1"&gt;--"gopls",&lt;/span&gt;

        &lt;span class="c1"&gt;-- Formatters / tools&lt;/span&gt;
        &lt;span class="s2"&gt;"stylua"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"blade-formatter"&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;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;--  LSP Configurations&lt;/span&gt;
&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;

&lt;span class="c1"&gt;-- Lua (for Neovim config)&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lsp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"lua_ls"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;settings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Lua&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;runtime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"LuaJIT"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="n"&gt;diagnostics&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;globals&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"vim"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"require"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="n"&gt;workspace&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;library&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nvim_get_runtime_file&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="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="n"&gt;telemetry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;enable&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="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;-- HTML&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lsp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"html"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;filetypes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"html"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"blade"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"php"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;init_options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;provideFormatter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;-- CSS&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lsp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"cssls"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;settings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;css&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;validate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;scss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;validate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;less&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;validate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&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;-- PHP (Intelephense)&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lsp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"intelephense"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;filetypes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"php"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"blade"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;settings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;intelephense&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;environment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;includePaths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"routes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"resources/views"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;maxSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="n"&gt;stubs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"apache"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"bcmath"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"bz2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"calendar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"Core"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"curl"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"date"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"dom"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"fileinfo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"filter"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"ftp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"gd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"hash"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"iconv"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"libxml"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"mbstring"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"openssl"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"pcre"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"PDO"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"pdo_mysql"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"Phar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"readline"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"Reflection"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"session"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"SimpleXML"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"sockets"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"sodium"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"standard"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"tokenizer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"xml"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"xmlreader"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"xmlwriter"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"zip"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"zlib"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"laravel"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"wordpress"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"woocommerce"&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="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;-- Laravel Blade (via emmet + formatter)&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lsp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"emmet_ls"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;filetypes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"html"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"css"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"blade"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"php"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;init_options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"bem.enabled"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&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;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;--  Native autocompletion trigger&lt;/span&gt;
&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nvim_create_autocmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"LspAttach"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;callback&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lsp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_client_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;client_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;~=&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;supports_method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"textDocument/completion"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
            &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lsp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;enable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;autotrigger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&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;Ini yang terbaharu, telah dioptimize ke 155ms load.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;--  NeoVim 0.12+ Native Pack + LSP Config, optimize  with load 155ms&lt;/span&gt;
&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;

&lt;span class="c1"&gt;-- Bootstrap plugins (native pack)&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/williamboman/mason.nvim.git"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/williamboman/mason-lspconfig.nvim.git"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="c1"&gt;-- Γ£à Added&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/neovim/nvim-lspconfig.git"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/nvim-treesitter/nvim-treesitter.git"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="n"&gt;build&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;":TSUpdate"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/hrsh7th/nvim-cmp.git"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/hrsh7th/cmp-nvim-lsp.git"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/hrsh7th/cmp-buffer.git"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/L3MON4D3/LuaSnip.git"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/echasnovski/mini.pairs.git"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/echasnovski/mini.icons.git"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/nvim-lualine/lualine.nvim.git"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/ibhagwan/fzf-lua.git"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/folke/tokyonight.nvim.git"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/akinsho/toggleterm.nvim.git"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="c1"&gt;-- Γ¥î Removed nvim-web-devicons (using mini.icons instead)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;--  Mason setup&lt;/span&gt;
&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"mason"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"mason-lspconfig"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="c1"&gt;-- ensure_installed = { "lua_ls", "html", "intelephense", "ts_ls", "gopls", "pyright" },&lt;/span&gt;

&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;--  Autocompletion (nvim-cmp) ΓÇö must come BEFORE LSP config&lt;/span&gt;
&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;cmp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"cmp"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;luasnip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"luasnip"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"luasnip.loaders.from_vscode"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;lazy_load&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;-- optional: load VS Code snippets&lt;/span&gt;

&lt;span class="n"&gt;cmp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="n"&gt;snippet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;expand&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;luasnip&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lsp_expand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;mapping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cmp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mapping&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;preset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;CR&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cmp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mapping&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nb"&gt;select&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;Tab&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cmp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mapping&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;select_next_item&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;S-Tab&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cmp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mapping&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;select_prev_item&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="n"&gt;sources&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"nvim_lsp"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"luasnip"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="c1"&gt;-- Γ£à Added&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"buffer"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;experimental&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;ghost_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;--  LSP (New Native API)&lt;/span&gt;
&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;lsp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lsp&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;capabilities&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"cmp_nvim_lsp"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;default_capabilities&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;-- Γ£à Now safe to call&lt;/span&gt;

&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;servers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"lua_ls"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"html"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"intelephense"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"ts_ls"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"gopls"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"pyright"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;ipairs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;servers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;lsp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;capabilities&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;settings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="n"&gt;lsp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;enable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;-- Optional: enhance lua_ls&lt;/span&gt;
&lt;span class="n"&gt;lsp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"lua_ls"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;settings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Lua&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;diagnostics&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;globals&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"vim"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="n"&gt;workspace&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;checkThirdParty&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="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;--  Treesitter (Syntax Highlight)&lt;/span&gt;
&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"nvim-treesitter.configs"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="n"&gt;ensure_installed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"lua"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"php"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"blade"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"html"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"javascript"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"go"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;highlight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;enable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;--  UI &amp;amp; Aesthetic&lt;/span&gt;
&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;colorscheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"tokyonight"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;-- Γ£à Mock nvim-web-devicons for compatibility&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"mini.icons"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"mini.icons"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;mock_nvim_web_devicons&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"lualine"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;theme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"tokyonight"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"mini.pairs"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"toggleterm"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;open_mapping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;[[&amp;lt;c-\&amp;gt;]]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;shade_terminals&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;shading_factor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;direction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"float"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;float_opts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;border&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"curved"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;winblend&lt;/span&gt; &lt;span class="o"&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;-- Helper: Toggle lazygit (if installed)&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;Terminal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"toggleterm.terminal"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;Terminal&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;lazygit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Terminal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"lazygit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hidden&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;direction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"float"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;_lazygit_toggle&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;lazygit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;toggle&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;--  Display Settings&lt;/span&gt;
&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relativenumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cursorline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;signcolumn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"yes"&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;termguicolors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scrolloff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sidescrolloff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;

&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;--  Clipboard Integration (WSL)&lt;/span&gt;
&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;--if vim.fn.has("wsl") == 1 then&lt;/span&gt;
&lt;span class="c1"&gt;--  vim.api.nvim_create_autocmd("TextYankPost", {&lt;/span&gt;
&lt;span class="c1"&gt;--      callback = function()&lt;/span&gt;
&lt;span class="c1"&gt;--          vim.fn.system("clip.exe", vim.fn.getreg('"'))&lt;/span&gt;
&lt;span class="c1"&gt;--      end,&lt;/span&gt;
&lt;span class="c1"&gt;--  })&lt;/span&gt;
&lt;span class="c1"&gt;--  vim.opt.clipboard = "unnamedplus"&lt;/span&gt;
&lt;span class="c1"&gt;--end&lt;/span&gt;


&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;--  Clipboard Integration (WSL - Lazy load)&lt;/span&gt;
&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"wsl"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="c1"&gt;-- Simple manual yank -&amp;gt; clip.exe&lt;/span&gt;
    &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nvim_create_autocmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"TextYankPost"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;callback&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"clip.exe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getreg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'"'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="c1"&gt;-- Defer clipboard provider to load after UI ready (for speed)&lt;/span&gt;
    &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nvim_create_autocmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"VimEnter"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;once&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;callback&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;defer_fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clipboard&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"unnamedplus"&lt;/span&gt;
            &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;-- delay 300ms after startup&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;--  Diagnostics / Auto Lint + Format&lt;/span&gt;
&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;diagnostic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="n"&gt;virtual_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ΓùÅ"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;signs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;underline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;update_in_insert&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="n"&gt;severity_sort&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;-- Auto format before save&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;lsp_format_group&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nvim_create_augroup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"LspAutoFormat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;clear&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nvim_create_autocmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"BufWritePre"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lsp_format_group&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;callback&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lsp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_clients&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="n"&gt;bufnr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt; &lt;span class="p"&gt;})[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;supports_method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"textDocument/formatting"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
            &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lsp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="n"&gt;async&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="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;--  Keymaps&lt;/span&gt;
&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mapleader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;" "&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;maplocalleader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;" "&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;keymap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;noremap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;silent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;-- FZF&lt;/span&gt;
&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;ff"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"fzf-lua"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;fg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"fzf-lua"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;live_grep&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;fb"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"fzf-lua"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;buffers&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;fh"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"fzf-lua"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;help_tags&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;-- Format &amp;amp; Diagnostics&lt;/span&gt;
&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;lf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lsp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="n"&gt;async&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;ld"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;diagnostic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open_float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;ln"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;diagnostic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;goto_next&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;lp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;diagnostic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;goto_prev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;-- Quick actions&lt;/span&gt;
&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;w"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;cmd&amp;gt;w&amp;lt;CR&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;q"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;cmd&amp;gt;q&amp;lt;CR&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;ft"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;cmd&amp;gt;ToggleTerm&amp;lt;CR&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;fu"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;cmd&amp;gt;lua _lazygit_toggle()&amp;lt;CR&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"t"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;Esc&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;[[&amp;lt;C-\&amp;gt;&amp;lt;C-n&amp;gt;]]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;-- Buffer navigation&lt;/span&gt;
&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;bb"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;cmd&amp;gt;bnext&amp;lt;CR&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;bp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;cmd&amp;gt;bprevious&amp;lt;CR&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;bd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;cmd&amp;gt;bd&amp;lt;CR&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;--  Memory Watcher&lt;/span&gt;
&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;timer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new_timer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;win&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;buf&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;create_win&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;buf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nvim_create_buf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;relative&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"editor"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;style&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"minimal"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;border&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"rounded"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;win&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nvim_open_win&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;update_mem&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;resident_set_memory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;
    &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;sign&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;diff&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="ow"&gt;and&lt;/span&gt; &lt;span class="s2"&gt;"+"&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="s2"&gt;"-"&lt;/span&gt;
    &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;string.format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Mem: %.2f MB"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nb"&gt;string.format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Change: %s%.2f MB"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sign&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;math.abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nvim_buf_set_lines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nvim_create_user_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"MemWatch"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;win&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nvim_win_is_valid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;win&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;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Memory watcher already running"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="n"&gt;create_win&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;schedule_wrap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;update_mem&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"MemoryWarning Memory watcher started"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;

&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nvim_create_user_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"MemWatchStop"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;win&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nvim_win_is_valid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;win&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
        &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nvim_win_close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;win&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"MemoryWarning Memory watcher stopped"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;

&lt;span class="c1"&gt;-- Auto-stop memory watcher on exit&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nvim_create_autocmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"VimLeavePre"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;callback&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nb"&gt;pcall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MemWatchStop&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="c1"&gt;--  Plugin Update Helper&lt;/span&gt;
&lt;span class="c1"&gt;-- =========================================&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nvim_create_user_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"PackUpdate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"≡ƒöä Updating plugins..."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Γ£à Plugins updated!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Update all plugins (vim.pack)"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;pu"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;cmd&amp;gt;PackUpdate&amp;lt;CR&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;noremap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;silent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

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

&lt;/div&gt;



</description>
      <category>neovim</category>
      <category>laravel</category>
      <category>go</category>
    </item>
    <item>
      <title>Golang Binary Compile arm64</title>
      <dc:creator>hardyweb</dc:creator>
      <pubDate>Fri, 22 Aug 2025 23:02:42 +0000</pubDate>
      <link>https://dev.to/hardyweb/golang-binary-compile-arm64-38gn</link>
      <guid>https://dev.to/hardyweb/golang-binary-compile-arm64-38gn</guid>
      <description>&lt;p&gt;Basic cross-compile&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GOOS=linux GOARCH=arm64 go build -o nama_sistem_arm64 main.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Strip debug info (reduce size)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GOOS=linux GOARCH=arm64 go build -ldflags="-s -w" -o nama_sistem_arm64 main.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enable optimizations&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GOOS=linux GOARCH=arm64 go build -ldflags="-s -w" -trimpath -o nama_sistem_arm64 main.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reproducible build (consistent hash)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GOOS=linux GOARCH=arm64 go build -ldflags="-s -w" -trimpath -buildvcs=false -o nama_sistem_arm64 main.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Extra: compress with UPX (optional)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;upx --best --lzma nama_sistem_arm64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>go</category>
      <category>programming</category>
      <category>snippet</category>
      <category>linux</category>
    </item>
    <item>
      <title>Projek Jawi Converter: Belajar Golang Sambil Mendigitalkan Warisan Bahasa</title>
      <dc:creator>hardyweb</dc:creator>
      <pubDate>Tue, 19 Aug 2025 14:17:05 +0000</pubDate>
      <link>https://dev.to/hardyweb/projek-jawi-converter-belajar-golang-sambil-mendigitalkan-warisan-bahasa-1p1a</link>
      <guid>https://dev.to/hardyweb/projek-jawi-converter-belajar-golang-sambil-mendigitalkan-warisan-bahasa-1p1a</guid>
      <description>&lt;p&gt;Aku percaya bahawa, cara terbaik untuk belajar bahasa pengaturcaraan baru adalah dengan membangunkan projek kecil yang praktikal. Untuk projek kali ini,  membangunkan tools Rumi ke Jawi Converter di jawi.hardyweb.net dengan bahasa pengaturcaran Golang.&lt;/p&gt;

&lt;p&gt;Selain Jawi, aku juga pernah buat projek seperti QR Code generator, mod_sec_audit parser, dan parser Waktu Solat dari e-solat.gov.my. Semua projek ni kecil tapi memberi pengalaman langsung dalam bermain dengan fungsi string manipulation, API integration, dan text processing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Idea Projek &amp;amp; Perbualan Dengan AI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pada mulanya, aku tanya GPT:&lt;br&gt;
“Boleh tak buat Jawi converter guna Golang?”&lt;/p&gt;

&lt;p&gt;Cadangan GPT ialah:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Mapping Huruf – setiap huruf Rumi dipetakan kepada huruf Jawi/Hijaiyah.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Special Words / Daftar Kata – perkataan yang ejaannya unik atau tidak tepat jika mapping, akan disimpan dalam pangkalan data untuk digunakan kembali. &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Contoh Mapping Huruf&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%2Frvn0muugdw5lsaa2fs4k.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%2Frvn0muugdw5lsaa2fs4k.png" alt=" " width="423" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mapping ni terus menukar huruf satu-per-satu.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Special Words&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Special words digunakan untuk perkataan yang mapping huruf biasa tidak menghasilkan bunyi atau ejaan tepat. Contohnya:&lt;br&gt;
specialWords := map[string]string{&lt;br&gt;
   "allah": "الله",&lt;br&gt;&lt;br&gt;
  "akhirat": "اخرَة",&lt;br&gt;
  "akhlak": "اخلاق", &lt;br&gt;
  "amalan": "عملن",&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Proses Tukar Tulisan&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Projek ni ikut empat langkah utama: ( ini versi awal ) &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clean &amp;amp; Tokenize
    ◦ Buang whitespace / trim
    ◦ Pecahkan ayat kepada perkataan
    ◦ Kecilkan semua huruf ( change to lower case )&lt;/li&gt;
&lt;/ol&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%2Fziwihl7u8gis39jmv4ub.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%2Fziwihl7u8gis39jmv4ub.png" alt=" " width="620" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cek Special Words
    ◦ Kalau perkataan ada dalam special_words, terus guna versi Jawi tersebut&lt;/li&gt;
&lt;li&gt;Mapping Huruf
    ◦ Kalau perkataan tiada dalam special_words, tukar huruf menggunakan mapping&lt;/li&gt;
&lt;li&gt;Gabungkan Kembali
    ◦ Combine token Jawi untuk membentuk ayat
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;sentenceTokens&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;cleaned&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;specialWords&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;mapLetters&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&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;&lt;strong&gt;Cabaran Linguistik&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Mapping huruf sahaja tidak mencukupi, contohnya:&lt;br&gt;
    • Perkataan “saya”&lt;br&gt;
        ◦ Mapping biasa → سایا&lt;br&gt;
        ◦ Bunyi sebenar →  ساي &lt;br&gt;
        ◦ Maka perlu dimasukkan ke special_words.&lt;br&gt;
    • Imbuhan depan &amp;amp; belakang (me-, di-, ter-, -kan, -i) memerlukan logic tambahan.&lt;br&gt;
    • Perkataan seperti “makan”, “dimakan”, “memakan”, “termakan”, “makanan”, “pemakan” perlu di-handle untuk ejaan yang tepat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Menyesuaikan Dengan Peraturan Jawi Lanjutan&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Apabila aku membaca nota dari Jawi Makmur dan karya Ahmad Ali Karim tentang hukum hamzah, terdapat beberapa peraturan tambahan yang perlu diambil kira selain flow asas yang dicadangkan oleh AI:&lt;br&gt;
    1. Penempatan Hamzah – hamzah boleh berada di atas alif (أ), bawah alif (إ), atau di atas waw/ya (ؤ/ئ) bergantung pada vokal dan kedudukan huruf.&lt;br&gt;
    2. Huruf Ikut Bunyi – sesetengah perkataan memerlukan penyesuaian huruf berdasarkan sebutan, bukan sekadar mapping huruf literal.&lt;br&gt;
    3. Gabungan Huruf &amp;amp; Alif Mati – dalam perkataan tertentu, alif mati atau huruf panjang perlu ditambah/ditinggalkan untuk memastikan ejaan betul.&lt;br&gt;
    4. Gelinciran – bunyi akhir tertentu mempengaruhi cara huruf dipetakan, terutama untuk kata nama khas dan kata ganda.&lt;/p&gt;

&lt;p&gt;Dengan memasukkan peraturan ini ke dalam projek, output Jawi menjadi lebih tepat dan mendekati sebutan sebenar, berbanding hanya mengikut mapping AI standard + special words.&lt;br&gt;
    1. Hukum Derlung&lt;br&gt;
        ◦ Singkirkan huruf ‘a’ pada akhir perkataan jika bukan ‘da, la, ra, wa, nga’.&lt;br&gt;
    2. padanan Huruf h dan k&lt;br&gt;
    3. Gelinciran / Kata Ganda / Akronim / Tiga Suku Kata&lt;br&gt;
    4. Ejaan Lazim &amp;amp; Kata Asal Arab&lt;/p&gt;

&lt;p&gt;Contoh:&lt;br&gt;
// Hukum Derlung&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;applyDerlung&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;endings&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"da"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"la"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"ra"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"wa"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"nga"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;endings&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HasSuffix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&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="n"&gt;word&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c"&gt;// Buang huruf 'a' akhir&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HasSuffix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"a"&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="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&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="n"&gt;word&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh  Salah &amp;amp; Betul:&lt;br&gt;
    • Salah: باچا / ممباچا / ترباچا / ديباچا / باچاکان / باچاکانلاه / باچاان&lt;br&gt;
    • Betul: باچ / ممباچ / ترباچ / دباچ / باچکن / باچکنله / باچاءن.&lt;/p&gt;

&lt;p&gt;Berikut adalah pipeline yang digunakan dalam jawi conveter semasa artikel ini ditulis, ia berevolusi dari 4 langkah awal sebagaimana dinyatakan di awal artikel,berkembang kerana melibatkan hukum dan peraturan-peraturan tatabahasa.&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="p"&gt;1.&lt;/span&gt; normalize → tokenize → standardize input.
&lt;span class="p"&gt;2.&lt;/span&gt; specialWords → override perkataan tertentu.
&lt;span class="p"&gt;3.&lt;/span&gt; diftong, prefix, suffix, digraph, gelinciran, hukum derlung 
&lt;span class="p"&gt;4.&lt;/span&gt; morpho/phonological rules.
&lt;span class="p"&gt;5.&lt;/span&gt; applyVowelAndEVariant → baru proses vowel-specific rules (awalan vokal + pepet/taling).
&lt;span class="p"&gt;6.&lt;/span&gt; applyReduplikasi → last step sebelum mapping, sebab dia modify bentuk token.
&lt;span class="p"&gt;7.&lt;/span&gt;mapToJawi → transliterasi.
&lt;span class="p"&gt;8.&lt;/span&gt; joinTokens → final output string.

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

&lt;/div&gt;



&lt;p&gt;*&lt;em&gt;pipeline 5 dan 6 tu , masih ada bug, kadang-kadang dia baca , tapi masih tak boleh tukar e pepet dan e taling dengan betul, kata ganda tu pun tak di tukar ke angka dua arab (٢) dengan betul *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Insight &amp;amp; Pembelajaran&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. AI + Programming = Learning Accelerator
    ◦ GPT bantu cadangkan struktur, tapi ketepatan Jawi masih bergantung pada rule + daftar perkataan.
2. Rujukan Akademik &amp;amp; Linguistik
    ◦ DBP &amp;amp; Jawi Makmur jadi rujukan untuk ejaan tepat.
    ◦ Belajar asas Jawi melalui sumber online:
        ▪ ejawimakmur.my
        ▪ Ahmad Ali Karim – Jenis Hamzah
        ▪ Ahmad Ali Karim – Tulisan Jawi Bicara
3. String Manipulation + Loops = Core Logic
    ◦ Semua proses boleh dilakukan menggunakan operasi string standard dalam programming.
4. Edge Cases &amp;amp; Imbuhan
    ◦ Kaedah mapping huruf sahaja tidak cukup; perlu hukum &amp;amp; pengecualian untuk bunyi sebenar.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Kenapa Buat Jawi Converter Sendiri Walaupun Ada Jawi Makmur &amp;amp; e-Jawi?&lt;/strong&gt;&lt;br&gt;
Walaupun platform rasmi wujud, projek ini berfungsi sebagai eksperimen akademik untuk menguji teori linguistik, menguji rule, imbuhan, kata ganda, dan hukum Jawi, sambil menyokong kajian computational linguistics dan digitasi warisan bahasa secara interaktif. &lt;/p&gt;

&lt;p&gt;_Digitasi adalah proses mengubah sesuatu yang berbentuk bukan digital kepada digital. Contohnya, apabila menukarkan dokumen kertas dan &lt;br&gt;
menyimpannya dalam data komputer sebagai dokumen digital. _&lt;/p&gt;

&lt;p&gt;=======================================================&lt;/p&gt;
&lt;h1&gt;
  
  
  artikel tambahan 
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Rujukan Hukum Ejaan Jawi — PUEJBM DBP
&lt;/h1&gt;

&lt;p&gt;Nota rujukan untuk pembangunan projek &lt;strong&gt;Jawi Converter (Golang)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Dokumen ini mengumpulkan beberapa hukum dan pola ejaan Jawi yang diperlukan untuk membina sistem penukaran Rumi → Jawi secara berasaskan peraturan (&lt;em&gt;rule-based&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sumber rujukan utama:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PUEJBM — Pedoman Umum Ejaan Jawi Bahasa Melayu&lt;/strong&gt;, Dewan Bahasa dan Pustaka (DBP)&lt;/li&gt;
&lt;li&gt;Jawi Makmur&lt;/li&gt;
&lt;li&gt;eJawi / ejaan.jawi.net.my&lt;/li&gt;
&lt;li&gt;Rujukan Ahmad Ali Karim berkaitan jenis-jenis hamzah&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Penting:&lt;/strong&gt; Contoh atau hukum yang ditanda &lt;code&gt;[SEMAK]&lt;/code&gt; belum disahkan sepenuhnya dan tidak wajar terus dijadikan rule dalam kod pengeluaran (&lt;em&gt;production rule&lt;/em&gt;) sehingga dibandingkan dengan sumber rujukan yang sah.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  1. Huruf Vokal
&lt;/h2&gt;

&lt;p&gt;Pemetaan vokal Rumi → Jawi tidak boleh dibuat secara mudah berdasarkan satu-ke-satu huruf. Kedudukan vokal dalam suku kata dan jenis vokal perlu dipertimbangkan.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Vokal&lt;/th&gt;
&lt;th&gt;Pola umum&lt;/th&gt;
&lt;th&gt;Contoh&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;a&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Dalam keadaan tertentu tidak dilambangkan, khususnya berdasarkan struktur suku kata dan hukum ejaan yang berkaitan&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;کيت&lt;/strong&gt; (kita), &lt;strong&gt;ڤاݢي&lt;/strong&gt; (pagi)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;i&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pada suku kata terbuka tertentu → &lt;code&gt;ي&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;کيري&lt;/strong&gt; (kiri), &lt;strong&gt;دوري&lt;/strong&gt; (duri)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;u&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pada suku kata terbuka tertentu → &lt;code&gt;و&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;ساتو&lt;/strong&gt; (satu), &lt;strong&gt;بوکو&lt;/strong&gt; (buku), &lt;strong&gt;دودوق&lt;/strong&gt; (duduk)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;o&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Lazimnya → &lt;code&gt;و&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;موتر&lt;/strong&gt; (motor), &lt;strong&gt;روتي&lt;/strong&gt; (roti), &lt;strong&gt;بولا&lt;/strong&gt; (bola)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;e&lt;/code&gt; pepet&lt;/td&gt;
&lt;td&gt;Umumnya tidak dilambangkan&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;بلاجر&lt;/strong&gt; (belajar), &lt;strong&gt;ݢلس&lt;/strong&gt; (gelas), &lt;strong&gt;دڠن&lt;/strong&gt; (dengan)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;e&lt;/code&gt; taling&lt;/td&gt;
&lt;td&gt;Dalam pola tertentu dilambangkan dengan &lt;code&gt;ا&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;ايمڤت&lt;/strong&gt; (empat), &lt;strong&gt;ݢلاڠ&lt;/strong&gt; (gelang)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Implikasi kepada converter
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;e&lt;/code&gt; pepet dan &lt;code&gt;e&lt;/code&gt; taling &lt;strong&gt;tidak boleh disamakan&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Sistem perlu menentukan jenis &lt;code&gt;e&lt;/code&gt; berdasarkan perkataan atau konteks fonologi sebelum melakukan pemetaan vokal.&lt;/p&gt;

&lt;p&gt;Contohnya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;e pepet  → biasanya tidak dilambangkan
e taling → dalam pola tertentu dilambangkan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Oleh itu, fungsi seperti:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;applyVowelAndEVariant()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;perlu dilaksanakan sebelum proses transliterasi huruf akhir.&lt;/p&gt;




&lt;h1&gt;
  
  
  2. Diftong
&lt;/h1&gt;

&lt;p&gt;Diftong pada kedudukan tertentu mempunyai pola ejaan Jawi tersendiri.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Diftong&lt;/th&gt;
&lt;th&gt;Pola Jawi&lt;/th&gt;
&lt;th&gt;Contoh&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;au&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;و&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;ڤولاو&lt;/strong&gt; (pulau)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ai&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ي&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;ڤنتاي&lt;/strong&gt; (pantai)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;oi&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;وي&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;کالوي&lt;/strong&gt; (kaloi)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Jangan menganggap semua rangkaian &lt;code&gt;a+i&lt;/code&gt;, &lt;code&gt;a+u&lt;/code&gt; dan &lt;code&gt;o+i&lt;/code&gt; sebagai diftong secara automatik. Sistem perlu membezakan diftong daripada dua vokal yang hadir secara berasingan.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  3. Bunyi &lt;code&gt;n&lt;/code&gt; dan Asimilasi Nasal
&lt;/h1&gt;

&lt;p&gt;Dalam proses morfologi bahasa Melayu, bunyi nasal boleh berubah mengikut bunyi konsonan yang mengikutinya.&lt;/p&gt;

&lt;p&gt;Contoh umum:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Konsonan selepas nasal&lt;/th&gt;
&lt;th&gt;Perubahan bunyi&lt;/th&gt;
&lt;th&gt;Contoh&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;p&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;n&lt;/code&gt; → &lt;code&gt;m&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;sampan, lambang&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;t&lt;/code&gt;, &lt;code&gt;d&lt;/code&gt;, &lt;code&gt;s&lt;/code&gt;, &lt;code&gt;c&lt;/code&gt;, &lt;code&gt;j&lt;/code&gt; dan keadaan tertentu&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;n&lt;/code&gt; → &lt;code&gt;n&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;bintang&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;k&lt;/code&gt;, &lt;code&gt;g&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;n&lt;/code&gt; → &lt;code&gt;ng&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;pangkat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;s&lt;/code&gt; dalam awalan tertentu&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;n&lt;/code&gt; → &lt;code&gt;ny&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;menyapu&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Namun, perkara ini perlu dibezakan daripada &lt;strong&gt;ejaan perkataan yang memang mempunyai huruf &lt;code&gt;n&lt;/code&gt;&lt;/strong&gt;, kerana tidak semua &lt;code&gt;n&lt;/code&gt; dalam perkataan mengalami asimilasi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implikasi kepada converter
&lt;/h3&gt;

&lt;p&gt;Pemetaan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;n → ن
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;sahaja tidak mencukupi untuk menangani morfologi.&lt;/p&gt;

&lt;p&gt;Converter yang menyokong imbuhan perlu mempunyai tahap &lt;strong&gt;analisis morfologi/fonologi&lt;/strong&gt; sebelum pemetaan huruf Jawi.&lt;/p&gt;




&lt;h1&gt;
  
  
  4. &lt;code&gt;k&lt;/code&gt; pada Akhir Kata
&lt;/h1&gt;

&lt;p&gt;Dalam sesetengah pola ejaan Jawi, bunyi &lt;code&gt;k&lt;/code&gt; pada akhir kata mempunyai bentuk ejaan tertentu dan perlu dibezakan daripada &lt;code&gt;ک&lt;/code&gt; yang digunakan dalam keadaan lain.&lt;/p&gt;

&lt;p&gt;Contoh:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;انق&lt;/strong&gt; — anak&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ماسوق&lt;/strong&gt; — masuk&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;باليق&lt;/strong&gt; — balik&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;دودوق&lt;/strong&gt; — duduk&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Istilah dan kategori seperti "&lt;code&gt;k&lt;/code&gt; ghaib" perlu dirujuk terus kepada PUEJBM sebelum dijadikan algoritma umum. Jangan bina rule berdasarkan hanya beberapa contoh.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Untuk pembangunan converter, lebih selamat memodelkannya sebagai:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;final-k rule
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;dan menyediakan senarai pengecualian apabila diperlukan.&lt;/p&gt;




&lt;h1&gt;
  
  
  5. &lt;code&gt;h&lt;/code&gt; pada Akhir Kata
&lt;/h1&gt;

&lt;p&gt;Terdapat pola tertentu yang menyebabkan huruf &lt;code&gt;h&lt;/code&gt; pada akhir kata tidak dieja sebagaimana bunyi Rumi secara satu-ke-satu.&lt;/p&gt;

&lt;p&gt;Contoh:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;مودَه&lt;/strong&gt; — mudah&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;رومه&lt;/strong&gt; — rumah&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;بودوه&lt;/strong&gt; — bodoh&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;باسه&lt;/strong&gt; — basah &lt;code&gt;[SEMAK]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Penting:&lt;/strong&gt; Jangan menganggap semua &lt;code&gt;h&lt;/code&gt; akhir mesti dibuang atau ditukar kepada satu bentuk Jawi tertentu. Rule ini perlu diuji terhadap PUEJBM dan senarai perkataan sebenar.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  6. Awalan &lt;code&gt;meN-&lt;/code&gt; dan &lt;code&gt;peN-&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Awalan bahasa Melayu mengalami perubahan bentuk berdasarkan huruf atau bunyi awal kata dasar.&lt;/p&gt;

&lt;p&gt;Contoh pola:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kata dasar bermula dengan&lt;/th&gt;
&lt;th&gt;Bentuk umum&lt;/th&gt;
&lt;th&gt;Contoh&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;p&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;, &lt;code&gt;f&lt;/code&gt;, &lt;code&gt;m&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;mem-&lt;/code&gt; / &lt;code&gt;pem-&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;membaca, meminta, pembaca&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;t&lt;/code&gt;, &lt;code&gt;d&lt;/code&gt;, &lt;code&gt;s&lt;/code&gt;, &lt;code&gt;c&lt;/code&gt;, &lt;code&gt;j&lt;/code&gt;, dan keadaan tertentu&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;men-&lt;/code&gt; / &lt;code&gt;pen-&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;menulis, mendengar, mencuri&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;s&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;meny-&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;menyapu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;k&lt;/code&gt;, &lt;code&gt;g&lt;/code&gt;, &lt;code&gt;h&lt;/code&gt;, vokal dan &lt;code&gt;ng&lt;/code&gt; dalam pola tertentu&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;meng-&lt;/code&gt; / &lt;code&gt;peng-&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;mengajar, mengikat, mengundi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kata dasar satu suku kata tertentu&lt;/td&gt;
&lt;td&gt;&lt;code&gt;menge-&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;mengecat, mengebor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;l&lt;/code&gt;, &lt;code&gt;r&lt;/code&gt;, &lt;code&gt;w&lt;/code&gt;, &lt;code&gt;y&lt;/code&gt; dan keadaan tertentu&lt;/td&gt;
&lt;td&gt;&lt;code&gt;me-&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;melukis, merawat&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Prinsip penting
&lt;/h3&gt;

&lt;p&gt;Ejaan Jawi bagi kata berimbuhan perlu mengambil kira &lt;strong&gt;sebutan dan struktur morfologi&lt;/strong&gt;, bukan sekadar melakukan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;replace("me", ...)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;atau:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;replace("n", ...)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Oleh itu, &lt;code&gt;meN-&lt;/code&gt; dan &lt;code&gt;peN-&lt;/code&gt; patut menjadi modul tersendiri:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;detectPrefix()
applyNasalAssimilation()
applyPrefixJawiRule()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  7. Imbuhan Lain
&lt;/h1&gt;

&lt;p&gt;Beberapa imbuhan bahasa Melayu yang biasa perlu dikenali sebagai unit morfologi.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;ber-&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Contoh:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;بکرجا&lt;/strong&gt; — bekerja&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;برلاري&lt;/strong&gt; — berlari&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;ter-&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Contoh:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ترباچا&lt;/strong&gt; — terbaca&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;di-&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Apabila &lt;code&gt;di-&lt;/code&gt; merupakan imbuhan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;دباچا&lt;/strong&gt; — dibaca&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;د توليس&lt;/strong&gt; / &lt;strong&gt;دتوﻟيس&lt;/strong&gt; — ditulis &lt;code&gt;[SEMAK]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;ke-...-an&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Contoh:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;کراݢاءن&lt;/strong&gt; — kerajaan &lt;code&gt;[SEMAK]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;کماجوان&lt;/strong&gt; — kemajuan &lt;code&gt;[SEMAK]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;-kan&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Contoh:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;باچاکن&lt;/strong&gt; — bacakan &lt;code&gt;[SEMAK]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;-an&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Bentuk ejaan boleh bergantung pada huruf dan vokal yang hadir sebelum akhiran.&lt;/p&gt;

&lt;p&gt;Contoh:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;باچاءن&lt;/strong&gt; — bacaan &lt;code&gt;[SEMAK]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ماکنن&lt;/strong&gt; — makanan &lt;code&gt;[SEMAK]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;مينومن&lt;/strong&gt; — minuman &lt;code&gt;[SEMAK]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Bahagian imbuhan dan hamzah perlu disahkan dengan PUEJBM sebelum dijadikan rule automatik. Contoh di sini berfungsi sebagai data ujian, bukan semata-mata definisi hukum.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;-lah&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Contoh:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;باچاله&lt;/strong&gt; — bacalah &lt;code&gt;[SEMAK]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  8. Kata Sendi &lt;code&gt;di&lt;/code&gt; / &lt;code&gt;ke&lt;/code&gt; vs Imbuhan
&lt;/h1&gt;

&lt;p&gt;Ini ialah bahagian yang sangat penting untuk converter kerana &lt;strong&gt;ruang antara perkataan bergantung pada fungsi perkataan tersebut&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fungsi&lt;/th&gt;
&lt;th&gt;Rumi&lt;/th&gt;
&lt;th&gt;Bentuk&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Kata sendi&lt;/td&gt;
&lt;td&gt;di rumah&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;د رومه&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Imbuhan&lt;/td&gt;
&lt;td&gt;ditulis&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;دتوﻟيس&lt;/strong&gt; &lt;code&gt;[SEMAK]&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kata sendi&lt;/td&gt;
&lt;td&gt;ke sekolah&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;ک سکوله&lt;/strong&gt; &lt;code&gt;[SEMAK]&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Imbuhan&lt;/td&gt;
&lt;td&gt;kerajaan&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;کراݢاءن&lt;/strong&gt; &lt;code&gt;[SEMAK]&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Contohnya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;di rumah
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;berbeza daripada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ditulis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jadi converter tidak sepatutnya memproses &lt;code&gt;di&lt;/code&gt; sebagai string biasa sahaja.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cadangan pipeline
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sentence
   ↓
tokenization
   ↓
morphological/context analysis
   ↓
determine "di" / "ke" function
   ↓
Jawi conversion
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  9. Kata Pinjaman Arab
&lt;/h1&gt;

&lt;p&gt;Kata pinjaman Arab memerlukan perhatian khusus kerana terdapat huruf Jawi yang mempunyai fungsi berkaitan dengan huruf Arab.&lt;/p&gt;

&lt;p&gt;Antara huruf yang perlu dikekalkan dalam perkataan Arab atau serapan Arab tertentu ialah:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ث ذ ح خ ص ض ط ظ ع غ&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;serta huruf-huruf Jawi/Arab lain mengikut ejaan perkataan yang sah.&lt;/p&gt;

&lt;p&gt;Contoh:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;مسجد&lt;/strong&gt; — masjid&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;خبر&lt;/strong&gt; — khabar&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;عادت&lt;/strong&gt; — adat &lt;code&gt;[SEMAK]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;حکم&lt;/strong&gt; — hukum&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;صلات&lt;/strong&gt; — solat&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;شريف&lt;/strong&gt; — syarif&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;طبيب&lt;/strong&gt; — tabib &lt;code&gt;[SEMAK]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Perkataan seperti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;الله&lt;/strong&gt; — Allah&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;boleh dianggap sebagai &lt;strong&gt;special word&lt;/strong&gt; kerana bentuk ejaannya tidak wajar dihasilkan hanya melalui transliterasi Rumi → Jawi biasa.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cadangan implementation
&lt;/h3&gt;

&lt;p&gt;Sediakan kamus:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;specialWords&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s"&gt;"allah"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"الله"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;dan lakukan lookup sebelum transliterasi umum.&lt;/p&gt;




&lt;h1&gt;
  
  
  10. Ta Marbutah
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;ة&lt;/code&gt; (&lt;em&gt;ta marbutah&lt;/em&gt;) digunakan dalam kata Arab tertentu dan kata serapan yang mengekalkan bentuk atau tradisi ejaan Arabnya.&lt;/p&gt;

&lt;p&gt;Contoh:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;سنة&lt;/strong&gt; — sunnah&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;مدرسة&lt;/strong&gt; — madrasah&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;مكة&lt;/strong&gt; — Mekah&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Namun, tidak semua perkataan Melayu yang berakhir dengan bunyi &lt;code&gt;a&lt;/code&gt; atau &lt;code&gt;ah&lt;/code&gt; boleh diberikan &lt;code&gt;ة&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prinsip converter
&lt;/h3&gt;

&lt;p&gt;Jangan buat:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if endsWith("ah") {
    use "ة"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;secara automatik.&lt;/p&gt;

&lt;p&gt;Lebih selamat menggunakan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Arabic-origin dictionary
+
morphological rules
+
exception list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  11. Kata Pinjaman Asing
&lt;/h1&gt;

&lt;p&gt;Kata pinjaman daripada bahasa Inggeris, Tamil, Cina, Siam dan bahasa lain lazimnya perlu ditangani berdasarkan &lt;strong&gt;sebutan dan sistem ejaan Jawi&lt;/strong&gt;, bukan transliterasi huruf Latin satu demi satu.&lt;/p&gt;

&lt;p&gt;Contoh:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ڤروݢرام&lt;/strong&gt; — program &lt;code&gt;[SEMAK]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ستروکتور&lt;/strong&gt; — struktur &lt;code&gt;[SEMAK]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;دوكتور&lt;/strong&gt; — doktor &lt;code&gt;[SEMAK]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ڤوليس&lt;/strong&gt; — polis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;بيݢ&lt;/strong&gt; — beg &lt;code&gt;[SEMAK]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;توالا&lt;/strong&gt; — tuala &lt;code&gt;[SEMAK]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;سکوله&lt;/strong&gt; — sekolah &lt;code&gt;[SEMAK]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Kluster konsonan
&lt;/h3&gt;

&lt;p&gt;Kata pinjaman tertentu mempunyai kluster konsonan yang perlu dikendalikan secara khusus.&lt;/p&gt;

&lt;p&gt;Contoh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;green
structure
program
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tidak semestinya boleh diproses menggunakan rule bahasa Melayu asli sahaja.&lt;/p&gt;

&lt;p&gt;Oleh itu, converter sebaiknya mempunyai kategori:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Malay native word
Arabic loanword
English/foreign loanword
proper noun
special word
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  12. Kata Ganda
&lt;/h1&gt;

&lt;p&gt;Kata ganda penuh mempunyai mekanisme ejaan Jawi tersendiri.&lt;/p&gt;

&lt;p&gt;Dalam keadaan tertentu, angka dua Arab &lt;strong&gt;٢&lt;/strong&gt; digunakan sebagai tanda penggandaan.&lt;/p&gt;

&lt;p&gt;Contoh:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;اورڠ٢&lt;/strong&gt; — orang-orang&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;رومه٢&lt;/strong&gt; — rumah-rumah&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Dalam Unicode, simbol yang kelihatan seperti &lt;code&gt;٢&lt;/code&gt; ialah &lt;strong&gt;ARABIC-INDIC DIGIT TWO&lt;/strong&gt;, bukan huruf Jawi biasa.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Kata ganda separa atau kata ganda berima pula tidak semestinya menggunakan kaedah yang sama.&lt;/p&gt;

&lt;p&gt;Contoh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sayur-mayur
kuih-muih
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Cadangan implementation
&lt;/h3&gt;

&lt;p&gt;Sediakan fungsi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;applyReduplication&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;yang mengenal pasti:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;full reduplication
partial reduplication
rhyming reduplication
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;dan bukan sekadar mencari tanda &lt;code&gt;-&lt;/code&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  13. Hamzah
&lt;/h1&gt;

&lt;p&gt;Hamzah merupakan salah satu bahagian paling kompleks dalam ejaan Jawi.&lt;/p&gt;

&lt;p&gt;Antara bentuk hamzah yang perlu dikenali termasuk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;أ&lt;/strong&gt; — hamzah di atas alif&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;إ&lt;/strong&gt; — hamzah di bawah alif&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ؤ&lt;/strong&gt; — hamzah di atas wau&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ئ&lt;/strong&gt; — hamzah di atas ya&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Selain fungsi yang berkaitan dengan kata Arab, hamzah juga boleh memainkan peranan dalam ejaan Jawi Melayu tertentu, termasuk keadaan yang melibatkan pertemuan vokal.&lt;/p&gt;

&lt;p&gt;Contoh:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;سوأل&lt;/strong&gt; / bentuk berkaitan — soal &lt;code&gt;[SEMAK]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;مجموع&lt;/strong&gt; — majmuk &lt;code&gt;[SEMAK]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;باچاءن&lt;/strong&gt; — bacaan &lt;code&gt;[SEMAK]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Prinsip penting
&lt;/h3&gt;

&lt;p&gt;Hamzah &lt;strong&gt;tidak boleh dipetakan hanya berdasarkan huruf Rumi &lt;code&gt;h&lt;/code&gt; atau &lt;code&gt;a&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Sistem perlu mempertimbangkan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kedudukan hamzah
+
vokal sebelum
+
vokal selepas
+
asal perkataan
+
pola ejaan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rujukan khusus jenis hamzah oleh Ahmad Ali Karim boleh digunakan sebagai bahan pembelajaran tambahan, tetapi PUEJBM hendaklah kekal sebagai rujukan utama untuk standard ejaan.&lt;/p&gt;




&lt;h1&gt;
  
  
  14. Hukum Derlung
&lt;/h1&gt;

&lt;p&gt;Hukum Derlung merupakan salah satu hukum penting dalam ejaan Jawi Melayu.&lt;/p&gt;

&lt;p&gt;Dalam gambaran mudah, huruf &lt;code&gt;a&lt;/code&gt; pada akhir kata tertentu tidak dilambangkan, dengan beberapa pengecualian yang perlu dikenali.&lt;/p&gt;

&lt;p&gt;Antara akhiran yang biasanya diberi perhatian ialah:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;da
la
ra
wa
nga
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh konseptual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bača
→ باچ
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;bukan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;باچا
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Contoh implementation awal
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;applyDerlung&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;endings&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"da"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"la"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"ra"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"wa"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"nga"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ending&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;endings&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HasSuffix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ending&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="n"&gt;word&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HasSuffix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"a"&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="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TrimSuffix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"a"&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="n"&gt;word&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tetapi:
&lt;/h3&gt;

&lt;p&gt;Fungsi di atas hanyalah &lt;strong&gt;model awal untuk eksperimen&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ia tidak sepatutnya dianggap sebagai implementasi lengkap Hukum Derlung sehingga dibandingkan dengan keseluruhan peraturan PUEJBM dan set data perkataan yang mencukupi.&lt;/p&gt;




&lt;h1&gt;
  
  
  15. Gelinciran
&lt;/h1&gt;

&lt;p&gt;Gelinciran perlu dilihat sebagai proses fonologi/ejaan yang bergantung pada struktur perkataan dan bunyi.&lt;/p&gt;

&lt;p&gt;Ia lebih sukar dimodelkan sebagai:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;one character → one Jawi character
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Terutamanya bagi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;kata nama khas&lt;/li&gt;
&lt;li&gt;kata pinjaman&lt;/li&gt;
&lt;li&gt;kata ganda&lt;/li&gt;
&lt;li&gt;perubahan bunyi akibat imbuhan&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Oleh itu, converter mungkin memerlukan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;phonological rules
+
word dictionary
+
exception list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;dan bukannya satu formula tunggal.&lt;/p&gt;




&lt;h1&gt;
  
  
  16. Kata Nama Khas, Akronim dan Singkatan
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Kata nama khas
&lt;/h3&gt;

&lt;p&gt;Kata nama khas hendaklah ditangani berdasarkan sebutan dan ejaan yang diterima.&lt;/p&gt;

&lt;p&gt;Contoh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nama orang
nama tempat
nama organisasi
nama produk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk nama yang mempunyai bentuk rasmi Jawi, bentuk rasmi tersebut patut diutamakan.&lt;/p&gt;

&lt;h3&gt;
  
  
  Akronim
&lt;/h3&gt;

&lt;p&gt;Akronim memerlukan keputusan sama ada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dibaca sebagai perkataan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;atau:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;disebut huruf demi huruf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contohnya singkatan seperti:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RIM
MARA
UITM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;tidak semestinya boleh diproses menggunakan rule perkataan biasa.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cadangan
&lt;/h3&gt;

&lt;p&gt;Gunakan kategori:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;properNoun
acronym
abbreviation
technicalTerm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;sebelum transliterasi biasa.&lt;/p&gt;




&lt;h1&gt;
  
  
  17. Angka dan Tanda Baca
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Kata ganda
&lt;/h3&gt;

&lt;p&gt;Gunakan angka dua Arab apabila peraturan ejaan menetapkannya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;orang-orang
→ اورڠ٢
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tanda baca
&lt;/h3&gt;

&lt;p&gt;Tanda baca moden seperti:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
,
:
;
?
!
(
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;boleh dikekalkan mengikut keperluan teks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nombor
&lt;/h3&gt;

&lt;p&gt;Nombor boleh dikekalkan dalam bentuk angka moden bergantung pada keperluan sistem dan konteks dokumen.&lt;/p&gt;




&lt;h1&gt;
  
  
  18. Cadangan Pipeline Jawi Converter
&lt;/h1&gt;

&lt;p&gt;Berdasarkan hukum-hukum di atas, pipeline tidak sepatutnya hanya berupa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rumi
  ↓
character mapping
  ↓
Jawi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sebaliknya, lebih sesuai:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Normalize
      ↓
2. Tokenize
      ↓
3. Detect special words
      ↓
4. Detect word category
      ↓
5. Morphological analysis
      ↓
6. Prefix / suffix rules
      ↓
7. Nasal assimilation
      ↓
8. Phonological rules
      ↓
9. Vowel + e-pepet/e-taling rules
      ↓
10. Derlung
      ↓
11. Hamzah rules
      ↓
12. Reduplication
      ↓
13. Character mapping
      ↓
14. Join tokens
      ↓
15. Validation / exception lookup
      ↓
Jawi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  19. Rules yang Perlu Ditambah dalam Pipeline Golang
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Hukum / Fungsi&lt;/th&gt;
&lt;th&gt;Cadangan kedudukan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Asimilasi nasal &lt;code&gt;meN-&lt;/code&gt; / &lt;code&gt;peN-&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Morphological analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Kata pinjaman Arab&lt;/td&gt;
&lt;td&gt;Special-word / dictionary layer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Ta marbutah&lt;/td&gt;
&lt;td&gt;Arabic-word layer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;k&lt;/code&gt; akhir&lt;/td&gt;
&lt;td&gt;Phonological/final-letter rule&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;h&lt;/code&gt; akhir&lt;/td&gt;
&lt;td&gt;Phonological/final-letter rule&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Nasal &lt;code&gt;n&lt;/code&gt; → &lt;code&gt;m/ng/ny&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Phonological rule&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;e&lt;/code&gt; pepet vs &lt;code&gt;e&lt;/code&gt; taling&lt;/td&gt;
&lt;td&gt;Vowel analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Diftong&lt;/td&gt;
&lt;td&gt;Phonological analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Hukum Derlung&lt;/td&gt;
&lt;td&gt;Final-vowel rule&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Hamzah&lt;/td&gt;
&lt;td&gt;Orthographic rule&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;Kata ganda&lt;/td&gt;
&lt;td&gt;Morphological rule&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;di&lt;/code&gt; / &lt;code&gt;ke&lt;/code&gt; sendi vs imbuhan&lt;/td&gt;
&lt;td&gt;Context/morphological analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;Kata pinjaman asing&lt;/td&gt;
&lt;td&gt;Dictionary + phonological rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;Kata nama khas&lt;/td&gt;
&lt;td&gt;Dictionary / proper-noun layer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;Akronim / singkatan&lt;/td&gt;
&lt;td&gt;Token classification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;Exception words&lt;/td&gt;
&lt;td&gt;Special dictionary&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  20. Jangan Jadikan Semua Hukum Sebagai &lt;code&gt;replace()&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Kesilapan paling mudah dalam membina Jawi Converter ialah menghasilkan kod seperti:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReplaceAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"ا"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReplaceAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"i"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"ي"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReplaceAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"u"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"و"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kaedah tersebut hanya sesuai untuk &lt;strong&gt;transliterasi asas&lt;/strong&gt;, bukan ejaan Jawi yang mengambil kira fonologi dan morfologi bahasa Melayu.&lt;/p&gt;

&lt;p&gt;Sebaliknya, struktur program boleh dibina seperti:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;WordContext&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Original&lt;/span&gt;       &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="n"&gt;Normalized&lt;/span&gt;     &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="n"&gt;Root&lt;/span&gt;           &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="n"&gt;Prefix&lt;/span&gt;         &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="n"&gt;Suffix&lt;/span&gt;         &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="n"&gt;IsArabicLoan&lt;/span&gt;   &lt;span class="kt"&gt;bool&lt;/span&gt;
    &lt;span class="n"&gt;IsProperNoun&lt;/span&gt;   &lt;span class="kt"&gt;bool&lt;/span&gt;
    &lt;span class="n"&gt;IsReduplicated&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Rule&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;WordContext&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kemudian rule boleh dilaksanakan secara berperingkat:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SpecialWordRule
      ↓
MorphologyRule
      ↓
NasalAssimilationRule
      ↓
DiphthongRule
      ↓
VowelRule
      ↓
DerlungRule
      ↓
HamzahRule
      ↓
CharacterMappingRule
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ini lebih mudah diuji dan diselenggara berbanding satu fungsi transliterasi yang terlalu besar.&lt;/p&gt;




&lt;h1&gt;
  
  
  21. Prinsip Pengujian
&lt;/h1&gt;

&lt;p&gt;Setiap hukum perlu mempunyai test case sendiri.&lt;/p&gt;

&lt;p&gt;Contohnya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rumi        Expected Jawi
--------------------------------
kita        کيت
pagi        ڤاݢي
buku        بوکو
duduk       دودوق
motor       موتر
roti        روتي
bola        بولا
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk rule morfologi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;membaca
meminta
menulis
mendengar
menyapu
mengajar
mengecat
melukis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk konteks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;di rumah
ditulis

ke sekolah
kerajaan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk kata ganda:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;orang-orang
rumah-rumah
sayur-mayur
kuih-muih
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dan untuk kata Arab:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;masjid
khabar
hukum
solat
Allah
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  22. Sumber Rujukan
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Rujukan utama
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Dewan Bahasa dan Pustaka (DBP)&lt;/strong&gt;&lt;br&gt;
PUEJBM — &lt;em&gt;Pedoman Umum Ejaan Jawi Bahasa Melayu&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Jawi Makmur
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://ejawimakmur.my/02-modul-jawi.html?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Jawi Makmur — Modul Jawi&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Digunakan sebagai rujukan tambahan dan bahan perbandingan untuk ejaan perkataan.&lt;/p&gt;
&lt;h3&gt;
  
  
  Ahmad Ali Karim — Jenis Hamzah
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://ahmadalikarim.wordpress.com/2021/07/03/tulisan-jawi-kisah-hamzah-yang-digelar-tiga-suku/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Tulisan Jawi — Kisah Hamzah yang Digelar Tiga Suku&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Ahmad Ali Karim — Jenis-Jenis Hamzah
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://ahmadalikarim.wordpress.com/2021/07/04/tulisan-jawi-bicara-jenis-jenis-hamzah/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Tulisan Jawi — Bicara Jenis-Jenis Hamzah&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  ejaan.jawi.net.my
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://ejaan.jawi.net.my?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Ejaan Jawi&lt;/a&gt;&lt;/p&gt;


&lt;h1&gt;
  
  
  Kesimpulan
&lt;/h1&gt;

&lt;p&gt;Projek &lt;strong&gt;Jawi Converter&lt;/strong&gt; bukan sekadar latihan pengaturcaraan Golang.&lt;/p&gt;

&lt;p&gt;Ia merupakan satu usaha untuk menghubungkan &lt;strong&gt;teknologi moden dengan warisan tulisan dan bahasa Melayu&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Walaupun projek ini bermula sebagai eksperimen kecil dalam pembangunan &lt;em&gt;rule-based converter&lt;/em&gt;, ia membuka ruang untuk mempelajari beberapa perkara serentak:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pengaturcaraan Golang;&lt;/li&gt;
&lt;li&gt;pemprosesan bahasa;&lt;/li&gt;
&lt;li&gt;morfologi;&lt;/li&gt;
&lt;li&gt;fonologi;&lt;/li&gt;
&lt;li&gt;Unicode dan text processing;&lt;/li&gt;
&lt;li&gt;reka bentuk rule engine;&lt;/li&gt;
&lt;li&gt;pengurusan kamus dan pengecualian;&lt;/li&gt;
&lt;li&gt;serta sejarah dan sistem tulisan Jawi.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Usaha ini mungkin kecil, tetapi ia tetap mempunyai nilai tersendiri sebagai sumbangan peribadi untuk membantu &lt;strong&gt;memelihara, memahami dan mendigitalkan warisan tulisan Jawi&lt;/strong&gt;, sambil membina kemahiran teknologi moden.&lt;/p&gt;


&lt;h1&gt;
  
  
  Nota Kaki — Kata Arab dan Serapan Arab
&lt;/h1&gt;

&lt;p&gt;Untuk perkataan Arab atau perkataan serapan Arab yang telah dimelayukan, rujukan kepada sumber bahasa Arab yang berautoriti juga boleh membantu, khususnya apabila persoalan melibatkan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;makhraj huruf;&lt;/li&gt;
&lt;li&gt;sifat huruf;&lt;/li&gt;
&lt;li&gt;bentuk asal perkataan Arab;&lt;/li&gt;
&lt;li&gt;huruf Hijaiyah;&lt;/li&gt;
&lt;li&gt;dan perubahan bentuk apabila perkataan tersebut diserap ke dalam bahasa Melayu.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Namun, untuk &lt;strong&gt;ejaan Jawi Bahasa Melayu&lt;/strong&gt;, rujukan utama bagi projek ini hendaklah kekal pada &lt;strong&gt;pedoman ejaan Jawi DBP&lt;/strong&gt;, manakala sumber bahasa Arab digunakan sebagai rujukan tambahan apabila diperlukan.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pembetulan penting:&lt;/strong&gt; Bahasa Arab mempunyai &lt;strong&gt;28 huruf asas&lt;/strong&gt;, bukan 30. Tulisan Jawi pula mempunyai beberapa huruf tambahan yang mewakili bunyi yang tidak terdapat dalam bahasa Arab, seperti &lt;code&gt;چ&lt;/code&gt;, &lt;code&gt;ڤ&lt;/code&gt;, &lt;code&gt;ݢ&lt;/code&gt;, &lt;code&gt;ڠ&lt;/code&gt; dan &lt;code&gt;ڽ&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Status Dokumen
&lt;/h2&gt;

&lt;p&gt;Dokumen ini sebaiknya dianggap sebagai:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Working Reference
       ↓
Rule Candidate
       ↓
Verify Against PUEJBM
       ↓
Test With Jawi Reference
       ↓
Unit Test
       ↓
Production Rule
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bukan semua contoh dalam nota ini boleh terus dianggap sebagai hukum muktamad.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rule yang belum disahkan perlu ditanda &lt;code&gt;[SEMAK]&lt;/code&gt; dan tidak dimasukkan terus ke dalam &lt;code&gt;mapToJawi()&lt;/code&gt; sehingga disahkan.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dengan pendekatan ini, projek Jawi Converter boleh berkembang daripada sekadar &lt;strong&gt;character transliterator&lt;/strong&gt; kepada &lt;strong&gt;rule-based Malay Jawi orthography engine&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>jawi</category>
      <category>go</category>
      <category>conveter</category>
      <category>melayu</category>
    </item>
    <item>
      <title>Error code: Wsl/Service/AttachDisk/0x8007000f</title>
      <dc:creator>hardyweb</dc:creator>
      <pubDate>Mon, 21 Jul 2025 20:59:21 +0000</pubDate>
      <link>https://dev.to/hardyweb/error-code-wslserviceattachdisk0x8007000f-2fem</link>
      <guid>https://dev.to/hardyweb/error-code-wslserviceattachdisk0x8007000f-2fem</guid>
      <description>&lt;p&gt;Trying to Format USB Drive Manually via WSL2&lt;br&gt;
Sometimes, we need to format a USB drive to Btrfs or other Linux-native filesystems, which requires mounting the device as a raw disk inside WSL2 — not just accessing it through /mnt/.&lt;/p&gt;

&lt;p&gt;Here’s how I tried to do it:&lt;/p&gt;

&lt;p&gt;Open Command Prompt as Administrator and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wmic diskdrive list brief
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will list all physical drives (e.g., \.\PHYSICALDRIVE1, \.\PHYSICALDRIVE2, etc.).&lt;/p&gt;

&lt;p&gt;Identify which one is your USB device.&lt;/p&gt;

&lt;p&gt;Attempt to Mount the Drive in WSL2&lt;br&gt;
Run the following command to mount the raw disk into WSL (replace X with the correct drive number):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wsl --mount \\.\PHYSICALDRIVEx --bare  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But I encountered this error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error code: Wsl/Service/AttachDisk/0x8007000f
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This error may occur if your version of WSL2 doesn't support raw disk mounting properly. To fix it, update WSL to the latest (preferably pre-release) version:&lt;/p&gt;

&lt;p&gt;Still in Command Prompt (Admin):&lt;/p&gt;

&lt;p&gt;In  cmd prompt ( Administrator mode )&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wsl --update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the update is done, run it again with --pre-release&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wsl --update --pre-release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wsl --restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then try mount aganin. &lt;/p&gt;

&lt;p&gt;Try Mounting Again&lt;/p&gt;

&lt;p&gt;**&lt;br&gt;
Final Notes**&lt;br&gt;
Even though the USB drive is accessible via /mnt/ in WSL, that method only provides user-space access, and does not allow formatting to filesystems like Btrfs or ext4. Raw disk mounting (--mount --bare) gives you block-level access needed for tools like mkfs.btrfs.&lt;/p&gt;

&lt;p&gt;If this still doesn't work, consider booting into a Linux distro like Manjaro/Debian and using gparted or CLI tools (mkfs.btrfs, parted) directly from there.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
