EmacsでFlutter開発環境をセットアップするwith JAWS

なぜこの記事書いたか

EmacsでFlutter環境を設定するドキュメントならもうたくさんある。が、JAWSユーザーはちょっとした問題に遭遇するだろうなと思ったので、書き留めておく。

環境

  • OS: Windows 11
  • Terminal: Git for Windowsにくっついている MSYS2のサブセット
  • JAWS: 2021日本語版

上記環境をmacOS 11.6の上で動かしている。

なにが問題か

lsp-dartを使ってコード補完とかを行っているとき、コードの見通しを良くするためのガイドが表示される。また、関数や引数の終了ポイントが分かるように、終了部分にリードオンリーでいろんな情報が表示される。

これらはコード行に直接表示されるので、編集できそうに見えたり、1行読んだときにまとめてガイド部分まで読み上げられることになる。また、微妙なフォントサイズの違いによって、JAWSがカーソル位置を見失ってしまう現象も起こる。ということで、これを抑制したい。

また、main()関数内でうっかりテストが走ってフリーズするのを抑制してる。

設定など

使ってるのは、

  • dart-mode
  • company
  • lsp-dart
  • yasnippet

の4つ。lsp-uiも入れると立地になるんだろうけど、これで十分。

下記を~/.emacs.d/init.elに設定。

(use-package company
  :ensure t
  :defer t
  :custom
  (company-transformers '(company-sort-by-backend-importance))
  (company-idle-delay 0)
  (company-echo-delay 0)
  (company-minimum-prefix-length 2)
  (company-selection-wrap-around t)
  (completion-ignore-case t)
  :bind
  (("C-M-<tab>" . company-complete))
  (:map company-active-map
        ("C-n" . company-select-next)
        ("C-p" . company-select-previous)
        ("C-s" . company-filter-candidates)
        ("C-i" . company-complete-selection)
        ([tab] . company-complete-selection))
  (:map company-search-map
        ("C-n" . company-select-next)
        ("C-p" . company-select-previous))
  :init
  (global-company-mode t)
  ;; yasnippet縺ィ縺ョ騾」謳コ
  (defvar company-mode/enable-yas t)
  (defun company-mode/backend-with-yas (backend)
    (if (or (not company-mode/enable-yas) (and (listp backend) (member 'company-yasnippet backend)))
        backend
      (append (if (consp backend) backend (list backend))
              '(:with company-yasnippet))))
  (setq company-backends (mapcar #'company-mode/backend-with-yas company-backends)))
;; yasnippet
(use-package yasnippet
  :ensure t
  :bind
  (:map yas-minor-mode-map
        ("C-x i n" . yas-new-snippet)
        ("C-x i v" . yas-visit-snippet-file)
        ("C-M-i"   . yas-insert-snippet))
  (:map yas-keymap
        ("<tab>" . nil)) ;; because of avoiding conflict with company keymap
  :init
  (yas-global-mode t))
;; Flutter & Dart
(use-package dart-mode
  :ensure t
  :custom
  (dart-format-on-save t)
  (dart-sdk-path "~/flutter/bin/cache/dart-sdk"))

(use-package lsp-dart
  :ensure t
  :hook (dart-mode . lsp)
  :custom
  (lsp-dart-suggest-from-unimported-libraries nil)
  (lsp-dart-main-code-lens nil)
  (lsp-dart-closing-labels nil)
  (lsp-dart-flutter-widget-guides nil)
  )

どんなもんかいねえ。