2009-07 / 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

2009-07-10 (金)

Emacs講座 -第8回- タブ幅 [Emacs講座]

目次 / 第1回 第2回 第3回 第4回 第5回 第6回 第7回 第8回 第9回

3つの変数


Emacs のタブ幅には、3つの変数が関係しています。

tab-width


タブコードを半角スペースいくつ分で表示するかを制御する変数です。
各バッファ毎に設定できます。デフォルトは 8 です。

default-tab-width


tab-width のデフォルト値です。全てのバッファに影響する変数です。
デフォルトは 8 です。

tab-stop-list


TAB キーを押した時に、カーソルが移動するカラムの位置です。デフォル
トは (8 16 24 32 40 48 56 64 72 80 88 96 104 112 120) です。

例えばタブ幅を 4 に変更したい場合は以下のようなコードを ~/.emacs に
記述します。

(setq-default tab-width 4)
(setq default-tab-width 4)
(setq tab-stop-list '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60
                      64 68 72 76 80 84 88 92 96 100 104 108 112 116 120))



関数化してみよう


tab-stop-list の設定が少し煩雑ですよね。以前は手計算で
tab-stop-list の中身を作っていたのですが、見事に計算間違いした経験
があります。そんな自分が嫌になったので、関数化しました。

「下記設定」と「前述の設定をタブ 8 に変えたもの」は同じ意味です。

