Vine Linuxでlittlerをインストールする

追記(2016.2.21)

Vine Linux 6 およびVineSeedに R-littler パッケージをアップロードしました。

したがって以下の記事は過去の記録程度の意味となりました。

経緯

Rのコマンドラインのインタフェースとして littler を使用する場合があります。

Vine Linuxでもlittlerパッケージを作成して使用できるようにしていますが、バージョンが0.1.5と古いです(バージョンを上げるとビルド時にエラーが出てしまったため放置していました)。

最近、何かを調べていて(忘れてしまいました)、 CRANにlittlerパッケージが登録されているのを知りました。早速インストールしたのでその時のメモです。

littlerのインストール

Vine Linuxの場合にはまずlibicu-develをインストールします。

sudo apt-get install libicu-devel

これのパッケージがないとlittlerのインストール時にエラーが出ます。

次にスーパーユーザーでRを起動し、

install.packages("littler")

でlittlerをインストールします。

64-bit環境では /usr/lib64/R/library/littler/bin 以下に r がインストールされるため、 /usr/local/bin 以下にシンボリックリンクを貼ります。

sudo ln -s /usr/lib64/R/library/littler/bin/r /usr/local/bin

これで r を使用できるようになります。

$ r --version
r ('littler') version 0.3.0

using GNU R Version 3.2.3 (2015-12-10)

Copyright (C) 2006 - 2015  Jeffrey Horner and Dirk Eddelbuettel

r is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under the terms of the
GNU General Public License.  For more information about
these matters, see http://www.gnu.org/copyleft/gpl.html.

プログラムの1行目は

#!/usr/bin/env r

としておくといいでしょう。

Emacsのパッケージ管理のレポジトリにMELPA-stableを追加する

経緯

Emacs-24.5を使用しており、パッケージ管理のレポジトリとして ELPA(gnu)の他に MELPAとMarmalade、orgを追加しています。

しかし、 MELPAに登録されているパッケージの中には亢進頻度が高いものもあり、時々アップグレードによって不具合が生じる場合もあります。

そのため、 MELPAに登録されているパッケージでも安定版で使用したい場合がありました。

そのような時に検索していると このページ にMELPA-stableのことが載っていました。

そこでMELPA-stableを導入したのでその時のメモを残しておきます。ただし、日本語の情報があまりなかったため少し大変でした。

MELPA-stableの導入

レポジトリの登録

このページ の内容に従って.emacs.elに

