のくす牧場
コンテンツ
牧場内検索
カウンタ
総計:127,542,413人
昨日:no data人
今日:
最近の注目
人気の最安値情報

私的良スレ書庫

不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitter
ログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。

【叩かれて】Emacs Lisp道場【強くなれ】

emacs スレッド一覧へ / emacs とは? / 携帯版 / dat(gz)で取得 / トップメニュー
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
レスフィルター : (試験中)
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter
351 : 名無しさん@お腹 - 05/02/11 20:45:11 (-1,-29,-30)
(interactive)
ていうかelispにbeginは無いし
352 : 名無しさん@お腹 - 05/02/11 20:46:07 (-2,-30,-65)
(define-key mode-specific-map "g"
(lambda ()
(interactive)
(forward-char)
(backward-char)))
353 : 名無しさん@お腹 - 05/02/11 21:58:34 (+69,+29,-21)
どうも、解決しました。
(ここ結構人居るんですね)
other-windowを組み合わせようとしてたんですが、
これが引数とるのに気が付かなくて二重にはまってました。
M-xから呼ぶときは引数いらないのに...いまだに意味不明です。
354 : 名無しさん@お腹 - 05/02/11 22:59:58 (+12,-30,-59)
(other-window ARG &optional ALL-FRAMES)
だから引数は必要。
M-x でいらない(ように見える)のは (interactive "p") で
(prefix-numeric-value current-prefix-arg) が渡されるから。
355 : 名無しさん@お腹 - 05/02/12 01:45:40 (+9,-30,-55)
>>353
要らない世話かも知れないけど>>354に補足すると
(interactive "p") で渡っているのは ARG の方だけね

ALL-FRAMES を指定するときは
(other-window 1 t)
のようにもう一つ引数がいるからね

詳しくは info を
356 : 名無しさん@お腹 - 05/02/12 08:41:04 (+57,+29,-7)
Lispはちょっと触った事あったんでいけるかと思ってたんですが、
Emacsの仕様もあって結構難しいですね。
ちょっと勉強してみます。
357 : 名無しさん@お腹 - 05/02/19 00:17:22 (+9,-30,-95)
(multibyte-string-p "a")
=> nil
(with-temp-buffer
(insert "a")
(multibyte-string-p (buffer-substring-no-properties (point-min) (point-max))))
=> t
HEAD でも 21.3 でもこうなるみたいなんだけどこーゆーもんなんすか?
358 : 名無しさん@お腹 - 05/02/19 00:30:43 (+10,-30,-91)
>>357
はい。

(with-temp-buffer
(set-buffer-multibyte nil)
(insert "a")
(multibyte-string-p (buffer-substring-no-properties (point-min) (point-max))))
=> nil
359 : 名無しさん@お腹 - 05/02/19 00:55:48 (+14,-30,-146)
>>358
むむ、なるほど、どうもです。
じつは任意の buffer から substring してきた文字列に multibyte (とりあえ
ずは日本語) が含まれてるかどうかを判定したいんですが、そんな場合はどう
するのが常套手段なんでしょう。思い付いたのは↓なんですが

(with-temp-buffer
(insert "あ")
(goto-char (point-min))
(if (re-search-forward "\cj" (point-max) t)
"日本語あり"
"日本語なし"))
=> "日本語なし"

