2016年6月24日金曜日

Emacsのshow-paren-match-faceがremoved

emacsのgit versionを使っているのだが、今日のupdateでshow-paren-match-faceが削除された。

commit c430f7e23fc2c22f251ace4254e37dea1452dfc3
Author: Mark Oteiza <mvoteiza@udel.edu>
Date: Thu Jun 23 17:13:11 2016 -0400
Remove some face aliases obsoleted in 22.1
...
* lisp/paren.el (show-paren-match-face, show-paren-mismatch-face):
...
以下のように、show-paren-matchを設定すれば良い:

(set-face-attribute 'show-paren-match nil
   :background 'unspecified
   :underline "turquoise")

2016年6月1日水曜日

Linux kernel 4.7-rc1をmake-kpkgでbuildする

概要

Linux kernel 4.7-rc1がreleaseされたが、buildでコケた。

Build environment

* Intel Core i7-6700K + DDR4 64GByte
* Debian Sid / Experimental
* gcc.real (Debian 6.1.1-4) 6.1.1 20160519
* Linux 4.7-rc1 (from Git)
* time (MAKEFLAGS= DEBIAN_BUILDARCH=native CONCURRENCY_LEVEL=8 CC='ccache gcc' CXX='ccache g++' fakeroot make-kpkg --initrd kernel_image)

error message

いつも通り、早速make-kpkgでbuildを試みたのだが、見事にコケた:

>   CC      arch/x86/boot/edd.o
> /tmp/ccENSHy1.s: Assembler messages:
> /tmp/ccENSHy1.s:35: Error: instruction `shlx' isn't supported in 16-bit mode.
> /tmp/ccENSHy1.s:39: Error: instruction `andn' isn't supported in 16-bit mode.
>   CC      arch/x86/boot/main.o
> scripts/Makefile.build:289: recipe for target 'arch/x86/boot/cpucheck.o' failed
> make[2]: *** [arch/x86/boot/cpucheck.o] Error 1
> make[2]: *** Waiting for unfinished jobs....

見ての通り、16bit modeでsupportされていないinstructionが使われている。

workaround

arch/x86/以下にあるcodeは-m32でcompileされるんじゃないのかな?と思い、関係しているであろうarch/x86/boot/Makefile@68を編集 (-m32を追加):

KBUILD_CFLAGS   := $(USERINCLUDE) $(REALMODE_CFLAGS) -D_SETUP
KBUILD_CFLAGS   := $(USERINCLUDE) $(REALMODE_CFLAGS) -D_SETUP -m32

これでbuildは通ったが、本当にこんなworkaroundで大丈夫なのかは不明。

ちなみに、Linux 4.6では全く同じ環境でbuildが通っているので、Linux 4.7で色々変わった関係だろう。

2016年5月5日木曜日

ASUS X200LAのFocaltech touchpadがうまく動かなくなった件

概要

  • Debian SidでX関連packageの変更?によりsynclientが動かなくなった
  • /etc/X11/xorg.conf.d/以下にsynaptics関連のfileを配置したら直った

不具合とworkaround

以前のpostで、ASUS X200LAに搭載されているFocaltech touchpadをsynclientで設定すると使いやすくなると書いたが、Linux kernelのupgradeに際してrebootした後、tapなどが動作しなくなっていることに気付いた。

何かの拍子に設定が戻ったのかとsynclient -lで設定を確認してみようとしたら"Couldn't find synaptics properties. No synaptics driver loaded?"を吐く。~/.xsessionにtouchpadを設定する一連のcommandsを書いているので、synclientのこのerrorのせいで動作がおかしくなっている。

当初はkernelを疑って以前のversionに戻したり、幾つかkernel optionsを弄ってみたが関係ないと分かった。

結局、cp -i /usr/share/X11/xorg.conf.d/50-synaptics.conf /etc/X11/xorg.conf.d/を実行した後にXをrestartしたら解決した。よくわからないが、Linux kernelではなく、X側の設定で何かしら変更があったようだ。

参考リンク




2016年4月21日木曜日

GCC 6でbuildできる/できないリスト (2016-04-20現在)

概要


Debian experimentalに入っているGCC 6でbuild可能/失敗するものの一覧。勿論、自分がbuildしてみたものだけ。

成功


  • Linux kernel (4.6-rc4)
  • Emacs
  • FFmpeg
  • mpv
  • MPlayer
  • VLC
  • Mesa
  • xf86-video-intel
  • drm
  • DeaDBeeF
  • Stellarium
  • Zsh


失敗


  • Firefox
  • Glibc


どちらもwarningをerror扱いするoptionのせいでbuild stop。

2016年4月20日水曜日

