Doom-emacs: REPL ์ฐฝ์„ ์–ด๋–ป๊ฒŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2017๋…„ 08์›” 08์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: hlissner/doom-emacs

C-c C-l ์‚ฌ์šฉํ•˜์—ฌ REPL์„ ์—ด๋ฉด ์ƒ์„ฑ๋˜๋Š” ์ฐฝ์ด ํŠน๋ณ„ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค(์–ด๋‘์šด ๋ฐฐ๊ฒฝ, ๋‹ซํž ๋•Œ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ, ...).

๊ทธ๊ฒƒ์€ ๋˜ํ•œ ํ•ญ์ƒ ๋‚ด ํ™”๋ฉด์„ ์ˆ˜ํ‰์œผ๋กœ ๋ถ„ํ• ํ•˜๋Š” ๊ฒƒ ๊ฐ™์œผ๋ฉฐ ๋•Œ๋กœ๋Š” ์œ ์šฉํ•˜๊ณ  ๋•Œ๋กœ๋Š” ์„ฑ๊ฐ€์‹ญ๋‹ˆ๋‹ค. emacs์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํžˆ ์•Œ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ฐฝ์„ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
switch-buffer ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์—์„œ ๊ฐ€์ ธ์˜ค๋„๋ก ๊ด€๋ฆฌํ–ˆ์ง€๋งŒ ๋ฒ„ํผ๊ฐ€ ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค์™€ ๋ชจ๋“  ํ”„๋ ˆ์ž„์„ ์ฃฝ์ด๊ธฐ ๋•Œ๋ฌธ์— ์›๋ณธ ํ”„๋ ˆ์ž„์„ ๋‹ซ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด ํŠน์ˆ˜ ๋ฒ„ํผ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์–ด๋–ป๊ฒŒ ํ‘œ์‹œ๋˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์‹ค ์ˆ˜ ์žˆ๋‚˜์š”? :(

๊ฐ์‚ฌ ํ•ด์š”!

discussion

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

ํ  ์—ฌ๊ธฐ ์›€์ง์ด๋Š” ๋ถ€๋ถ„์ด ๋งŽ๊ตฐ์š”. C-c C-l ๋ฌถ์ธ ๋‚ด์šฉ์ด ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. +eval/repl ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“œ์˜ repl์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ Doom์€ repl ๋ฒ„ํผ๋ฅผ ์ผ๋ฐ˜ ํŠน์ˆ˜ ๋ฒ„ํผ์ฒ˜๋Ÿผ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ ๋‘ ๊ฐœ์˜ ๊ด€๋ จ ๋ณ€์ˆ˜๋Š” shackle-default-alignment ๋ฐ shackle-rules ์ด๋ฉฐ, ์ด๋Š” Emacs์—๊ฒŒ ํŠน์ • ๊ธฐ์ค€์„ ์ถฉ์กฑํ•˜๋Š” ์ฐฝ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

shackle-rules ์˜ ๋์— ๋‘ ๊ฐ€์ง€ ํฌ๊ด„ ๊ทœ์น™์ด ์žˆ์Šต๋‹ˆ๋‹ค.

(set! :popup 
  '("^\\*"  :regexp t :noselect t :autokill t)
  '("^ \\*" :regexp t :size 12 :noselect t :autokill t :autoclose t))))

์—ฌ๊ธฐ์„œ ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๋Š” :autokill t (๋ฒ„ํผ์™€ ๊ด€๋ จ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•จ๊ป˜ ์ข…๋ฃŒ๋จ์„ ๋ณด์žฅ)์ด๋ฉฐ :align ์ง€์ •๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ shackle-default-alignment ์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. 'below .

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋‹ค์Œ์€ ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

  1. ํŠนํžˆ repl์— ๋Œ€ํ•œ ์šฐ์„  ์ ์šฉ ๊ทœ์น™์„ ์ง€์ •ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

    (set! :popup "*my-repl-buffer*" :align 'left :noesc t)
    

    ์ž์„ธํ•œ ๋‚ด์šฉ์€ M-x doom/describe-setting RET :popup ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

  2. ๊ท€ํ•˜์˜ repl์—์„œ +eval-repl-mode ๋ถ€ ๋ชจ๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•˜์‹ญ์‹œ์˜ค:

    (add-hook 'inferior-python-mode-hook #'+eval-repl-mode)

    ์ด ํŒ์—… ๊ทœ์น™์€ modules/feature/eval/config.el ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    (set! :popup
     '(:custom (lambda (b &rest _) (buffer-local-value '+eval-repl-mode b)))
     :size 16 :noesc t)
    
  3. C-c C-l ๋ฅผ +eval/repl ๋ฐ”์ธ๋”ฉํ•˜๊ณ  ๋Œ€์‹  ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ repl์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๋ชจ๋“œ์—๋Š” ์ ์ ˆํ•œ ๊ธฐ๋ณธ๊ฐ’์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์›ํ•˜๋Š” repl์ด ์—ด๋ฆฌ์ง€ ์•Š์œผ๋ฉด :repl ์„ค์ •์œผ๋กœ major-mode->repl ์—ฐ๊ฒฐ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด

    (set! :repl 'python-mode #'+python/repl)

    :repl์ด ์›ํ•˜๋Š” ํ•จ์ˆ˜๋Š” repl์„ ํฌํ•จํ•˜๋Š” ๋ฒ„ํผ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

