-->
ラベル emacs の投稿を表示しています。 すべての投稿を表示
ラベル emacs の投稿を表示しています。 すべての投稿を表示

2011-06-06

emacsの文字情報の取得

C-x =
例。(〓にカーソルを合わせた後にコマンドを入力する)
Char: 〓 (12307, #o30023, #x3013, file ...) point=1 of 1 (0%) column=0

詳細に表示。
C-u C-x = 
例。
character: 〓 (12307, #o30023, #x3013)
preferred charset: japanese-jisx0208 (JISX0208.1983/1990 Japanese Kanji: ISO-IR-87)
       code point: 0x222E
           syntax: _    which means: symbol
         category: .:Base, c:Chinese, h:Korean, j:Japanese, |:line breakable
      buffer code: #xE3 #x80 #x93
        file code: #xE3 #x80 #x93 (encoded by coding system utf-8-unix)
          display: terminal code #xE3 #x80 #x93

Character code properties: customize what to show
  name: GETA MARK
  general-category: So (Symbol, Other)

There are text properties here:
  fontified            t

[back]

2010-04-11

emacs の php-mode の設定の例

この例では pear の標準コーディング規約にある設定をベースにします。
http://pear.php.net/manual/ja/standards.indenting.php (空白 4 つのインデントを使用します。タブは使いません。)

(require 'php-mode)
(add-hook
 'php-mode-hook
 (defun php-mode-hook ()
   ;; c-mode のスタイル (コメントアウトした場合 "gnu")
   (c-set-style "bsd")

   ;; 連続する空白の一括削除 (必要なければコメントアウトする)
   (c-toggle-hungry-state t)

   ;; コメント行のインデント (必要なければコメントアウトする)
   (setq c-comment-only-line-offset 0)

   ;; コメントのスタイル (必要なければコメントアウトする)
   (setq comment-start "// "
         comment-end   ""
         comment-start-skip "// *")

   ;; 勝手に改行モード (必要なければコメントアウトする)
   (c-toggle-auto-hungry-state t)
   (setq c-hanging-braces-alist
         '(
           (class-open nil)
           (class-close nil)
           (defun-open before after)
           (defun-close nil)
           (inline-open nil)
           (inline-close nil)
           (brace-list-open nil)
           (brace-list-close nil)
           (block-open nil)
           (block-close nil)
           (substatement-open before after)
           (statement-case-open before after)
           (extern-lang-open nil)
           (extern-lang-close nil)
           ))

   ;; PEAR のスタイル (indent-tabs-mode nil を pear だけに反映させる場合はこちら)
   (setq tab-width 4
         c-basic-offset 4
         c-hanging-comment-ender-p nil
         indent-tabs-mode nil)
   ))
(setq
 auto-mode-alist
 (append
  '(
    ("/\\(PEAR\\|pear\\)/" . php-mode)
    ("\.php$" . php-mode)
    )auto-mode-alist))

c-set-style は慎重に選ぶことを、お勧めします。
M-x c-set-style
Possible completions are:
awk            bsd            ellemtel       gnu            java
k&r            linux          python         stroustrup     whitesmith

例えば、サンプルとなるソース (多次元配列, オブジェクト, クラス, 関数, if, else, for, while, switch, case などが書かれたインデント無しの状態の phpファイル) を用意して C-x h C-M-\ をスタイルごとに実行します。その都度 emacs を再起動した方が良いかもしれません。

2010-02-28

mmm-mode でヒアドキュメントの色付け

この記事は emacs の mmm-mode で phpファイルのヒアドキュメントに色付けする際の例です。

ヒアドキュメントと、phpタグ以外の部分と、コンパイラ停止、を認識しやすくします。
背景色をつけるだけですので、インデントすると EOF; の部分などが破壊されます。
(始めの部分)<?php ... ?>(終わりの部分) は背景色は変わりません。
(require 'mmm-mode)
(setq mmm-global-mode 'maybe)
(setq mmm-submode-decoration-level 1)
(invert-face 'mmm-default-submode-face nil)
(set-face-background 'mmm-default-submode-face "navy")
(setq mmm-font-lock-available-p t)
(mmm-add-mode-ext-class nil "\\.php\\'" 'php-others)
(mmm-add-group
 'php-others
 '(
   (php-heredoc
    :include-front t
    :include-back t
    :front-offset 0
    :back-offset 0
    :front "<<<\\s-*[\"\']?\\([a-zA-Z_][a-zA-Z0-9_]+\\)"
    :back "^\\s-*~1;$"
    :save-matches 1
    :submode fundamental-mode
    :face mmm-code-submode-face
    :delimiter-mode nil
    )
   (php-outside
    :include-front nil
    :include-back nil
    :front-offset 0
    :back-offset 0
    :front "\\(\\?\\|%\\)>"
    :back "<\\(\\?\\|%\\)"
    :save-matches 1
    :submode fundamental-mode
    :face mmm-code-submode-face
    :delimiter-mode nil
    )
   (php-halt-compiler
    :include-front t
    :include-back t
    :front-offset 0
    :back-offset 0
    :front "__halt_compiler\\s-*("
    :back ")\\s-*;"
    :save-matches 1
    :submode fundamental-mode
    :face mmm-code-submode-face
    :delimiter-mode nil
    )
   ))

コメント部分にphpの開始タグ、終了タグがあると失敗します。
phpの開始タグ、終了タグの%,?の種類が違うと失敗します。
背景色が変化した部分をインデントすると失敗します。
xml宣言などのphpの開始タグ、終了タグと同じ文字があると失敗します。
phpの文字列に <?, ?> などがあると失敗します。

mmm-sample.el に perl, bash 用のヒアドキュメントと php-mode 用のサンプルがあります。
(例) /usr/share/emacs/site-lisp/mmm-mode/mmm-sample.el

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/31151
http://d.hatena.ne.jp/Tetsujin/20070808/1186582582
http://d.hatena.ne.jp/jimo1001/20071111/1194770814
http://www.bookshelf.jp/pukiwiki/pukiwiki.php?refer=MeadowMemo&cmd=read&page=MeadowMemo%2F%CA%A3%BF%F4%A4%CE%A5%E1%A5%B8%A5%E3%A1%BC%A5%E2%A1%BC%A5%C9%A4%F2%B6%A6%C2%B8%A1%BDmmm-mode
http://www.emacswiki.org/emacs/HtmlModeDeluxe

2010-02-25

php-mode.el の差分

この記事は emacs の php-mode.el の色付けに関する設定例です。

pecl, emerge dev-php/* dev-php5/*, php3, php4, php5.0-5.3, php6, manual の定数、関数を色が付くように、できるだけ反映させました。
足りない、もしくは、余分な値があります。

php の pear などの define(xxx, ...), function xxx(...){...} はありません。
php-search-documentation の部分に余分な修正が入るので手動で戻してください。
$ cp -pi php-mode.el php-mode.el.aaaaaaaaaaa
$ md5sum php-mode.el.aaaaaaaaaaa
d9a1e06bb579950c58fd3c1d8e813ce6  php-mode.el.aaaaaaaaaaa
$ grep -i "defconst.*php-mode-version-number" php-mode.el.aaaaaaaaaaa
(defconst php-mode-version-number "1.5.0"
$ md5sum -c heavy.php-mode.el.2010-02-25.patch.gz.md5sum
heavy.php-mode.el.2010-02-25.patch.gz: OK
$ gunzip heavy.php-mode.el.2010-02-25.patch.gz
$ patch php-mode.el heavy.php-mode.el.2010-02-25.patch
$ md5sum php-mode.el
07e14e3d5e9d1f161c37dac7c03d3efc  php-mode.el
$ emacs -batch -f batch-byte-compile php-mode.el

heavy.php-mode.el.2010-02-25.patch.gz
heavy.php-mode.el.2010-02-25.patch.gz.md5sum

2010-02-23

php-mode の php-search-documentation

この記事は emacs の php-mode.el の設定例です。

w3m-mode で function.xxx.html にアクセスできるように修正します。
$ diff -u php-mode.el.orig php-mode.el.w3m
--- php-mode.el.orig    2008-11-05 01:29:19.000000000 +0900
+++ php-mode.el.w3m     2010-02-23 14:51:26.000000000 +0900
@@ -544,7 +544,15 @@
 (defun php-search-documentation ()
   "Search PHP documentation for the word at point."
   (interactive)
-  (browse-url (concat php-search-url (current-word t))))
+  (w3m-browse-url (concat php-search-url "function."
+                          (my-str-replace "_" "-" (downcase (current-word t)))
+                          ".html")))
+(defun my-str-replace (search replace subject)
+  (let ((xxx -1))
+    (while xxx
+      (setq xxx (string-match search subject (+ 1 xxx)))
+      (if xxx (setq subject (replace-match replace nil nil subject)))))
+  subject)

 ;; Define function for browsing manual
 (defun php-browse-manual ()

string-match, replace-match でセットで扱うので replace-match に変数が足りないように見えますが動作します。
phpで書くと下記のようなイメージになります。
この例の場合 elisp の方は search に指定する文字が2バイト以上でも変換できますが php の方はできません。
<?php
function my_str_replace($search, $replace, $subject)
{
    $xxx = -1; // phpの場合は、すでに関数内でローカル変数です。
    while ($xxx !== false)
    {
        $xxx = strpos($subject, $search);
        if ($xxx !== false)
        {
            $subject[$xxx] = $replace; // 推薦されない文字列のアクセス方法です。
        }
    }
    return $subject;
}
print my_str_replace("_", "-", "_1_2_3_4_5_6_7_8_9_0_") . "\n";
print my_str_replace("_", "-", "") . "\n";
print my_str_replace("_", "-", "__") . "\n";
print my_str_replace("_", "-", "--") . "\n";
print my_str_replace("_", "-", "str_replace") . "\n";
print my_str_replace("_", "-", "htmlspecialchars") . "\n";
?>

2010-02-16

meadowからemacsへ

この記事は emacs の設定の例です。

emacs23.1 が linux の方に入っているので ntemacs23.1 へ変更しました。
http://d.hatena.ne.jp/galaxy9est/20091206/1260073096でバイナリ配布されていたのをそのまま使いました。
使う機能が大体動いたので、移行できそうなので設定を続けました。

しかし shell-mode が使えないです。
bash のビルドインコマンド (cd, test など) が動作しません。
cd sjisの文字列; test -e sjisの文字列; cat utf8の文字列; ls utf8 の文字列 がそれぞれ成功します。

.emacs に setenv を足すと cd が成功しました。
cygwin では無いコマンドは sjis を返す場合があるので command 2>&1 | nkf などが必要な場合があります。
nkfのインストールは、http://blog.goo.ne.jp/rm_-rf/e/63aa37f245f401d1404b107355d27a52のページを参考にしました。

;; ~/.bashrcで文字コード指定。
;; ...
;; LC_ALL=ja_JP.UTF-8
;; LANG="${LC_ALL}"
;; ...
;; ja_JP.UTF-8 はフックの中で指定すると2回目以降のshell-modeの起動で反映されます。
(setenv "LANG" "ja_JP.UTF-8")
(setenv "LC_ALL" "ja_JP.UTF-8")
(setq explicit-shell-file-name "bash.exe")
(setq shell-file-name "sh.exe")
(setq shell-command-switch "-c")
(set-language-environment "Japanese") ;; ここより上の方にある場合ここはコメントアウトします。
(prefer-coding-system 'iso-2022-jp)
(prefer-coding-system 'euc-jp)
(prefer-coding-system 'shift_jis)
(prefer-coding-system 'utf-8)
(set-default-coding-systems 'utf-8-unix)
(set-keyboard-coding-system 'utf-8-unix)
(set-terminal-coding-system 'utf-8-unix)
(setq file-name-coding-system 'sjis) ;; これが無いとemacs自体が日本語ファイルにアクセスできません。
(set-clipboard-coding-system 'sjis) ;; コピペが文字化けする場合、ここをコメントアウトして下さい。
(set-w32-system-coding-system 'sjis) ;; 時計部分などのシステム関連。
(set-buffer-file-coding-system 'utf-8-unix)

switch でcaseを2個書くとインデントがおかしくなります。
case 1 は大丈夫で case "1", case '1' だとおかしくなります。
http://debbugs.gnu.org/cgi/bugreport.cgi?bug=5388
$ sudo CFLAGS="" CXXFLAGS="" USE="-X -alsa -dbus -gif -gpm -gtk -jpeg -png -svg -tiff -xpm" emerge -av emacs
$ LANG=C LC_ALL=C eix app-editors/emacs$
[I] app-editors/emacs
     Available versions:
        (18)    18.59-r6
        (21)    21.4-r19
        (22)    22.3-r3!s
        (23)    23.1-r2!s
        {X Xaw3d alsa dbus gif gpm gtk gzip-el hesiod jpeg kerberos leim m17n-lib motif png sendmail sound source svg tiff toolkit-scroll-bars xft xpm}
     Installed versions:  23.1-r2(23)!s(17:05:58 02/25/10)(-X -Xaw3d -alsa -dbus -gif -gpm -gtk -gzip-el -hesiod -jpeg -kerberos -m17n-lib -motif -png -sound -source -svg -tiff -toolkit-scroll-bars -xft -xpm)
     Homepage:            http://www.gnu.org/software/emacs/
     Description:         The extensible, customizable, self-documenting real-time display editor
$ emacs -Q
M-x c-mode
M-x c-set-style bsd
M-x c-syntactic-information-on-region

switch($a)                      /* ((topmost-intro 192)) */
{                               /* ((substatement-open 192)) */
case 1:                         /* ((case-label 233)) */
case 2:                         /* ((case-label 233)) */
        $a=1;                   /* ((statement-case-intro 306)) */
        break;                  /* ((statement 343)) */
case "1":                       /* ((case-label 233)) */
case "2":                       /* ((case-label 233)) */
        $a=1;                   /* ((statement-cont 457)) */
break;                          /* ((statement 457)) */
}                               /* ((block-close 233)) */

2010-02-09

bash: bind: warning: line editing not enabled

この記事は emacs の shell-mode に関する参考です。

emacs の shell-mode でワーニングが表示されます。
設定の一部を .bashrc から .inputrc に変えました。
$ grep history-search-forward ~/.inputrc ~/.bashrc|sed 's/\/home\/[0-9A-Za-z]*\///'
.inputrc:"\C-n":history-search-forward
.bashrc:        #bind "\C-n":history-search-forward

2009-12-10

meadowで日本語入力ができなくなる場合の修正例

http://www.voc.mydns.jp/hiki/?Meadow+Memo
この記事は上記のサイトの引用です。

[コンパネ]-[地域と言語のオプション]-[言語]-[詳細]-[キー設定]
とたどって、入力言語のホットキーで、
「入力言語を切り替える」
で、
[入力言語の切り替え]と[キーボードレイアウトの切り替え]