Skip to content

rescenedev/ev

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

46 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

โšก ev

ํ„ฐ๋ฏธ๋„์—์„œ ์ฆ‰์‹œ ๋œจ๋Š” ํŒŒ์ผ ๊ฒ€์ƒ‰ โ€” macOS์šฉ Everything

ํƒ€์ดํ•‘ํ•˜๋Š” ์ˆœ๊ฐ„ ํŒŒ์ผ๋ช…๊ณผ ํŒŒ์ผ ๋‚ด์šฉ์„ ๋™์‹œ์— ๋’ค์ง„๋‹ค. .hwpx ํ•œ๊ธ€ ๋ฌธ์„œ ์†๊นŒ์ง€.

ripgrep ยท fzf ยท fd ์œ„์— ์–น์€ ์–‡์€ zsh ๋ž˜ํผ โ€” ๋ฐ”ํ€ด๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค์ง€ ์•Š์•˜๋‹ค.


search> ์œ ๋™์„ฑ
 1. ๊ทœ์ •๋ณ€๊ฒฝ์˜ˆ๊ณ  ๊ณต๊ณ ๋ฌธ_๊ธˆ์œตํˆฌ์ž์—…๊ทœ์ • ์ผ๋ถ€๊ฐœ์ •๊ณ ์‹œ์•ˆ.hwpx:20:14:์ฆ๊ถŒ์‚ฌ์˜ ์œ ๋™์„ฑ ๋ฆฌ์Šคํฌ ๊ด€๋ฆฌโ€ฆ  โ”‚  โ”Œโ”€โ”€ preview โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
 README.md:8:์ด ๋„๊ตฌ๋Š” ์œ ๋™์„ฑ ์žˆ๊ฒŒโ€ฆ                                                              โ”‚  โ”‚ ์ฆ๊ถŒ์‚ฌ์˜ ์œ ๋™์„ฑ ๋ฆฌ์Šคํฌ   โ”‚
 lib/search.sh                                                                                    โ”‚  โ”‚ ๊ด€๋ฆฌ ์—ญ๋Ÿ‰ ๋ฐ ์œ„๊ธฐ ๋Œ€์‘โ€ฆ  โ”‚
                                                                                                  โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
Ctrl-F: ๋ฒ”์œ„  Ctrl-H: ์ˆจ๊น€  Enter: ์—ด๊ธฐ  Ctrl-O: Finder  Ctrl-Y: ๋ณต์‚ฌ  ?: ๋ฏธ๋ฆฌ๋ณด๊ธฐ

์™œ ev?

  • ์ฆ‰์‹œ์„ฑ โ€” ์ž…๋ ฅํ•  ๋•Œ๋งˆ๋‹ค rg/fd๊ฐ€ ๋‹ค์‹œ ๋Œ๋ฉฐ ๊ฒฐ๊ณผ๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฐฑ์‹ ๋œ๋‹ค. ์—”ํ„ฐ ์น  ํ•„์š” ์—†์Œ.
  • ์ด๋ฆ„ + ๋‚ด์šฉ ํ•œ ๋ฒˆ์— โ€” ํŒŒ์ผ๋ช… ๋งค์นญ๊ณผ ํŒŒ์ผ ๋‚ด์šฉ ๋งค์นญ์„ ํ•ฉ์ณ ๋ณด์—ฌ์ค€๋‹ค. ๋”ฐ๋กœ ๋„๊ตฌ๋ฅผ ๋ฐ”๊ฟ€ ํ•„์š” ์—†์Œ.
  • ํ•œ๊ธ€ ๋ฌธ์„œ(.hwpx) ๊ด€ํ†ต โ€” zip+XML์„ ํ’€์–ด ๋ณธ๋ฌธ์„ ์ถ”์ถœ, ํ•œ๊ธ€ ์•ฑ ์—†์ด๋„ ๋‚ด์šฉ ๊ฒ€์ƒ‰ยท๋ฏธ๋ฆฌ๋ณด๊ธฐยท์ฝ๊ธฐ๊ฐ€ ๋œ๋‹ค.
  • Finder์ฒ˜๋Ÿผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ โ€” Ctrl-V๋กœ ๋ฌธ์„œ ์ฒซ ํŽ˜์ด์ง€๋ฅผ ํ„ฐ๋ฏธ๋„ ์•ˆ์— ์ด๋ฏธ์ง€๋กœ ๋ Œ๋”(QuickLook + chafa). Ghostty/kitty/WezTerm.
  • ๊ฐ€๋ณ๋‹ค โ€” ์ปดํŒŒ์ผ ์—†๋Š” ๋‹จ์ผ ์Šคํฌ๋ฆฝํŠธ. ์˜์กด์„ฑ์€ ์ „๋ถ€ brew ํ•œ ์ค„. ์—†์œผ๋ฉด ์ž๋™ ์„ค์น˜.

