右AltキーをCtrlに変更する

ノートパソコンのキーボードだとCtrlキーが左手側だけのことが多いので、Emacsを使っていると左手の小指に負荷がかかる。

右手側にCtrlキーがあれば両手で負荷が分散できる。 大抵のノートパソコンには右Altキーがあるので、Emacsで右Altキーを右Ctrlキーとして使う方法を考えた。

前提: - X Window System上でEmacsを使っている

以下の設定を.bashrcに追加:

# Xmodmap
if [ -n "${DISPLAY}" ]; then
  if xmodmap | egrep 'mod1.*Alt_R'; then
    xmodmap - <<EOF
remove mod1 = Alt_R
add control = Alt_R
EOF
  fi
fi

結果は次のとおり。

$ xmodmap
xmodmap:  up to 4 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Eisu_toggle (0x42)
control     Control_L (0x25),  Control_R (0x6d),  Alt_R (0x71)
mod1        Alt_L (0x40),  Meta_L (0x9c)
mod2        Num_Lock (0x4d)
mod3
mod4        Super_L (0x73),  Super_R (0x74),  Super_L (0x7f),  Hyper_L (0x80)
mod5        Mode_switch (0x8),  ISO_Level3_Shift (0x7c)

8月に読んだ本やマンガ

8月の読書メーター
読んだ本の数:60
読んだページ数:10138
ナイス数:1

