1read 100read
2011年10月1期プログラムEmacs Lisp 3 TOP カテ一覧 スレ一覧 削除依頼
・ 次のスレ
疑似乱数2
【SecondLife】リンデンスクリプト【LSL】
Oracleの開発で SI Object Browser 買わないやつ
***Javaのオススメ入門書*** 『創るJava』 3.0


Emacs Lisp 3


1 :07/10/09 〜 最終レス :11/12/12
Emacs Lisp の専用スレ。
少数派による互助を中心に、初心者の相談も気が向けば受け付けます。
単なる Emacs ユーザーは別板の Emacs 関連スレにどうぞ。
過去スレ
Emacs Lisp
http://pc2.2ch.net/test/read.cgi/tech/1004551074/
Emacs Lisp 2
http://pc11.2ch.net/test/read.cgi/tech/1068467385/
関連スレ
Emacs part 22
http://pc11.2ch.net/test/read.cgi/unix/1180828013/
【叩かれて】Emacs Lisp道場【強くなれ】
http://pc11.2ch.net/test/read.cgi/unix/1063880951/
Lisp Scheme Part18
http://pc11.2ch.net/test/read.cgi/tech/1186922295/

2 :
(message ">>1 乙")

3 :
(setq >>1 "乙")

4 :
System.out.println(">>1 乙");

5 :
スパイがいるぞ

6 :
ここまでバレバレだとスパイというより罠だな
そんなことよりコンスセルの話をしようぜ

7 :
いやでゴンス

8 :
ところで、lexbindはもうtrunkにマージされた?

9 :
elisp で perl みたいなテキスト処理をしたいんだけど、
ファイルから一行読み込む、ってどうやるの?
ファイルは馬鹿でかいから、バッファに全部は読み込めない。

10 :
insert-file-contents かな

11 :
リージョン内の文字列を対象に、ファイルサイズを知りたいです。
リージョンを指定して M-| wc -c だと、改行コードなどがバッファのものと違う、
string-width だと TAB が 8 にカウントされる、改行がカウントされない、
length だとマルチバイト文字も 1 文字とカウントする、
など、どれもちょっと期待と違います。
ちなみに、最終的には mode-line に表示させたいので、
外部プロセスなどは使わずにすませたいところです。
何かいい方法ないでしょうか?

12 :
buffer-file-coding-system に encode-coding-string して length 取る、とか…

13 :
毎回やるのか、それ。遅そう……。

14 :
>>11です。
>>12 を参考にコードを書いてみましたが、
1MBくらいのファイルになるとスクロールに影響がありました。
私の組み方も悪かったのかも知れませんね。
バッファ全体を substring して temp-buffer に insert して encode して length… だったので。
きっと、もちょっと効率良くできるのでしょう。
で、mode-line の表示をどうしたものかと xdisp.c を眺めていたのですが、
mode-line-format に %i や %I が使えることが分かったので、
もうこれでいいコトにします。
ありがとうございました。

15 :
> 1MBくらいのファイルになるとスクロールに影響がありました。
変更がなければ再計算する必要ないと思うが。

16 :
バッファに変更がないことを知るのは難しいよね?
undo-list はアテにならないから使えないと思うんだけど、
バッファに変更があったことをどうやって知ればいい?

17 :
buffer-modified-tickとか。
buffer-undo-listじゃどうアテにならないのかおせーて。

18 :
buffer-undo-list って、メジャーモードによっては消えたりするじゃない、
…と思ったけど、変化したら再計算するんだから、十分アテになるね。

19 :
after-change-functions

20 :
>>19
おお、これなら…、と思ってやってみましたが、
少し速くタイプすると描画がついてきませんでした。これは CPU の性能のせいかな?
もちろん、スクロールには影響なかったですよ。ありがとうございます。
after-change-functions 自体は便利そうなので、別の何かに使います。