์„ค์น˜

Homebrew (๊ถŒ์žฅ)

brew tap rescenedev/tap   # ํ•œ ๋ฒˆ๋งŒ
brew install ev           # ์ดํ›„์—” ๊ทธ๋ƒฅ ev
brew upgrade ev           # ์—…๋ฐ์ดํŠธ

rg/fzf/fd๋Š” ์˜์กด์„ฑ์œผ๋กœ ํ•จ๊ป˜ ์„ค์น˜๋˜๊ณ , bat(๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ•˜์ด๋ผ์ดํŠธ)ยทpoppler(PDF ์ถ”์ถœ)๋Š” ๊ถŒ์žฅ ์˜์กด์„ฑ์œผ๋กœ ๊ฐ™์ด ๊น”๋ฆฐ๋‹ค. ์ตœ์‹  main์„ ์“ฐ๋ ค๋ฉด brew install --HEAD rescenedev/tap/ev.

์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ

curl -fsSL https://rescenedev.github.io/ev/install.sh | bash

~/.ev์— ๋ฐ›์•„ ~/.local/bin/ev๋กœ ๋งํฌํ•œ๋‹ค. rg/fzf/fd๋Š” ์ฒซ ์‹คํ–‰ ์‹œ ์ž๋™ ์„ค์น˜. ์„ค์น˜ ์œ„์น˜๋Š” EV_INSTALL_DIR / EV_BIN_DIR๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

์ง์ ‘ clone ํ•˜๋ ค๋ฉด
git clone https://github.com/rescenedev/ev && cd ev && ./ev
sudo ln -s "$PWD/ev" /usr/local/bin/ev          # ๋˜๋Š”
mkdir -p ~/.local/bin && ln -s "$PWD/ev" ~/.local/bin/ev

์‚ฌ์šฉ๋ฒ•

ev            # ํ˜„์žฌ ํด๋” ๊ฒ€์ƒ‰
ev ~/work     # ํŠน์ • ํด๋” ๊ฒ€์ƒ‰
ev .          # ํ˜„์žฌ ํด๋” (๋ช…์‹œ)

์‹คํ–‰ํ•˜๋ฉด ํ˜„์žฌ ํด๋” ํ•˜์œ„ ํŒŒ์ผ ๋ชฉ๋ก์ด ๋ฐ”๋กœ ๋œฌ๋‹ค. ํƒ€์ดํ•‘ํ•˜๋ฉด ํŒŒ์ผ๋ช…(fd)๊ณผ ๋‚ด์šฉ(rg)์„ ๋™์‹œ์— ๊ฒ€์ƒ‰ํ•ด ๊ฒฐ๊ณผ๋ฅผ ํ•ฉ์ณ ๋ณด์—ฌ์ค€๋‹ค โ€” ๋‚ด์šฉ ๋งค์น˜๋Š” ํŒŒ์ผ:์ค„:์—ด:๋‚ด์šฉ, ํŒŒ์ผ๋ช… ๋งค์น˜๋Š” ๊ฒฝ๋กœ๋งŒ. ์—”ํ„ฐ๋ฅผ ์น  ํ•„์š” ์—†์ด ํ•œ ๊ธ€์ž ์ž…๋ ฅํ•  ๋•Œ๋งˆ๋‹ค ๊ฒ€์ƒ‰์ด ๋‹ค์‹œ ๋ˆ๋‹ค.

ํ™”๋ฉด ๊ตฌ์„ฑ

search> ์œ ๋™์„ฑ                    โ† ์—ฌ๊ธฐ์— ํƒ€์ดํ•‘ (ํ”„๋กฌํ”„ํŠธ๊ฐ€ ํ˜„์žฌ ๊ฒ€์ƒ‰ ๋ฒ”์œ„๋ฅผ ์•Œ๋ ค์คŒ)
 ํŒŒ์ผ1:์ค„:์—ด:๋งค์นญ๋‚ด์šฉ  โ”‚  โ”Œ preview โ”   โ† ์™ผ์ชฝ: ๊ฒฐ๊ณผ, ์˜ค๋ฅธ์ชฝ: ๋ฏธ๋ฆฌ๋ณด๊ธฐ(๋งค์นญ ์ค„ ๊ฐ•์กฐ)
 ํŒŒ์ผ2 (ํŒŒ์ผ๋ช… ๋งค์น˜)   โ”‚  โ”‚  โ€ฆ      โ”‚
 โ€ฆ                     โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