超人ロック エピタフ (1) (MFコミックス フラッパーシリーズ)超人ロック エピタフ (1) (MFコミックス フラッパーシリーズ)
読了日:08月04日 著者:聖 悠紀
超人ロック エピタフ (2) (MFコミックス フラッパーシリーズ)超人ロック エピタフ (2) (MFコミックス フラッパーシリーズ)
読了日:08月04日 著者:聖 悠紀
超人ロック エピタフ (3) (MFコミックス フラッパーシリーズ)超人ロック エピタフ (3) (MFコミックス フラッパーシリーズ)
読了日:08月04日 著者:聖 悠紀
超人ロック エピタフ (4) (MFコミックス フラッパーシリーズ)超人ロック エピタフ (4) (MFコミックス フラッパーシリーズ)
読了日:08月04日 著者:聖 悠紀
絵で見てわかる量子コンピュータの仕組み絵で見てわかる量子コンピュータの仕組み感想
1キュビットの量子ゲートの動作すら、通常のコンピュータの動作とくらべて段違いに複雑で難しい。そもそもこれってデジタルコンピュータと言えるのだろうか。どちらかというとアナログコンピュータに近い気もする。現代のデジタルコンピュータのブール代数やフォンノイマン型のような汎用的で再帰的に部品化する方法論もまだ確立していなさげだ。
読了日:08月04日 著者:宇津木 健
お兄ちゃんはおしまい! (IDコミックス)お兄ちゃんはおしまい! (IDコミックス)
読了日:08月08日 著者:ねことうふ
サイコスタッフ 新装版サイコスタッフ 新装版
読了日:08月08日 著者:水上悟志
ろんぐらいだぁす!(10) 特装版ろんぐらいだぁす!(10) 特装版
読了日:08月08日 著者:三宅 大志
私はどのようにしてLinuxカーネルを学んだか (ゆたかさんの技術書)私はどのようにしてLinuxカーネルを学んだか (ゆたかさんの技術書)
読了日:08月08日 著者:平田豊
怪物王女ナイトメア(5) (シリウスKC)怪物王女ナイトメア(5) (シリウスKC)
読了日:08月08日 著者:光永 康則
ふたりソロキャンプ(3) (イブニングKC)ふたりソロキャンプ(3) (イブニングKC)
読了日:08月10日 著者:出端 祐大
うらら迷路帖 (1) (まんがタイムKRコミックス)うらら迷路帖 (1) (まんがタイムKRコミックス)
読了日:08月11日 著者:はりかも
終わりのセラフ 2 (ジャンプコミックス)終わりのセラフ 2 (ジャンプコミックス)
読了日:08月11日 著者:山本 ヤマト,降矢 大輔
かわうその自転車屋さん 7 (芳文社コミックス)かわうその自転車屋さん 7 (芳文社コミックス)
読了日:08月11日 著者:こやまけいこ
少女終末旅行 1 (BUNCH COMICS)少女終末旅行 1 (BUNCH COMICS)
読了日:08月11日 著者:つくみず
少女終末旅行 2 (BUNCH COMICS)少女終末旅行 2 (BUNCH COMICS)
読了日:08月11日 著者:つくみず
新版 日本人になった祖先たち―DNAが解明する多元的構造 (NHKブックス No.1255)新版 日本人になった祖先たち―DNAが解明する多元的構造 (NHKブックス No.1255)
読了日:08月11日 著者:篠田 謙一
少女終末旅行 3 (BUNCH COMICS)少女終末旅行 3 (BUNCH COMICS)
読了日:08月12日 著者:つくみず
少女終末旅行 4 (BUNCH COMICS)少女終末旅行 4 (BUNCH COMICS)
読了日:08月12日 著者:つくみず
少女終末旅行 5 (BUNCH COMICS)少女終末旅行 5 (BUNCH COMICS)
読了日:08月12日 著者:つくみず
少女終末旅行 6 (BUNCH COMICS)少女終末旅行 6 (BUNCH COMICS)
読了日:08月12日 著者:つくみず
裏世界ピクニック(3) (ガンガンコミックス)裏世界ピクニック(3) (ガンガンコミックス)
読了日:08月13日 著者:宮澤 伊織,水野 英多
緑の王 VERDANT LORD(3) (マガジンZKC)緑の王 VERDANT LORD(3) (マガジンZKC)
読了日:08月13日 著者:曽我 篤士
緑の王 VERDANT LORD(4) (マガジンZKC)緑の王 VERDANT LORD(4) (マガジンZKC)
読了日:08月13日 著者:曽我 篤士
緑の王 VERDANT LORD(5) (マガジンZKC)緑の王 VERDANT LORD(5) (マガジンZKC)
読了日:08月13日 著者:曽我 篤士
緑の王 VERDANT LORD(6) (マガジンZKC)緑の王 VERDANT LORD(6) (マガジンZKC)
読了日:08月13日 著者:曽我 篤士
仏教入門 (講談社現代新書)仏教入門 (講談社現代新書)
読了日:08月13日 著者:南 直哉
うらら迷路帖 (2) (まんがタイムKRコミックス)うらら迷路帖 (2) (まんがタイムKRコミックス)
読了日:08月14日 著者:はりかも
博多弁の女の子はかわいいと思いませんか?(1) (チャンピオンREDコミックス)博多弁の女の子はかわいいと思いませんか?(1) (チャンピオンREDコミックス)
読了日:08月14日 著者:新島 秋一
博多弁の女の子はかわいいと思いませんか?(2) (チャンピオンREDコミックス)博多弁の女の子はかわいいと思いませんか?(2) (チャンピオンREDコミックス)
読了日:08月14日 著者:新島 秋一
博多弁の女の子はかわいいと思いませんか?(3) (チャンピオンREDコミックス)博多弁の女の子はかわいいと思いませんか?(3) (チャンピオンREDコミックス)
読了日:08月14日 著者:新島秋一
緑の王 VERDANT LORD(7) (マガジンZKC)緑の王 VERDANT LORD(7) (マガジンZKC)
読了日:08月15日 著者:曽我 篤士
緑の王 VERDANT LORD(8) (マガジンZKC)緑の王 VERDANT LORD(8) (マガジンZKC)
読了日:08月15日 著者:曽我 篤士
緑の王 VERDANT LORD(9) <完> (マガジンZKC)緑の王 VERDANT LORD(9) <完> (マガジンZKC)
読了日:08月15日 著者:曽我 篤士
うらら迷路帖 (3) (まんがタイムKRコミックス)うらら迷路帖 (3) (まんがタイムKRコミックス)
読了日:08月15日 著者:はりかも
幼女戦記 (1) (角川コミックス・エース)幼女戦記 (1) (角川コミックス・エース)
読了日:08月16日 著者:東條 チカ
幼女戦記 (2) (角川コミックス・エース)幼女戦記 (2) (角川コミックス・エース)
読了日:08月16日 著者:東條 チカ
幼女戦記 (3) (角川コミックス・エース)幼女戦記 (3) (角川コミックス・エース)
読了日:08月16日 著者:東條 チカ
幼女戦記 (4) (角川コミックス・エース)幼女戦記 (4) (角川コミックス・エース)
読了日:08月16日 著者:東條 チカ
幼女戦記 (5) (角川コミックス・エース)幼女戦記 (5) (角川コミックス・エース)
読了日:08月16日 著者:東條 チカ
幼女戦記 (6) (角川コミックス・エース)幼女戦記 (6) (角川コミックス・エース)
読了日:08月16日 著者:東條 チカ
幼女戦記 (7) (角川コミックス・エース)幼女戦記 (7) (角川コミックス・エース)
読了日:08月16日 著者:東條 チカ
幼女戦記 (8) (角川コミックス・エース)幼女戦記 (8) (角川コミックス・エース)
読了日:08月16日 著者:東條 チカ
幼女戦記 (9) (角川コミックス・エース)幼女戦記 (9) (角川コミックス・エース)
読了日:08月16日 著者:東條 チカ
幼女戦記 (10) (角川コミックス・エース)幼女戦記 (10) (角川コミックス・エース)
読了日:08月16日 著者:東條 チカ
幼女戦記 (11) (角川コミックス・エース)幼女戦記 (11) (角川コミックス・エース)
読了日:08月16日 著者:東條 チカ
幼女戦記 (12) (角川コミックス・エース)幼女戦記 (12) (角川コミックス・エース)
読了日:08月16日 著者:東條 チカ
幼女戦記 (13) (角川コミックス・エース)幼女戦記 (13) (角川コミックス・エース)
読了日:08月16日 著者:東條 チカ
幼女戦記 (14) (角川コミックス・エース)幼女戦記 (14) (角川コミックス・エース)
読了日:08月16日 著者:東條 チカ
幼女戦記 (15) (角川コミックス・エース)幼女戦記 (15) (角川コミックス・エース)
読了日:08月16日 著者:東條 チカ
修羅の刻(18) (講談社コミックス月刊マガジン)修羅の刻(18) (講談社コミックス月刊マガジン)
読了日:08月16日 著者:川原 正敏
怪物王女(1) (シリウスKC)怪物王女(1) (シリウスKC)
読了日:08月16日 著者:光永 康則
日本酒の科学 水・米・麹の伝統の技 (ブルーバックス)日本酒の科学 水・米・麹の伝統の技 (ブルーバックス)
読了日:08月20日 著者:和田 美代子
キン肉マン「超人」 (学研の図鑑)キン肉マン「超人」 (学研の図鑑)
読了日:08月23日 著者:
海に沈んだ大陸の謎 最新科学が解き明かす激動の地球史 (ブルーバックス)海に沈んだ大陸の謎 最新科学が解き明かす激動の地球史 (ブルーバックス)
読了日:08月24日 著者:佐野 貴司
先をゆくもの達先をゆくもの達
読了日:08月27日 著者:神林 長平
我々は生命を創れるのか 合成生物学が生みだしつつあるもの (ブルーバックス)我々は生命を創れるのか 合成生物学が生みだしつつあるもの (ブルーバックス)
読了日:08月28日 著者:藤崎 慎吾
達人伝~9万里を風に乗り~(24) (アクションコミックス)達人伝~9万里を風に乗り~(24) (アクションコミックス)
読了日:08月28日 著者:王 欣太
フェイト/エクストラ CCC FoxTail (8) (角川コミックス・エース)フェイト/エクストラ CCC FoxTail (8) (角川コミックス・エース)
読了日:08月28日 著者:たけのこ星人
技術と法律2018 (技術書典シリーズ(NextPublishing))技術と法律2018 (技術書典シリーズ(NextPublishing))
読了日:08月28日 著者:

読書メーター

RubyのRegexp.last_matchのスコープ

ちょっとハマったのでメモ。

Rubyでは正規表現を一致させた結果をRegexp.last_match$~などで取得する。 リファレンスマニュアルでは次のように説明されている。

カレントスコープで最後に行った正規表現マッチのMatchDataオ ブジェクトを返します。

このカレントスコープはレキシカルに、つまりコードの字面上だけで決定される。 正規表現を一致させた後であっても、スコープが異なれば一致させた結果にアクセスすることはできない。

実証コード:

def foo(re)
  re.call                       # ここで正規表現を一致させる
  p Regexp.last_match           # が、外側のスコープの結果は得られない
end

foo(proc{ 'foo' =~ /foo/ })
p Regexp.last_match             # 同じスコープなら結果を得られる

実行結果:

nil
#<MatchData "foo">

次期家PC

DELLのnew XPS13 2 in 1に少し期待していたが、盆休み前に表参道のDELL Design Laboに実機を見に行ったところ、MagLevキーボードが思ったより打鍵感がペコペコで期待外れだった。持ち運びを考えなければSurface Bookが良さそうだが、今年は新機種が出るのかなあ。

追記(2019/09/24)

ビックカメラで実機を触ってみたら、以外とこのキーボードで行ける気がした。 増税前の割引セールをやってるのでどうしようかな。 10月に発表と噂のSurfaceの新型も気になるが。

追記(2019/09/26)

