Emacs Pinky를 피하는 방법 : hydra-pinky

12445 단어 emacs-lispHydraEmacs
Emacs 설정 은 프로그래머 masasam 님의 블로그 'Solist Work Blog '에서 많은 것을 흡수하고 날마다 키우고 있습니다. 그 블로그 안에 있는 Emacs Pinky를 hydra로 해결하기 의 기사를 참고로 하여 더욱 사용하기 쉽게 커스터마이즈 설정해 보았습니다. hydra-pinky를 사용하면 편안함에 빠집니다.

스크린 샷





hydra-pinky 를 발동하면 미니 버퍼에 적문자의 키 메뉴가 나옵니다. 이 빨간색 디스플레이의 키를 입력하는 동안 언제든지 hydra는 해제되지 않습니다. hydra가 종료하는 조건은, 정의된 빨강 키 이외의 키를 타이프 ​​치거나, 파랑 문자의 "q":quit 를 누른 경우입니다.

hydra-pinky는, vew-mode와 비슷한 컨셉의 동작을 해, 거기로부터 빠지면 보통의 편집 모드에 돌아온다…라고 하는 구조입니다. 키 바인딩을 기억할 필요도 없이 GUI로 스피디하게 키 조작할 수 있는 것은 초보자 Emacser에게는 매우 고맙습니다. 나는 hydra-pinky 외에도 다양한 hydra를 활용하고 있습니다.

Hydra에서 Emacs의 키 바인딩 문제 해결

sequential-command



rubikitch/sequential-command

Emacs를 재부팅하고 C-a C-a C-a하면 줄 머리에 가서 버퍼의 머리에 가서 취소합니다. 한 기능이지만, 쓸데없이 편리합니다.

hydra-pinky에서는 "a", "e"키에 할당됩니다.

window-toggle-division



Window의 세로 분할, 가로 분할을 toggle로 전환합니다.

iflipb: 버퍼 이동



버퍼 이동은 next-buffer Emacs : 탭을 사용하지 않는 궁극적 인 버퍼 이동

화살표 키 취급



Emacser 쪽에서 보면 사도라고 말할 것 같지만, 나는 커서 이동에 화살표 키를 사용하는 경우도 많습니다. 기본은 h, j, k, l을 사용하도록 하고 있어 확실히 화살표 키에 닿으면 hydra-pinky가 사라져 버리므로, 화살표 관계의 조작으로 pinky가 사라지지 않도록 하고 있습니다.

트랙패드 사용 안함



필자의 경우 Macbook을 사용하고 있기 때문에 hydra-pinky 발동 중에 실수로 트랙 패드를 만지면 마음대로 해제되어 버립니다. 그래서 마우스를 사용할 때는 트랙패드를 무효로 하는 설정을 하고 있습니다.
MacBook 트랙패드 사용 안함

설정


(bind-key [f11] 'hydra-pinky/body)
(key-chord-define-global
 "::"
 (defhydra hydra-pinky (:color red :hint nil)
   "
 :_0_._1_._2_._3_._o_._S_._x_   :_j_._k_._h_._l_._c_._a_._e_._b_._SPC_._m_._w_._s_._/_   :_n_._p_._u_._t_   :_<_-_:_-_>_   :_q_uit"
   ;; window
   ("0" delete-window)
   ("1" delete-other-windows)
   ("2" split-window-below)
   ("3" split-window-right)
   ("o" other-window-or-split)
   ("S" window-swap-states)
   ("x" window-toggle-division)
   ;; page
   ("a" seq-home)
   ("e" seq-end)
   ("j" next-line)
   ("k" previous-line)
   ("l" forward-char)
   ("h" backward-char)
   ("c" recenter-top-bottom)
   ("<down>" next-line)
   ("<up>" previous-line)
   ("<right>" forward-char)
   ("<left>" backward-char)
   ("<C-up>" backward-paragraph)
   ("<C-down>" forward-paragraph)
   ("<C-left>" left-word)
   ("<C-right>" right-word)
   ("b" scroll-down-command)
   ("SPC" scroll-up-command)
   ("m" set-mark-command)
   ("w" avy-goto-word-1)
   ("s" swiper-isearch-region)
   ;; git
   ("n" git-gutter:next-hunk)
   ("p" git-gutter:previous-hunk)
   ("u" git-gutter:popup-hunk)
   ("t" git-gutter:toggle-popup-hunk)
   ;; buffer
   ("/" kill-buffer)
   (":" counsel-switch-buffer)
   ("<" iflipb-previous-buffer)
   (">" iflipb-next-buffer)
   ;; quit
   ("q" nil)))

;; sequential-command
(use-package sequential-command-config
  :commands sequential-command-setup-keys
  :hook (after-init . sequential-command-setup-keys))

;; other-window-or-split
(bind-key
 "C-q"
 (defun other-window-or-split ()
   "If there is one window, open split window.
If there are two or more windows, it will go to another window."
   (interactive)
   (when (one-window-p)
     (split-window-horizontally))
   (other-window 1)))

;; window-toggle-division
(defun window-toggle-division ()
  "Replace vertical <-> horizontal when divided into two."
  (interactive)
  (unless (= (count-windows 1) 2)
    (error "Not divided into two!"))
  (let ((before-height)
        (other-buf (window-buffer (next-window))))
    (setq before-height (window-height))
    (delete-other-windows)
    (if (= (window-height) before-height)
        (split-window-vertically)
      (split-window-horizontally))
    (other-window 1)
    (switch-to-buffer other-buf)
    (other-window -1)))

;; iflipb
(setq iflipb-wrap-around t)
(setq iflipb-ignore-buffers (list "^[*]" "^magit" "dir]$"))
;; sequential-command
(use-package sequential-command-config
  :commands sequential-command-setup-keys
  :hook (after-init . sequential-command-setup-keys))

좋은 웹페이지 즐겨찾기