Ctrl-F: ๋ฒ”์œ„  Ctrl-H: ์ˆจ๊น€  Enter: ์—ด๊ธฐ  โ€ฆ   โ† ํ•˜๋‹จ: ๋‹จ์ถ•ํ‚ค ํžŒํŠธ
  • ๊ฒฐ๊ณผ ์ค„ ํ˜•์‹ โ€” ๋‚ด์šฉ ๋งค์น˜๋Š” ๊ฒฝ๋กœ:์ค„๋ฒˆํ˜ธ:์—ด๋ฒˆํ˜ธ:๋งค์นญํ•œ ์ค„, ํŒŒ์ผ๋ช… ๋งค์น˜๋Š” ๊ฒฝ๋กœ๋งŒ.
  • ์˜ค๋ฅธ์ชฝ ๋ฏธ๋ฆฌ๋ณด๊ธฐ โ€” bat์ด ์žˆ์œผ๋ฉด ๋ฌธ๋ฒ• ํ•˜์ด๋ผ์ดํŠธ, ์—†์œผ๋ฉด cat. hwpx ๋“ฑ์€ ์ถ”์ถœํ•œ ํ‰๋ฌธ์„ ๋ณด์—ฌ์ฃผ๊ณ  ๋งค์นญ ์ค„๋กœ ์Šคํฌ๋กคํ•œ๋‹ค.
  • ๊ฒฐ๊ณผ๊ฐ€ ์•ˆ ๋ณด์ด๋ฉด โ€” ๊ฒ€์ƒ‰ ๋ฒ”์œ„(Ctrl-F)๋‚˜ ์ˆจ๊น€ ํ† ๊ธ€(Ctrl-H)์„ ํ™•์ธ. .gitignore์— ๊ฑธ๋ฆฐ ํŒŒ์ผ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น ์ง„๋‹ค.

๊ฒ€์ƒ‰์–ด ๋ฌธ๋ฒ•

  • ๊ณต๋ฐฑ์œผ๋กœ ๋‹จ์–ด ๋‚˜์—ด โ€” rg์˜ ์Šค๋งˆํŠธ ์ผ€์ด์Šค๊ฐ€ ์ ์šฉ๋œ๋‹ค(์†Œ๋ฌธ์ž๋ฉด ๋Œ€์†Œ๋ฌธ์ž ๋ฌด์‹œ, ๋Œ€๋ฌธ์ž๊ฐ€ ์„ž์ด๋ฉด ๊ตฌ๋ถ„).

  • ํ™•์žฅ์ž ํ•„ํ„ฐ *.ํ™•์žฅ์ž โ€” ๊ฒ€์ƒ‰์–ด์— *.pdf ๊ฐ™์€ ํ† ํฐ์„ ์„ž์œผ๋ฉด ๊ทธ ํ™•์žฅ์ž๋งŒ ๋Œ€์ƒ์œผ๋กœ ์ขํžŒ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ๋„ ๊ฐ€๋Šฅ.

    *.hwpx ์œ ๋™์„ฑ          โ†’ hwpx ํŒŒ์ผ์—์„œ๋งŒ "์œ ๋™์„ฑ" ๊ฒ€์ƒ‰
    *.hwpx *.pdf ๊ธˆ์œต      โ†’ hwpxยทpdf ๋‘ ์ข…๋ฅ˜์—์„œ "๊ธˆ์œต" ๊ฒ€์ƒ‰
    *.md                   โ†’ ๊ฒ€์ƒ‰์–ด ์—†์ด ํ™•์žฅ์ž๋งŒ ์ฃผ๋ฉด .md ํŒŒ์ผ ๋ชฉ๋ก
    

    โš ๏ธ ํ™•์žฅ์ž ํ•„ํ„ฐ(*.ํ™•์žฅ์ž)๋Š” ๋Œ€ํ™”ํ˜• TUI ๊ฒ€์ƒ‰์ฐฝ ์ „์šฉ์ด๋‹ค. ๋น„๋Œ€ํ™”ํ˜• ev -g์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค(์•„๋ž˜ ๋น„๋Œ€ํ™”ํ˜• ์ฐธ๊ณ ).