(add-to-list 'package-archives
             '("melpa-stable" . "https://stable.melpa.org/packages/") t)

を追加します。 Emacs-24以降を使用する場合にはそれ以外の設定は不要です。

パッケージの移行

M-x package-list-packages

を実行し、下の方にある installed となっているパッケージを選択します。 (バージョン番号)(melpa-stable) という箇所を選択すると インストール画面に移行します。

この時、既にMELPAからインストールされているパッケージのフォルダは削除せずに別な場所に保存しておいた方がいいかもしれません。

また、場合によっては MELPA-stableではなくMarmaladeからインストールすることもあるため、どちらからインストールしたのかをメモしておいた方がいいです。

始めはメモしておかなかったため、後でもう一度調べ直すことになりました。結構大変でした。

package-pinned-packages変数の設定

この状態でパッケージのアップグレードを行うと、 MELPAのパッケージが候補に上がってきました。

これでは安定版をインストールした意味がないので、 MELPA-stable版の場合にはMELPA版をインストールしないようにするための設定を調べたところ、 このページ が見つかりました。

package-pinned-packages という変数に パッケージ名とレポジトリを登録すればいいようです。

少し長いですが、現時点での私の設定を載せておきます。

(setq package-pinned-packages
      '(
        (ac-R                  . "marmalade")
        (ace-isearch           . "melpa-stable")
        (ace-jump-buffer       . "melpa-stable")
        (ace-jump-mode         . "melpa-stable")
        (ace-link              . "melpa-stable")
        (ace-pinyin            . "melpa-stable")
        (ace-window            . "melpa-stable")
        (ag                    . "melpa-stable")
        (alert                 . "melpa-stable")
        (async                 . "melpa-stable")
        (auto-complete         . "melpa-stable")
        (avy                   . "melpa-stable")
        (bind-key              . "melpa-stable")
        (bm                    . "marmalade")
        (button-lock           . "melpa-stable")
        (calfw                 . "melpa-stable")
        (color-theme           . "marmalade")
        (ctable                . "melpa-stable")
        (dash                  . "melpa-stable")
        (deferred              . "melpa-stable")
        (descbinds-anything    . "marmalade")
        (diffview              . "melpa-stable")
        (diminish              . "melpa-stable")
        (dired-details         . "marmalade")
        (el-mock               . "melpa-stable")
        (el-x                  . "melpa-stable")
        (elscreen              . "melpa-stable")
        (elscreen-mew          . "melpa-stable")
        (epl                   . "melpa-stable")
        (ess                   . "melpa-stable")
        (ess-R-data-view       . "melpa-stable")
        (ess-R-object-popup    . "melpa-stable")
        (ess-smart-underscore  . "melpa-stable")
        (f                     . "melpa-stable")
        (flycheck              . "melpa-stable")
        (flyspell-lazy         . "melpa-stable")
        (fuzzy                 . "melpa-stable")
        (git-commit            . "melpa-stable")
        (gntp                  . "melpa-stable")
        (guide-key             . "melpa-stable")
        (helm                  . "melpa-stable")
        (helm-ag               . "melpa-stable")
        (helm-core             . "melpa-stable")
        (helm-swoop            . "melpa-stable")
        (highlight-defined     . "melpa-stable")
        (ht                    . "melpa-stable")
        (htmlize               . "marmalade")
        (hydra                 . "melpa-stable")
        (ibuffer-vc            . "melpa-stable")
        (ido-completing-read+  . "melpa-stable")
        (ido-vertical-mode     . "melpa-stable")
        (imenus                . "melpa-stable")
        (julia-mode            . "melpa-stable")
        (kill-or-bury-alive    . "melpa-stable")
        (letcheck              . "melpa-stable")
        (log4e                 . "melpa-stable")
        (m-buffer              . "melpa-stable")
        (magit                 . "melpa-stable")
        (magit-popup           . "melpa-stable")
        (metaweblog            . "melpa-stable")
        (mew                   . "melpa-stable")
        (migemo                . "melpa-stable")
        (morlock               . "melpa-stable")
        (mykie                 . "melpa-stable")
        (noflet                . "marmalade")
        (oauth                 . "marmalade")
        (org                   . "org")
        (org-gcal              . "melpa-stable")
        (org2blog              . "melpa-stable")
        (ox-pandoc             . "melpa-stable")
        (pandoc-mode           . "melpa-stable")
        (paredit               . "melpa-stable")
        (parsebib              . "melpa-stable")
        (passthword            . "melpa-stable")
        (pcre2el               . "marmalade")
        (pcsv                  . "melpa-stable")
        (php-mode              . "melpa-stable")
        (pkg-info              . "melpa-stable")
        (popup                 . "melpa-stable")
        (popwin                . "melpa-stable")
        (rainbow-delimiters    . "melpa-stable")
        (request               . "melpa-stable")
        (request-deferred      . "melpa-stable")
        (revive                . "marmalade")
        (s                     . "melpa-stable")
        (sexp-move             . "melpa-stable")
        (smartrep              . "melpa-stable")
        (smex                  . "melpa-stable")
        (stan-mode             . "melpa-stable")
        (stripe-buffer         . "melpa-stable")
        (unkillable-scratch    . "melpa-stable")
        (use-package           . "melpa-stable")
        (vline                 . "marmalade")
        (with-editor           . "melpa-stable")
        (ml-rpc                . "melpa-stable")
        (xml-rpc               . "marmalade")
        ))

これでMELPAではなく、MELPA-stableやMarmaladeを参照するようになりました。

Vine Linux 6.3でgitを私的rpmパッケージ化

経緯

Emacs-24.5でMELPAからmagitをインストールして使用しています。

しかし、いつの頃からか.gitフォルダが存在していても認識されなくなりした。

調べてみるとログには以下のように書かれていました。

Also note that starting with the ‘2.1.0’ release, Magit requires at least Emacs ‘24.4’ and Git ‘1.9.4’. You should make sure you have at least these releases installed before updating Magit. And if you connect to remote hosts using Tramp, then you should also make sure to install a recent enough Git version on these hosts.

そこで Vine Linux 6.3のgitのバージョンを調べてみると

$ rpm -qa | grep git
git-1.7.4.2-1vl6.x86_64

とやはり対応していませんでした。

gitのビルド

ソースコードからのビルド

そこでソースコードからビルドしました。今回インストールしたgitのバージョンは2.5.3です。

ソースコードは GitHub からダウンロードしました。

tar xzf git-2.5.3.tar.gz
cd git-2.5.3
make prefix=/usr/local all
sudo make prefix=/usr/local install

で/usr/local以下にインストールされます。

この状態でmagitをアップグレードすると動作するようになりました。

私的パッケージ化

