# Mission: Upgrade zsh command history search

ช่วยตั้งค่า terminal (zsh) ของฉันให้ค้นหาคำสั่งเก่า ๆ ได้ง่ายขึ้น ฉันชอบกดลูกศรขึ้นหาคำสั่งที่เคยพิมพ์ แต่บ่อยครั้งจำได้แค่ลาง ๆ ว่ามีคำอะไรอยู่ในคำสั่ง

ทำ 3 อย่างนี้ให้:

1. **กดลูกศรขึ้นแบบกรอง** — พิมพ์ต้นคำสั่ง เช่น `git` แล้วกด `↑` ต้องเจอแค่คำสั่งที่ขึ้นต้นด้วย `git` (ถ้าบรรทัดว่าง กด `↑` ก็ไล่ทุกคำสั่งเหมือนเดิม)
2. **ขยายประวัติคำสั่ง** เป็น 50,000 คำสั่ง แชร์ประวัติข้ามทุกหน้าต่าง/แท็บ ตัดคำสั่งซ้ำ และคำสั่งที่พิมพ์ช่องว่างนำหน้าไม่ต้องบันทึก (เอาไว้ใช้ตอนพิมพ์คำสั่งที่มีรหัสผ่านหรือ token)
3. **ติดตั้ง `fzf`** แล้วผูกกับ zsh ให้ `Ctrl+R` ขึ้นเป็นลิสต์ค้นหาแบบ fuzzy (พิมพ์คำไม่ครบ ไม่เรียงติดกันก็ยังเจอ) และ `Ctrl+T` ใช้ค้นไฟล์

## กติกา

- **สำรวจก่อนแก้** — เช็คว่า shell ที่ใช้คือ zsh จริงไหม (`echo $SHELL`), อ่าน `~/.zshrc` ทั้งไฟล์, เช็คว่ามี oh-my-zsh / prezto / fzf / atuin / zsh-autosuggestions อยู่แล้วไหม และค่า `HISTSIZE` / `SAVEHIST` ตอนนี้เป็นเท่าไหร่ (macOS ตั้งไว้ใน `/etc/zshrc`) แล้วสรุปให้ฉันฟังสั้น ๆ ก่อนลงมือ
- ถ้า shell ไม่ใช่ zsh (เช่น bash) ให้หยุดแล้วบอกฉันก่อน อย่าเอา config ของ zsh ไปใส่ไฟล์ของ bash
- **สำรอง `~/.zshrc` ก่อนแตะ** เป็น `~/.zshrc.bak-<วันที่วันนี้>`
- ถ้ามีการตั้งค่าเรื่องเดียวกันอยู่แล้ว (เช่น oh-my-zsh เปิดลูกศรกรองให้แล้ว หรือมีบรรทัดโหลด fzf อยู่แล้ว) **อย่าใส่ซ้ำ** บอกฉันว่ามีอยู่แล้ว
- เพิ่ม config ใหม่ **ต่อท้ายไฟล์เป็นบล็อกเดียว** มีหัวข้อ comment ชัด ๆ จะได้หาเจอและลบออกง่ายถ้าไม่ชอบ ห้ามแก้บรรทัดเดิมที่มีอยู่
- ติดตั้ง fzf ด้วยตัวจัดการแพ็กเกจของเครื่อง (macOS ใช้ `brew install fzf`, Linux ใช้ `apt` / `dnf` / `pacman` ตามที่มี) ถ้าไม่มีตัวจัดการแพ็กเกจเลย ให้บอกฉันก่อน อย่าไปโหลดสคริปต์จากเว็บมารันเอง

## config ที่ต้องการ (ปรับได้ถ้าเครื่องต่างออกไป)

```zsh
# --- command history (bigger + shared + searchable) ---
HISTSIZE=50000
SAVEHIST=50000
setopt EXTENDED_HISTORY      # record timestamp of each command
setopt SHARE_HISTORY         # share history across open terminals/panes
setopt HIST_IGNORE_ALL_DUPS  # drop older duplicate entries
setopt HIST_IGNORE_SPACE     # commands starting with a space are not saved
setopt HIST_REDUCE_BLANKS

# Up/Down arrows: type a prefix (e.g. "git") then only matching history shows
autoload -U up-line-or-beginning-search down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey '^[[A' up-line-or-beginning-search
bindkey '^[OA' up-line-or-beginning-search
bindkey '^[[B' down-line-or-beginning-search
bindkey '^[OB' down-line-or-beginning-search

# fzf: Ctrl+R = fuzzy history search list, Ctrl+T = pick a file
source <(fzf --zsh)
```

> `fzf --zsh` ใช้ได้กับ fzf เวอร์ชัน 0.48 ขึ้นไป ถ้าเวอร์ชันเก่ากว่านั้น ให้ใช้วิธีผูกตามที่ fzf เวอร์ชันนั้นแนะนำแทน

## ตรวจว่าใช้ได้จริง

รันคำสั่งนี้ แล้วต้องเห็น `HISTSIZE=50000`, `^R` ผูกกับ `fzf-history-widget` และลูกศรขึ้นผูกกับ `up-line-or-beginning-search`:

```bash
zsh -i -c 'echo HISTSIZE=$HISTSIZE SAVEHIST=$SAVEHIST; bindkey "^R"; bindkey "^[[A"'
```

ถ้าขึ้นเตือน `can't change option: zle` ไม่ต้องตกใจ เป็นเพราะ `zsh -c` ไม่ได้เปิดหน้าจอจริง ไม่ใช่ config ผิด

## สรุปให้ฉันตอนจบ

ใช้ภาษาง่าย ๆ ฉันไม่ใช่โปรแกรมเมอร์:

- เปลี่ยนอะไรไปบ้าง และไฟล์สำรองอยู่ที่ไหน (วิธีย้อนกลับ)
- ต้องปิด terminal แล้วเปิดใหม่ หรือพิมพ์ `source ~/.zshrc` ก่อนถึงจะใช้ได้
- วิธีใช้แต่ละอย่างแบบสั้น ๆ: ลูกศรขึ้นแบบกรอง, `Ctrl+R` (เลือกด้วย `↑` `↓`, `Enter` เอามาใส่บรรทัด, `Esc` ยกเลิก), `Ctrl+T`, การพิมพ์ช่องว่างนำหน้าเพื่อไม่ให้บันทึก
- ท่าเสริมที่ไม่ต้องติดตั้งอะไร: `history | grep คำที่จำได้` แล้ว `!เลข` เพื่อรันซ้ำ, `!!` รันคำสั่งล่าสุด
- ถ้าฉันใช้ AI coding tool ที่มีกล่องพิมพ์ของตัวเอง (เช่น Claude Code) ให้บอกด้วยว่า `Ctrl+R` ในนั้นเป็นระบบของตัวแอปเอง ไม่ได้ใช้ fzf ตัวนี้