๊ฒ€์ƒ‰ ๋ฒ”์œ„ (Ctrl-F๋กœ ์ˆœํ™˜)

ํ”„๋กฌํ”„ํŠธ ๋ฒ”์œ„ ๋™์ž‘
search> ์ „์ฒด (๊ธฐ๋ณธ) ํŒŒ์ผ๋ช…(fd) + ๋‚ด์šฉ(rg) ๋™์‹œ
name> ํŒŒ์ผ๋ช…๋งŒ fd๋กœ ๊ฒฝ๋กœ๋งŒ ๋งค์นญ
text> ๋‚ด์šฉ๋งŒ rg๋กœ ํŒŒ์ผ ๋‚ด์šฉ๋งŒ ๋งค์นญ (hwpx ๋“ฑ ์ถ”์ถœ ํฌํ•จ)

Ctrl-F๋ฅผ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ์ „์ฒด โ†’ ํŒŒ์ผ๋ช… โ†’ ๋‚ด์šฉ โ†’ ์ „์ฒด ์ˆœ์œผ๋กœ ๋Œ๊ณ , ํ”„๋กฌํ”„ํŠธ ๊ธ€์ž๊ฐ€ ํ˜„์žฌ ๋ฒ”์œ„๋ฅผ ์•Œ๋ ค์ค€๋‹ค.

๋‹ค์ค‘ ์„ ํƒ โ†’ ๋‚ด๋ณด๋‚ด๊ธฐ ์›Œํฌํ”Œ๋กœ

  1. Tab์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฒฐ๊ณผ๋ฅผ ๋งˆํ‚น(Ctrl-A๋กœ ์ „์ฒด ํ† ๊ธ€).
  2. ๋งˆํ‚นํ•œ ๊ฒƒ๋“ค(์—†์œผ๋ฉด ํ˜„์žฌ ์ค„)์„ ๋Œ€์ƒ์œผ๋กœ:
    • Ctrl-E โ†’ Markdown ๋ณด๊ณ ์„œ๋กœ ๋‚ด๋ณด๋‚ด๊ธฐ
    • Ctrl-Y โ†’ ๊ฒฝ๋กœ๋ฅผ ํด๋ฆฝ๋ณด๋“œ ๋ณต์‚ฌ
    • Ctrl-G โ†’ zip์œผ๋กœ ๋ฌถ๊ธฐ
  3. Ctrl-E/Ctrl-G ๊ฒฐ๊ณผ๋Š” $EV_EXPORT_DIR(๊ธฐ๋ณธ ~)์— ev-export-<์‹œ๊ฐ>.md / ev-files-<์‹œ๊ฐ>.zip๋กœ ์ €์žฅ๋œ๋‹ค.

ํ‚ค๋งต

ํ‚ค ๋™์ž‘
ํƒ€์ดํ•‘ ์ฆ‰์‹œ ๊ฒ€์ƒ‰ (ํŒŒ์ผ๋ช… + ๋‚ด์šฉ ๋™์‹œ)
Ctrl-F ๊ฒ€์ƒ‰ ๋ฒ”์œ„ ์ˆœํ™˜: ์ „์ฒด search> โ†’ ํŒŒ์ผ๋ช…๋งŒ name> โ†’ ๋‚ด์šฉ๋งŒ text>
Ctrl-H ์ˆจ๊น€ํŒŒ์ผ / .gitignore ํฌํ•จ ํ† ๊ธ€
Enter ํ…์ŠคํŠธ โ†’ $EDITOR(ํ•ด๋‹น ์ค„) ยท hwpx โ†’ ์ถ”์ถœ ํ…์ŠคํŠธ pager ยท ๊ทธ ์™ธ โ†’ macOS ๊ธฐ๋ณธ ์•ฑ
Ctrl-O ์„ ํƒ ํŒŒ์ผ์„ Finder์—์„œ ์—ด๊ธฐ (์œ„์น˜ ํ‘œ์‹œ)
Tab ํ•ญ๋ชฉ ๋งˆํ‚น(๋‹ค์ค‘ ์„ ํƒ) ยท Shift-Tab ํ•ด์ œ ยท Ctrl-A ์ „์ฒด ํ† ๊ธ€
Ctrl-E ์„ ํƒ(์—†์œผ๋ฉด ํ˜„์žฌ) ๊ฒฐ๊ณผ๋ฅผ Markdown์œผ๋กœ ๋‚ด๋ณด๋‚ด๊ธฐ
Ctrl-Y ์„ ํƒ(์—†์œผ๋ฉด ํ˜„์žฌ) ๊ฒฝ๋กœ ํด๋ฆฝ๋ณด๋“œ ๋ณต์‚ฌ
Ctrl-G ์„ ํƒ(์—†์œผ๋ฉด ํ˜„์žฌ) ํŒŒ์ผ์„ zip์œผ๋กœ ๋ชจ์œผ๊ธฐ
? ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ฐฝ ํ† ๊ธ€
Esc ๊ฒ€์ƒ‰์–ด ์ง€์šฐ๊ธฐ (๋น„์šฐ๋ฉด ํŒŒ์ผ ๋ชฉ๋ก์œผ๋กœ ๋ณต๊ท€)
Ctrl-C ์ข…๋ฃŒ