せっかくなのでrpmパッケージ化しました。本来のパッケージと名前を区別するために my_git としています。

からダウンロードできます。

/usr/local以下にインストールされるため、本来のパッケージに含まれるファイルを上書きすることはありません。

org-modeで(require ‘ob-R)とするとエラーが出ていたのを解決(訂正)

経緯

Emacsのパッケージ管理をpackageで行っています。 2015.8.3より後のバージョンのorgをインストールした場合に、 org-bableでR-modeを使用するために

(require 'ob-R)

とすると

Debugger entered--Lisp error: (invalid-function org-babel-header-args-safe-fn)

のようにエラーが出ていました。

試行錯誤の結果、解決できたのでメモを残しておきます。

追記(2015.9.29)

以下の「方法」の内容は間違いの可能性があるため訂正します。従来のELPA(gnu)レポジトリでインストールできました。

org-modeのメーリングリストを見ていると同じエラーの投稿がありました( 質問 とそれに対する 回答 )。

回答には

When this error has been reported in the past, it has been due to
another version of Org being loaded during the update.  Please uninstall
and then reinstall before any version of Org is loaded.

と書かれていました。

つまり、

  1. 一度(新しいバージョンの)Orgをアンインストールする。
  2. Emacsを起動して古いバージョンのOrgがロードされる前に(新しいバージョンの)Orgをインストールする。

必要があるようです。

何回もインストールとアンインストールを繰り返して試行錯誤した結果、

  1. (念のため)Emacsをシャットダウンする。
  2. emacs -Q でまっさらな環境のEmacsを起動する(ここが重要)。
  3. M-x list-packages からorg(gnu版のみ表示される)をインストールする。
  4. Emacsを起動する。

でエラーが起こらなくなりました。

同じ症状で困っている方がいれば試してみて下さい。

方法(以下の内容は必要ありません)

このページ の内容を参考にしました。

.emacs.elに

;; (require 'package)   ;; 設定済のためコメントアウト
(add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/") t)

を追加し、

M-x list-packages

とすると、

org                20150914      available  gnu        Outline-based notes management and organizer
org                20150914      available  org        Outline-based notes management and organizer

のようにorg版のorgも表示されるようになるので、こちらをインストールします。

これで

(require 'ob-R)

としてもエラーが出なくなりました。

補足

このページ によると、開発版ではstan-modeに対応しているようです(2015.9.20閲覧)。 2015.9.3のgitのログ に載っていました。

近いうちに取り込まれて使用できるようになるでしょう。楽しみです。

Vine Linuxでタイル型ウィンドウマネージャ(ratpoisonとawesome)を私的パッケージ化

経緯

Vine Linuxにはタイル型ウィンドウマネージャのパッケージが存在していません。

そこで全くの個人的な興味から、タイル型ウィンドウマネージャとして ratpoison (version 1.4.8)と awesome (version 3.5.6)をパッケージ化したのでrpmファイルをアップロードします。

ただし個人的には fluxbox (version 1.3.5)をカスタマイズして愛用しています。

インストール

ダウンロード先

このページ から適切なrpmファイルをダウンロードしてインストールして下さい。

  • Vine Linux6ならVine6
  • VineSeed(次期Vine Linux7)ならVine7

のページに進み、さらに

  • 32ビット環境であればi686
  • 64ビット環境であればx86_64

のページに進みます。

ratpoison

Vine Linux6とVineSeed(Vine Linux7)用のパッケージを用意しました。

  • ratpoison-1.4.8-***.rpm

をダウンロードしてインストールします。

awesome

VineSeed(Vine Linux7)用のパッケージだけを用意しました。 Vine Linux6では依存パッケージのバージョンが古いためビルドできませんでした。

  • lgi-0.9.0-1vl7.***.rpm
  • awesome-3.5.6-1vl7.***.rpm

の2つのパッケージをダウンロードします。先にlgi(awesomeの依存パッケージ)をインストールしてから awesomeをインストールします。

注意事項

使用方法

ここでは操作方法については書きませんが、他のページで十分調べてから使用するようにして下さい。特に「ログアウト」の方法を知らずにログインしてしまうと大変です(経験済みです)。

責任回避のようなもの

今回はあくまでも私的にパッケージ化したものであり、 Vine Linuxのオフィシャルなものではありません。ですのでパッケージの説明文は非常にいいかげんなものです。また、ライセンスの記載も正しくないものも含まれています。

また、使用した事によって生じた不具合などについては責任を取ることはできません。

uim-skkを導入するための設定

経緯

Emacs上で日本語を入力するためのシステムとして SKKを使用しています。

今回Emacs以外のアプリケーションでもSKKを使用するように設定したため、その際の設定をメモしておきます。

現在のVine Linux 6はuimのバージョンが1.6.1のため sticky-shiftが実現できないため、最新版(1.8.2)をインストールしました。

uimのインスール

uimの再ビルド

VineSeedからuim-1.8.6-2vl7.src.rpmをダウンロードし、 vbuilderでRPMパッケージを作成します。 vbuilderはあらかじめインストールしておきます。

sudo apt-get install vbootstrap
wget http://ftp.vinelinux.org/pub/Vine/apt/VineSeed/SRPMS.plus/uim-1.8.6-2vl7.src.rpm
sudo vbuilder --unionfs clean build build-rpm uim-1.8.6-2vl7.src.rpm

~/rpm/vbuilder/6/RPMS/以下のフォルダ(32bitと64bitで異なる)に rpmパッケージが作成されるため、必要なパッケージをインストールします。

自分でソースコードをダウンロードしてビルドしてもいいのですが、依存パッケージを自分の環境にインストールしなければならないことを考えると、 vbuilderを使用してビルドした方が良いと思います。

作成されたパッケージ

uim-1.8.6-2vl6.x86_64.rpm
uim-anthy-1.8.6-2vl6.x86_64.rpm
uim-devel-1.8.6-2vl6.x86_64.rpm
uim-el-1.8.6-2vl6.x86_64.rpm
uim-fep-1.8.6-2vl6.x86_64.rpm
uim-gtk-1.8.6-2vl6.x86_64.rpm
uim-gtk3-1.8.6-2vl6.x86_64.rpm
uim-kde-applet-1.8.6-2vl6.x86_64.rpm
uim-m17n-1.8.6-2vl6.x86_64.rpm
uim-mana-1.8.6-2vl6.x86_64.rpm
uim-qt-1.8.6-2vl6.x86_64.rpm
uim-qt4-1.8.6-2vl6.x86_64.rpm
uim-skk-1.8.6-2vl6.x86_64.rpm
uim-xim-1.8.6-2vl6.x86_64.rpm

作成されたパッケージのインストール

今回は

uim-1.8.6-2vl6.x86_64.rpm
uim-xim-1.8.6-2vl6.x86_64.rpm
uim-skk-1.8.6-2vl6.x86_64.rpm
uim-gtk-1.8.6-2vl6.x86_64.rpm  # uimの設定を行なうために必要
uim-gtk3-1.8.6-2vl6.x86_64.rpm # 同上(gtk3版)
uim-fep-1.8.6-2vl6.x86_64.rpm  # ターミナルなどで日本語入力するために必要

をapt-get installコマンドでインストールしました(必要に応じて依存パッケージが同時にインストールされます)。

uimの設定

uimの設定画面

uim-pref-gtk &

あるいは

uim-pref-gtk3 &

で設定画面を開き、各種設定を行います。

個人的な設定(主なもののみ)

  • 全体設定
    • 標準の入力方式:「直接入力」
    • 入力方式の一時切り換えキー:「”zenkaku-hankaku”」
  • SKK
    • 標準の入力モード:「ひらがな」
  • SKK辞書
    • 「辞書ファイルの代わりに辞書サーバを使用」:オン
      • (自分でパッケージ化しているので使用しないと)
    • 「個人辞書ファイル」:適度な場所を指定
  • SKKキー設定1
    • 「sticky」(sticky-shift):”Henkan_Mode”

uimをデフォルトの漢字変換システムにするための設定

GNOMEでは「システムメニュー」から、「設定」→「ユーザ向け」→「漢字変換システムの選択」を実行し、「uim」を選択します。ログアウトして再ログインすると使用できるようになります。

fluxboxでの設定方法は分かりませんでした。コマンドが分かれば可能なのですが。

【追記】 vutils-guiパッケージに含まれるコマンドを使用して

gsetime &

で設定画面が出ることが分かりました。

uimを自動起動するための設定

GNOMEの場合

自動起動するアプリケーションに

uim-toolbar-gtk-systray

あるいは

uim-toolbar-gtk3-systray

を追加します。

fluxboxの場合

~/.fluxbox/startup

uim-toolbar-gtk-systray &
uim-toolbar-gtk &

あるいは

uim-toolbar-gtk3-systray &
uim-toolbar-gtk3 &

を追加します。

z + spaceで全角スペースを入力するための設定

今回は http://makenowjust.hatenablog.com/entry/2014/08/10/233424 の内容を参考にしました。

以下の内容で ~/.uim を作成します。文字コードはEUC-JPです。

(define uim-pref-suppress-dot-uim-warning-dialog? #t)

(require-module "skk")

(define skk-ja-rk-rule
  (append '(
            ((("z" " ") . ()) (" " " " " "))
            )
          skk-ja-rk-rule))

Firefoxで入力ができない場合の設定

~/.bash_profile

export GTK_IM_MODULE=uim firefox

を追加します。

他の候補:fcitx-skk

現時点でのVineSeedではfcitxがインストールされているため fcitx-skkを自分でビルドして試しました。

しかし、

  • 漢字変換後に確定する場合にテンキーを使用しなければならない
  • sticky-shiftが使用できない

という欠点があったため uim-skkの方が良いと感じました。

Emacsでddskkパッケージを使用し、さらにcdb形式の辞書ファイルを自作するための設定

経緯

Emacsで日本語入力をする際にSKKを使用しています。最近、 package.elで導入するSKK でddskkがMELPAに登録されたことを知ったため、インストールしてみました。

従来の方法よりも楽になりました。

  • 辞書ファイルの統合
  • 辞書サーバの設定

も行なったので、その時の内容をメモ的に残しておきます。

ddskkパッケージ

dskkパッケージのインストール

MELPAを使用する方法は省略します。

M-x package-refresh-contents
M-x package-install ddskk

でインストールします。同時にcccとcdbの2つのパッケージもインストールされます。

init.elの設定

(require 'skk)

(global-set-key (kbd "C-x C-j") 'skk-mode)
;; (global-set-key "\C-xj" 'skk-auto-fill-mode) ;; 改行を自動入力する場合
;; (global-set-key "\C-xt" 'skk-tutorial)       ;; チュートリアル
(setq default-input-method "japanese-skk")

(setq skk-user-directory "~/Dropbox/emacs/SKK") ;; 設定ファイル、個人辞書ファイルの置き場
(setq skk-init-file "~/Dropbox/emacs/SKK/init") ;; 設定ファイルの指定

を追加します。

initの設定

使用する辞書ファイルをいくつか統合してさらにcdb化し、 SKK-JISYO.my.cdb というファイル名にしています。そこまで必要なければ SKK-JISYO.L でいいと思います。

;; -*-mode: emacs-lisp; -*-

;;; 使用する辞書の設定
;; large辞書
(setq skk-cdb-large-jisyo "/usr/local/share/skk/SKK-JISYO.my.cdb")
;; 個人辞書
(setq skk-jisyo "~/Dropbox/emacs/SKK/skk-jisyo")
(setq skk-backup-jisyo "~/Dropbox/emacs/SKK/skk-jisyo.bak")

;; From DDSKK 14.2:
;;   メイン辞書(L 辞書、CDB 形式辞書、辞書サーバ)以外の辞書を指定する
(setq skk-extra-jisyo-file-list
      (list
       '("/usr/local/share/skk/SKK-JISYO.JIS3_4" . euc-jisx0213)
       ))

;; 変換記録を保存するファイル名
(setq skk-record-file "~/Dropbox/emacs/SKK/record")

;;; 外見の変更
;; モードラインに色をつける設定
(setq skk-use-color-cursor t)
(setq skk-indicator-use-cursor-color t)

;; 変換候補のハイライトの設定
(setq skk-henkan-face (skk-make-face 'gray80/gray25)) ;; お好みで

これで使用できるようになったため、今までのddskkをアンインストールしました(make uninstallは用意されていないため自力で削除)。

辞書ファイルの用意

辞書ファイルの統合

統合したい辞書ファイルを用意して同じフォルダに入れ、

skkdic-expr2 \
    SKK-JISYO.JIS2 + \
    SKK-JISYO.L + \
    SKK-JISYO.assoc + \
    SKK-JISYO.edict + \
    SKK-JISYO.geo + \
    SKK-JISYO.itaiji + \
    SKK-JISYO.jinmei + \
    SKK-JISYO.law + \
    SKK-JISYO.office.zipcode + \
    SKK-JISYO.propernoun + \
    SKK-JISYO.station + \
    SKK-JISYO.zipcode | skkdic-sort > SKK-JISYO.my

のようなスクリプトを実行すると SKK-JISYO.my が生成されるため、 /usr/local/share/skk にコピーします(今回のようにcdb形式の辞書ファイルを使用する場合には不要)。

skkdic-expr2

私が使用しているVine Linuxでは skktoolsをインストールしても skkdic-expr2 コマンドが導入されなかったため少しだけ大変でした。

結果だけ書くと、メーリングリストで許可を得た上でパッケージを更新することで対処しました。

SPECファイルに

BuildRequires: glib2-devel

の行を追加することで skkdic-expr2 がビルドされるようになりました。

cdb形式の辞書の作成

このためにはパッケージを自分でインストールする必要があります。

tinycdb

tinycdb は辞書サーバであるdbskkd-cdbをビルドするために必要なプログラムです。 cdb形式の辞書を作成するためには、この中に含まれる cdb が必要です。

wget http://www.corpit.ru/mjt/tinycdb/tinycdb-0.78.tar.gz
tar xzf tinycdb-0.78.tar.gz
cd tinycdb-0.78
make
sudo make install

dbskkd-cdb

dbskkd-cdb は辞書サーバの1つです。

この中に含まれるスクリプトを改変して使用します。

  • skktocdbm.sh
    #!/bin/sh
    # Converting SKK Dictionary to cdbmake-acceptable form
    # Originally by D. J. Bernstein's 12tocdbm.sh
    # modified by Kenji Rikitake
    # bugfix of truncated strings by Hideto Kihara
    # bugfix of locale by Tatsuya Kinoshita
    LC_ALL=C awk '
      /^[^;]/ {
        s = substr($0, index($0, " ") + 1)
        print "+" length($1) "," length(s) ":" $1 "->" s
      }
      END {
        print ""
      }
    '
    
  • makeskkcdb.sh
    #!/bin/sh
    ./skktocdbm.sh < /usr/local/share/skk/SKK-JISYO.L | \
      cdb -c -t - SKK-JISYO.L.cdb
    
  • skktocdb

    上の2つのスクリプトを組み合せて作成したのが以下のスクリプトです。

    #!/bin/sh
    
    LC_ALL=C awk '
      /^[^;]/ {
        s = substr($0, index($0, " ") + 1)
        print "+" length($1) "," length(s) ":" $1 "->" s
      }
      END {
        print ""
      }
    ' $1 | cdb -c -t - $1.cdb
    

    実行権限をつけて/usr/local/binにコピーしました。

    skktocdb SKK-JISYO.my
    

    のように使用すると同じフォルダに SKK-JISYO.my.cdb が作成されます。

    このファイルを/usr/local/share/skkにコピーします。これで自作の辞書ファイルを使用できるようになります。

辞書サーバを使用する場合

この場合には、initファイルの

(setq skk-cdb-large-jisyo "/usr/local/share/skk/SKK-JISYO.my.cdb")

の記述は必要ありません。

先日、Vine Linuxの dbskkd-cdb パッケージを更新しました。

EAGLE 雑記 の内容を参考にして任意の辞書ファイルを指定することができるように改変しました。

/etc/xinetd.d/dbskkd-cdbの例

# default: on
# description: dbskkd-cdb is a skkserv implementation, \
#              a Japanese dictionary server for the Simple Kana to \
#              Kanji conversion program.
service skkserv
{
    port = 1178
    socket_type = stream
    wait = no
    only_from = 127.0.0.1
    user = nobody
    server = /usr/sbin/dbskkd-cdb
    # specify dictionary path
    server_args = /usr/local/share/skk/SKK-JISYO.my.cdb
    log_on_failure += USERID
    disable = no
}

変更後は

sudo /etc/init.d/xinetd restart

でxinet.dを再起動すれば辞書サーバでSKKを使用できるようになります。

flycheckの設定(RとRuby)

Emacsで文法チェックをするために flycheckおよび関連パッケージを導入したので、その時のメモです。

flycheckを使用するためのEmacsの設定

パッケージのインストール

  • flycheck
  • flycheck-pos-tip
    • エラー内容をその場にツールチップで表示するためのパッケージ
  • helm-flycheck
    • helmインターフェースからエラーを選択するためのパッケージ

init.elの設定

(require 'flycheck)
(require 'flycheck-pos-tip)

(eval-after-load 'flycheck
  '(custom-set-variables
   '(flycheck-display-errors-function #'flycheck-pos-tip-error-messages)))

(add-hook 'R-mode-hook 'flycheck-mode)
(add-hook 'ruby-mode-hook 'flycheck-mode)


(require 'helm-flycheck) ;; Not necessary if using ELPA package
(eval-after-load 'flycheck
  '(define-key flycheck-mode-map (kbd "C-+") 'helm-flycheck))

ここではRとRubyでflycheckを行うように設定しています。

helm-flycheckで修正候補を選択するためのキーに C-+ を割り当てています。

Rの設定

R-modeでycheckを使用するためには、 Rのlintrパッケージが必要なのでインストールしておきます。

install.package("lintr")

ox-pukiwikiの(私的)設定変更

org-modeの原稿をpukiwiki形式に変換するためのパッケージとして ox-pukiwiki があります。

非常に便利なのですが #+BEGIN_SRC#+END_SRC で囲んだ ソースコードを出力しようとしても #+BEGIN_SRC#+END_SRC そのものが出力されてしまいます。

#+BEGIN_EXAMPLE#+END_EXAMPLE で囲んだ部分は整形済みテキストとして出力されます。

そこでox-pukiwiki.elのソースコードを調べたところ

(org-export-define-backend 'pukiwiki
  '((babel-call . org-pukiwiki-identity)
          中略
    (example-block . org-pukiwiki-example-block)
          中略
    (src-block . org-pukiwiki-identity)
          中略
    (verse-block . org-pukiwiki-identity))
  :menu-entry
  '(?p "Export to Pukiwiki"
       ((?p "As Pukiwiki buffer"
      (lambda (a s v b) (org-pukiwiki-export-as-pukiwiki a s v)))
  (?P "As Pukiwiki file"
      (lambda (a s v b) (org-pukiwiki-export-to-pukiwiki a s v)))
  (?o "As Pukiwiki file and open"
      (lambda (a s v b)
        (if a (org-pukiwiki-export-to-pukiwiki t s v)
    (org-open-file (org-pukiwiki-export-to-pukiwiki nil s v))))))))

のように定義されていました。

したがって、

(src-block . org-pukiwiki-identity)

(src-block . org-pukiwiki-example-block)

に変更したところ、 #+BEGIN_SRC#+END_SRC で囲んだ部分も整形済みテキストとして出力されるようになりました。

以下、設定です。

(require 'ox-pukiwiki)

(org-export-define-backend 'pukiwiki
  '((babel-call . org-pukiwiki-identity)
    (bold . org-pukiwiki-bold)
    (center-block . org-pukiwiki-identity)
    (clock . org-pukiwiki-identity)
    (code . org-pukiwiki-code)
    (comment . org-pukiwiki-comment)
    (comment-block . (lambda (&rest args) ""))
    (diary-sexp . org-pukiwiki-identity)
    (drawer . (lambda (&rest args) ""))
    (dynamic-block . org-pukiwiki-identity)
    (entity . org-pukiwiki-identity)
    (example-block . org-pukiwiki-example-block)
    (fixed-width . org-pukiwiki-identity)
    (footnote-definition . org-pukiwiki-identity)
    (footnote-reference . org-pukiwiki-identity)
    (headline . org-pukiwiki-headline)
    (horizontal-rule . org-pukiwiki-identity)
    (inline-babel-call . org-pukiwiki-identity)
    (inline-src-block . org-pukiwiki-identity)
    (inlinetask . org-pukiwiki-identity)
    (italic . org-pukiwiki-italic)
    (item . org-pukiwiki-item)
    (keyword . org-pukiwiki-keyword)
    (latex-environment . org-pukiwiki-identity)
    (latex-fragment . org-pukiwiki-identity)
    (line-break . org-pukiwiki-identity)
    (link . org-pukiwiki-link)
    (node-property . org-pukiwiki-identity)
    (paragraph . org-pukiwiki-identity)
    (plain-list . org-pukiwiki-plain-list)
    (planning . org-pukiwiki-identity)
    (property-drawer . (lambda (&rest args) ""))
    (quote-block . org-pukiwiki-identity)
    (quote-section . org-pukiwiki-identity)
    (radio-target . org-pukiwiki-identity)
    (section . org-pukiwiki-identity)
    (special-block . org-pukiwiki-identity)
    (src-block . org-pukiwiki-example-block)
    (statistics-cookie . org-pukiwiki-identity)
    (strike-through . org-pukiwiki-strike-through)
    (subscript . org-pukiwiki-identity)
    (superscript . org-pukiwiki-identity)
    (table . org-pukiwiki-table)
    (table-cell . org-pukiwiki-table-cell)
    (table-row . org-pukiwiki-table-row)
    (target . org-pukiwiki-identity)
    (timestamp . org-pukiwiki-identity)
    (underline . org-pukiwiki-underline)
    (verbatim . org-pukiwiki-verbatim)
    (verse-block . org-pukiwiki-identity))
  :menu-entry
  '(?p "Export to Pukiwiki"
       ((?p "As Pukiwiki buffer"
      (lambda (a s v b) (org-pukiwiki-export-as-pukiwiki a s v)))
  (?P "As Pukiwiki file"
      (lambda (a s v b) (org-pukiwiki-export-to-pukiwiki a s v)))
  (?o "As Pukiwiki file and open"
      (lambda (a s v b)
        (if a (org-pukiwiki-export-to-pukiwiki t s v)
    (org-open-file (org-pukiwiki-export-to-pukiwiki nil s v))))))))

f.elに関するメモ

Emacsのモダンなライブラリ4+1選 で紹介されていたf.elパッケージについて、少し勉強したのでその内容をメモ的に残しておきます。

このページの存在は少し前に知っていましたが、 るびきち様 にパッケージと関数を教えて頂いたので自分でも調べてみました。

ファイルに関する関数

f-で始まる関数がf.elパッケージで提供されている関数です。

関数名が短かくて分かりやすくなるとともに ~を自動で展開 (expand-file-name)してくれるものが多いため プログラムが簡潔になりそうです。

また、ファイルの拡張子を変更するf-swap-ext関数は非常に便利かもしれません。

(require 'f)
(setq file "~/.emacs.d/init.el")

;;; ファイル
;; 絶対パス(フルパス)
(expand-file-name file)          ; => "/home/ara/.emacs.d/init.el"
(f-expand file)                  ; => "/home/ara/.emacs.d/init.el"
;; ファイル名(ディレクトリ以外)
(file-name-nondirectory file)    ; => "init.el"
(file-name-nondirectory
 (directory-file-name file))     ; => "init.el"
(f-filename file)                ; => "init.el"
;; ファイルのベースネーム
(f-base file)                    ; => "init"
;; 拡張子
(file-name-extension file)       ; => "el"
(f-ext file)                     ; => "el"
;; 拡張子なしのパス
(file-name-sans-extension file)  ; => "~/.emacs.d/init"
(f-no-ext file)                  ; => "~/.emacs.d/init"

;;; ファイル => ディレクトリ(末尾の/なし)
(directory-file-name
 (file-name-directory file))     ; => "~/.emacs.d"
(f-dirname file)                 ; => "/home/ara/.emacs.d"
;;; ファイル => ディレクトリ(末尾の/あり)
(file-name-directory file)       ; => "~/.emacs.d/"
(f-slash (f-dirname file))       ; => "/home/ara/.emacs.d/"

;; パスの結合(/の有無は自動で処理される)
(f-join "~/.emacs.d" "init.el")  ; => "/home/ara/.emacs.d/init.el"
(f-join "~/.emacs.d/" "init.el") ; => "/home/ara/.emacs.d/init.el"

;; 拡張子の変更
(f-swap-ext file "elc")          ; => "~/.emacs.d/init.elc"

ディレクトリに関する関数

  • 末尾の/を外すのがf-long
    • 内部でf-expandを呼び出しているだけ(f-expandで十分かも)
  • 末尾の/をつけるのがf-full
    • f-longの後にf-slashを適用している
(require 'f)
(setq dir1 "~/.emacs.d")
(setq dir2 "~/.emacs.d/")

;;; 絶対パス(フルパス)
(expand-file-name dir1)          ; => "/home/ara/.emacs.d"
(expand-file-name dir2)          ; => "/home/ara/.emacs.d/"
(f-expand dir1)                  ; => "/home/ara/.emacs.d"
(f-expand dir2)                  ; => "/home/ara/.emacs.d"

;;; ディレクトリ
;; ディレクトリ(末尾の/なし)
(directory-file-name dir1)       ; => "~/.emacs.d"
(directory-file-name dir2)       ; => "~/.emacs.d"
(f-long dir1)                    ; => "/home/ara/.emacs.d"
(f-long dir2)                    ; => "/home/ara/.emacs.d"
;; ディレクトリ(末尾の/あり)
(file-name-as-directory dir1)    ; => "~/.emacs.d/"
(file-name-as-directory dir2)    ; => "~/.emacs.d/"
(f-slash dir1)                   ; => "~/.emacs.d/"
(f-slash dir2)                   ; => "~/.emacs.d/"
(f-full dir1)                    ; => "/home/ara/.emacs.d/"
(f-full dir2)                    ; => "/home/ara/.emacs.d/"

その他の関数

f-readあるいはf-read-textは非常に便利そうです。

with-temp-buffer => insert-file-contents のような作業を内部で行ってくれます。結果がバッファへの挿入ではなく文字列として返ってくるのだけが異なりますが、それでもプログラムが非常に簡潔になりそうです。

;; ファイルを文字列として読み込む(codingは省略可能:デフォルトは'utf-8)
(f-read path coding)
(f-read-text path coding)

;; 文字列をファイルに保存(codingは省略可能:デフォルトは'utf-8)
(f-write text coding path)
(f-write-text text coding path)

;; このファイルのフルパスを得る
(f-this-file)