(defun set-aurora-tab-width (num &optional local redraw)
  "タブ幅をセットします。タブ5とかタブ20も設定できたりします。
localが non-nilの場合は、カレントバッファでのみ有効になります。
redrawが non-nilの場合は、Windowを再描画します。"
  (interactive "nTab Width: ")
  (when local
    (make-local-variable 'tab-width)
    (make-local-variable 'tab-stop-list))
  (setq tab-width num)
  (setq tab-stop-list ())
  (while (<= num 256)
    (setq tab-stop-list `(,@tab-stop-list ,num))
    (setq num (+ num tab-width)))
  (when redraw (redraw-display)) tab-width)

(set-aurora-tab-width (setq default-tab-width (setq-default tab-width 8)))



動的なタブ幅の切り替え


開いたテキストが自分のタブ幅と異なるため、インデントがずれた経験は
ありませんか?

キー操作で動的に切り替えられるように、私は以下の設定をしています。
結構おすすめです。(ctl-q-map については、第5回を参照してください。)

(define-key ctl-q-map (kbd "2") (lambda () (interactive) (set-aurora-tab-width 2 t t)))
(define-key ctl-q-map (kbd "4") (lambda () (interactive) (set-aurora-tab-width 4 t t)))
(define-key ctl-q-map (kbd "8") (lambda () (interactive) (set-aurora-tab-width 8 t t)))


例えば "Ctrl-q 4" すると、カレントバッファのタブ幅が 4 になります。
他のバッファには影響を与えません。

ファイル単位でのタブ幅の切り替え


ファイルの先頭に以下を書いておくと、Emacs はそのファイルをタブ 4 で開きます。

-*- tab-width: 4 -*-


ファイルの最後に書くことも出来ます。

Local Variables:
tab-width: 4
End:


tab-width に特化された実装になっているわけではありません。
このような記述をすると、ファイル毎に変数値を設定できるのです。

英語ですが、Info にも詳しい説明が書いてあります。

1. M-x info [Enter]
2. 以下の行で Enter
  * Emacs: (emacs). The extensible self-documenting text editor.
3. g を押したあと、Specifying File Variables [Enter]


関連する関数


タブに関連する関数をご紹介します。それぞれ M-x で呼び出せます。

tabify


リージョン内の連続する空白をタブに変換します。変数 tab-width がこの
動きを制御します。

untabify


リージョン内のタブを複数のスペースに変換します。変数 tab-width がこ
の動きを制御します。

第8回終わり。

目次 / 第1回 第2回 第3回 第4回 第5回 第6回 第7回 第8回 第9回

2009-07 / 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

最終更新時間: 2017-02-26 21:55

検索
最近の話題
- 2017-02-26
  git-hyper-blame のセットアップ方法と使い方
- 2017-02-25
  18 年 4 カ月使った au を解約して IIJmio に乗り換えた
- 2017-02-21
  第18回Elasticsearch勉強会に参加してきた #elasticsearchjp
- 2017-01-27
  同じ Ajax 処理を Vue.js と jQuery で書いてみた
- 2017-01-10
  完全に闇に落ちていた StartSSL に ¥3,603 課金してしまったお話
- 2017-01-03
  Software Design を 13 ヶ月分まとめ読みした
- 2016-12-19
  任意の Ruby オブジェクトを YAML として書く
  Ruby の $ERROR_INFO などの特殊変数は require 'English' が必要だったのか
最近追記された記事
- 2017-02-25-1 (0日前)
- 2017-02-21-1 (4日前)
- 2015-06-07-1 (10日前)
- 2016-10-19-1 (19日前)
- 2016-01-01-1 (31日前)
- 2015-01-04-1 (40日前)
- 2015-06-07-1 (60日前)
- 2016-12-10-1 (78日前)
- 2016-11-05-1 (86日前)
- 2015-01-04-1 (94日前)
カテゴリ
- Anthy (3)
- Apache (11)
- Apple (1)
- ATOK (4)
- au (3)
- AWS (15)
- Bazaar (1)
- Berkshelf (2)
- BigQuery (1)
- BitBar (3)
- Book (85)
- Boxen (2)
- Bugsnag (1)
- C (26)
- capistrano (3)
- chalow (56)
- ChatWork (1)
- Chef (17)
- Chrome (3)
- Chromecast (1)
- CircleCI (7)
- Comics (2)
- Cooking (10)
- cvs (15)
- cygwin (12)
- D3.js (1)
- Debian (55)
- Docker (1)
- E-mail (8)
- elasticsearch (4)
- Emacs (219)
- Emacs講座 (10)
- English (4)
- feedforce (7)
- fetchmail (3)
- Firefox (20)
- Fluentd (4)
- ftp (1)
- Game (19)
- Gem (5)
- Git (9)
- GitHub (15)
- Go (5)
- Google (1)
- gpg (4)
- GrowthForecast (7)
- Health (2)
- Heroku (9)
- Homebrew (10)
- HTML (6)
- iBook (1)
- iPhone (15)
- IRC (1)
- Jenkins (8)
- JS (1)
- Karabiner (1)
- KeySnail (3)
- Kibana (1)
- Kindle (1)
- Langrich (7)
- LDAP (6)
- Life (18)
- Linux (5)
- Mackerel (1)
- Mew (18)
- MongoDB (1)
- Mozilla (19)
- Music (1)
- MySQL (1)
- NAS (4)
- nginx (6)
- NHK (1)
- Node (1)
- ntp (4)
- OOP (1)
- OpenID (2)
- openssl (1)
- Opera (2)
- OSX (41)
- Perl (14)
- PHP (19)
- PostgreSQL (1)
- procmail (4)
- Programing (3)
- Puppet (1)
- Python (2)
- Rails (10)
- Rake (2)
- RaspberryPi (1)
- RedHat (29)
- Redmine (3)
- Rspec (1)
- Ruby (48)
- samba (3)
- screen (7)
- sed (5)
- serverspec (6)
- sh (8)
- Slack (2)
- Solaris9 (22)
- Spring (2)
- ssh (4)
- StatusNet (21)
- svn (12)
- Swift (1)
- Tablet (1)
- tdiary (3)
- Twitter (14)
- Twmode (6)
- Ubuntu (5)
- UNIX (102)
- vagrant (8)
- Video (21)
- vim (1)
- Wercker (9)
- Windows (29)
- Wine (3)
- XML (11)
- XP (1)
- zsh (25)
- インストールメモ (33)
- クイックシェイプ (12)
- ネタ (15)
- 勉強会 (14)
- 携帯 (6)
- 正規表現 (4)
過去ログ
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12
2002 : 01 02 03 04 05 06 07 08 09 10 11 12
2001 : 01 02 03 04 05 06 07 08 09 10 11 12
Google+