ํ„ฐ๋ฏธ๋„ TUI๋Š” Cmd ํ‚ค ์กฐํ•ฉ์„ ๋ฐ›์ง€ ๋ชปํ•ด์„œ Finder ์—ด๊ธฐ๋Š” Ctrl-O๋กœ ์ œ๊ณตํ•œ๋‹ค. Ctrl-E/Ctrl-G ๊ฒฐ๊ณผ๋Š” $EV_EXPORT_DIR(๊ธฐ๋ณธ ~)์— ev-export-<์‹œ๊ฐ>.md / ev-files-<์‹œ๊ฐ>.zip๋กœ ์ €์žฅ๋œ๋‹ค.

๋น„๋Œ€ํ™”ํ˜• / Export

TUI ์—†์ด ํŒŒ์ดํ”„ยท์Šคํฌ๋ฆฝํŠธ๋กœ ์“ฐ๋Š” ๋ชจ๋“œ. fzf๋ฅผ ๋„์šฐ์ง€ ์•Š์œผ๋ฏ€๋กœ cronยทCIยท๋‹ค๋ฅธ ๋ช…๋ น๊ณผ ์กฐํ•ฉํ•˜๊ธฐ ์ข‹๋‹ค.

๋ช…๋ น ํ•˜๋Š” ์ผ ๊ธฐ๋ณธ ํฌ๋งท
ev -l [๋””๋ ‰ํ„ฐ๋ฆฌ] ํŒŒ์ผ ๋ชฉ๋ก ์ถœ๋ ฅ (๊ฒ€์ƒ‰์–ด ์—†์Œ) paths
ev -g <๊ฒ€์ƒ‰์–ด> [๋””๋ ‰ํ„ฐ๋ฆฌ] ๋‚ด์šฉ ๊ฒ€์ƒ‰ (hwpx/docx/pptx/xlsx/pdf ํฌํ•จ) lines
ev -x <ํŒŒ์ผ> ํŒŒ์ผ ํ•œ ๊ฐœ์˜ ํ‰๋ฌธ ์ถ”์ถœ (์›๋ฌธ ํ…์ŠคํŠธ)
ev --to-txt <๋””๋ ‰ํ„ฐ๋ฆฌ> [์ถœ๋ ฅ] ํด๋” ๋‚ด hwpx/docx๋ฅผ ์ผ๊ด„ .txt๋กœ ๋ณ€ํ™˜ (ํŒŒ์ผ ์ƒ์„ฑ)
ev -h / --help ๋„์›€๋ง

โš ๏ธ -g/-l์€ ๊ฒ€์ƒ‰์–ด๋ฅผ ๊ทธ๋Œ€๋กœ rg/fd์— ๋„˜๊ธด๋‹ค. ๋Œ€ํ™”ํ˜•์˜ *.ํ™•์žฅ์ž ํ•„ํ„ฐ ๋ฌธ๋ฒ•์€ ์—ฌ๊ธฐ์„  ์•ˆ ๋จน๋Š”๋‹ค โ€” ํ™•์žฅ์ž๋กœ ์ขํžˆ๋ ค๋ฉด ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ง์ ‘ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ ๊ฒฐ๊ณผ๋ฅผ grep์œผ๋กœ ๊ฑฐ๋ฅธ๋‹ค. -l์€ ํŒจํ„ด ์ธ์ž๋ฅผ ๋ฐ›์ง€ ์•Š๊ณ  ๋””๋ ‰ํ„ฐ๋ฆฌ ์ „์ฒด๋ฅผ ๋‚˜์—ดํ•œ๋‹ค(ํŒŒ์ผ๋ช…์œผ๋กœ ์ขํžˆ๋ ค๋ฉด ev -l DIR | rg ํŒจํ„ด).