再度、店舗で実機をじっくりと確かめてみた。 キーボードはそんなに悪くないが、今度はディスプレイのペラさが気になった。 Surfaceの方がディスプレイの作りがかっちりしていて視認性もよさそう。 少なくともDELLは今回は見送りだな。

ivy/counselの設定

いろいろ試行錯誤して次の設定に落ち着いた。

ivy

基本設定

(require 'ivy)
(ivy-mode 1)
(setq ivy-height 30)
(setq ivy-use-virtual-buffers t)

helmのように正規表現を順不同にする

(setq ivy-re-builders-alist '((t . ivy--regex-ignore-order)))

デフォルトで入力済みの^を消す

鬱陶しいのでデフォルト値から消した。

(setq ivy-initial-inputs-alist
      (seq-remove
       (lambda (initial-input-pair)
         (let ((initial-input-name (car initial-input-pair)))
           (or (string-prefix-p "counsel-" (symbol-name initial-input-name))
               (seq-contains '(Man-completion-table woman) initial-input-name))))
       ivy-initial-inputs-alist))

検索候補を語長順かつ辞書順にする

Emacs-Lispのコマンド・関数・変数の検索が対象。

(defun ivy--sort-by-len (name candidates)
  "Sort CANDIDATES based on similarity of their length with NAME."
  (let ((name-len (length name))
        (candidates-count (length candidates)))
    (if (< 500 candidates-count)
        candidates
      (seq-sort-by (lambda (candidate-string)
                     (cons candidate-string
                           (abs (- name-len (length candidate-string)))))
                   (lambda (a b)
                     (or (< (cdr a) (cdr b))
                         (and (= (cdr a) (cdr b))
                              (string< (car a) (car b)))))
                   candidates))))
(dolist (i '(counsel-M-x
             counsel-apropos
             counsel-describe-function
             counsel-describe-variable
             counsel-describe-face))
  (setf (alist-get i ivy-sort-matches-functions-alist) 'ivy--sort-by-len))

swiper

呼び出すだけ。

(require 'swiper)

counsel

基本設定

(require 'counsel)
(counsel-mode 1)
(global-set-key (kbd "M-x") 'counsel-M-x)                  ; replace to counsel command
(global-set-key (kbd "C-x C-b") 'ivy-switch-buffer)        ; replace to counsel command
(global-set-key (kbd "ESC M-x") 'execute-extended-command) ; backup original command

counsel-gitにUntracked Filesを追加

helm-ls-gitに動作を近づける。

(setq counsel-git-cmd
      (string-join '("git status --short --untracked-files=all | awk '$1~/?/{print $2}'" ; additional untracked files
                     "git ls-files --full-name --")                                      ; default git command
                   "; "))

counsel-gitのエイリアス

counsel-git-grepと被るので、区別がつくようにエイリアスを定義。

(defalias 'counsel-git-ls 'counsel-git)

counsel-git-grepに別ウィンドウのアクションを追加

標準だとなぜか未定義なので追加した。

(defun counsel-git-grep-other-window (&rest args)
  "Go to occurrence X in current Git repository other window.
ARGS is passed through to `counsel-git-grep-action'."
  (switch-to-buffer-other-window (current-buffer))
  (apply #'counsel-git-grep-action args))
(ivy-add-actions
 'counsel-git-grep
 '(("j" counsel-git-grep-other-window "other window")))

magitの設定

(with-eval-after-load "magit"
  (setq magit-completing-read-function 'ivy-completing-read))

prescient

基本設定

(require 'prescient)
(setq prescient-aggressive-file-save t)
(prescient-persist-mode 1)
(require 'ivy-prescient)
(ivy-prescient-mode 1)

検索候補を辞書順に並べる

デフォルトだと同じ語長のワードがランダムに並んで 気持ち悪いので、adviceを使って無理やり辞書順に並べ替えた。

(defun my-advice/ivy-prescient-sort-function-by-dictionary-order (adviced-sort-function c1 c2)
  "Around advice function for `ivy-prescient-sort-function'.
This advice sorts candidates by dictionary order.
ADVICED-SORT-FUNCTION is original function.
C1 and C2 is original arguments."
  (or (funcall adviced-sort-function c1 c2)
      (progn
        (when (listp c1)
          (setq c1 (car c1)))
        (when (listp c2)
          (setq c2 (car c2)))
        (and (= (length c1) (length c2))
             (string< c1 c2)))))
(advice-add 'ivy-prescient-sort-function :around #'my-advice/ivy-prescient-sort-function-by-dictionary-order)