(´・ω・`)
360 : 名無しさん@お腹 - 05/02/19 01:12:14 (+9,-30,-170)
(find-charset-string "abc")
=> (ascii)
(find-charset-string "abcほげ")
=> (ascii japanese-jisx0208)

(let ((str "あ"))
(if (memq 'japanese-jisx0208 (find-charset-string str))
"日本語あり"
"日本語なし"))
=> "日本語あり"
361 : 名無しさん@お腹 - 05/02/19 01:21:29 (+9,-30,-63)
(re-search-forward "\\cj" (point-max) t)

Emacs21 なら
(re-search-forward "[[:nonascii:]]" (point-max) t)
が使えたはず。
362 : 名無しさん@お腹 - 05/02/19 01:27:41 (+16,-29,-82)
Emacsのunibyte/multibyteってのはタダのバイト列として読むか
なんらかのエンコーディングで表現された文字として読むかってとこで生じる。
単に表現されたときに1バイトになるかってのは関係ない。
363 : 名無しさん@お腹 - 05/02/19 01:49:37 (+10,-30,-196)
>>362
うそー、関係あるよ。

src/alloc.c:
Lisp_Object
make_string_from_bytes (contents, nchars, nbytes)
const char *contents;
int nchars, nbytes;
{
register Lisp_Object val;
val = make_uninit_multibyte_string (nchars, nbytes);
bcopy (contents, SDATA (val), nbytes);
if (SBYTES (val) == SCHARS (val))
STRING_SET_UNIBYTE (val);
return val;
}

文字列中の文字が全て1バイトになるかを思いっきり考慮してんじゃん。
364 : 名無しさん@お腹 - 05/02/19 02:29:27 (+9,-29,-38)
はいはい。それはmake_string_from_bytesだからでしょ。
それは考慮してるんじゃなくてunibyteにするかmutlibyteにするかっていう
判定材料に使ってるだけだよ。
その関数の使われるところがどういうところかも見れば自明だと思うんだけど。
365 : 名無しさん@お腹 - 05/02/19 03:06:30 (+5,-12,+0)
自日月
366 : 名無しさん@お腹 - 05/02/19 03:38:11 (+38,-30,-53)
>>364
はいはい。じゃあ
(multibyte-string-p (string 97)) => nil
(multibyte-string-p (string 53794)) => t
を説明してみ。
367 : 名無しさん@お腹 - 05/02/19 03:49:16 (+3,-30,-215)
アホだな。Fstringってmake_string_from_bytesを使ってる例でしかないじゃん。
それはインタフェースからしてmultibyteかどうかの情報が与えられないから、
multibyteかどうかを判定するのに文字の範囲から推定するしかできないからでしょ。

逆に例えば既にmultibyteである情報源から文字列を作るとき、
要するにmultibyte bufferからsubstringする場合なんかはいちいち
中身が1バイト文字だけかどうかなんて考慮しないよ。

まあソースコード読みなよ。
Emacsでのunibyte/multibyteの扱いってものについて学習してらっしゃい。
368 : 名無しさん@お腹 - 05/02/19 05:04:41 (+5,-30,-71)
>>362
> 単に表現されたときに1バイトになるかってのは関係ない。
に対し、SINGLE_BYTE_CHAR_P でない文字を含む文字列は常に multibyte にな
ると言ってるのに、SINGLE_BYTE_CHAR_P だけからなる文字列も multibyte に
なり得ると反論してもしょうがないだろうに。
369 : 名無しさん@お腹 - 05/02/19 05:27:37 (+4,-29,-73)
> に対し、SINGLE_BYTE_CHAR_P でない文字を含む文字列は常に multibyte にな
> る
そこが問題なのか? 違うだろ。だって当たり前すぎるほど当たり前じゃん。
>>363はタダのバイト列として読むんじゃなくてEmacsの内部表現で表現された
文字列として読んでるんだから。

そこを問題にしているとしたら363の方こそナンセンス。

370 : 名無しさん@お腹 - 05/02/19 07:02:02 (+63,+29,-33)
>>366がどういう意図をもっているのか自分で説明すべきだろ。
何を根拠に何を主張したいのか書かなきゃ単なる煽りの手口。
371 : 359 - 05/02/19 09:05:52 (+4,-30,-114)
>>360
> (find-charset-string "abc")

>>361
> (re-search-forward "[[:nonascii:]]" (point-max) t)
おー、ありがとう。勉強になるっす。

> (re-search-forward "\\cj" (point-max) t)
うぼあ、なんたる初歩的ミス orz
372 : 名無しさん@お腹 - 05/02/20 14:51:39 (+3,-30,-274)
Emacs の multibyte, unibyte まわりって確かにわかりずらいですよねー。
試しに unibyte な文字列中に "\\cj" で検索かけてみたんですけど、結果は nil なん
ですねぇ。当然と言えば当然ですが。

(string-match "\\cj" "あいうえお")
=> 0
(string-match "\\cj" (string-as-unibyte "あいうえお"))
=> nil

(find-charset-string "あいうえお")
=> (japanese-jisx0208)
(find-charset-string (string-as-unibyte "あいうえお"))
=> (eight-bit-graphic eight-bit-control)

coding-system の binary, raw-string とかとの関係も難しい・・・。
373 : 名無しさん@お腹 - 05/02/20 14:56:20 (+66,-30,-108)
閑話休題。
iswitchb で migemo を使えるようにしてみたですよ。

(setq iswitchb-regexp t)
(setq iswitchb-use-migemo-p t)
(defadvice iswitchb-get-matched-buffers (before iswitchb-use-migemo activate)
"iswitchb で migemo を使ってみる。"
(when iswitchb-use-migemo-p
(ad-set-arg 0 (migemo-get-pattern (ad-get-arg 0)))))
374 : 名無しさん@お腹 - 05/02/20 18:40:57 (+62,+29,-2)
>>373
おおぅ、ナイスです。
ありがたく使わせていただきます。
375 : 373 - 05/02/21 23:35:24 (-4,-30,-260)
昔の「自慢の.emacsを貼り付けよう」スレのように活気付く事を祈って。
dired とか ibuffer で色を付けて、長いファイル名があってもそれなりに見やすくしてみる。

まずは dired:
(defun dired-font-lock-information-matcher (limit)
"dired でまん中へんに色を付けてみる matcher。"
(when (dired-move-to-filename nil limit)
(let (end)
(backward-char)
(setq end (point-marker))
(progn (beginning-of-line)
(forward-sexp (if (looking-at dired-re-mark) 2 1))
(forward-char))
(store-match-data (list (point-marker) end)))
(forward-line)))

(font-lock-add-keywords
'dired-mode
'((dired-font-lock-information-matcher . font-lock-constant-face)))
376 : 373 - 05/02/21 23:36:57 (+0,+0,+0)
んで ibuffer:
(setq ibuffer-fontify-information-field-list '(size mode))
(defadvice ibuffer-insert-buffers-and-marks (after ibuffer-fontify-information-field activate)
"ibuffer でまん中へんに色を付けてみる。"
(save-excursion
(ibuffer-goto-beg)
(while (not (eobp))
(let ((pos (point))
(limit (line-end-position)))
(while (and (setq pos (next-single-property-change pos 'ibuffer-field nil limit))
(< pos limit))
(goto-char pos)
(let ((buffer-read-only nil)
(field (get-text-property (point) 'ibuffer-field))
(beg pos))
(when (memq field ibuffer-fontify-information-field-list)
(setq pos (next-single-property-change pos 'ibuffer-field nil limit))
(goto-char pos)
(put-text-property beg pos
'face 'font-lock-constant-face)))))
(forward-line))))

dired-mode で、dircolors の色を使うようにすると派手でいいかもしれないとか思った。
377 : 373 - 05/02/22 00:21:53 (+3,-30,-197)
dircolors 使うやつができたっぽい。

(require 'dircolors)
(font-lock-add-keywords
'dired-mode
(mapcar (lambda (x)
(list
(format "\\(%s\\)$"
(mapconcat (lambda (ext)
(if (stringp ext)
(format "\\.%s" ext)
(format ".*%s.*" (cadr ext))))
(car x)
"\\|"))
`(".+" (dired-move-to-filename) nil (0 ',(cadr x)))))
dircolors-extension))
378 : 名無しさん@お腹 - 05/03/20 13:59:42 (+7,-30,-50)
(defadvice next-error (after next-error-plus-alpha activate)
(insert "OMOITSUKANAI"))
定義してgrep+next-error実行しても, OMOITSUKANAIがバッファに挿入され
ないのはどうしてなのだろうか
379 : 名無しさん@お腹 - 05/03/20 18:00:24 (+2,-29,-4)
>>378
(with-current-buffer ) を抜けたあとだから。
380 : 名無しさん@お腹 - 2005/03/21(月) 13:45:50 (+2,-29,-12)
>>379 with-current-buffer 以後でも insert を可能にする方法は何
かありますか?
381 : 名無しさん@お腹 - 2005/03/21(月) 18:16:49 (+4,-29,+0)
>>380
with-current-buffer
382 : 名無しさん@お腹 - 2005/03/23(水) 00:29:38 (+7,-30,-47)
>>381
(defadvice next-error (after next-error-plus-alpha activate)
 (with-current-buffer next-error-last-buffer
   (insert "OMOITSUKANAI")))

なりませんけど・・・?
383 : 名無しさん@お腹 - 2005/03/23(水) 09:16:12 (+32,-30,-30)
>>382
(when (setq next-error-last-buffer (next-error-find-buffer))
...
384 : 名無しさん@お腹 - 2005/03/23(水) 14:52:04 (+85,+29,-2)
>>383
その中に入れても結局なりませんでした。。。
385 : 名無しさん@お腹 - 2005/03/23(水) 21:36:02 (+54,+8,-13)
>>384
最新の Emacs だと grep バッファは読み込み専用だけど,あらかじめちゃんと
書き込めるように対処はしてあるの?
386 : 名無しさん@お腹 - 2005/03/24(木) 00:33:30 (+10,-30,-28)
>>385
書き込みしたいのは、次のエラー箇所が見つかったファイル (この場合はマッチするファイル)に
なので、 *grep* バッファ上でではありません。。
`next-error-last-buffer' がそのファイルじゃないのですか?
387 : 名無しさん@お腹 - 2005/03/24(木) 01:36:43 (-2,-30,-12)
試してみると
next-error-last-buffer's value is #<buffer *grep*>
ってなるから違うみたい
388 : 名無しさん@お腹 - 2005/03/24(木) 22:05:20 (+54,+11,-82)
emacs 21.4 を使っています。
カーソル配下のtextのface取得方法が解からないので、教えてください。
やりたいことは、特定の単語の色の変更では無く、
その単語の所属するキーワードグループまるごと色を変更したい為、
カーソル配下の単語から、faceを特定したいということです。

お願いします。
389 : 名無しさん@お腹 - 2005/03/24(木) 22:51:54 (+4,-30,-11)
(get-text-property (point) 'face)
390 : 388 - 2005/03/25(金) 00:51:21 (+2,-20,+2)
>>389
thx
391 : 名無しさん@お腹 - 2005/03/30(水) 12:38:13 (+49,+21,-14)
Emacs には「グラフ」データ構造の library がないように思えます。
ここでプログラムしてみちゃってください。
392 : 名無しさん@お腹 - 2005/03/30(水) 12:52:18 (+83,+26,+0)
ム板でやると盛り上がると見た。
393 : 名無しさん@お腹 - 2005/03/30(水) 17:48:01 (+69,+29,-8)
>>392
ここでよくない? こういうプログラミング練習の為にこのスレッドがあるんじゃないの?
394 : 名無しさん@お腹 - 2005/03/30(水) 18:33:00 (+57,+29,-3)
ライブラリ的なのはあっちっしょ。好きそうな人もいるし。
395 : 名無しさん@お腹 - 2005/03/30(水) 21:02:12 (+31,-29,-17)
cons と car と cdr で事足りる
396 : 名無しさん@お腹 - UNIX時間(+0900)35年,2005/04/03(日) 07:43:30 (+62,+29,-23)
>>395
おまえは、 「情報なんて 0 と 1 のみで事足りる」
とでも言うのか?

アホ。
397 : 名無しさん@お腹 - UNIX時間(+0900)35年,2005/04/03(日) 20:28:38 (+2,-25,-72)
「ハッカーと画家」に
car, cdr, cons, quote, cond, atom, eq
だけで Lisp の関数は書けるとかって書いてあった。
四則演算はどうやってやるんだ?
398 : 名無しさん@お腹 - UNIX時間(+0900)35年,2005/04/03(日) 20:57:40 (+3,-30,-98)
(t) => 1、(t t) => 2、(t t t) => 3
のように表わすことにして
(defun plus (x y)
(cond (y (plus (cons (car y) x) (cdr y)))
(t x)))
(plus '(t t t) '(t t))
=> (t t t t t)
足し算ができれば後はどうとでも。
399 : 名無しさん@お腹 - UNIX時間(+0900)35年,2005/04/03(日) 23:04:31 (+3,-30,+0)
398 は効率悪すぎだから (t) => 1、(nil t) => 2、(t t) => 3 と
little endian な 2 進表記にして

(defun plus (x y &optional c)
(cond ((cond ((eq x nil) (eq y nil)))
(cond (c (cons c nil))))
((car x)
(cond ((car y)
(cons c (plus (cdr x) (cdr y) t)))
((cons (not c) (plus (cdr x) (cdr y) c)))))
((car y)
(cons (not c) (plus (cdr x) (cdr y) c)))
((cons c (plus (cdr x) (cdr y) nil)))))

(defun mul (x y)
(cond ((eq y nil) nil)
((plus (cond ((car y) x))
(mul (cons nil x)
(cdr y))))))

(plus '(t t nil t) '(t nil t)) ; 11 + 5
=> (nil nil nil nil t) ; 16

(mul '(t t nil t) '(t nil t)) ; 11 * 5
=> (t t t nil t t) ; 55
400 : 名無しさん@お腹 - 2005/04/05(火) 10:30:07 (+61,+29,-33)
おいおまえら、知能ベースを elisp で書けよ。
はやくしろ。
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / emacs スレッド一覧へ
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

類似してるかもしれないスレッド


トップメニューへ / →のくす牧場書庫について