์ถœ๋ ฅ ํฌ๋งท

--format paths|lines|md|csv|json (๋˜๋Š” --json ๋‹จ์ถ•). -l์€ ๊ธฐ๋ณธ paths, -g๋Š” ๊ธฐ๋ณธ lines.

$ ev -g ์œ ๋™์„ฑ . --format md
- `./b.txt:2` โ€” ์œ ๋™์„ฑ
- `./a.md:1` โ€” ์œ ๋™์„ฑ ๋ฆฌ์Šคํฌ ๊ด€๋ฆฌ

$ ev -g ์œ ๋™์„ฑ . --format csv
file,line,text
"./b.txt",2,"์œ ๋™์„ฑ"
"./a.md",1,"์œ ๋™์„ฑ ๋ฆฌ์Šคํฌ ๊ด€๋ฆฌ"

$ ev -g ์œ ๋™์„ฑ . --json
[
  {"file":"./b.txt","line":2,"col":1,"text":"์œ ๋™์„ฑ"},
  {"file":"./a.md","line":1,"col":1,"text":"์œ ๋™์„ฑ ๋ฆฌ์Šคํฌ ๊ด€๋ฆฌ"}
]
  • paths โ€” ๊ณ ์œ  ํŒŒ์ผ ๊ฒฝ๋กœ๋งŒ (์ค‘๋ณต ์ œ๊ฑฐ, ์ˆœ์„œ ์œ ์ง€)
  • lines โ€” ๊ฒฝ๋กœ:์ค„:์—ด:๋‚ด์šฉ ์›๋ณธ ๊ทธ๋Œ€๋กœ
  • md โ€” Markdown ๋ฆฌ์ŠคํŠธ (- `๊ฒฝ๋กœ:์ค„` โ€” ๋‚ด์šฉ)
  • csv โ€” file,line,text ํ—ค๋” + ๋”ฐ์˜ดํ‘œ ์ด์Šค์ผ€์ดํ”„
  • json โ€” ๊ฐ์ฒด ๋ฐฐ์—ด (file/line/col/text; -l์€ file๋งŒ)

์ž์ฃผ ์“ฐ๋Š” ๋ ˆ์‹œํ”ผ

# ํด๋”์˜ ํ•œ๊ธ€ ๋ฌธ์„œ์—์„œ ํ‚ค์›Œ๋“œ ์ฐพ์•„ Markdown ๋ณด๊ณ ์„œ๋กœ
ev -g ์œ ๋™์„ฑ ~/docs --format md > report.md

# JSON์œผ๋กœ ๋ฝ‘์•„ jq๋กœ ํ›„์ฒ˜๋ฆฌ (๋งค์นญ๋œ ํŒŒ์ผ ๋ชฉ๋ก๋งŒ)
ev -g ๊ธˆ์œตํˆฌ์ž ~/docs --json | jq -r '.[].file' | sort -u

# ํŒŒ์ผ ๋ชฉ๋ก์„ ๋‹ค๋ฅธ ๋ช…๋ น์œผ๋กœ ํŒŒ์ดํ”„
ev -l ~/work | fzf            # ์ง์ ‘ fzf์— ๋„ฃ๊ธฐ
ev -l ~/work | wc -l          # ๊ฐœ์ˆ˜ ์„ธ๊ธฐ

# hwpx ํ•œ ๊ฐœ๋ฅผ ํ‰๋ฌธ์œผ๋กœ ์ฝ๊ธฐ / ํŽ˜์ด์ €๋กœ ๋ณด๊ธฐ
ev -x ๋ณด๊ณ ์„œ.hwpx | less

# ํด๋” ์ „์ฒด hwpxยทdocx๋ฅผ .txt๋กœ ๋ณ€ํ™˜ (์›๋ณธ ์˜† ๋˜๋Š” ์ง€์ • ํด๋”์—)
ev --to-txt ~/docs                # ์›๋ณธ๊ณผ ๊ฐ™์€ ์œ„์น˜์— *.txt ์ƒ์„ฑ
ev --to-txt ~/docs ~/docs-txt     # ~/docs-txt ์•„๋ž˜์— ๋ชจ์•„์„œ ์ƒ์„ฑ