๋ชจ๋“  3 ๋Œ“๊ธ€

ํ  ์—ฌ๊ธฐ ์›€์ง์ด๋Š” ๋ถ€๋ถ„์ด ๋งŽ๊ตฐ์š”. C-c C-l ๋ฌถ์ธ ๋‚ด์šฉ์ด ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. +eval/repl ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“œ์˜ repl์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ Doom์€ repl ๋ฒ„ํผ๋ฅผ ์ผ๋ฐ˜ ํŠน์ˆ˜ ๋ฒ„ํผ์ฒ˜๋Ÿผ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ ๋‘ ๊ฐœ์˜ ๊ด€๋ จ ๋ณ€์ˆ˜๋Š” shackle-default-alignment ๋ฐ shackle-rules ์ด๋ฉฐ, ์ด๋Š” Emacs์—๊ฒŒ ํŠน์ • ๊ธฐ์ค€์„ ์ถฉ์กฑํ•˜๋Š” ์ฐฝ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

shackle-rules ์˜ ๋์— ๋‘ ๊ฐ€์ง€ ํฌ๊ด„ ๊ทœ์น™์ด ์žˆ์Šต๋‹ˆ๋‹ค.

(set! :popup 
  '("^\\*"  :regexp t :noselect t :autokill t)
  '("^ \\*" :regexp t :size 12 :noselect t :autokill t :autoclose t))))

์—ฌ๊ธฐ์„œ ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๋Š” :autokill t (๋ฒ„ํผ์™€ ๊ด€๋ จ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•จ๊ป˜ ์ข…๋ฃŒ๋จ์„ ๋ณด์žฅ)์ด๋ฉฐ :align ์ง€์ •๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ shackle-default-alignment ์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. 'below .

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋‹ค์Œ์€ ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

  1. ํŠนํžˆ repl์— ๋Œ€ํ•œ ์šฐ์„  ์ ์šฉ ๊ทœ์น™์„ ์ง€์ •ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

    (set! :popup "*my-repl-buffer*" :align 'left :noesc t)
    

    ์ž์„ธํ•œ ๋‚ด์šฉ์€ M-x doom/describe-setting RET :popup ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

  2. ๊ท€ํ•˜์˜ repl์—์„œ +eval-repl-mode ๋ถ€ ๋ชจ๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•˜์‹ญ์‹œ์˜ค:

    (add-hook 'inferior-python-mode-hook #'+eval-repl-mode)

    ์ด ํŒ์—… ๊ทœ์น™์€ modules/feature/eval/config.el ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    (set! :popup
     '(:custom (lambda (b &rest _) (buffer-local-value '+eval-repl-mode b)))
     :size 16 :noesc t)
    
  3. C-c C-l ๋ฅผ +eval/repl ๋ฐ”์ธ๋”ฉํ•˜๊ณ  ๋Œ€์‹  ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ repl์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๋ชจ๋“œ์—๋Š” ์ ์ ˆํ•œ ๊ธฐ๋ณธ๊ฐ’์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์›ํ•˜๋Š” repl์ด ์—ด๋ฆฌ์ง€ ์•Š์œผ๋ฉด :repl ์„ค์ •์œผ๋กœ major-mode->repl ์—ฐ๊ฒฐ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด

    (set! :repl 'python-mode #'+python/repl)

    :repl์ด ์›ํ•˜๋Š” ํ•จ์ˆ˜๋Š” repl์„ ํฌํ•จํ•˜๋Š” ๋ฒ„ํผ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

์•„, ์–ธ๊ธ‰ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ผ์ด๋ธŒ ํŒ์—… ์ฐฝ์„ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค(ํ•„์š”ํ•œ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค). ๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ ํ•„์š”๋กœ ํ–ˆ๋˜ ๋ชจ๋“  ๋„์›€์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

๋” ๊ตฌ์ฒด์ ์œผ๋กœ ๋งํ•˜๋ฉด intero REPL์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. intero-repl-load ๋ผ๋Š” ๋ช…๋ น์œผ๋กœ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ด๋–ค ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฒฐ๊ตญ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ”๋‹ค.

(set! :popup "^\\*intero:" :regexp t :align 'right :size 80)

๋‚ด modules/private/ptival/init.el ์—์„œ ๋งค๋ ฅ์ฒ˜๋Ÿผ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค!

์‹œ๊ฐ„์„ ๋‚ด์–ด ์ด ๋ชจ๋“  ๊ฒƒ์„ ์„ค๋ช…ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋‚˜๋Š” ํ•ฉ๋ฆฌ์ ์ธ ์‹œ๊ฐ„ ์•ˆ์— ํ˜ผ์ž์„œ ์ด๊ฒƒ์„ ์•Œ์•„ ๋ƒˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค! ๐Ÿ‘

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