この記事はChromium Browser Advent Calendar 2017の9日目の記事です。
いま砂漠にいてネットがないという噂のyuryuさんの代理で投稿させてもらいます・・・!
今回は、自分の普段のワークフローで使っている環境として、diffビューワー & mergeツールであるmeld、ビルドするために使ってる簡単なスクリプト(build.sh)、あとEmacsの設定を少し紹介したいと思います。
もしこうしたほうが便利だよ!みたいなのがあったらぜひ教えてください:)
meld
普段Emacsを使っているのでプライベートではmagitを使っているのですが、chromiumのリポジトリがあまりに重すぎてmagitが使い物にならないので、meldを使っています。
mergetoolとして見やすく、ショートカットキーを使うことでサクサク作業できるので便利です。
.gitconfigに以下を追加することで、git difftool -d
とかgit mergetool
とかのツールとして使うことができます。
[diff]
tool = meld
[merge]
tool = meld
[mergetool "meld"]
cmd = meld $LOCAL $MERGED $REMOTE
keepBackup = false
build.sh(適当につくったスクリプト)
普段複数のパッチを別のブランチで作業していますが、パッチAをレビューに投げる→パッチBを書く→パッチAに戻る、としたときにビルドしたバイナリがそのままのこっていると何かと便利だなということを感じていました。
そこで、適当にninjaを叩く代わりのラッパースクリプトをかいて、ブランチごと&ビルドオプションごとのディレクトリを掘ってビルドするようにしています。
https://gist.github.com/makotoshimazu/1a9bd0a3f43a471057fc587f192571f9
やってくれることとしては、ブランチごと&ビルドタイプごとに別のoutディレクトリを作ってくれること、特に指定しなくても適当なビルドターゲットでコンパイルしてくれること、あと後述するEmacsの予測変換に必要なファイル(.clang_complete)を吐いてくれることの3つになります。
つかいかた
# chromiumのソースがあるディレクトリの中にbuild.shを置く
$ cd chromium/src
$ wget https://gist.githubusercontent.com/makotoshimazu/1a9bd0a3f43a471057fc587f192571f9/raw/abf1026b3e70b3059d8f1d11fd58b327c18ffab1/build.sh
$ chmod +x build.sh
$ gn gen out/release #同様に、debug用のバイナリを作りたいときにはout/debugを作る
$ gn args out/release
# releaseビルド用のGNの設定を書く。
$ ./build.sh release
こうすると、out/branchname_release
というディレクトリを作成し、out/release
からgnの設定(args.gn)をコピーしてきて、そのディレクトリに適当なバイナリをビルドしてくれます。
もし.clang_completeが必要ない場合は、build.shの最後から2行目、update_clang_completeの行をコメントアウトすると動くと思います。
以下に僕がつかってるgnの設定をメモしておきます。
is_component_build = true
is_debug = false
enable_nacl = false
dcheck_always_on = true
is_component_build = true
is_debug = true
enable_nacl = false
dcheck_always_on = true
is_debug = false
target_os = "android"
target_cpu = "arm"
symbol_level = 0
# enable_incremental_javac = true
# is_component_build = true
is_asan = true
is_lsan = true
is_debug = false
enable_nacl = false # Necessary until the NaCl GN build is more complete.
is_component_build = true
is_debug = false
enable_nacl = false
is_tsan = true
is_msan = true
use_prebuilt_instrumented_libraries = true
is_debug = false
enable_nacl = false # Necessary until the NaCl GN build is more complete.
Emacs
エディタの設定です。人によってそれぞれだと思うので、こうした方がいいよ!とかあったらめっちゃ知りたいです・・・
とりあえず記事に書いた部分の.emacs.dをここに公開しておきました。参考にどうぞ。
基本設定
;; == Basic settings ==
;; Remove tool bar
(tool-bar-mode 0)
;; Remove menu bar
(menu-bar-mode 0)
;; Use y/n instead of yes/no
(fset 'yes-or-no-p 'y-or-n-p)
;; No *.~ files
(setq make-backup-files nil)
;; No .#* files
(setq auto-save-default nil)
;; Use C-h as backspace
(keyboard-translate ?\C-h ?\C-?)
;; Highlight relevant parenthesis
(show-paren-mode t)
;; Show underline
(setq hl-line-face 'underline)
(global-hl-line-mode)
;; Share clipboard with X
(setq x-select-enable-clipboard t)
;; Highlight the target words
(setq search-highlight t)
(setq query-replace-highlight t)
;; Auto indent on newline
(global-set-key "\C-m" 'newline-and-indent)
;; Kill whole line including newline by one C-k
(setq kill-whole-line t)
Package.el
デフォルトで入ってるしそれなりに便利なのでつかってます。Caskとかあるみたいだけどpackage.elと比較したときの嬉しさをあまり良くわかってないです。
まず、初めてM-x list-packageすると勝手に以下のやつをinit.elに雑な感じで突っ込んでくるので、適当に見た目よさそうなところへ移動させます。
;; Added by Package.el. This must come before configurations of
;; installed packages. Don't delete this line. If you don't want it,
;; just comment it out by adding a semicolon to the start of the line.
;; You may delete these explanatory comments.
(package-initialize)
さすがにデフォルトだとパッケージが足りないので、melpaを追加します。
;; Add mepla
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/") t)
予測変換(company, irony)
M-x list-package
をして、companyを検索。iをおしてinstall状態にします。
ついでにironyとcompany-ironyもやっちゃおう。
さいごにxでまとめて実行。
Emacs起動し直して、M-x install-irony-server
をすると、ironyのために裏でclangを回すプログラムがビルドできます。
;; == company ==
(add-hook 'after-init-hook 'global-company-mode)
(setq company-idle-delay 0.1)
(setq company-minimum-prefix-length 2)
;; == irony ==
(add-hook 'c++-mode-hook 'irony-mode)
(add-hook 'c-mode-hook 'irony-mode)
(add-hook 'irony-mode-hook 'company-irony-setup-begin-commands)
(add-to-list 'company-backends 'company-irony)
文法チェック(flycheck-irony)
全体をビルドする前にローカルでチェックしてくれるので、凡ミスに気づけます。
M-x list-packages
からflycheckとflycheck-ironyをiしてxでインストールしましょう。
さっきまでのcompany, ironyの設定も含めて書くとこんな感じになります。
;; == company ==
(require 'company)
(add-hook 'after-init-hook 'global-company-mode)
(setq company-idle-delay 0.1)
(setq company-minimum-prefix-length 2)
;; == flycheck ==
(add-hook 'after-init-hook #'global-flycheck-mode)
(define-key global-map (kbd "C-M-P") 'flycheck-previous-error)
(define-key global-map (kbd "C-M-N") 'flycheck-next-error)
;; == irony ==
(add-hook 'c++-mode-hook 'irony-mode)
(add-hook 'c-mode-hook 'irony-mode)
(add-hook 'irony-mode-hook 'company-irony-setup-begin-commands)
(add-to-list 'company-backends 'company-irony)
(eval-after-load 'flycheck
'(add-hook 'flycheck-mode-hook #'flycheck-irony-setup))
再起動してチェックしてみると、さっき例で書いたプログラムに文法エラーがあったことがわかります。
C-M-P
とかC-M-N
でエラー一覧見れたり、C-! l
でエラーの一覧がでてきたりするので便利です。
ところでchromiumのリポジトリで動かしたい
わかります。インクルードするパスをGNで設定してあったりするので、それをどこかに書かないとぜんぜんヘッダが読み込まれません。
ということで、まず.clang_completeという設定ファイルを自動で読み込むように設定しましょう。すると、バックエンドで走らせるclangのコンパイルオプションをディレクトリごとにいじることが出来ます。
これを足せばOKです。
(add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options)
ironyの設定はこんな感じになると思います。
;; == irony ==
(add-hook 'c++-mode-hook 'irony-mode)
(add-hook 'c-mode-hook 'irony-mode)
(add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options)
(add-hook 'irony-mode-hook 'company-irony-setup-begin-commands)
(add-to-list 'company-backends 'company-irony)
(eval-after-load 'flycheck
'(add-hook 'flycheck-mode-hook #'flycheck-irony-setup))
とりあえずこれをchromium/srcのしたに.clang_completeという名前で置きましょう。すると(だいたい)救われます。
-std=c++14
-DCONTENT_IMPLEMENTATION
-I.
-I./third_party/khronos
-I./gpu
-I./third_party/libwebp
-I./testing/gtest/include
-I./skia/config
-I./skia/ext
-I./third_party/skia/include/c
-I./third_party/skia/include/config
-I./third_party/skia/include/core
-I./third_party/skia/include/effects
-I./third_party/skia/include/images
-I./third_party/skia/include/lazy
-I./third_party/skia/include/pathops
-I./third_party/skia/include/pdf
-I./third_party/skia/include/pipe
-I./third_party/skia/include/ports
-I./third_party/skia/include/utils
-I./third_party/skia/include/gpu
-I./third_party/skia/src/gpu
-I./third_party/skia/src/sksl
-I./third_party/icu/source/common
-I./third_party/icu/source/i18n
-I./third_party/mesa/src/include
-I./third_party/libwebm/source
-I./third_party/protobuf/src
-I./third_party/googletest/src/googletest/include/
-Iout/Default/gen/protoc_out
-Iout/Default/gen
-Iout/Default/gen/blink
-Iout/Default/gen/third_party/WebKit
-Iout/Default/gen/ui/resources
-Iout/Default/gen/v8/include
-I./build/linux/debian_jessie_amd64-sysroot/usr/include/glib-2.0
-I./build/linux/debian_jessie_amd64-sysroot/usr/include/nspr
-I./build/linux/debian_jessie_amd64-sysroot/usr/include/nss
-I./build/linux/debian_jessie_amd64-sysroot/usr/lib/x86_64-linux-gnu/glib-2.0/include
-I./testing/gmock/include
-I./testing/gmock_custom
-I./third_party
-I./third_party/WebKit
-I./third_party/WebKit/Source
-I./third_party/boringssl/src/include
-I./third_party/ced/src
-I./third_party/iccjpeg
-I./third_party/leveldatabase
-I./third_party/leveldatabase/src
-I./third_party/leveldatabase/src/include
-I./third_party/libjpeg_turbo
-I./third_party/libpng
-I./third_party/libvpx/source/libvpx
-I./third_party/libyuv/include
-I./third_party/ots/include
-I./third_party/webrtc_overrides
-I./third_party/zlib
-I./v8/include
-isystem./buildtools/third_party/libc++/trunk/include
-isystem./buildtools/third_party/libc++abi/trunk/include
--sysroot=./build/linux/debian_jessie_amd64-sysroot
Blinkのほうもそれなりにいじる機会があるので、こんなのをsrc/third_party/WebKit/.clang_completeに足してます。
-std=c++14
-DBLINK_MODULES_IMPLEMENTATION=1
-DCHROMIUM_BUILD
-DCOMPONENT_BUILD
-DDYNAMIC_ANNOTATIONS_ENABLED=1
-DENABLE_MEDIA_ROUTER=1
-DFIELDTRIAL_TESTING_ENABLED
-DFULL_SAFE_BROWSING
-DSAFE_BROWSING_CSD
-DSAFE_BROWSING_DB_LOCAL
-DUSE_AURA=1
-DUSE_CAIRO=1
-DUSE_GLIB=1
-DUSE_NSS_CERTS=1
-DUSE_PANGO=1
-DUSE_UDEV
-DUSE_X11=1
-DV8_DEPRECATION_WARNINGS
-DWTF_USE_DYNAMIC_ANNOTATIONS=1
-D_FILE_OFFSET_BITS=64
-D_LARGEFILE64_SOURCE
-D_LARGEFILE_SOURCE
-D__STDC_CONSTANT_MACROS
-D__STDC_FORMAT_MACROS
-DBLINK_IMPLEMENTATION=1
-DINSIDE_BLINK
-DGLIB_VERSION_MAX_ALLOWED=GLIB_VERSION_2_32
-DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_26
-DGL_GLEXT_PROTOTYPES
-DUSE_GLX
-DUSE_EGL
-DSK_IGNORE_LINEONLY_AA_CONVEX_PATH_OPTS
-DSKIA_DLL
-DGR_GL_IGNORE_ES3_MSAA=0
-DSK_SUPPORT_GPU=1
-DENABLE_LAYOUT_UNIT_IN_INLINE_BOXES=0
-DENABLE_OILPAN=1
-DWTF_USE_CONCATENATED_IMPULSE_RESPONSES=1
-DWTF_USE_WEBAUDIO_FFMPEG=1
-DWTF_USE_DEFAULT_RENDER_THEME=1
-DU_USING_ICU_NAMESPACE=0
-DU_ENABLE_DYLOAD=0
-DICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_FILE
-DANGLE_ENABLE_RELEASE_ASSERTS
-DLIBXSLT_STATIC
-DUSING_V8_SHARED
-DGOOGLE_PROTOBUF_NO_RTTI
-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER
-DHAVE_PTHREAD
-DPROTOBUF_USE_DLLS
-DBORINGSSL_SHARED_LIBRARY
-DUSE_LIBJPEG_TURBO=1
-I../..
-I../../build/linux/debian_jessie_amd64-sysroot/usr/include/glib-2.0
-I../../build/linux/debian_jessie_amd64-sysroot/usr/include/nspr
-I../../build/linux/debian_jessie_amd64-sysroot/usr/include/nss
-I../../build/linux/debian_jessie_amd64-sysroot/usr/lib/x86_64-linux-gnu/glib-2.0/include
-I../../gpu
-I../../skia/config
-I../../skia/ext
-I../../third_party/WebKit
-I../../third_party/WebKit/Source
-I../../third_party/WebKit/Source/platform
-I../../third_party/angle/include
-I../../third_party/angle/src/common/third_party/numerics
-I../../third_party/boringssl/src/include
-I../../third_party/iccjpeg
-I../../third_party/icu/source/common
-I../../third_party/icu/source/i18n
-I../../third_party/khronos
-I../../third_party/libjpeg_turbo
-I../../third_party/libpng
-I../../third_party/libwebm/source
-I../../third_party/libwebp
-I../../third_party/libxml/linux/include
-I../../third_party/libxml/src/include
-I../../third_party/libxslt
-I../../third_party/mesa/src/include
-I../../third_party/ots/include
-I../../third_party/protobuf/src
-I../../third_party/skia/include/c
-I../../third_party/skia/include/config
-I../../third_party/skia/include/core
-I../../third_party/skia/include/effects
-I../../third_party/skia/include/gpu
-I../../third_party/skia/include/images
-I../../third_party/skia/include/lazy
-I../../third_party/skia/include/pathops
-I../../third_party/skia/include/pdf
-I../../third_party/skia/include/pipe
-I../../third_party/skia/include/ports
-I../../third_party/skia/include/utils
-I../../third_party/skia/src/gpu
-I../../third_party/skia/src/sksl
-I../../third_party/snappy/linux
-I../../third_party/snappy/src
-I../../third_party/zlib
-I../../v8/include
-I../../out/Default/gen
-I../../out/Default/gen/angle
-I../../out/Default/gen/blink
-I../../out/Default/gen/protoc_out
-I../../out/Default/gen/third_party/WebKit
-I../../out/Default/gen/v8/include
-isystem../../buildtools/third_party/libc++/trunk/include
-isystem../../buildtools/third_party/libc++abi/trunk/include
--sysroot=../../build/linux/debian_jessie_amd64-sysroot
この辺は、ninjaを実行するときに-vオプションをつけて適当なシンボルをビルドするときの設定をコピーしてきました。
あと細かいですが、.clang_completeがgitでコミットされないようにしときましょう。
# Run this in your chromium/src directory
$ echo ".clang_complete" >> .git/info/exclude
.clang_completeの中のoutディレクトリが今つかってるoutディレクトリが違うんだけど
そうなんですよね。outディレクトリにあるヘッダを適切に読み込めないとmojoのインターフェースが補完されなくて不便です。ということでbuild.shが自動でoutディレクトリに合わせてくれるようにしたら意外と便利でした。
詳細はbuild.shを見てもらえばわかるかと思いますが、update_clang_complete
では.clang_complete.templateを読み取り、%OUTDIR%
と書いてある部分を正しいoutディレクトリのパスに置換して.clang_completeをアップデートしてくれます。
function update_clang_complete() {
OUTDIR_TAG="%OUTDIR%"
TARGET_PATHS=("$script_dir/.clang_complete" "$script_dir/third_party/WebKit/.clang_complete")
outdir="$1"
for target in ${TARGET_PATHS[@]}; do
template_path="${target}.template"
sed -e "s|${OUTDIR_TAG}|${outdir}|" $template_path > $target
done
}
つまり、前述の.clang_completeの代わりに.clang_complete.templateを以下のようにしておいておけばOKです。
```text:~/chromium/src/.clang_complete
-std=c++14
-DCONTENT_IMPLEMENTATION
-I.
-I./third_party/khronos
-I./gpu
-I./third_party/libwebp
-I./testing/gtest/include
-I./skia/config
-I./skia/ext
-I./third_party/skia/include/c
-I./third_party/skia/include/config
-I./third_party/skia/include/core
-I./third_party/skia/include/effects
-I./third_party/skia/include/images
-I./third_party/skia/include/lazy
-I./third_party/skia/include/pathops
-I./third_party/skia/include/pdf
-I./third_party/skia/include/pipe
-I./third_party/skia/include/ports
-I./third_party/skia/include/utils
-I./third_party/skia/include/gpu
-I./third_party/skia/src/gpu
-I./third_party/skia/src/sksl
-I./third_party/icu/source/common
-I./third_party/icu/source/i18n
-I./third_party/mesa/src/include
-I./third_party/libwebm/source
-I./third_party/protobuf/src
-I./third_party/googletest/src/googletest/include/
-I%OUTDIR%/gen/protoc_out
-I%OUTDIR%/gen
-I%OUTDIR%/gen/blink
-I%OUTDIR%/gen/third_party/WebKit
-I%OUTDIR%/gen/ui/resources
-I%OUTDIR%/gen/v8/include
-I./build/linux/debian_jessie_amd64-sysroot/usr/include/glib-2.0
-I./build/linux/debian_jessie_amd64-sysroot/usr/include/nspr
-I./build/linux/debian_jessie_amd64-sysroot/usr/include/nss
-I./build/linux/debian_jessie_amd64-sysroot/usr/lib/x86_64-linux-gnu/glib-2.0/include
-I./testing/gmock/include
-I./testing/gmock_custom
-I./third_party
-I./third_party/WebKit
-I./third_party/WebKit/Source
-I./third_party/boringssl/src/include
-I./third_party/ced/src
-I./third_party/iccjpeg
-I./third_party/leveldatabase
-I./third_party/leveldatabase/src
-I./third_party/leveldatabase/src/include
-I./third_party/libjpeg_turbo
-I./third_party/libpng
-I./third_party/libvpx/source/libvpx
-I./third_party/libyuv/include
-I./third_party/ots/include
-I./third_party/webrtc_overrides
-I./third_party/zlib
-I./v8/include
-isystem./buildtools/third_party/libc++/trunk/include
-isystem./buildtools/third_party/libc++abi/trunk/include
--sysroot=./build/linux/debian_jessie_amd64-sysroot
-std=c++14
-DBLINK_MODULES_IMPLEMENTATION=1
-DCHROMIUM_BUILD
-DCOMPONENT_BUILD
-DDYNAMIC_ANNOTATIONS_ENABLED=1
-DENABLE_MEDIA_ROUTER=1
-DFIELDTRIAL_TESTING_ENABLED
-DFULL_SAFE_BROWSING
-DSAFE_BROWSING_CSD
-DSAFE_BROWSING_DB_LOCAL
-DUSE_AURA=1
-DUSE_CAIRO=1
-DUSE_GLIB=1
-DUSE_NSS_CERTS=1
-DUSE_PANGO=1
-DUSE_UDEV
-DUSE_X11=1
-DV8_DEPRECATION_WARNINGS
-DWTF_USE_DYNAMIC_ANNOTATIONS=1
-D_FILE_OFFSET_BITS=64
-D_LARGEFILE64_SOURCE
-D_LARGEFILE_SOURCE
-D__STDC_CONSTANT_MACROS
-D__STDC_FORMAT_MACROS
-DBLINK_IMPLEMENTATION=1
-DINSIDE_BLINK
-DGLIB_VERSION_MAX_ALLOWED=GLIB_VERSION_2_32
-DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_26
-DGL_GLEXT_PROTOTYPES
-DUSE_GLX
-DUSE_EGL
-DSK_IGNORE_LINEONLY_AA_CONVEX_PATH_OPTS
-DSKIA_DLL
-DGR_GL_IGNORE_ES3_MSAA=0
-DSK_SUPPORT_GPU=1
-DENABLE_LAYOUT_UNIT_IN_INLINE_BOXES=0
-DENABLE_OILPAN=1
-DWTF_USE_CONCATENATED_IMPULSE_RESPONSES=1
-DWTF_USE_WEBAUDIO_FFMPEG=1
-DWTF_USE_DEFAULT_RENDER_THEME=1
-DU_USING_ICU_NAMESPACE=0
-DU_ENABLE_DYLOAD=0
-DICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_FILE
-DANGLE_ENABLE_RELEASE_ASSERTS
-DLIBXSLT_STATIC
-DUSING_V8_SHARED
-DGOOGLE_PROTOBUF_NO_RTTI
-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER
-DHAVE_PTHREAD
-DPROTOBUF_USE_DLLS
-DBORINGSSL_SHARED_LIBRARY
-DUSE_LIBJPEG_TURBO=1
-I../..
-I../../build/linux/debian_jessie_amd64-sysroot/usr/include/glib-2.0
-I../../build/linux/debian_jessie_amd64-sysroot/usr/include/nspr
-I../../build/linux/debian_jessie_amd64-sysroot/usr/include/nss
-I../../build/linux/debian_jessie_amd64-sysroot/usr/lib/x86_64-linux-gnu/glib-2.0/include
-I../../gpu
-I../../skia/config
-I../../skia/ext
-I../../third_party/WebKit
-I../../third_party/WebKit/Source
-I../../third_party/WebKit/Source/platform
-I../../third_party/angle/include
-I../../third_party/angle/src/common/third_party/numerics
-I../../third_party/boringssl/src/include
-I../../third_party/iccjpeg
-I../../third_party/icu/source/common
-I../../third_party/icu/source/i18n
-I../../third_party/khronos
-I../../third_party/libjpeg_turbo
-I../../third_party/libpng
-I../../third_party/libwebm/source
-I../../third_party/libwebp
-I../../third_party/libxml/linux/include
-I../../third_party/libxml/src/include
-I../../third_party/libxslt
-I../../third_party/mesa/src/include
-I../../third_party/ots/include
-I../../third_party/protobuf/src
-I../../third_party/skia/include/c
-I../../third_party/skia/include/config
-I../../third_party/skia/include/core
-I../../third_party/skia/include/effects
-I../../third_party/skia/include/gpu
-I../../third_party/skia/include/images
-I../../third_party/skia/include/lazy
-I../../third_party/skia/include/pathops
-I../../third_party/skia/include/pdf
-I../../third_party/skia/include/pipe
-I../../third_party/skia/include/ports
-I../../third_party/skia/include/utils
-I../../third_party/skia/src/gpu
-I../../third_party/skia/src/sksl
-I../../third_party/snappy/linux
-I../../third_party/snappy/src
-I../../third_party/zlib
-I../../v8/include
-I../../%OUTDIR%/gen
-I../../%OUTDIR%/gen/angle
-I../../%OUTDIR%/gen/blink
-I../../%OUTDIR%/gen/protoc_out
-I../../%OUTDIR%/gen/third_party/WebKit
-I../../%OUTDIR%/gen/v8/include
-isystem../../buildtools/third_party/libc++/trunk/include
-isystem../../buildtools/third_party/libc++abi/trunk/include
--sysroot=../../build/linux/debian_jessie_amd64-sysroot
さいごにこれも忘れずにignoreしましょう。
# Run this in your chromium/src directory
$ echo ".clang_complete.template" >> .git/info/exclude
そのほか好きなパッケージ
-
helm
- 適当にボタンおしたらインクリメンタルサーチでコマンド使えるのでとても便利。
-
magit
- ぱっと見た目がわかりやすいしhunkだけコミットとかしやすくて好きだけど、chromiumのリポジトリではおもすぎて使えないので悲しい。こないだキックスターターでお金集めてたけど、成功したみたいでよかったです。
-
moe-theme
- いい感じの見た目になるので好き。moe-darkとpowerline-moe-themeを使っています。
- mojo-mode
- mojomという拡張子のchromiumで使っているIPCを記述するためのファイルのために、雑な感じでmajorモードを作りました。ただあまりに雑すぎていろいろバグってるので公開するレベルにないのでなんとかしたい・・・ もしちゃんとできたらsrc/tools/emacsとかに公開してもいいかも。それか、もしどなたか作ってたら教えて下さい。。
-
flyspell
- EIGO苦手なので、スペルチェッカを常時動かしています。バックエンドとしてはaspellを使っています。