๋ฌธ์„œ ๋‚ด์šฉ ๊ฒ€์ƒ‰ (HWPX ยท DOCX ยท PPTX ยท XLSX ยท PDF)

.hwpx/.docx/.pptx/.xlsx๋Š” ์‚ฌ์‹ค zip ์•ˆ์˜ XML์ด๊ณ , .pdf๋Š” pdftotext๋กœ ํ‘ผ๋‹ค. ev๋Š” ripgrep์˜ --pre ์ „์ฒ˜๋ฆฌ๊ธฐ(libexec/ev-extract)๋กœ ์ด๋“ค๋งŒ ํ‰๋ฌธ์œผ๋กœ ๋ณ€ํ™˜ํ•ด ๊ฒ€์ƒ‰ยท๋ฏธ๋ฆฌ๋ณด๊ธฐํ•œ๋‹ค.

๊ฒ€์ƒ‰์–ด ์ž…๋ ฅ
   โ”‚
   โ”œโ”€ ์ผ๋ฐ˜ ํŒŒ์ผ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ†’ rg ๊ฐ€ ์ง์ ‘ ๊ฒ€์ƒ‰
   โ””โ”€ *.hwpx/docx/pptx/xlsx/pdf โ”€โ”€โ†’ ev-extract โ”€โ”€โ†’ ํ‰๋ฌธ ๋ณ€ํ™˜ โ†’ rg ๊ฐ€ ์ถ”์ถœ ํ…์ŠคํŠธ ๊ฒ€์ƒ‰
                                                                  โ”‚
                                                    ๊ฒฐ๊ณผ๋Š” ์›๋ณธ ํŒŒ์ผ ๊ฒฝ๋กœ๋กœ ํ‘œ์‹œ

์ถ”์ถœ ๋ฐฉ์‹: hwpx=Contents/section*.xml ยท docx=word/document.xml ยท pptx=ppt/slides/slide*.xml ยท xlsx=xl/sharedStrings.xml+์‹œํŠธ ยท pdf=pdftotext.

  • ๋ณ„๋„ ์ธ๋ฑ์Šคยท์บ์‹œ ์—†์Œ โ€” rg๊ฐ€ ๊ฒ€์ƒ‰ ์‹œ์ ์— ์ถ”์ถœ, ์›๋ณธ ๊ฒฝ๋กœ ๊ทธ๋Œ€๋กœ ๊ฒฐ๊ณผ ํ‘œ์‹œ.
  • ๋ฏธ๋ฆฌ๋ณด๊ธฐ์— ์ถ”์ถœ ํ…์ŠคํŠธ๋ฅผ ๋ Œ๋”ํ•˜๊ณ  ๋งค์นญ ์ค„์„ ๊ฐ•์กฐํ•œ๋‹ค.
  • ํ•œ๊ธ€/ํ•œ์ปด์˜คํ”ผ์Šค, MS Office๊ฐ€ ์—†์–ด๋„ ๋‚ด์šฉ์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.
  • Enter โ€” hwpx๋Š” ์ถ”์ถœ ํ…์ŠคํŠธ๋ฅผ pager๋กœ, ๋‚˜๋จธ์ง€๋Š” macOS ๊ธฐ๋ณธ ์•ฑ์œผ๋กœ ์—ฐ๋‹ค.
  • pdf ๋ณธ๋ฌธ์€ pdftotext(poppler) ํ•„์š”. ๊ตฌ๋ฒ„์ „ ๋ฐ”์ด๋„ˆ๋ฆฌ .hwp๋Š” ๋ฏธ์ง€์›.

๋™์ž‘ ์›๋ฆฌ

fzf๊ฐ€ ๋ฉ”์ธ ๋ฃจํ”„๋ฅผ ๋Œ๊ณ , ๊ฒ€์ƒ‰ยท๋ฏธ๋ฆฌ๋ณด๊ธฐยท์—ด๊ธฐยท๋ฒ”์œ„์ „ํ™˜์€ ev์˜ ์ˆจ์€ ์„œ๋ธŒ์ปค๋งจ๋“œ๊ฐ€ ๋งก๋Š”๋‹ค. fzf๋Š” --bind์˜ reload/transform/become ์•ก์…˜์œผ๋กœ ์ด ์„œ๋ธŒ์ปค๋งจ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ํ˜„์žฌ ์ฟผ๋ฆฌ๋Š” FZF_QUERY ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋œ๋‹ค.

ev (zsh)
โ”œโ”€ lib/deps.sh      ์˜์กด์„ฑ ์ ๊ฒ€ / ์ž๋™ ์„ค์น˜
โ”œโ”€ lib/search.sh    rg ยท fd ๋ช…๋ น ์กฐ๋ฆฝ (+ hwpx ์ „์ฒ˜๋ฆฌ๊ธฐ ์—ฐ๊ฒฐ)
โ”œโ”€ lib/extract.sh   hwpx โ†’ ํ‰๋ฌธ ํ…์ŠคํŠธ
โ”œโ”€ lib/editor.sh    ์—๋””ํ„ฐ ์ค„ ์ ํ”„ ยท ํ…์ŠคํŠธ/๋ฐ”์ด๋„ˆ๋ฆฌ ํŒ๋ณ„
โ”œโ”€ lib/preview.sh   ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ช…๋ น (bat โ†’ cat ํด๋ฐฑ)
โ””โ”€ libexec/ev-extract   rg --pre ์ „์ฒ˜๋ฆฌ๊ธฐ

ํ™˜๊ฒฝ๋ณ€์ˆ˜

๋ณ€์ˆ˜ ์˜๋ฏธ
EDITOR ์—ด ๋•Œ ์‚ฌ์šฉํ•  ์—๋””ํ„ฐ (๊ธฐ๋ณธ vi)
EV_AUTO_INSTALL=0 ์˜์กด์„ฑ ์ž๋™ ์„ค์น˜ ๋„๊ธฐ (์•ˆ๋‚ด๋งŒ)
EV_EXPORT_DIR Ctrl-E/Ctrl-G ๋‚ด๋ณด๋‚ด๊ธฐ ์ €์žฅ ์œ„์น˜ (๊ธฐ๋ณธ ~)
EV_EXCLUDE_GLOBS ๊ฒ€์ƒ‰์—์„œ ์ œ์™ธํ•  ๊ธ€๋กญ (๊ธฐ๋ณธ: *.so *.dylib *.o *.a *.class *.pyc *.pyo *.exe *.dll *.node *.wasm)

๋ฐ”์ด๋„ˆ๋ฆฌ/์ปดํŒŒ์ผ ์•„ํ‹ฐํŒฉํŠธ(.so ๋“ฑ)๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์—์„œ ์ œ์™ธ๋œ๋‹ค. ๋ฏธ๋ฆฌ๋ณด๊ธฐ์—์„œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์€ ๋ณธ๋ฌธ ๋Œ€์‹  ํŒŒ์ผ ์œ ํ˜•ยทํฌ๊ธฐ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

์˜์กด์„ฑ

  • ํ•„์ˆ˜ โ€” ripgrep, fzf (0.73+), fd
  • ์„ ํƒ โ€” bat (๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฌธ๋ฒ• ํ•˜์ด๋ผ์ดํŠธ; ์—†์œผ๋ฉด cat)
  • ๋‚ด์žฅ โ€” unzip, perl (hwpx ์ถ”์ถœ; macOS ๊ธฐ๋ณธ ์ œ๊ณต)
  • ๊ฐœ๋ฐœ โ€” bats-core (ํ…Œ์ŠคํŠธ)

ํ…Œ์ŠคํŠธ

bats test/      # 44 tests

์ˆœ์ˆ˜ ํ—ฌํผ ํ•จ์ˆ˜์™€ rg/fd/์ถ”์ถœ ๋™์ž‘์€ bats๋กœ, ๋Œ€ํ™”ํ˜• fzf ํ™”๋ฉด์€ docs/MANUAL-CHECKLIST.md ์ˆ˜๋™ ์ ๊ฒ€์œผ๋กœ ๊ฒ€์ฆํ•œ๋‹ค.

๋žœ๋”ฉ ํŽ˜์ด์ง€

site/ ์˜ ์ •์  ํŽ˜์ด์ง€(Terminal CLI ํ…Œ๋งˆ)๋ฅผ GitHub Actions๋กœ GitHub Pages์— ๋ฐฐํฌํ•œ๋‹ค. Settings โ†’ Pages โ†’ Source๋ฅผ GitHub Actions๋กœ ์„ค์ •ํ•˜๋ฉด main ํ‘ธ์‹œ ์‹œ ์ž๋™ ๋ฐฐํฌ๋œ๋‹ค.


built with Claude ยท rg + fzf + fd ยท ๋‹จ์ผ zsh ์Šคํฌ๋ฆฝํŠธ