選択しているbufferに応じてneotreeのディレクトリを移動させる

emacsでbufferを選択するたびにneotreeディレクトリがそれに応じて変わると便利なのではないかと思い, 設定してみた.

bufferの選択に応じて呼び出されるhookは存在しないらしいので, switch-buffer-functionsを利用する

(use-package switch-buffer-functions :ensure t)

switch-buffer-functionsにhookを追加.

(add-hook 'switch-buffer-functions
          (lambda (prev current)
            (let ((neotree-buffer (neo-global--get-buffer)))
              (if (and
                   ;; Ignore if new buffer is neotree
                   (not (eq current neotree-buffer))
                   ;; Ignore if the buffer is not assosiated with a file
                   buffer-file-name
                   ;; Ignore if neotree is not active
                   (neo-global--window-exists-p))
                  (progn
                    (neo-buffer--change-root default-directory)
                    (switch-to-buffer current)
                    )
                )
              )
            ))

macでimagemagickとcocoaが有効になったemacsを使う

結論から言うと, emacs-plusを使うと良い

macemacscocoa上で動かしたい時, homebrewではbrew cask install emacsのようにインストールする.

しかしこれだとimagemagickが有効になっていない.

imagemagickが有効化は以下のコマンドで調べられる.

(image-type-available-p 'imagemagick)

markdown-modemarkdown-max-image-sizeを使いたかったのだが, これが imagemagick必須だった ので, brew cask経由で入れたemacsでは有効にならなかった.

mac上で簡単にimagemagickcocoaが有効なemacsを使うには, emacs-plusを使うと良い

brew tap d12frosted/emacs-plus
brew install emacs-plus --with-imagemagick@6 --without-spacemacs-icon

--without-spacemacs-iconは, とくにspacemacsを使っているわけでないのでつけてみた.

emojifyを使ってemacsで絵文字を表示する😺

emacsで絵文字を表示するにはemacs-emojifyを入れると良い.

use-packageを使って, こんな感じで設定

(use-package emojify :ensure t
  :if (display-graphic-p)
  :hook (after-init . global-emojify-mode)
  :bind
  ("C-x e" . 'emojify-insert-emoji)
  )

絵文字を挿入するときはemojify-insert-emojiを呼び出すと良い.

プログラミング言語系のモードだと, コメントと文字列の中だけ表示されるらしい

f:id:garaemon1:20191012154542p:plain
emacs-emojify

emacsからcatkin buildを走らせる

emacs編集中に, ターミナルに移動することなくcatkin buildを走らせられると便利.

(defun ros-catkin-make (dir)
  "Run catkin_make command in DIR."
  (interactive (list default-directory))
  ;; clear compilation buffer first not to occupy memory space.
  (if (get-buffer "*catkin_make*")
      (kill-buffer "*catkin_make*"))
  (let* ((default-directory dir)
         (compilation-buffer-name-function (lambda (major-mode-name) "*catkin_make*")))
    (compile "catkin bt --no-status"))
  (switch-to-buffer-other-window (get-buffer-create "*catkin_make*"))
  )

具体的には編集中のbufferのディレクトリに対して, catkin build --thisを走らせている.

適当にC-x C-mとかに割り当てる.

(global-set-key (kbd "C-x C-m") 'ros-catkin-make)

emacs-slackでShift+Enter, Ctrl+Enterをメッセージ内改行にする

emacs-slack内ではEnterでメッセージ送信がされるので、メッセージ内で改行するときにwebのインターフェイスなどと同様にShift+Enter, Ctrl+Enterでメッセージ内改行するようにしたい.

;; use Shift+Enter and Ctrl+Enter as newline
(define-key slack-mode-map '[S-return] 'newline)
(define-key slack-mode-map '[C-return] 'newline)

参考

keyboard macroの最中はhelmを使わない

個人的にC-sでの検索に通常のisearch-forwardではなく, helm-swoopを利用している.

しかしこうすると, keyboard macroを入力している間にhelmが走り、これがどうやら後ほどkeyboard macroを再生するときに問題があるようだ.

keyboard macroを記録中かどうかはdefining-kbd-macroという変数を見ればわかるようだ. また, keyboard macroの実行中はexecuting-kdb-macroを見ればわかる.

defining-kbd-macrotのときはisearch-forwardを利用するようにする.

;; (global-set-key (kbd "C-s") 'helm-swoop)
(defun my-search-forward ()
  "Customized search function to use helm-swoop except for in defining keyboard macro."
  (interactive)
  (if (or defining-kbd-macro executing-kbd-macro)
       (isearch-forward)
     (helm-swoop)))
(global-set-key (kbd "C-s") 'my-search-forward)

同様のkeyboard macroが有効かに応じて挙動を切り替える設定は他の色々なものに利用できるはず.

emacs 26で入ったdisplay-line-numbersを利用する

emacsで左側に行数を表示するlinum-modeは重いことで有名だった。 軽くするためにはいろいろと設定しなくてはいけなかった.

しかし, emacs26でついに行数表示のネイティブ実装であるdiplay-line-numbers-modeが実装された.

(if (version<= "26.0.50" emacs-version)
      (global-display-line-numbers-mode))

個人的にはemacs -nwで起動したときに行数表示の色が見にくかったので以下のようにしている

(if (version<= "26.0.50" emacs-version)
    (progn
      (global-display-line-numbers-mode)
      (defun display-line-numbers-color-on-after-init (frame)
        "Hook function executed after FRAME is generated."
        (unless (display-graphic-p frame)
          (set-face-background
           'line-number
           (plist-get base16-solarized-dark-colors :base01))))
      (add-hook 'after-make-frame-functions
                (lambda (frame)
                  (display-line-numbers-color-on-after-init frame)))
      ))