mieki256's diary



2017/03/29(水) [n年前の日記]

#1 [emacs] emacsの拡張をアップデートしたり設定を見直したり

emacsの設定を弄ってるところ。環境は Windows10 x64 + NTEmacs 24.5.1。

拡張をアップデートしたら動作が怪しくなってしまった。 :

最近の emacs は、 M-x package-list-packages をするとネット経由で拡張がインストールできたりするのだけど。Uキーを押して、アップデートできそうな拡張に全部マークをつけて、xキーを押して実行・アップデートしてみたら、その後動作が怪しくなって困ったり。

症状としては、Rubyスクリプトを書く際にスペースキーを1回押すと空白が2つ入ってしまったり、ファイルを修正後に C-x C-s を叩いても何故か保存できずに「ファイル名は?」と尋ねられたり。

~/.emacs の中身を色々書き換えて犯人を探してみたら、悪さをしていたのはこのあたりだった…。
(require 'ruby-electric)
(add-hook 'ruby-mode-hook '(lambda () (ruby-electric-mode t)))

ググってみたら、ruby-electric は emacs 24.x 以降で動作が怪しいとのことで。

_Emacs24 で ruby-electric的なruby-modeを実現するには: invisible colors, inherent shapes and impassible emotion

ruby-electric は使わずに、ruby-end.el をインストールしつつ、括弧等の補完は emacs24.x 以降で使える新機能で対応、という手があるらしい。試してみたところ、余分なスペースも入らないし、ファイル保存もできるようになった。

ただ、「|v|」と打ちたい時に、「|」だけ打てば「||」に補完してくれないのはちょっとアレだけど。この文字は括弧じゃないから判別と補完が難しいのだろうな…。今までは ruby-electric が頑張っていたということだろうか。

にしても、上記ページは 2012年頃の記事だし…。今もダメなんだろうか。いやまあ、手元の環境では実際こうしてダメになったのだから、今でもダメなんだろうけど。

ruby-electricは使えるのか使えないのか。 :

_qoobaa/ruby-electric: Improved ruby-electric mode を眺めたら、「このリポジトリはもうメンテナンスしてねえよ」「でもMELPAで扱ってるのは Ruby SVN のソレだよ」と書いてあった。

_[Home] Ruby Mode によると、 _[ruby] Index of /trunk/misc が、その Ruby SVN リポジトリらしい。ruby-electric の最後の更新は2年前、ということかな…。

そもそも ruby-mode.el もどれが最新なのか分からない。NTEmacsのインストールフォルダ内を眺めたら、標準で ruby-mode.el が入ってたけど、これは古いのか新しいのか。

ruby-mode 以外はどこから入手するのがいいのだろう。などと思いながら M-x package-list-packages で ruby-additional.el をインストールしてみたら、rdoc-mode.el、ruby-style.el、rubydb2x.el、rubydb3x.el も一緒に入ってた。また、inf-ruby.el も M-x package-list-packages でインストールできるらしい。

つまり、ruby-additional と inf-ruby をインストールすれば、ひとまずファイルは揃うはず、ということだろうか。しかし、それぞれの中身は、新しいのか古いのか…。中身を見ても、そもそもヘッダー部分からして全然違っていたりして、バージョンすら判別できず。途中で別の方がごっそり書き直したとかそういうアレかな…。

でもまあ、emacs に標準で ruby-mode が入ってるだけでも御の字、かもしれん…。

tabbarの設定を見直し。 :

emacs上でタブバーを表示してくれる tabbar てのがあるのだけど、ファイル編集した際のタブ表示が反映されなくて悩んだり。

tabbar.el を眺めたら分かってきた。tabbar-selected-modified と tabbar-modified があるのね…。両方設定してやらないといかんのだな…。

とりあえず、~/.emacs 内では現状こんな感じに。
;; ----------------------------------------
;; tabbar - バッファの上部にタブを表示
;;
;; M-Left、M-Right   タブ間を移動
;; home、S-home      タブ間を移動
;; C-TAB、C-S-TAB    タブ間を移動

(require 'tabbar)
(tabbar-mode)

;; (require 'cl)
;; (load "~/.emacs.d/elisp/tabbar_init")

(tabbar-mwheel-mode nil)  ;; タブ上でマウスホイール無効
(setq tabbar-buffer-groups-function nil)  ;; グループ化無効
(setq tabbar-auto-scroll-flag t)  ;; タブを自動スクロール
(setq tabbar-use-images nil)  ;; 画像を使わない

;; 左に表示されるボタンを無効化
(dolist (btn '(tabbar-buffer-home-button
               tabbar-scroll-left-button
               tabbar-scroll-right-button))
  (set btn (cons (cons "" nil)
                 (cons "" nil))))


;; scratch 以外で先頭に「*」がついてるタブを表示しない
(setq tabbar-buffer-list-function
      (lambda ()
        (remove-if
         (lambda(buffer)
           (unless (string= (buffer-name buffer) "*scratch*")
             (find (aref (buffer-name buffer) 0) " *")))
         (buffer-list))))

;; 外観変更

;; タブセパレータの長さ
(setq tabbar-separator '(0.4))

(set-face-attribute
 'tabbar-default nil
 :family (face-attribute 'default :family)
 :foreground "#cccccc"
 :background "#666666"
 :height 1.0)

;; タブセパレータの見た目
(set-face-attribute
 'tabbar-separator nil
 :foreground "#222222"
 :background "#666666")

;; 非選択・未変更タブ
(set-face-attribute
 'tabbar-unselected nil
 :foreground "#333333"
 :background "#bbbbbb"
 :weight 'medium
 :box nil)

;; 非選択・変更タブ
(set-face-attribute
 'tabbar-modified nil
 :foreground "red"
 :background "#bbbbbb"
 :weight 'medium
 :box nil)

;; 選択・未変更タブ
(set-face-attribute
 'tabbar-selected nil
 :foreground "blue"
 :background "#eeeeee"
 :weight 'bold
 :box nil)

;; 選択・変更タブ
(set-face-attribute
 'tabbar-selected-modified nil
 :foreground "red"
 :background "#eeeeee"
 :weight 'bold
 :box nil)

(set-face-attribute
 'tabbar-button nil
 :box nil)

;; (set-face-attribute 'tabbar-default nil :background "brightblue" :foreground "white")
;; (set-face-attribute 'tabbar-selected nil :background "#ff5f00" :foreground "brightwhite" :box nil)
;; (set-face-attribute 'tabbar-modified nil :background "brightred" :foreground "brightwhite" :box nil)

;; 編集されたらタブのラベルに記号を追加
;; Add a buffer modification state indicator in the tab label, and place a
;; space around the label to make it looks less crowd.
(defadvice tabbar-buffer-tab-label (after fixup_tab_label_space_and_flag activate)
  (setq ad-return-value
        (if (and (buffer-modified-p (tabbar-tab-value tab))
                 (buffer-file-name (tabbar-tab-value tab)))
            (concat " * " (concat ad-return-value " "))
          (concat " " (concat ad-return-value " ")))))

;; 編集されるたびにタブのラベルを更新
;; Called each time the modification state of the buffer changed.
(defun ztl-modification-state-change ()
  (tabbar-set-template tabbar-current-tabset nil)
  (tabbar-display-update))

;; First-change-hook is called BEFORE the change is made.
(defun ztl-on-buffer-modification ()
  (set-buffer-modified-p t)
  (ztl-modification-state-change))
(add-hook 'after-save-hook 'ztl-modification-state-change)

;; This doesn't work for revert, I don't know.
;;(add-hook 'after-revert-hook 'ztl-modification-state-change)
(add-hook 'first-change-hook 'ztl-on-buffer-modification)

(dolist (func '(tabbar-mode tabbar-forward-tab tabbar-forward-group tabbar-backward-tab tabbar-backward-group))
  (autoload func "tabbar" "Tabs at the top of buffers and easy control-tab navigation"))

(defmacro defun-prefix-alt (name on-no-prefix on-prefix &optional do-always)
  `(defun ,name (arg)
     (interactive "P")
     ,do-always
     (if (equal nil arg)
         ,on-no-prefix
       ,on-prefix)))

(defun-prefix-alt shk-tabbar-next (tabbar-forward-tab) (tabbar-forward-group) (tabbar-mode 1))
(defun-prefix-alt shk-tabbar-prev (tabbar-backward-tab) (tabbar-backward-group) (tabbar-mode 1))

;; キー割り当て
(global-set-key [M-right] 'shk-tabbar-next)
(global-set-key [M-left] 'shk-tabbar-prev)
(global-set-key [(control tab)] 'shk-tabbar-next)
(global-set-key [(control shift tab)] 'shk-tabbar-prev)
(define-key global-map [home] 'shk-tabbar-next)
(define-key global-map [\S-home] 'shk-tabbar-prev)
見た目はこんな感じ。

emacs_tabbar_ss.png

手動で入れたyasnippetを整理。 :

昔手動で yasnippet をインストールしたのだけど、ネット経由で最新版が入れられるのだからそっちを入れようと思い立って。手動で入れてた関連ファイルを別の場所に移動して M-x package-list-packages でインストール。自分用のスニペットは ~/.emacs.d/snippets/ にコピー。

emacs の起動がとんでもなく速くなった。20秒以上かかっていたのが、数秒で立ち上がる。今まで訳も分からずインストールしていた古いアレコレが、無駄に時間を食っていたのか…。

picture-modeを強化。 :

_Emacs picture-modeの拡張 - 屯遁のパズルとプログラミングの日記 で、picture-mode を強化する elisp が披露されてた。試しに導入。

xyzzy の罫線モードと同様に、C-カーソルキーでいきなり縦横の線が引けるようになった。これはたしかに快適。

ただ、C-c C-カーソルキーでリージョンを移動できるはずが、それについては動作せず。ひとまず、C-M-カーソルキーに割り当てたら動いたけど…。
  (define-key picture-mode-map [C-M-right] 'picture-region-move-right)
  (define-key picture-mode-map [C-M-left]  'picture-region-move-left)
  (define-key picture-mode-map [C-M-up]    'picture-region-move-up)
  (define-key picture-mode-map [C-M-down]  'picture-region-move-down)
しかし、どうして動かなかったのかよく分からず。emacsのバージョンによって記述の仕方が変わるのだろうか。

む。分かった。tabbar が C-c C-right 等のショートカットキーを取ってしまっているのだな…。

tabbar側のキーの殺し方は、こんな感じだろうか。
(define-key tabbar-mode-map [(control ?c) C-right] nil)  ;; tabbar-forward
(define-key tabbar-mode-map [(control ?c) C-left]  nil)  ;; tabbar-backward
(define-key tabbar-mode-map [(control ?c) C-up]    nil)  ;; tabbar-backward-group
(define-key tabbar-mode-map [(control ?c) C-down]  nil)  ;; tabbar-forward-group
ちなみに自分の場合、C-tab、C-S-tab、Home、S-Home にタブの切り替えを割り当ててあるので殺しても困らない、とメモ。

以上です。

過去ログ表示

Prev - 2017/03 - Next
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project