cmigemoで複数の辞書を使う

概要


C/Migemoは複数の辞書を扱える便利な機能がある。但し、Emacsからmigemo.elを通して使う時には少々fileに細工する必要がある。

C/MigemoとRuby/Migemoの違い


man cmigemoすると明らかな通り、cmigemoはmain dictionaryに加えて、最大8つのsub dictionariesを指定できる。こんな感じ:

cmigemo -s <SUB_DICTIONARY_1> -s <SUB_DICTIONARY_2> ... -s <SUB_DICTIONARY_8> -d <MAIN_DICTIONARY>

Sub dictionariesの何が便利なのかと言えば:

  • mainの辞書を弄るほどでもない内部的なentryを好き放題追加できる
  • mainの辞書とは別にrevision controlしたり配布したりできる

例えば、cmigemoに付属のmigemo-dictをmainとして、それを補完する2つのsub dictionariesを指定すると:

cmigemo -q --emacs -s /home/user/.emacs.d/migemo/migemo-dict.user -s /home/user/.emacs.d/migemo/migemo-dict.sub -d /home/user/.emacs.d/migemo/migemo-dict

この例ではsub dictionariesとしてmigemo-dict.subとmigemo-dict.userの2つを指定している。

Emacsから複数辞書を活用する


複数辞書を指定する場合、Emacsでmigemoを使うためのmigemo.elには細工が必要。

migemo.elは、cmigemoを呼び出すcommand lineを組み立てているのだが、そこでcmigemoに与えているoptionが実はRuby/Migemoのもので、そのままではsub dictionariesを指定できない。2016年現在実際に利用されているのはC/Migemoだけだと思うんだが……。

具体的にはmigemo-initの内部でuser-dictionaryを指定する部分の"-u"及びregex-dictionaryを指定する部分の"-r"をそれぞれ"-s"に設定し、migemo-user-dictionaryとmigemo-regex-dictionaryをそれぞれsub dictionariesのabsolute pathに変更すれば良い。

3つ以上のsub dictionariesを使いたい場合は、非常にダサい実装だが、migemo-sub-dictionary-1〜8を定義し:

(when (and migemo-sub-dictionary-1
           (file-exists-p migemo-sub-dictionary-1))
  (list "-s" migemo-sub-dictionary-1))

を8回copy'n'paste (-1〜-8に変更しつつ)すれば動く (と思う)。

勿論、loopとかmapとかを使ってsmartに書きたい所。

2016年4月13日水曜日

Emacsのimenuをmarkdownで活用する

imenuとは

Emacsには、構造化されたtextの目次を表示しそこへジャンプするimenuという機能がある。

Textによって「目次」とすべき内容が異なるので、imenuにはtextに応じたindexingを行うfunctionを渡せるように作られている。

imenuはprogramming languageには勿論、HTMLやMarkdownのようなtextにも応用できる。

markdown-modeにおけるimenu

markdown-modeはindexを作製するfunctionを2種類提供してくれている:

  • markdown-imenu-create-flat-index
  • markdown-imenu-create-nested-index

この2つの違いはfunction nameそのままで、flatの方はtreeのleaf nodeのみを列挙するのに対し、nestedは言わばleaf nodeへのfull pathを列挙する。

Defaultではflatがimenu-create-index-functionにbindされているので、markdown-modeのhookを使ってnestedをbindすればそちらを利用できる。


実際の活用に際して

imenuはそのままでは使いにくいので、helm-imenuを使うと良いだろう。

この際、which-function (which-funcはobsolete)で現在位置を表示させるのも便利だ。


Indexの実例

# H1
## H2-1
### H3-1
### H3-2
## H2-2
### H3-3

のようなMarkdown textがあるとする。


flat-index

H1
H2-1
H3-1
H3-2
H2-2
H3-3


nested-index

H1 / .
H1 / H2-1 / .
H1 / H2-1 / H3-1
H1 / H2-1 / H3-2
H1 / H2-2 / .
H1 / H2-2 / H3-3

参考Link




個人的にemacsを使う理由

個人的にemacsを日本語文書の記述や編集に使っている。

大きな理由は:

* DDSKK → 日本語入力
* helm (特にhelm-filelist+) → 最近開いたfileをincrementalに絞り込み
* auto-save-buffers-enhanced → 自動save
* migemo → ローマ字で日本語検索
* helm-swoop → 検索語をlistして一覧 & jump

今の所emacs以外でこれらを実現できる環境はなさそう。

あと、fileを開いた時にbufferをview-modeで開くhookを仕込んでいるので、半ばViみたいな使い方になっている。

ちなみに、設定ファイルとかプログラムの記述とかには専らVimを使っている。