ㅈㅅㄹ

거의 이맥스를 사용하기 시작하면서부터 줄곧 idosmex를 사용하고 있었는 데, 며칠 전 helm-cmd-t에 혹해서, 사실 더 정확히는 VIM의 command-t에 혹했다는게 맞겠지만, 어쨌건 helm으로 넘어가 보기로 했다. 아직 초기라 거의 튜토리얼 보고 나름 필수 패키지라는 것들만 사용해보고 있기는 한데, 뭐 ido 시절에 비해 확실히 편리한 점이 있기는 있네. 일단은 약간의 시행 착오 끝에 아래의 패키지를 추가해서 쓰고 있다:


  • helm : helm 메인 패키지
  • ac-helm : auto-complete를 helm 인터페이스를 사용하도록 하는 패키지
  • helm-projectile : projectile과 helm을 연동해 주는 패키지
  • helm-ls-git : git 파일이나 버퍼를 helm 인터페이스로 검색하는 패키지


정작 원래 사용하려고 했던 helm-cmd-t는 기능이 helm-ls-githelm-projectile과 거의 겹치지만 실제로 사용해 보니 위의 둘 보다 별로라서 사용하지 않게 되었다. flx를 helm에 연동한 helm-flx도 써보긴 했는데 이걸 쓰니 helm-M-x의 응답시간이 현저하게 느려지는 것 같아서 이것도 조금 쓰다가 폐기해 버렸다.

;; utils-helm.el

;; Written by Yunsik Jang <doomsday@kldp.org>
;; You can use/modify/redistribute this freely.

(require 'helm)
(require 'helm-config)
(require 'helm-projectile)

(let ((map helm-map))
  (define-key map (kbd "<tab>") 'helm-execute-persistent-action) ; rebind tab to run persistent action
  (define-key map (kbd "C-i") 'helm-execute-persistent-action) ; make TAB work in terminal
  (define-key map (kbd "C-z") 'helm-select-action)
  (define-key map (kbd "M-f") 'helm-next-source)
  (define-key map (kbd "M-b") 'helm-previous-source))

(setq helm-split-window-preferred-function 'helm-split-window-default-fn
      helm-move-to-line-cycle-in-source t
      helm-ff-search-library-in-sexp t
      helm-scroll-amount 8
      helm-ff-file-name-history-use-recentf t
      helm-M-x-fuzzy-match t

      ;; projectile
      projectile-enable-caching t
      projectile-file-exists-remote-cache-expire (* 10 60)
      projectile-completion-system 'helm
      projectile-switch-project 'helm-projectile)

;; replace projectile prefix key
(let ((map projectile-mode-map))
  (define-key map projectile-keymap-prefix nil)
  (define-key map (kbd "C-x p") 'projectile-command-map))

(projectile-global-mode)
(helm-autoresize-mode 1)
(helm-projectile-on)

;; http://emacs.stackexchange.com/questions/2563/helm-search-within-buffer-feature
(defconst my:helm-follow-sources
  '(helm-source-occur)
  "List of sources for which helm-follow-mode should be enabled")

(defun my:helm-set-follow ()
  "Enable helm-follow-mode for the sources specified in the list
variable `my-helm-follow-sources'. This function is meant to
be run during `helm-initialize' and should be added to the hook
`helm-before-initialize-hook'."
  (mapc (lambda (source)
          (when (memq source my:helm-follow-sources)
            (helm-attrset 'follow 1 (symbol-value source))))
        helm-sources))

;; Add hook to enable helm-follow mode for specified helm
(add-hook 'helm-before-initialize-hook 'my:helm-set-follow)

(provide 'utils-helm)

위는 helm 설정 파일인데, 아직 거의 처음 사용하는 것이라 사실 거의 튜토리얼 기본 셋 정도이다. 다만 마지막의 my:helm-set-follow 함수는 stackoverflow에서 주워 온 건데 helm-occur에서 선택한 항목의 위치를 원래 버퍼에서 추적해 주도록 하는 것으로, 이건 정말 쓸만하다. 보통은 버퍼 내의 정규 표현 검색을 위해서 helm-swoop을 많이 사용하지만 아직까지는 my:helm-set-followhelm-occur 조합만으로도 쓸만해서 helm-swoop은 설치하고 있지 않다.


오늘로써 helm으로 넘어 온 지 3일 정도 된 것 같은데, 현재 시점에서 helm에 대한 감상은... 뭐 일단 쓸만한 게 좀 있어서 좋긴 하지만 가끔 의도한 대로 동작하지 않는 경우가 종종 있어서 계속 쓰게 될 지는 아직 좀 고민해봐야 할 것 같다. candidates source도 auto-complete처럼 그냥 ac-sources에 등록만 해놓으면 엔진에서 알아서 가져다 보여주거나 쓰는 게 아니라, 이건 좀 목적에 따른 source를 helm이라는 공용 인터페이스를 사용해서 선택할 수 있게 하는 형태라 키 바인딩이 좀 더 번잡해 진 것 같기도 하고...