<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Emacs Diary on yothinix</title><link>https://yothinix-com.pages.dev/tags/emacs-diary/</link><description>Recent content in Emacs Diary on yothinix</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 13 Feb 2022 18:37:41 +0700</lastBuildDate><atom:link href="https://yothinix-com.pages.dev/tags/emacs-diary/index.xml" rel="self" type="application/rss+xml"/><item><title>ยิง request แบบไม่มีสะดุดด้วย emacs REST client</title><link>https://yothinix-com.pages.dev/emacs-rest-client/</link><pubDate>Sun, 09 Jan 2022 13:17:00 +0700</pubDate><guid>https://yothinix-com.pages.dev/emacs-rest-client/</guid><description>&lt;p&gt;ช่วงปีใหม่ผมมีเวลาไปเรียนคอร์ส &lt;strong&gt;&lt;a href="https://skooldio.com/bundles/the-ultimate-go-series"&gt;The Ultimate Go Series&lt;/a&gt;&lt;/strong&gt; ของพี่ยอดซึ่งจากใจคนที่ดู Go อยู่ห่างๆ ผมบอกได้เลยว่าคอร์สนี้สอนได้ครบเครื่องมากในเวลาไม่กี่ชั่วโมง แต่นั่นไม่ใช่ประเด็นครับ ประเด็นคือตอนคอร์ส 2 ที่กำลังเรียนเรื่อง API พี่ยอดใช้ HTTP Client ที่รันจาก Plain-text query เลยบน VSCode ซึ่ง ส่วนตัวผมเคยใช้อะไรคล้ายๆ กันบน Intellij เวอร์ชั่นหลังๆ แต่ก็ยังไม่ค่อยคลิก&lt;/p&gt;
&lt;p&gt;แต่ก็จังหวะพอดีที่คอร์สนี้ผมเรียนอยู่บน emacs ผมที่ค่อยๆ ใช้งานหนักขึ้นเรื่อยๆ เพื่อให้ตอบโจทย์การใช้งานที่สุด โพสนี้เลยจะเล่าว่าผมใช้ Emacs REST cilent ยังไง แล้วก็จะเปรียบเทียบ use case เดียวกันเทียบกับ REST client บน Intellij กับ VSCode ด้วยครับ&lt;/p&gt;
&lt;h2 id="installing"&gt;&lt;strong&gt;Installing&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;สำหรับ emacs สามารถโหลดจาก MELPA ได้จาก package ชื่อ &lt;a href="https://github.com/pashky/restclient.el"&gt;restclient&lt;/a&gt; ครับ แต่ถ้าใครใช้ Doom ก็เพียงแค่เปิด option &lt;code&gt;rest ; Emacs as a REST client&lt;/code&gt; ในไฟล์ init.el แล้วสั่ง &lt;code&gt;doom reload&lt;/code&gt; ก็พร้อมใช้งานแล้วครับ&lt;/p&gt;</description><content:encoded><![CDATA[<p>ช่วงปีใหม่ผมมีเวลาไปเรียนคอร์ส <strong><a href="https://skooldio.com/bundles/the-ultimate-go-series">The Ultimate Go Series</a></strong> ของพี่ยอดซึ่งจากใจคนที่ดู Go อยู่ห่างๆ ผมบอกได้เลยว่าคอร์สนี้สอนได้ครบเครื่องมากในเวลาไม่กี่ชั่วโมง แต่นั่นไม่ใช่ประเด็นครับ ประเด็นคือตอนคอร์ส 2 ที่กำลังเรียนเรื่อง API พี่ยอดใช้ HTTP Client ที่รันจาก Plain-text query เลยบน VSCode ซึ่ง ส่วนตัวผมเคยใช้อะไรคล้ายๆ กันบน Intellij เวอร์ชั่นหลังๆ แต่ก็ยังไม่ค่อยคลิก</p>
<p>แต่ก็จังหวะพอดีที่คอร์สนี้ผมเรียนอยู่บน emacs ผมที่ค่อยๆ ใช้งานหนักขึ้นเรื่อยๆ เพื่อให้ตอบโจทย์การใช้งานที่สุด โพสนี้เลยจะเล่าว่าผมใช้ Emacs REST cilent ยังไง แล้วก็จะเปรียบเทียบ use case เดียวกันเทียบกับ REST client บน Intellij กับ VSCode ด้วยครับ</p>
<h2 id="installing"><strong>Installing</strong></h2>
<p>สำหรับ emacs สามารถโหลดจาก MELPA ได้จาก package ชื่อ <a href="https://github.com/pashky/restclient.el">restclient</a> ครับ แต่ถ้าใครใช้ Doom ก็เพียงแค่เปิด option <code>rest ; Emacs as a REST client</code> ในไฟล์ init.el แล้วสั่ง <code>doom reload</code> ก็พร้อมใช้งานแล้วครับ</p>
<h2 id="basic-usage"><strong>Basic Usage</strong></h2>
<p>วิธีการใช้งานของ restclient ทั้งสามเจ้าที่ผมพูดถึงข้างต้นจะคล้ายๆ กันหมดครับ คือให้เราสร้างไฟล์นามสกุล http ขึ้นมาหลังจากนั้นเราก็เขียน Request ลงไปครับ เหมือนตัวอย่างนี้</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-lisp" data-lang="lisp"><span class="line"><span class="cl"><span class="nv">POST</span> <span class="nv">http://localhost:8081/todos</span>
</span></span><span class="line"><span class="cl"><span class="nv">Authorization:</span> <span class="nv">Bearer</span> <span class="nv">token</span>
</span></span><span class="line"><span class="cl"><span class="nv">Content-Type:</span> <span class="nv">application/json</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">{</span>
</span></span><span class="line"><span class="cl">  <span class="s">&#34;text&#34;</span><span class="err">:</span> <span class="s">&#34;test request&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">}</span>
</span></span></code></pre></div><p>ซึ่งเราจะเห็นได้ว่ามันจะมีส่วนประกอบหลักๆ อยู่ 4 ส่วนคือ</p>
<ul>
<li>HTTP Method — ตรงนี้เราจะใส่เป็น GET, POST, PUT, PATCH, DELETE แล้วแต่เราเลย</li>
<li>HTTP Endpoint — เป็น URL ที่เราจะไป consuming REST service ครับ</li>
<li>Request Header (Optional) — ตรงนี้เป็นส่วนที่เราจะใส่ Request header เช่น Authorization หรือ Content-Type เป็นต้น ถ้าใส่ตัวใหม่ก็เคาะบรรทัดใหม่ แต่มีข้อแม้ว่าต้องติดกับบรรทัดที่เป็น Method + endpoint เสมอครับ</li>
<li>Request Body (Optional) — ตัวนี้แล้วแต่ method ครับ แต่ถ้าเราต้องใช้ให้เคาะ เว้นบรรทัดมาจาก header 1 บรรทัด แล้วใส่ body ไปได้เลย แล้วแต่ type ที่เราตั้งไว้ ซึ่งในเคสข้างบนเป็น JSON ครับ</li>
</ul>
<p>พอเราเตรียม Request query เรียบร้อยแล้ว เราสามารถสั่งให้ emacs เรายิง HTTP request ไปตามที่เราเขียนไว้โดยเลื่อน cursor ไปไว้ที่บรรทัด HTTP Method ครับ หลังจากนั้นกด <code>C-c C-c</code> ก็จะเป็นการยิง request ออกไปครับ ซึ่งถ้าเราไม่เคยยิงมาก่อนมันจะเปิด buffer window ของ <em>HTTP Response</em> ให้อัตโนมัติครับ</p>
<p><img src="/emacs-rest-client/L9Yr4pvWv_hu_84e321774776f3cd.webp"
       srcset="/emacs-rest-client/L9Yr4pvWv_hu_aa690f01d5859298.webp 480w, /emacs-rest-client/L9Yr4pvWv_hu_7ca776626ddc4df2.webp 960w, /emacs-rest-client/L9Yr4pvWv_hu_84e321774776f3cd.webp 1440w"
       sizes="(max-width: 960px) 100vw, 960px"
       width="1440" height="796"
       alt="Screen Shot 2565-01-09 at 10.29.14.png"
       loading="lazy" decoding="async"></p>
<p>ซึ่งมันจะโฟกัส cursor มาที่ window ของ response อัตโนมัติด้วยครับ โดยเราสามารถสลับกลับไปที่ window ของไฟล์ http เราได้โดยกด <code>C-x o</code> ครับ</p>
<h2 id="tricks"><strong>Tricks</strong></h2>
<p>จริงๆ รู้แค่ข้างบนก็พอใช้งานได้แล้ว 80% ครับ แต่เพื่อความสะดวกสบาย ผมมีทริก 3 อย่างที่ใช้บ่อยมาก หลังจากใช้ emacs REST client ตัวนี้มากซักพัก</p>
<p>เทคนิคแรกคือ เวลา cursor ของเราดีดมาที่หน้า response แล้วเราต้องคอย Switch กลับบ่อยๆ มันก็น่ารำคาญครับ ซึ่งเทคนิคนึงที่ช่วยได้คือ ให้เราสั่ง request โดยใช้ <code>C-c C-v</code> แทนครับ วิธีนี้จะทำให้มันไม่โฟกัสไปที่ Buffer ของ <em>HTTP Response</em> ถ้าเราต้องการแค่ดูผลลัพธ์เฉยๆ</p>
<p>เทคนิคที่สองคือ หลายๆ ครั้งการเขียน Request ของเรามันจะมีชื่อซ้ำๆ หรือใช้ Header ซ้ำๆ ใช่มั้ยครับ พอเราไม่อยากเขียนซ้ำหรือต้องแก้หลายที่ ตัว emacs REST client รองรับการสร้าง variable ด้วยในตัวโดย เราสามารถเขียนเป็น</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-lisp" data-lang="lisp"><span class="line"><span class="cl"><span class="ss">:base_url</span> <span class="nf">=</span> <span class="nv">http://localhost:8081</span>
</span></span></code></pre></div><p>หลังจากนั้น เราก็เอาตัวแปรนี้ไปใช้ได้อย่างเช่นในเคสนี้ผมจะเอาไปใช้กับ endpoint ผมก็สามารถเขียนแบบนี้ได้เลย</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-lisp" data-lang="lisp"><span class="line"><span class="cl"><span class="nv">GET</span> <span class="ss">:base_url/tokenz</span>
</span></span></code></pre></div><p>ซึ่งนอกจาก การแทนที่ variable แบบง่ายๆ นี้แล้ว เราสามารถทำ multiline variable ได้ด้วย โดยเปลี่ยนจาก <code>=</code> เป็น <code>= &lt;&lt;</code> ซึ่งสามารถไปดูได้ใน GitHub ของ library นี้ได้เลยครับ</p>
<p>เทคนิคสุดท้ายคือ เป็นเรื่องธรรมดามากที่เราจะมีการป้องกัน API เราด้วย Authentication method แล้วเราต้องมาแปะ token ที่ยิงขอจาก API นึงมาใช้กับ API อื่นๆ ใน emacs REST client ตัวนี้เราสามารถทำได้เหมือนกันครับ โดยทำตามนี้</p>
<p>ใน Request ที่เราทำ Authentication แล้วเราได้ Token กลับคืนมาใน Response ให้เราใส่ Hook ตัวนี้ลงไปหลัง Request ที่เราทำการขอ Token ครับCOPY</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-lisp" data-lang="lisp"><span class="line"><span class="cl"> <span class="nv">-&gt;</span> <span class="nv">run-hook</span> <span class="p">(</span><span class="nv">restclient-set-var</span> <span class="s">&#34;:newtoken&#34;</span> <span class="p">(</span><span class="nf">cdr</span> <span class="p">(</span><span class="nv">assq</span> <span class="ss">&#39;token</span> <span class="p">(</span><span class="nv">json-read</span><span class="p">))))</span>
</span></span></code></pre></div><p>จะมีจุดสังเกตุอยู่ 2 จุดคือ</p>
<ul>
<li><code>“:newtoken”</code> ตัวนี้คือชื่อตัวแปรที่เราจะเซตให้กับ token ที่เราอ่านขึ้นมาได้ครับ</li>
</ul>
<p><code>‘token</code> ตัวนี้เป็น key ใน response body ที่เราจะไปอ่านค่าของ token ขึ้นมาครับ</p>
<p>นอกจากนั้นจะเป็น function ที่ restclient.el เตรียมมาให้เราในการอ่านค่าจาก Response JSON ครับ</p>
<p>ใน Request ของ protected resource เราสามารถนำตัวแปรนั้นไปใช้ได้เหมือนกับวิธีการใช้ตัวแปรตัวอื่นเลย อย่างเช่นในเคสนี้ผมเอาไปใส่ไว้ใน Authorization header ครับ</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-lisp" data-lang="lisp"><span class="line"><span class="cl"> <span class="nv">POST</span> <span class="nv">http://localhost:8081/todos</span>
</span></span><span class="line"><span class="cl"> <span class="nv">Authorization:</span> <span class="nv">Bearer</span> <span class="ss">:newtoken</span>
</span></span></code></pre></div><p>เพียงแค่นี้เราก็จะสามารถใช้ reuse authentication token กับ request อื่นๆ ได้แล้วครับ ซึ่งจริงๆ ตัว Library นี้ยังมีฟีเจอร์อื่นๆ อีกด้วยครับ สามารถลองกดคีย์ดูได้ ยังมีอีกหลายฟีเจอร์ที่ผมยังไม่ได้ใช้เลย</p>
<p><img src="/emacs-rest-client/q5h3vgH39_hu_257d011fcc56c559.webp"
       srcset="/emacs-rest-client/q5h3vgH39_hu_2d96b7e65b59a570.webp 480w, /emacs-rest-client/q5h3vgH39_hu_2adaaf3fce01b4ed.webp 960w, /emacs-rest-client/q5h3vgH39_hu_257d011fcc56c559.webp 1440w"
       sizes="(max-width: 960px) 100vw, 960px"
       width="1440" height="999"
       alt="Screen Shot 2565-01-09 at 11.13.38.png"
       loading="lazy" decoding="async"></p>
<h2 id="comparison-with-intellij-rest-client-and-vscode-rest-client"><strong>Comparison with Intellij REST client and VSCode REST client</strong></h2>
<p>ไหนๆ ก็พูดถึง Emacs แล้วก็ขอเทียบกับ REST client แบบเดียวกันของ Intellij กับ VSCode เลยละกันว่ามันมีข้อดีข้อเสียต่างกันยังไงบ้าง</p>
<p><img src="/emacs-rest-client/srgYnopvq_hu_27e731e4cd180f5b.webp"
       srcset="/emacs-rest-client/srgYnopvq_hu_cc6239823828a84f.webp 480w, /emacs-rest-client/srgYnopvq_hu_c3bc5b601ee4b503.webp 960w, /emacs-rest-client/srgYnopvq_hu_27e731e4cd180f5b.webp 1440w"
       sizes="(max-width: 960px) 100vw, 960px"
       width="1440" height="998"
       alt="Screen Shot 2565-01-09 at 10.55.17.png"
       loading="lazy" decoding="async"></p>
<p>เทียบกัน 3 เจ้า ถ้าไม่นับคีย์ emacs ที่กดง่ายมากในตัวอยู่แล้ว ผมยกให้ VSCode REST client นี่ UX ดีสุดเลยครับ ผมรู้สึกว่าการประกาศตัวแปร กับการใช้งานมันตรงไป ตรงมาดีแต่ที่ชอบที่สุดของตัว VSCode คือวิธีการที่มันดึงค่ามาจาก Response นี่ ง่ายที่สุดในทั้ง 3 เจ้า แล้วก็ตรงไปตรงมาที่สุดแล้วครับ โดยแค่บอกชื่อ request name แล้วก็แกะ body ออกมา bind ใส่ variable จบ ซึ่งมันควรจะแค่นี้จริงๆ ครับ</p>
<p><img src="/emacs-rest-client/vpjsN3uun_hu_2a9c3745c3919dc2.webp"
       srcset="/emacs-rest-client/vpjsN3uun_hu_43cf5a1912c767bd.webp 480w, /emacs-rest-client/vpjsN3uun_hu_8fab7fb9e8b77c3f.webp 960w, /emacs-rest-client/vpjsN3uun_hu_2a9c3745c3919dc2.webp 1440w"
       sizes="(max-width: 960px) 100vw, 960px"
       width="1440" height="788"
       alt="Screen Shot 2565-01-09 at 11.46.48.png"
       loading="lazy" decoding="async"></p>
<p>ในส่วนของ Intellij REST Client ผมว่าข้อดีคือมัน Integrate กับ ecosystem ของ Jetbrain ได้เนียนจนคนที่ใช้อยู่แล้ว จะไม่รู้สึกว่ามันขัดเลยอย่างเช่นปุ่มกด run request รวมถึง Response ที่หน้าตาไม่ต่างกับ test runner ที่คุ้นเคยกันอยู่แล้ว อาจจะมี function ที่เวิ่นเว้อหน่อยในการแกะ response ออกมา แต่ผมว่าก็ยังอ่านง่ายกว่าและตรงไปตรงมากว่า emacs ครับ</p>
<p>ข้อเสียหลักๆ ของ Intellij REST cilent คือการที่เราต้องประกาศ environment แยกไว้อีกไฟล์นี่แหละครับ ส่วนตัวผมรู้สึกว่ามันขัดใจมาก (หรือถ้ามันประกาศไว้ในไฟล์เดียวได้บอกผมหน่อยนะครับ) อีกข้อเสียนึงที่เป็นส่วนหนึ่งให้ผมเลิกใช้ตัวนี้ไปคือมันจะเก็บ Response ไว้ในไฟล์เป็น default ครับ ซึ่งพอเราเทสบ่อยๆ มันก็สร้างไฟล์ response ออกมาบานมา แล้วต้องมาคอยนั่งไล่ลบใน .idea เราที่บวมขึ้นเรื่อยๆ ครับ</p>
<h2 id="verdict"><strong>Verdict</strong></h2>
<p>สุดท้ายแล้ว ผมรู้สึกว่าเรามาถึงยุคที่การเก็บ HTTP Request query เป็น Plain text นี้มันดูแลง่ายกว่าสมัยก่อนมากๆ ครับ เพียงแค่ยัดลง git เราก็จะ maintain ตัวนี้ได้ยาวๆ เป็น executable document ที่แท้จริง แล้วจะเห็นได้ว่าแทบจะทุก editor/IDE รองรับแล้ว แต่อาจจะแตกต่างกันไปตามสไตล์แต่ละ implementation ของตัวเองครับ ซึ่งในจุดนี้ถ้าทั้งทีมตกลงกันดีๆ ผมคิดว่าน่าจะไม่มีปัญหาอะไร ส่วนใครเอาไปปรับใช้กับตัวเองแล้วเจอเทคนิคอะไรดีๆ ก็แบ่งปันกันได้ครับ แล้วเจอกันใหม่ตอนหน้าครับ</p>
<hr>
<p>ปล.นอกเรื่องนิดนึงตอนแรกซีรีย์ emacs diary นี้ผมว่าจะเขียนตั้งแต่ Basic ขึ้นไปเรื่อยๆ แต่คิดว่าทำแบบนั้นกว่าจะได้เขียนเรื่องที่อยากเขียน หรือพอมีเรื่องที่จะเขียนมันก็ต่อคิวยาว เพราะฉะนั้นผมเลยเปลี่ยนแนวทางใหม่เป็นลงตามอารมณ์เลยละกันครับ 555</p>
]]></content:encoded></item><item><title>Emacs diary EP2: สภาพแวดล้อม</title><link>https://yothinix-com.pages.dev/emacs-env/</link><pubDate>Sat, 04 Dec 2021 13:13:00 +0700</pubDate><guid>https://yothinix-com.pages.dev/emacs-env/</guid><description>&lt;p&gt;ผมไม่รู้ว่าจะมีใครมาใช้ emacs แบบ เป็น text-editor ตัวแรกเลยมั้ย ผมไม่ใช่คนนึงแน่ๆ ซึ่งพอเราเปลี่ยนเครื่องมือ มันจะอารมณ์เดียวกับเราเปลี่ยนภาษา Programming ที่เราเขียนทุกวันเลย เพราะสิ่งแรกๆ ที่เราพยายามทำคือ &amp;ldquo;เราพยายามจะทำสิ่งเดียวกับที่เราเคยทำได้จากภาษาเก่า ในภาษาใหม่&amp;rdquo; ลองเปลี่ยนคำว่า ภาษา เป็น text-editor ดูครับ แล้วลองตอบตัวเองดูว่าเราอยากทำอะไรได้บ้าง&lt;/p&gt;
&lt;p&gt;คำตอบของคำถามข้างบนมันน่าจะเยอะมาก หรืออาจจะขอแค่มี syntax highlight ผมเชื่อว่าแต่ละคนมีคำตอบของตัวเอง ซึ่งผมก็มีคำตอบของผมด้วย และคิดว่าเป็นหัวข้อที่ดีที่จะเอามาเขียน EP2 ที่ค้างคาไว้มานาน หลังจากเกริ่นมานาน วันนี้ขอเสนอตอน &amp;ldquo;สภาพแวดล้อม&amp;rdquo; ครับ&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;💬 ในบล็อกนี้ผมอาจจะมี Reference ถึง key Vim เยอะมาก ไม่ใช่เพราะมันไม่ดี แต่เพื่อต้องการให้เห็นภาพว่า Design philosophy มันต่างกัน และส่วนตัวผมยังชอบ Vim อยู่นะ :wq!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="เปดประตและปดประต"&gt;&lt;strong&gt;เปิดประตูและปิดประตู&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;มันจะมี Joke ที่คนใช้ Vim โดนล้อกันบ่อยๆ คือปิด Vim กันไม่เป็น ซึ่งส่วนตัวผมมองว่า Emacs ก็ไม่ต่างกัน ถึงมันจะมี Menu bar ให้ข้างบนก็เถอะ&lt;/p&gt;
&lt;p&gt;ถ้าต้องการเปิดไฟล์ใน emacs เราจะเปิดจาก terminal เป็น emacs ก็ได้ แต่ถ้าเผลอเข้ามาใน emacs แล้วจะใช้ &lt;code&gt;C-x C-f&lt;/code&gt; ครับ&lt;/p&gt;</description><content:encoded><![CDATA[<p>ผมไม่รู้ว่าจะมีใครมาใช้ emacs แบบ เป็น text-editor ตัวแรกเลยมั้ย ผมไม่ใช่คนนึงแน่ๆ ซึ่งพอเราเปลี่ยนเครื่องมือ มันจะอารมณ์เดียวกับเราเปลี่ยนภาษา Programming ที่เราเขียนทุกวันเลย เพราะสิ่งแรกๆ ที่เราพยายามทำคือ &ldquo;เราพยายามจะทำสิ่งเดียวกับที่เราเคยทำได้จากภาษาเก่า ในภาษาใหม่&rdquo; ลองเปลี่ยนคำว่า ภาษา เป็น text-editor ดูครับ แล้วลองตอบตัวเองดูว่าเราอยากทำอะไรได้บ้าง</p>
<p>คำตอบของคำถามข้างบนมันน่าจะเยอะมาก หรืออาจจะขอแค่มี syntax highlight ผมเชื่อว่าแต่ละคนมีคำตอบของตัวเอง ซึ่งผมก็มีคำตอบของผมด้วย และคิดว่าเป็นหัวข้อที่ดีที่จะเอามาเขียน EP2 ที่ค้างคาไว้มานาน หลังจากเกริ่นมานาน วันนี้ขอเสนอตอน &ldquo;สภาพแวดล้อม&rdquo; ครับ</p>
<blockquote>
<p>💬 ในบล็อกนี้ผมอาจจะมี Reference ถึง key Vim เยอะมาก ไม่ใช่เพราะมันไม่ดี แต่เพื่อต้องการให้เห็นภาพว่า Design philosophy มันต่างกัน และส่วนตัวผมยังชอบ Vim อยู่นะ :wq!</p>
</blockquote>
<h2 id="เปดประตและปดประต"><strong>เปิดประตูและปิดประตู</strong></h2>
<p>มันจะมี Joke ที่คนใช้ Vim โดนล้อกันบ่อยๆ คือปิด Vim กันไม่เป็น ซึ่งส่วนตัวผมมองว่า Emacs ก็ไม่ต่างกัน ถึงมันจะมี Menu bar ให้ข้างบนก็เถอะ</p>
<p>ถ้าต้องการเปิดไฟล์ใน emacs เราจะเปิดจาก terminal เป็น emacs ก็ได้ แต่ถ้าเผลอเข้ามาใน emacs แล้วจะใช้ <code>C-x C-f</code> ครับ</p>
<blockquote>
<p>💬 วิธีกดปุ่มอย่างที่เห็นข้างบนตัว ctrl หรือที่ชอบเขียนใน Document เป็น C- ก็คือกด ctrl แช่ไว้แล้วตามด้วยตัวอักษรครับ แต่ถ้าเป็น combo แบบข้างบนกด ctrl ค้างไว้เลยแล้วกด x f ก็ได้ครับ</p>
</blockquote>
<p>ทีนี้ก็มาถึง Highlight เรา เราจะปิด emacs ยังไงดี การปิด emacs จะใช้คีย์ <code>C-x C-c</code> ครับ ซึ่งถ้าเราไม่ได้แก้ไขอะไรใน buffer ที่เราเปิดมันก็จะปิดไปเลย แต่ถ้ามีมันก็จะถามว่าจะ Save มั้ย จะปิดจริงๆ ใช่มั้ยนะ</p>
<h2 id="เดนและกระโดด"><strong>เดินและกระโดด</strong></h2>
<p>สิ่งแรกที่ผมโฟกัสเลยคือการเดิน ซึ่งเอาจริงๆ เราสามารถเลือกที่จะไม่รู้อันนี้ก็ได้ แล้วใช้แค่ Arrow key ที่มีติดมากับคีย์บอร์ดส่วนใหญ่ก็ได้ แต่เหตุผลแรกคีย์บอร์ดผมไม่ใช่คีย์บอร์ดเหมือนคนส่วนใหญ่และสองคือ พอเราเคยใช้ Vim มา เราจะรู้ได้ถึงประสิทธิภาพในการเดินที่ไม่ต้องขยับมือออกจาก Homerow อยู่แล้ว ซึ่งสองเหตุผลนี้คือเหตุผลที่ผมเลือกที่จะเรียนรู้การเดินแบบ emacs ครับ</p>
<p>วิธีการเดินใน emacs จะใช้ Modifier key → Ctrl แล้วตามด้วยคีย์ที่เอาไว้ใช้เดิน ซึ่งประกอบด้วย</p>
<ul>
<li><code>C-f</code> → Forward คือเลื่อน cursor ไปข้างหน้า</li>
<li><code>C-b</code> → Backward คือเลื่อน cursor ไปข้างหลัง</li>
<li><code>C-p</code> → Previous คือเลื่อน cursor ขึ้นบน</li>
<li><code>C-n</code> → Next คือเลื่อน cursor ลงล่าง</li>
</ul>
<p>ซึ่งสำหรับคนที่เปลี่ยน Keyboard layout อย่างผมมันจำง่ายกว่าคีย์ Vim ที่ intention เอาไว้มือขวา แต่ emacs เลือกที่จะแมพตามคำที่ระบุ Behavior มัน ซึ่งแปปเดียวก็จำได้เลย</p>
<p>ในส่วนของการกระโดดนั้น ถ้าเป็นการกระโดดข้ามคำ การเดินหน้ากับถอยหลังจะใช้คีย์เดียวกันเลยคือ f, b แต่เปลี่ยน Modifier คีย์เป็น M หรือ Meta key หรือ Alt หรือ Option key (1) แต่ถ้าเป็นการกระโดดไปที่ตัวสุดท้ายของบรรทัดหรือถอยไปต้นบรรทัดจะใช้ a, e แทน ซึ่งสรุปได้ตามนี้ครับ</p>
<ul>
<li><code>M-f</code> → Forward Word</li>
<li><code>M-b</code> → Backward Word</li>
<li><code>C-a</code> → Beginning of Line</li>
<li><code>C-e</code> → End of Line</li>
</ul>
<p>ส่วนการกระโดดขึ้นลงนั้น จะเริ่มจำยากกว่าที่ไล่มาข้างบนคือ <em>movement by balanced expression</em>. ซึ่งจะใช้ { } ในการกระโดดระหว่าง Block ของ expression หรือ Paragraph ถ้าพูดแบบบ้านๆ แต่เราก็สามารถกระโดดขึ้นไปบรรทัดแรกหรือบรรทัดสุดท้ายของไฟล์ได้ด้วยตามนี้ครับ</p>
<ul>
<li><code>M-{</code> → Move to Beginning of Paragraph</li>
<li><code>M-}</code> → Move to End of Paragraph</li>
<li><code>M-&lt;</code> → Move to Beginning of Buffer</li>
<li><code>M-&gt;</code> → Move to End of Buffer</li>
</ul>
<p>อันที่จริง ยังมีอีกหลายคีย์ที่ช่วยให้เราเดินและกระโดดได้อีกในหลายรูปแบบ แต่ข้างบนเป็นรูปแบบที่ผมใช้บ่อยจนติดเป็น Muscle Memory ไปละ</p>
<blockquote>
<p>💬 แรงบันดาลใจหนึ่งที่ผมมาใช้ emacs เพราะตอนผมไปเรียน HtDP รุ่นพี่ผมเค้าบอกว่าเนี่ยคีย์ที่กดใน Racket เนี่ยมันคีย์เดียวกับ emacs เลย แล้วมันกดได้ในหลายโปรแกรมเลยนะ พอผมไปลองเท่านั้นแหละ จริง! แทบจะทุกโปรแกรมครับ</p>
</blockquote>
<h2 id="buffer"><strong>Buffer</strong></h2>
<p>ก่อนจะไปถึง Window ที่ผมเชื่อว่าหลายๆ คนชินมากับ Editor อื่นๆ เหมือนผม ผมอยากจะให้ทุกคนลองรู้จักกับระบบ Buffer ใน emacs ก่อน เพราะส่วนตัวผมชอบ emacs มากระดับที่เรียกได้ว่า Paradigm shift กันเลยทีเดียว</p>
<p>เวลาเราเปิดไฟล์ขึ้นมาใน emacs ตัวไฟล์จะไม่โดนแก้ไขตรงๆ แต่แรกครับ แต่มันจะถูกโหลดมาเก็บไว้ใน buffer ของ emacs ซึ่งใน emacs มี buffer หลายแบบมากทั้ง</p>
<p><code>*file*</code> - ตัวนี้เราน่าจะยุ่งบ่อยสุดละ มันคือ buffer ที่เกิดจากเวลาเราเปิดไฟล์ขึ้นมาใน emacs ครับ ซึ่งปกติมันก็จะตั้งชื่อให้เป็นชื่อไฟล์ที่เราเปิดโดยอัตโนมัติ</p>
<p><code>*scratch*</code> - ตัวนี้เป็นเหมือนกระดาษทด เอาไว้ให้เราจดอะไรก็ได้</p>
<p><code>*message*</code> - ตัวนี้เป็นพวกแจ้งเตือนที่ emacs เตือนเรา อย่างเช่นตอนเราจะปิด emacs ตอนยังไม่เซฟไฟล์</p>
<p><code>*help*</code> - ตัวนี้ตามตัวครับเป็นคู่มือให้เราใช้ emacs</p>
<p>ทีนี้เวลาเราทำงานกับ buffer สำหรับผมคิดว่ามี 2 อย่างที่ควรรู้เอาไว้คือ การสลับ buffer เวลาเราเปิดหลายๆ ไฟล์ และการลบ buffer ที่ไม่ใช้แล้วออกไปครับ</p>
<p><img src="/emacs-env/bLbBVLbMG_hu_64f2f1b136aec366.webp"
       srcset="/emacs-env/bLbBVLbMG_hu_f83c0b64c03cca4d.webp 480w, /emacs-env/bLbBVLbMG_hu_3637f750dfa02dd6.webp 960w, /emacs-env/bLbBVLbMG_hu_64f2f1b136aec366.webp 1440w"
       sizes="(max-width: 960px) 100vw, 960px"
       width="1440" height="678"
       alt="Screen Shot 2564-12-04 at 09.30.33.png"
       loading="lazy" decoding="async"></p>
<p>การสลับ buffer เราสามารถกด <code>C-x b</code> ได้ครับ จะเป็นการเปิดเมนูให้เราสลับ buffer ได้โดยพิมพ์ชื่อเอาก็ได้ หรือจะเลื่อนขึ้นลงก็ได้ครับ (ในภาพเป็นตัวที่ Modify ใน Doom แล้วแต่ตัวมาตรฐานก็กด tab เพื่อดู list ของ buffer ทั้งหมดได้ครับ</p>
<p>อีกอย่างคือ พอเราเปิดไฟล์มาเยอะๆ ตัว buffer เราก็จะเริ่มล้นหรือทำให้หาไฟล์ที่ต้องการยากขึ้น ไม่ต่างจากเวลาเราเปิด chrome tab ไว้เยอะๆ เลย ซึ่งวิธีการลบ buffer คือกด <code>C-x k</code> ครับ ซึ่งจะเหมือนกับตอนเราปิด emacs คือถ้าเรายังไม่เซฟไฟล์มันจะถามก่อนว่าจะเซฟก่อนมั้ย</p>
<p>Buffer ยังทำอะไรได้อีกเยอะมากครับ ทั้งเปิด email, feed, calendar หรือแม้กระทั่งเป็น terminal emulator แต่เอาไว้ตอนต่อๆ ไปผมค่อยไปเล่าถึงตรงนั้น แล้วก็ท้ายสุด ใน Vim ก็มี buffer นะ แต่ผมไม่เคยใช้เลย ฮาาา</p>
<h2 id="window"><strong>Window</strong></h2>
<p>ถ้าเป็นใน text-editor ตัวอื่นๆ แทบจะทั้งหมดหรืออย่างน้อยก็ที่ผมรู้จัก เค้าจะเรียกสิ่งนี้ว่า Pane ครับ ซึ่งสามารถ Split ได้ทั้ง Horizontal, Vertical เลยโดยคีย์หลักๆ ที่ผมใช้จะมี</p>
<p><code>C-x 2</code> - อันนี้ไว้ Split Horizontal หรือแบ่งบนล่างครับ</p>
<p><code>C-x 3</code> - อันนี้ไว้ Split Vertical หรือแบ่งซ้ายขวาครับ</p>
<p><code>C-x o</code> - อันนี้เป็นตัวอักษร O (Omongo) นะครับ เอาไว้สลับระหว่าง Window</p>
<p><code>C-x 0</code> - อันนี้เป็นเลข 0 นะครับ เอาไว้ลบ window ที่กำลังโฟกัสอยู่ (Close this window)</p>
<p><code>C-x 1</code> - อันนี้เอาไว้ปิดที่เหลือทั้งหมด (Close other window)</p>
<p>ซึ่งหลังจากใช้ได้ซักพักผมรู้สึกว่ามันคุ้นๆ นะ จนผมค้นพบว่าคีย์มันคล้าย tmux มากๆ เลยครับ อาจจะคล้ายแค่ <code>C-x o</code> พวก Split อะไรอาจจะไม่ตรง แต่มันทำให้ผมเข้าใจ concept switch window ได้เร็วมากๆ นอกจากนั้น ถ้าเราเปิด 3 Window ขึ้นไป ใน Doom emacs มันจะมีฟีเจอร์ highlight window ต่างๆ เป็นตัวอักษรครับ ถ้าอยากไปหน้าไหน ก็กดตัวอักษรที่มัน highlight แดงๆ เลยไม่ต้องกด <code>C-x o</code> ย้ำๆ หลายๆ ครั้งครับ</p>
<p><img src="/emacs-env/0AzwfSNfp_hu_fb81b0fbf27d93ad.webp"
       srcset="/emacs-env/0AzwfSNfp_hu_8a8bd67b0518238b.webp 480w, /emacs-env/0AzwfSNfp_hu_f0162558e051d79d.webp 960w, /emacs-env/0AzwfSNfp_hu_fb81b0fbf27d93ad.webp 1440w"
       sizes="(max-width: 960px) 100vw, 960px"
       width="1440" height="1058"
       alt="Screen Shot 2564-12-04 at 09.41.06.png"
       loading="lazy" decoding="async"></p>
<h2 id="frame"><strong>Frame</strong></h2>
<p>Frame ถ้าแปลตรงตัวคือกรอบใช่มั้ยครับ ใน emacs มันหมายถึงหน้าต่างทั้งหน้าเลย (ไม่ใช่หน้าต่าง Window ที่ผมพูดถึงข้างบนนะ) ซึ่งผมว่าสิ่งที่อธิบายได้ดีที่สุดคือมันเหมือน tmux window ที่เรากด <code>C-b c</code> มากๆ ครับ</p>
<p>ตัว Frame มีประโยชน์มากๆ เอาไว้ให้เราแยก Workspace ได้จะในกรณีที่เราเปิด Window เยอะๆ แล้ว ก็อยากเปิดอันอื่นด้วย แต่หน้าไม่พอ ส่วนตัวผมไม่ค่อยได้ใช้ฟีเจอร์นี้เท่าไร แทบจะนับครั้งได้ เลยไม่รู้จะเล่าอะไรเท่าไร</p>
<h2 id="tab"><strong>Tab</strong></h2>
<p>พอผ่านมาทั้ง Buffer, Windows, Frame หลายคนน่าจะสงสัยว่า อ่าวแล้ว Tab ละในพวก text-editor อื่นๆ ก็มีนิ ใช่ครับ emacs ก็มีแต่ผมไม่เคยใช้ครับ ผมใช้แค่ข้างบนก็พอละ</p>
<p>แต่ถ้ามามองอีกมุมนึงผมว่า concept ของ buffer มันทดแทน tab ได้เลยนะ เพราะถ้าอยากไปดูไฟล์ไหนก็เปิด buffer ขึ้นมาดูเอา อีกเหตุผลนึงคือผมว่ามันโฟกัสกว่าด้วย ไม่ต้องเห็น tab ให้รกหูรกตา</p>
<h2 id="emacs-pinky"><strong>Emacs Pinky</strong></h2>
<p>ถ้าใครเพิ่งมาลอง emacs ใหม่ๆ แล้วมาถึงจุดนี้ ขอแสดงความยินดีด้วยครับ คุณได้สัมผัสกับสิ่งที่ชาว emacs โดนล้อมาหลายปีนั่นก็คือ Emacs Pinky ครับ ถ้าสังเกตุ เราใช้นิ้วก้อยกด Ctrl (C) กันซ้ำๆ เยอะมากและถ้าใช้บ่อยๆ หนักๆ มันก็เกิดอาการบาดเจ็บได้ ซึ่งเอาจริงๆ มันก็ไม่ค่อยดีกับสุขภาพนิ้วเท่าไร วิธีการบรรเทาขั้นแรก แต่ก็ยังเจ็บนิ้วก้อยอยู่ คือย้าย ctrl มาไว้ที่ปุ่ม Caplock เอาครับ อารมณ์เดียวกับชาว Vim ที่ย้าย ESC มาอยู่ที่ Caplock เหมือนกัน</p>
<p>ถ้าใครย้ายแล้วยังรู้สึกปวดนิ้วก้อยอยู่ ผมก็แนะนำคีย์บอร์ดที่ช่วยเพิ่มการใช้งานนิ้วโป้ง อย่างมีนัยยะสำคัญอย่าง Ergodox EZ หรือ Kinesis Advantage2 ก็ได้ครับ จะช่วยให้เราย้ายปุ่มพวก Modifier key ให้มาอยู่ที่นิ้วโป้งเราได้ ช่วยลดภาระของนิ้วก้อยไปได้มากๆ</p>
<p>แต่ส่วนตัวผมถึงจะใช้ Ergodox EZ แต่ผมก็ยังแมพไว้ที่นิ้วก้อยอยู่ครับ เพราะ Thumb cluster ผมมันแมพปุ่มอื่นจนเต็มแล้ว T_T</p>
<p><img src="/emacs-env/0MsDuO0Sg_hu_991365afe1b16a8b.webp"
       srcset="/emacs-env/0MsDuO0Sg_hu_84286c6bf26dd8fd.webp 480w, /emacs-env/0MsDuO0Sg_hu_991365afe1b16a8b.webp 960w"
       sizes="(max-width: 960px) 100vw, 960px"
       width="960" height="396"
       alt="Screen Shot 2564-12-04 at 08.21.46.png"
       loading="lazy" decoding="async"></p>
<p>ก็ประมาณนี้ครับตอนสอง ผมว่าวิธีการที่ emacs เค้าออกแบบสภาพแวดล้อมขึ้นมานี่น่าสนใจมากเป็นอีก Philosophy ที่ก็มีจุดแข็งในตัวมันเองครับ ถ้าใครชอบซีรีย์นี้ก็กดติดตามได้ใน Hashnode ครับ พอถึงเวลาที่ผมออกตอนใหม่เดี๋ยวมันก็แจ้งเตือนเอง แล้วเจอกันใหม่ตอนหน้าครับ</p>
<h2 id="reference"><strong>Reference</strong></h2>
<ul>
<li><a href="https://www.masteringemacs.org/article/effective-editing-movement">https://www.masteringemacs.org/article/effective-editing-movement</a></li>
<li><a href="https://www.oreilly.com/library/view/learning-gnu-emacs/0596006489/ch04.html">https://www.oreilly.com/library/view/learning-gnu-emacs/0596006489/ch04.html</a></li>
<li><a href="https://en.wikipedia.org/wiki/Emacs#Emacs_pinky">https://en.wikipedia.org/wiki/Emacs#Emacs_pinky</a></li>
</ul>
<h2 id="footnote"><strong>Footnote</strong></h2>
<p>(1) อันนี้แล้วแต่ emacs variations ที่ลงในเครื่องเลยครับส่วนตัวผมใช้ <strong><a href="https://github.com/railwaycat/homebrew-emacsmacport">Homebrew-emacsmacport</a></strong> ทำให้มันแมพกับ Option แทนที่จะแมพกับ Cmd เหมือนกับบาง Variations</p>
]]></content:encoded></item><item><title>Emacs diary EP1: จุดเริ่มต้น</title><link>https://yothinix-com.pages.dev/emacs-getting-start/</link><pubDate>Sat, 02 Oct 2021 13:10:00 +0700</pubDate><guid>https://yothinix-com.pages.dev/emacs-getting-start/</guid><description>&lt;p&gt;ช่วง 2 เดือนที่ผ่านมาเป็นช่วงเวลาที่ผมเริ่มหัดใช้ Emacs จาก 0 เลยซึ่งจากใจคนที่อยู่บน Vim และ Jetbrains ecosystem มานาน ผมค้นพบว่า มันมีหลายๆ อย่างมากที่ Emacs ทำได้ดีในแบบของมันและหลายๆ ครั้งเป็นแรงบันดาลใจให้โปรแกรมอื่นๆ ด้วย&lt;/p&gt;
&lt;p&gt;และจากชื่อที่มี EP1 แน่นอนครับว่า ผมไม่ได้มาเดี่ยวๆ เดี๋ยวมันจะพาลูกตามมาอีกเรื่อยๆ ก็คอยกดติดตามซีรีย์นี้กันได้ครับ สำหรับในตอนแรกนี้ ผมจะเล่าถึงวิธีการ ที่ผมศึกษาวิธีใช้ Emacs ในช่วงที่ผ่านมาครับ ซึ่งถ้าใครขี้เกียจรอตอนต่อๆ ไป ถ้าดูตามวาร์ปที่ผมลิสต์ไว้ก็ไปได้ไกลละครับ&lt;/p&gt;
&lt;h2 id="อยางแรกเลยวธตดตง-emacs-ใน-mac-เหมอนจะงายแตตองร"&gt;&lt;strong&gt;อย่างแรกเลยวิธีติดตั้ง Emacs ใน Mac เหมือนจะง่ายแต่ต้องรู้&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;ปกติเวลาเราจะลง Software อะไรใน Mac ถ้าแบบไม่คิดเลย เราจะมุ่งไปหา Homebrew ซึ่งแค่ brew install emacs แค่นี้ก็ใช้ได้ละ แต่ปัญหาคือ Binary นี้มันไม่ได้ถูก Optimize มาให้ Mac ซักเท่าไร จะเจอปัญหาปุ่ม Command บ้าง แต่ที่หนักที่สุดคือ Window mode นี่แหละ ซึ่งผมผู้ใช้งาน Magnet อยู่ทำงานกับ Emacs ด้วยไม่ได้ เพราะ Window Snapping ไม่ทำงาน (&lt;a href="https://www.reddit.com/r/emacs/comments/8ez3a9/macos_window_snapping_with_magnetdoesnt_work_on/"&gt;link&lt;/a&gt;)&lt;/p&gt;</description><content:encoded><![CDATA[<p>ช่วง 2 เดือนที่ผ่านมาเป็นช่วงเวลาที่ผมเริ่มหัดใช้ Emacs จาก 0 เลยซึ่งจากใจคนที่อยู่บน Vim และ Jetbrains ecosystem มานาน ผมค้นพบว่า มันมีหลายๆ อย่างมากที่ Emacs ทำได้ดีในแบบของมันและหลายๆ ครั้งเป็นแรงบันดาลใจให้โปรแกรมอื่นๆ ด้วย</p>
<p>และจากชื่อที่มี EP1 แน่นอนครับว่า ผมไม่ได้มาเดี่ยวๆ เดี๋ยวมันจะพาลูกตามมาอีกเรื่อยๆ ก็คอยกดติดตามซีรีย์นี้กันได้ครับ สำหรับในตอนแรกนี้ ผมจะเล่าถึงวิธีการ ที่ผมศึกษาวิธีใช้ Emacs ในช่วงที่ผ่านมาครับ ซึ่งถ้าใครขี้เกียจรอตอนต่อๆ ไป ถ้าดูตามวาร์ปที่ผมลิสต์ไว้ก็ไปได้ไกลละครับ</p>
<h2 id="อยางแรกเลยวธตดตง-emacs-ใน-mac-เหมอนจะงายแตตองร"><strong>อย่างแรกเลยวิธีติดตั้ง Emacs ใน Mac เหมือนจะง่ายแต่ต้องรู้</strong></h2>
<p>ปกติเวลาเราจะลง Software อะไรใน Mac ถ้าแบบไม่คิดเลย เราจะมุ่งไปหา Homebrew ซึ่งแค่ brew install emacs แค่นี้ก็ใช้ได้ละ แต่ปัญหาคือ Binary นี้มันไม่ได้ถูก Optimize มาให้ Mac ซักเท่าไร จะเจอปัญหาปุ่ม Command บ้าง แต่ที่หนักที่สุดคือ Window mode นี่แหละ ซึ่งผมผู้ใช้งาน Magnet อยู่ทำงานกับ Emacs ด้วยไม่ได้ เพราะ Window Snapping ไม่ทำงาน (<a href="https://www.reddit.com/r/emacs/comments/8ez3a9/macos_window_snapping_with_magnetdoesnt_work_on/">link</a>)</p>
<p>สุดท้าย เลยจึงเป็นสาเหตุให้ต้องหา Binary Emacs ใหม่ ซึ่งผมมาจบที่ <a href="https://github.com/railwaycat/homebrew-emacsmacport">Homebrew-emacsmacport</a> ซึ่งแก้ปัญหา GUI support ใน Mac มาให้แล้ว ตัวนี้สามารถลงผ่าน Homebrew หรือโหลด pre-built binary มาได้เหมือนกัน แต่ผมแนะนำลงผ่าน Homebrew เพราะนอกจากจะอัพเกรดง่ายกว่าแล้ว เรายังสามารถ custom install ได้เช่น เปลี่ยนไอคอนของ App Emacs เป็นต้น</p>
<h3 id="สรปวธตดตง-emacs-บน-mac">สรุปวิธีติดตั้ง Emacs บน Mac</h3>
<p>COPY</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">$ brew tap railwaycat/emacsmacport
</span></span><span class="line"><span class="cl">$ brew install emacs-mac --with-emacs-big-sur-icon
</span></span></code></pre></div><h2 id="จดเรมตนจรงๆ"><strong>จุดเริ่มต้นจริงๆ</strong></h2>
<p>ส่วนตัวผมเป็น Vim User มาน่าจะเกิน 10 ปีละ เคยเฉียดมาใกล้ Emacs มากที่สุดตอนใช้ Spacemacs เมื่อหลายปีก่อน แต่ด้วยความที่ตอนนั้นก็ใช้ Evil mode ในนั้น เลยยังไม่ค่อยได้สัมผัสกับพลังของมันเท่าไร key-binding ที่ใช้ก็เหมือนใช้ Vim ปกติเลย</p>
<p><img src="/emacs-getting-start/l2BK3e_X_hu_904e233960bd19ce.webp"
       srcset="/emacs-getting-start/l2BK3e_X_hu_b14765943d5ed2d4.webp 480w, /emacs-getting-start/l2BK3e_X_hu_f869205813e88e1f.webp 960w, /emacs-getting-start/l2BK3e_X_hu_904e233960bd19ce.webp 1440w"
       sizes="(max-width: 960px) 100vw, 960px"
       width="1440" height="1692"
       alt="228749370_10226649062191075_4331154690813486649_n.jpg"
       loading="lazy" decoding="async"></p>
<p>มารอบนี้จุดเริ่มต้นเพราะคลาส <a href="https://www.coursera.org/learn/programming-languages">Programming Languages, Part A</a> ซึ่งในคลาสแนะนำให้ใช้ Emacs เพราะมันสะดวกกับการเขียน sml มากกว่า ซึ่งตอนเรียนๆ อาจารย์ก็ไม่ได้ใช้อะไรมากนอกจาก navigate ใน Emacs ซึ่งเราก็สามารถใช้ลูกศรได้ตามปกติเลย แต่ถ้าจะมีพิเศษหน่อยคือ การสั่ง Evaluate sml expression (C-c C-e) หรือการเปิด REPL ของ sml เลย ซึ่งใช้ง่ายมาก เลยเป็นจุดเริ่มต้นที่ผมเริ่มจะไปลงลึกกับ Emacs ละ</p>
<p>ด้วยความที่ในคลาสไม่ได้สอนใช้นอกจากที่ผมบอกข้างต้น วิธีการเรียน Emacs ผมช่วงแรกเลยเรียนกับ Youtube channel: <a href="https://www.youtube.com/c/SystemCrafters">System Crafters</a> ซึ่งเป็นช่องที่มีแต่ Emacs จริงๆ จุดเริ่มต้นผมอยู่ที่วิดีโอ <a href="https://www.youtube.com/watch?v=48JlgiBpw_I">The Absolute Beginner&rsquo;s Guide to Emacs</a> ซึ่งผมรู้จัก dired เข้าใจแนวคิด Window/Frame/Buffer แนวคิดของ Major-Mode, Minor-Mode แนวคิดของ Command กับพวก Key binding พื้นฐานจากวิดีโอนี้เลย</p>
<p><img src="/emacs-getting-start/3_cnp_kKf_hu_8e10259d37643e52.webp"
       srcset="/emacs-getting-start/3_cnp_kKf_hu_56287cc6426ca51c.webp 480w, /emacs-getting-start/3_cnp_kKf_hu_2c6349edb2950ee0.webp 960w, /emacs-getting-start/3_cnp_kKf_hu_8e10259d37643e52.webp 1440w"
       sizes="(max-width: 960px) 100vw, 960px"
       width="1440" height="1095"
       alt="Screen Shot 2564-10-02 at 09.06.01.png"
       loading="lazy" decoding="async"></p>
<p>พอจบจากตรงนี้ชีวิตก็เริ่มซนขึ้น เพราะใน Vim เราสามารถ Custom อะไรต่างๆ ได้ลง Package เพิ่มได้ เราก็อยากทำแบบเดียวกันได้เหมือนกัน เลยไปต่อที่วิดีโอซีรีย์ <a href="https://www.youtube.com/playlist?list=PLEoMzSkcN8oPH1au7H6B7bBJ4ZO7BXjSZ">Emacs From Scratch</a> ซึ่งสอนเราค่อยๆ custom ไฟล์ init.el ขึ้นมาจาก 0 เลย ซึ่งซีรีย์นี้ทำให้ผมค่อยๆ รู้จักกับ Ecosystem ของ Emacs มากขึ้นเรื่อยๆ ว่าเห้ย มันมีอะไรมากกว่านั้นนะ และ Community ชอบใช้อะไรกันได้เร็วมาก ซึ่งในแต่ละตอนจะมี Org note เก็บไว้ที่ <a href="https://github.com/daviwil/emacs-from-scratch">GitHub</a> ของเค้าด้วย ซึ่งแยกเป็นตอนๆ แบบละเอียด พร้อมคำอธิบายเลย ซึ่งผมบอกได้เลยว่า ใครชอบอ่านไป GitHub ใครชอบดูวิดีโอไป Youtube เลยครับ ได้อะไรจากตรงนี้เยอะมากแน่ๆ</p>
<p>ตอนแรกขอหอมปาก หอมคอแค่นี้ก่อน ส่วนตอนต่อไปจะเล่าถึงอะไรนั้น คอยติดตามกันได้ครับ</p>
]]></content:encoded></item></channel></rss>