tasuwo blog

Emacsに色々設定したメモ

| Comments

やったことは以下

  1. タブ,全角/半角スペースを可視化(whitespaceの導入)
  2. タブをスペースで変換するように設定
  3. Markdownにおける行頭タブの自動整形の無効化
  4. GFMを利用する

それぞれまとめていく.

1. やったこと

1.1 whitespace導入

whitespace-modeを使って、ファイルの保存時に行末のスペースや末尾の改行を削除する

上記を参考に,whitespace-modeを導入.
(setq-default show-trailing-whitespace t)と設定がかぶっていたので削除した.

1.2 タブをスペースに変換

(setq-default indent-tabs-mode nil)を使っていたのだけど,タブがスペースに置換されない.
そもそもどのタイミングで置換されていたのか?

16. .emacs ファイル

上記サイトによれば,自動インデントをした際のインデントがスペースになる,ということらしい.
普段入力するタブをスペースに置換するにはどうすればよいかと考えたけれど,単純にキーバインドに割り当てればよいだけだということに気づく.
init.el内でのタブ周りの設定は以下.

1
2
3
4
5
;; タブ幅
(custom-set-variables '(tab-width 4))

;; インデント整形時,タブの代わりにスペースを用いる
(setq-default indent-tabs-mode nil)

これとは別に,キーバインドとして以下を設定したらうまくいった.

1
2
3
4
5
6
7
(global-set-key "\C-i" '(lambda ()
                          (interactive)
                          (let ((width tab-width)
                                (str   ""))
                            (dotimes (i width)
                              (setq str (concat str " ")))
                            (insert str))))

タブをC-iで入力できるように,C-i\tで置き換えていた.
タブ文字の挿入を割り当てているのだから,設定が反映されないのは当たり前だった.
スペース4つ分で代わりに置き換えようと思ったが,タブ幅の設定を反映できた方が良いと思ったのでこうなった.
ちょっとやり方が苦しい.もっと上手い方法があるかもしれない.

1.3 Markdownにおける行頭タブの自動整形の無効化

タブ入力した後に字句入力して改行するとタブが削除されてしまうのでなんとかしかった.
これはつまり,直前にインデントがない場合,Emacs が余分なインデントだと判断して自動整形してしまっているのだと思われる.

emacs 24.4のmarkdown-modeでリストのインデントが行頭に揃えられてしまう(解決)

Emacs 24.4 のインデントを無効化

コーディングの際には自動インデントは欲しいので,Markdownの編集時のみ自動インデントを無効化したい.
Emacsはモードが設定されると,対応するモードフック変数に登録されている関数を呼び出す.
各モードのカスタマイズのためには,このモードフック変数を編集する.
今回は,以下のように設定を追記して自動インデントを無効化した.

1
2
3
4
5
6
7
8
;; markdown
(autoload 'markdown-mode "markdown-mode.el" "Major mode for editing Markdown files" t)
(setq auto-mode-alist (cons '("\\.md" . gfm-mode) auto-mode-alist))

(add-hook 'gfm-mode-hook
          '(lambda ()
             (setq global-linum-mode nil)
             (electric-indent-local-mode -1)))

global-linum-modeは画面外にはみ出した文章の改行指定.
コーディングでは全体の形が崩れるので無効にしておくが,Markdownは文章なので改行したほうが読みやすい.

1.4 GFMモードを利用する

行末のスペースも削除されてしまうので,どうしようと思っていたが,GFMモードというものを利用すれば良いらしい.
具体的な使い方は前項に示した.gfm-mode は markdown-mode.el 内に定義されているようだ.
GFMモードを快適に利用したいので,さらに以下を設定していく.

  1. OctopressでGFMが使用できるように設定する
  2. GFMのプレビューができるようにする

1.4.1 OctopressでGFMが使用できるように設定する

  1. Gemfilegem 'redcarpet', '~> 3.1を追記(他のgemがこのバージョンに依存していたため,参考サイトと違うバージョンを指定)
  2. なかったので,gem 'albino', '~> 1.3.3'も追加
  3. bundle install
  4. pluginsディレクトリに,redcarpet2_markdown.rbを追加(source)
  5. _config.ymlmarkdown: rdiscountを下記のように書き換え
1
2
3
markdown: redcarpet
redcarpet:
  extensions: ["hard_wrap"]

redcarpet2を指定するとエラーとなった.(参考)

Octopress で GitHub Flavored Markdown (GFM) を使う

1.4.2 emacs上からGFMのプレビューができるようにする

Grip は Markdown を GitHub Flavor に変換してプレビューできる.

  1. Gripをインストール
1
$ sudo pip install grip

GitHub Flavored Markdown に対応した Grip というツールが便利だったので備忘録
Grip - GitHub風にMarkdownをHTMLプレビュー

  1. binファイルを作成し,パスの通ったディレクトリにおく
1
2
3
4
5
6
7
$ which grip
$ emacs /usr/local/bin/markdown

#!/bin/sh
filename=$1
/usr/local/bin/grip --export --gfm ${filename} > /dev/null
cat ${filename%.*}.html

GFMモードでプレビューするためには,--gfmオプションを追加する.
markdownファイルについて.既にパス内に存在している場合がある(通常のプレビュー時に用いていたのかも)
なので,which markdownで存在するかどうか調べて,存在したならバックアップをとって新たに置き換えると良い.
また,権限を755に設定しておくこと.

  1. 設定の追加
1
2
3
4
5
6
7
8
9
10
11
12
13
;; markdown mode
(autoload 'markdown-mode "markdown-mode"
   "Major mode for editing Markdown files" t)
   (add-to-list 'auto-mode-alist '("\\.text\\'" . gfm-mode))
   (add-to-list 'auto-mode-alist '("\\.markdown\\'" . gfm-mode))
   (add-to-list 'auto-mode-alist '("\\.md\\'" . gfm-mode))

;; ファイルパスを渡す
(defun markdown-custom ()
  "markdown-mode-hook"
    (setq markdown-command-needs-filename t)
      )
      (add-hook 'markdown-mode-hook '(lambda() (markdown-custom)))
  1. C-c C-c pC-c C- vで実行

トラブルシューティング

これでok…と思ったら,文字化けする上にちっともGitHub Flavor でない.

試しに,Markdownファイルに対して直接gripを叩く.

1
$ grip test.md

するとエラーがでて,プレビューできない.

1
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa4 in position 2: invalid start byte

文字コード関連かと思い,対象ファイルの文字コードをnkfで調べる.

1
2
$ nkf --guess test.md
EUC-JP (LF)

UTF-8に変換.

1
$ nkf -u --overwrite test.md

再び実行.

1
2
3
$ nkf --guess test.md
UTF-8 (LF)
$ grip test.md

うまくいった.
ただ,エラーが表示されてしまう.

1
/usr/local/lib/python2.7/site-packages/requests/packages/urllib3/connectionpool.py:769: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.org/en/latest/security.html InsecureRequestWarning)

証明書関連のエラーだと思われる.
詳しくは後日調べることにして,プレビューもできたのでとりあえずコレでOK.
ただ,#で指定する見出しがなぜか変換されない.これもとりあえず後日調べることにする.

Emacsのmarkdown-modeを使ってみる

2. 今後やりたいことのメモ

とりあえず,MarkdownをEmacsから手軽に書いて,ブログを更新するという目標は達成できた.

Comments