21 :
昨日からelispを勉強しています。
Rubyが一応は書けます。
OSはUbuntu7.10を使っています。
質問なのですが
yatexは.elファイルをどっかに置いているのだと思いますが
これはどこに置いてあるのですか?
rpm系を使っていて
rpm -ql yatexのような事が出来ればいいのですが良く分かりません。
まずこれについて方法を教えていただければと思います。
次に、
例えば/usr/libとかに.elファイルが置いてあるとして
emacsはどこに書いてある命令でこれを読みに行くのでしょうか?
最後に
.emacsというのにelispを書くとemacsをカスタマイズ出来るそうですが
.emacsに例えば
(set-language-environment "Japanese")
(set-default-coding-systems 'euc-japan)
(set-terminal-coding-system 'euc-japan)
と書いた場合、確認した中では
何もファイルを指定せずにファイルを開いた場合と
.rbファイルを開いた場合に設定が反映されましたが、
.texの時は変わらず、JISのままでした。
例えば/usr/libにyatex.elというのがあると仮定して、
おそらくここにJISにしなさいという命令が書いてあるものと思われ
それにより上書きされているものと思われますが、
同一種の命令の場合、
.emacsの設定の方を優先順序を上にするにはどうすればいいですか?

22 :
>>21
ライブラリの場所は M-x locate-library でわかるよ

23 :
ありがとうございます。
無理やりですが
locate yatexで調べました。
/usr/share/emacs/site-lisp
とかにそれらしきパッケージが入っていますね。
しかしどうやって読み込んでるのかとか
どうやってyatexを使用した場合でも.emacsに書いたeuc-jpを使いなさい
という命令を優先させる事が出来るのかが分かりません・・・

24 :
yatexが入っているならそのinfoも入っているはずなので、
C-h iでyatexを探して読んでみるといい。
文字エンコーディングの設定方法はそこに書いてある。

25 :
このスレはEmacs設定スレじゃないと思うんだが……

26 :
Emacs Lispの成分解析結果 :
Emacs Lispの55%は陰謀で出来ています。
Emacs Lispの39%は祝福で出来ています。
Emacs Lispの6%は成功の鍵で出来ています。

27 :
リストの n 番目の要素を置き換えるような関数はありますか?
&optional な引数で、上書きと挿入を切り替えることができると嬉しいです。
(setq test '(A B C D E))
(func test 3 X)
=> (A B C X E)
(func test 3 X t)
=> (A B C X D E)
みたいなものがあったら嬉しいのですが、標準関数でこれと同じようなものはありますか?
自分でやると
(append (reverse (nthcdr (- (length lst) n ) (reverse lst)))
X
(nthcdr n lst))
みたいになってしまうのです。

28 :
;; 破壊的挿入
(setf (nthcdr n lst) (cons new (nthcdr n lst)))
;; 非破壊的挿入
(let ((lst (copy-list lst)))
(setf (nthcdr n lst) (cons new (nthcdr n lst)))
lst)
;; 破壊的上書き
(setcar (nthcdr n lst) new)
;; 非破壊的上書き
(let ((lst (copy-list lst)))
(setcar (nthcdr n lst) new)
lst)
or
(substitute-if new 'identity lst :count 1 :start n)
setfとsubstitute-ifはCL。あとは詳しい人が降臨するのを待とう。
おれもここは苦手なんだ。

29 :
>>27
仕様バグ。使い方は
(setq test (func test 3 x t))
でないとダメ。
なぜなら0番目に挿入がありえるから。

30 :
>>29
???
そういうこともあるから値返してんじゃないの?
どのへんがバグなのか分からないオレははんぶん素人です。

31 :
変更箇所を色分けするhighlight-changes-modeで、
保存のたびに色が変化する(tomato→black)ようにしたくて、以下を.emacsに書いたのですが、エラーが出てしまいます。
小関氏の『入門Meadow/Emacs』に載っているソースを真似たのですが、どこが問題なのでしょうか?
よろしくお願いします。
●.emacs
(setq highlight-changes-colours
      (let ((r 255)(g 99)(b 71) ret) ;初期値tomato
(while (> (+ r g b) 0) ;だんだん色褪せる
 (setq ret (append ret (list (format "#%02x%02x%02x" r g b))))
 (setq r (* (/ r 10) 8)
g (* (/ g 10) 8) 
b (* (/ b 10) 8)))
ret))
●エラー
Wrong type argument: symbolp, (* (/ b 10) 8)

32 :
じっと目を凝らしても君には見えないんだろうな。

33 :
>>31
Emacsが日本語でやさしく教えてくれるようになるまで別のもの使っときw

34 :
>>31
setqのgの後ろに幽霊が居るぞ

35 :
develockで赤くしました。

36 :
develockって一度有効にしちゃったらoffにできないよね……

37 :
バージョンが古いんじゃないの?

38 :
と思ったら、なんか変だね…

39 :
関数内で、自身の関数名を取得する方法はありますか?

40 :
backtrace-frame()

41 :
>>40
(defun hoge()
(interactive)
(setq self (second (backtrace-frame 3)))
(message "%s" self)
)
お、できた。
サンクス

42 :
let使えよ
selfが汚染されるだろ

43 :
変数 arg が string で空ではない事を判定するのは
こんな感じだと思うんですが
(and (stringp arg) (not (string= arg "")))
これに相当する標準のコマンドってありますか?

44 :
(equal arg "")じゃダメなん?

45 :
ああnonempty stringで真にしたいのか。ない、そんなの。

46 :
lisp のファイル内に時々 ^L (Control-L) だけの行があるけど
あれ何のためにあるの?

47 :
改ページ

48 :
Lispに限らず見かけるけど。
a2ps-j とかはそれを認識して改ページしてくれるので、
見やすくするために入れる。

49 :
EmacsのCソースコードにも入ってるよ。
一つのソースファイルをいくつかのセクションに分けたいときに使ってるね。
Emacsではbackword-page (C-x [), forward-page (C-x ])でページ単位で移動できる。

50 :
>>47-49
なるほど。勉強になりました。

51 :
文字列を N 回結合する関数ってありますか?
(defun foo (str num)
(let (i result)
(dotimes (i num result)
(setq result (concat result str)))))
こんなのを作るしかないんですかね?

52 :
ないんじゃないかな、こんなのやってみたけど
(defun X (s n) (apply 'concat (make-list n s)))

53 :
>>52
おお、素晴らしい。
そっちの方が色々応用できそうですね。

54 :
>> 53
カキコしたあと思い出したんだけど、前スレで同じ質問あったな。いくつかレスがついてる。
http://pc11.2ch.net/test/read.cgi/tech/1068467385/936
> perl の x 演算子みたいな関数って無い?
> make-string の文字列版というか、
> (hogefunc 3 "abc")
> => "abcabcabc"
> みたいなやつ。

55 :
>>53
mapconcat の方がいろいろ対応できるよ

56 :
>>54
確認しました。 ありがとうございます。
941 :デフォルトの名無しさん:2007/09/08(土) 00:20:18
ということは、まとめると
(mapconcat 'identity (make-vector 3 "abc") nil)
が一番速いのかね
>>55
みたいですね。
こういうコードをさらっと書けるように修行します。

57 :
(reduce 'concat (make-vector 3 "abc")) ;; ==> "abcabcabc"
ぱっとみて思いついた。

58 :
>>57
でもそれは >>51 のように順々に concat していくのと同様だから遅すぎである。
(reduce 'concat (make-vector 10000 "abc"))
Time: 5182 ms
(mapconcat 'identity (make-vector 10000 "abc") nil)
Time: 2 ms

59 :
>>58
さっさと本スレで初心者にやさしく答えてあげてください。

60 :
こっちの方が速かった。
(mapconcat (lambda (x) "abc") (make-bool-vector 10000 nil) nil)
くり返し回数が十分大きい場合はこっちのが速い
(with-temp-buffer
(let* ((n 10000) (s "abc") (l nil))
(while (/= n 0)
(setq l (cons (= 1 (logand n 1)) l))
(setq n (lsh n -1)))
(while (progn (if (car l) (insert s)) (setq l (cdr l)))
(insert-buffer-substring (current-buffer) (point-min) (point-max)))
(buffer-string)))

61 :
>>60
思いつく柔軟さはいいと思うけど、
そんなコード氾濫してたら嫌だというのが正直なとこだな

62 :
ならinline functionにすればいいじゃない

63 :
Perlの
$foo =~ s/abc/def/;
みたいにして変数の中身を正規表現を使って置換することはEmacsLispで出来ますか?
perfume-replaceをどう使っていいのか分かりません

64 :
>>63
replace-regexp-in-string

65 :
>>63
replace-regexp-in-string でいいんじゃね? と思ったが、
s/abc/def/ じゃなくて s/abc/def/g になっちまうな。
(let ((foo "abc123abc"))
(setq foo (replace-regexp-in-string "abc" "def" foo)))
⇒ "def123def"
replace-match なら s/abc/def/ になるかな。
(let ((foo "abc123abc"))
(string-match "abc" foo)
(setq foo (replace-match "def" nil nil foo)))
⇒ "def123abc"

66 :
>>65
あー s/abc/def/gでいいんです。すいません
とりあえずreplace-regexp-in-stringとstring-matchの使い方を覚えます
どうもありがとうございました

67 :
ヘルプでcount-mathesの説明を見るとhow-manyのアライアスだということで
how-manyのソースを見てみたところ
(defun how-many (regexp &optional rstart rend)
と、引数を3つしかとらないみたいなのですが
バッファ内で(how-many "aa" nil nil nil)と引数を4つ渡して評価しても何故か
普通に動作します。
どうして引数を4つ渡しても動作するんでしょうか?
emacsのバージョンは22です

68 :
すみません
使ってるバージョン(22)と見たソースのバージョン(21)が異なってただけでした。orz
22のソースだとちゃんと引数は4になってました。
あともう1つわからない点があって、22のcount-matchesの説明をc-h fで見ると
the function behaves in all respects has if it had been called interactively.
という英文があるんですが、これはどういう意味なんでしょうか?
特にin all respects has という部分がわかりません。

69 :

>>68
その英文は少々不自然である。 例えばそれは
if interactive is t, the function behaves as if it had been called interactively (in every respect).
(もし `interactive' が t であるならば、この関数は interactive に呼ばれた時と同じ動作をする。)
と訂正されるべきだろう。 "has" は "as" であって、単純なタイポである。

70 :
>>69
変な英文だと思ったらtypoだったんですね。
わかりました、ありがとうございます。

71 :
>>70
貢献できて嬉しいよ。

72 :
関数のカリー化はできないのでしょうか?

73 :
プ

74 :
emacs lisp からcommon lispのcl-whoなどのパッケージを使う方法ないでしょうか?

75 :

Google Desktop の検索結果に time というプロパティがあり、それを通常の日付/時間表示に変換する方法が分かりません。どうすればいいのでしょうか?
;Google Deskitop の time の値(milie second): 128542440648970000
; 試してみたこと。
; current-time-string に渡すため (high low)のフォーマットにしようとこころみた。
(let* ((second 128542440648970)
(high (/ second 65535))
(low (logand second 65535)))
(List high low))
;こんな結果になる。
(-380 28938)

76 :
(let* ((second "128542440648970")
(high (calc-eval (concat second " / 65535")))
(low (calc-eval (concat "and(" second ",65535"))))
(list high low))
=> ("1961431916.52" "28938")
で結果は正しい?

77 :
>>76
レスありがとう。
'high' が integer じゃないって怒られた。だめみたいです。

78 :
それくらい自分で型変換しようぜ…

79 :
>(concat second " / 65535")
65535 じゃなくて 65536 じゃないか?

80 :
emacs21 --batch --eval "(hoge ...) "
の出力が日本語を含むリストのはずなのですが
\222 が連続して並んでます
nkfでも変換できないみたいです
どうすれば普通の日本語にできるのでしょうか?

81 :
>>80
--batch の出力は必ず iso-2022 になるはず。

82 :
emacsで.emacs.elファイルが開かれている場合、閉じるときにeval(してエラーがあれば警告し)たいのですが、良い方法をお分かりの方、教えてくださると幸いです。
ちなみに、
http://www.jaist.ac.jp/~n-yoshi/tips/junk_elisp.html#bytecompile
の、保存時に自動バイトコンパイルするよう設定を参考に、(byte-compile-file "~/.emacs.el")を(eval-current-buffer)に書き換えたりしてみたのですが、それだと、Emacsが重くなってダメでした。
高林哲氏のauto-save-buffersを使っているせいもあるんでしょうが。

83 :
>>82
その真上にある終了時に byte-compile ってやつはダメなの?

84 :
>>82
kill-buffer-query-functions で eval してはどうでしょうか。
(add-to-list 'kill-buffer-query-functions
(lambda ()
(when (string= (expand-file-name "~/.emacs.el")
(buffer-file-name))
(eval-buffer))
t))

85 :
>>84 的確なレスありがとうございます。
さっそく試したところ、うまいこと動きました。
ただ、やはり、バッファ終了時ではなく、手動保存時に
add-hookすることができればそれがベストかなと、
思い直した次第です。
つまり、'after-save-hookだとauto-save時にも適用されてしまいますが、自分でC-x C-sした時だけeval-bufferするようなことって、できますでしょうか?
たびたびすいませんです。これで最後の質問にいたします。

86 :
>>85
eval-bufferして本来の動作をするようなelispを定義して
C-xC-s のコマンドに上書きすればいいだけじゃないか。

87 :
そういうコマンド書いて C-x C-s に割り当てればいいんじゃないかな。

88 :
>>85
interactive-p で auto-save かどうかを判定できるかも。

89 :
選択範囲内のすべての行の先頭にタブを入れたいのですが,
どうすればいいですか?
わかる方がいましたら教えてください。

90 :
>>89
マークして C-x r t C-q TAB RET
基本的な操作は本スレで質問しような。

91 :
>>81
なぜかうちの環境ではならない
ubuntu7.10

92 :
>>90
そんな長いコマンドがちょっといやで,
C-c C-tあたりでできるようにしたいです

93 :
>>92
じゃあチラシの裏に書く前にさっさとそうしてください。

94 :
opensuse11 初心者だけど、manページが文字化けする。。。。

95 :
elispでもマクロがあるんだねぇ。しらなかった。試しに作ったけど
(defmacro definsert (name str)
(let ((dstr (gensym)) (len (gensym)))
`(defun ,name ()
(let* ((,dstr (concat ,str ,str)) (,len (length ,str)))
(insert ,dstr)
(backward-char ,len)))))
( definsert insert-double-aho "aho")
(insert-double-aho) => ahoaho カーソルの位置 最初のahoの後ろ
インデントは適当になおしてね。また、これは車輪の再発明でinsert-pairが
標準であることを付け加えておきますね。

96 :
一行コピーの一番エレガントな実装を教えてください。
取り合えず手元にあるものではこんな感じ。
(defun duplicate-line (n)
(interactive "p")
(save-excursion
(copy-region-as-kill (line-beginning-position)
(progn (forward-line 1) (point)))
(dotimes (i n)
(yank))))
ちなみに、コピー後のカーソル位置は任意です。(カラムが移動するのはイヤン)

97 :
;; エレガントかどうか知らんけど、最終行でも動作が変わらないようにしてみました
(defun duplicate-line (n)
(interactive "p")
(save-excursion
(let ((str (concat (buffer-substring (line-beginning-position)
(line-end-position))
"\n")))
(forward-line)
(when (= (line-end-position)
(point-max))
(insert "\n"))
(dotimes (i n)
(insert str)))))

98 :
(fset 'duplicate-line
[?\C-a ?\C- ?\C-e escape ?w ?\C-m ?\C-y ?\C-a ?\C-p])

99 :
ありがとうございます。
>>97
確かに最終行が改行で終わってないと動作がおかしいですが、
ある意味正しいというか、あまりないことなので現状でも
いいかなという気もします…
>>98
マクロも考えたんですが、カーソルのカラム位置が移動しちゃうのと
一回のUndoで元に戻らないのがちょっと微妙です。

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 削除依頼
・ 次のスレ
疑似乱数2
【SecondLife】リンデンスクリプト【LSL】
Oracleの開発で SI Object Browser 買わないやつ
***Javaのオススメ入門書*** 『創るJava』 3.0