- 1 名前:おっす [03/09/18 19:29]
- なんとなくEmacs 触り始めて、なんとなくelispにも手を出して
しまったアナタ。 なんとなく書いてしまったコードをココに書き込んで叩かれましょう。 タタカレテツヨクナレ。 年季の入った玄人衆は、もしアドバイスできたらお願いします。 いや、叩きついでにでも。 とりあえず入門書は ttp://www.netfort.gr.jp/~kiyoka/emacs_setq/emacs_setq.html ttp://www.math.s.chiba-u.ac.jp/~matsu/lisp/emacs-lisp-intro-jp.html リファレンスマニュアルは(ちと古い) ttp://www.fan.gr.jp/~ring/doc/elisp-manual/elisp.html とか、新しいのは(でも英語) ttp://www.delorie.com/gnu/docs/elisp-manual-21/elisp.html ではひとつ、コード中心の熱いバトルをよろぴく。
- 27 名前:名無しさん@お腹いっぱい。 mailto:sage [03/09/25 11:49]
- >>25
(fset 'yes-or-no-p 'y-or-n-p)
- 28 名前:名無しさん@お腹いっぱい。 mailto:sage [03/09/26 09:48]
- >>24
贅沢を言えば、 (y-or-n-p "Not exists. New file? ")で nと答えた時にアボートせずに ファイル名入力へ戻ってホスィ
- 29 名前:24 mailto:sage [03/09/26 10:13]
- >>28
こんなんではいかが? (defun my-find-file (filename &optional wildcards) (interactive "FFind file: \np") (unless (or (file-exists-p filename) (y-or-n-p "Not exists. New file? ")) (setq filename nil) (command-execute 'my-find-file)) (find-file filename))
- 30 名前:名無しさん@お腹いっぱい。 mailto:sage [03/09/26 10:37]
- >>29
イイカモ。 でもさらに贅沢を言えば (command-execute 'my-find-file)でファイル名入力に戻った時に 前回の入力がそのまま残っていてくれるとウレシイス
- 31 名前:24 mailto:sage [03/09/26 12:54]
- >>30
拙者もちょっと気になってましたが、 何をどうやればよいのやら・・・。 (interactive "FFind file: \np")のプロンプトの後に文字列を挿入すること自体、 さっぱりわかりません。
- 32 名前:名無しさん@お腹いっぱい。 mailto:sage [03/09/26 20:09]
- (defun my-find-file (filename &optional wildcards)
(interactive "FFind file: \np") (unless (or (file-exists-p filename) (string-match "[[*?]" filename) (y-or-n-p "Not exists. New file? ")) (let* ((regexp (concat "^" (regexp-quote default-directory) "\\(.*\\)")) (str (progn (string-match regexp filename) (match-string 1 filename)))) (catch 'exit (while t (setq filename (read-file-name "Find file: " default-directory nil nil str)) (when (or (file-exists-p filename) (string-match "[[*?]" filename) (y-or-n-p "Not exists. New file? ")) (throw 'exit t)) (string-match regexp filename) (setq str (match-string 1 filename)))))) (find-file filename wildcards))
- 33 名前:24 mailto:sage [03/09/26 21:00]
- >>32は神!
じっくり読ませてもらいます。 ありがとうございまスタ。
- 34 名前:名無しさん@お腹いっぱい。 mailto:sage [03/09/26 21:07]
- こんなのも考えてみた。
(defun my-find-file-interactive-arg (&optional initial) (let* ((insert-default-directory (null initial)) (name (read-file-name "Find file: " nil nil nil initial)) (file (expand-file-name name))) (cond ((file-exists-p file) (list file)) ((y-or-n-p (format "File %s not exists, New file?" file)) (list file)) (t (my-find-file-interactive-arg name))))) (defun my-find-file (filename &optional wildcards) (interactive (my-find-file-interactive-arg)) (find-file filename wildcards)) なんか、 point が filename の最初に来ちゃうんだけどね…
- 35 名前:24 mailto:sage [03/09/26 22:05]
- >>34
!!! interactiveの引数が関数になってる。 おお、こんなことができるのですか! 自前でinteractiveのコード文字を定義すればいいと・・・目から鱗。 ちょっと感動してます。 コンパクトになってるし。
- 36 名前:名無しさん@お腹いっぱい。 mailto:sage [03/09/27 10:29]
- あ… >>34 、 wildcards なんて引数があったの忘れてる (w
wildcard なときでも存在確認できるように、前の関数修正。 (defun my-find-file-interactive-arg (&optional initial) (let* ((insert-default-directory (null initial)) (name (read-file-name "Find file: " nil nil nil initial)) (wild-p current-prefix-arg) (file (if wild-p name (expand-file-name name)))) (cond ((if wild-p (file-expand-wildcards name) (file-exists-p file)) (list file wild-p)) ((y-or-n-p (format "File %s not exists, New file?" file)) (list file wild-p)) (t (my-find-file-interactive-arg name)))))
- 37 名前:24 mailto:sage [03/09/27 12:11]
- >>34
> なんか、 point が filename の最初に来ちゃうんだけどね… 気になりだすと止まらないので、朝から覗いてるんですが、 read-file-name -> completing-read -> read-from-minibuffer -> read-string と見ていっても結局 built-in function で補完途中の動作は触れないんですね。 src/fileio.c にread-file-nameがあるんですけど、ここいらにパッチするし かないんでしょうか・・・ポイント動かすだけなのに・・・ もうギブっす
- 38 名前:24 [03/09/27 12:17]
- >>37
× 補完途中 ○ 入力中 スンマセ
- 39 名前:あぼーん mailto:あぼーん [あぼーん]
- あぼーん
- 40 名前:24 mailto:sage [03/09/27 13:00]
- すごい安直なことを思いつきました。
(add-hook 'minibuffer-setup-hook 'end-of-line) 問題続出の予感・・・
- 41 名前:名無しさん@お腹いっぱい。 mailto:sage [03/09/28 06:56]
- >>40
んじゃ、こんなんでどうでしょ? my-find-file-interactive-arg() をちょっとだけ変えますた。 (defvar my-find-file-interactive-arg-active-p nil) (defun my-find-file-interactive-arg (&optional initial) (let* ((my-find-file-interactive-arg-active-p t) (insert-default-directory (null initial)) (name (read-file-name "Find file: " nil nil nil initial)) (file (expand-file-name name))) (cond ((file-exists-p file) (list file)) ((y-or-n-p (format "File %s not exists, New file?" file)) (list file)) (t (my-find-file-interactive-arg name))))) (defun my-find-file-minibuffer-setup-hook () (when my-find-file-interactive-arg-active-p (end-of-line))) (add-hook 'minibuffer-setup-hook 'my-find-file-minibuffer-setup-hook)
- 42 名前:24 mailto:sage [03/09/28 12:44]
- >>41
おお、完璧です。そうかこうすればよかったんだ。 ところで > (let* ((my-find-file-interactive-arg-active-p t) で、 > (defvar my-find-file-interactive-arg-active-p nil) を変更できるというのをはじめて知りますた。 勉強になりますです。
- 43 名前:名無しさん@お腹いっぱい。 mailto:sage [03/09/29 21:52]
- ----BEGIN BASE64----(bf-mode.el.gz)
H4sICDAmeD8AA2JmLW1vZGUuZWwAzRprb9w28vMecP+BEILzqo02tuNcUQftIU7d nK+OU8Quer26B3AlalexVlRIyvYGxf32myEpinravvTaLJB4V5wZzpszIz5/To4E v5GMfJvljGx4wkjKBUkywZI//+n5c/w3e3SSHJJlGuHyguWPr8ne4guyv7v79Mnu l0/2vyR7+4dP9w4PDsiqEIIc35bkUY2sCRd0w3wKeuGUSoU7ZmnGgP5rXpBzVhIg h5TJ/t7h091D+PKP84uamMZryJCYb5gkN5lakxdH529Of7g4Pv2JnL0hP754+/bF 2cVPC41xsc4kkTxVN1QwAt+TTCqRLSvFElIVCRNErRl5dfYDecUKJmhOvq+WeRaT 0yxmhWQLt/mPa6qQggKSh/oJIUfp3FNiqLlDmE1WcBG1dboAaPOI5jngkC2vLBnF ydKQSdEWjMos3xJaJBozVvn2MUmYLDPFCE/JFWNlVqwsWcfgSSEVkLa87S1Aw9eM BI3SApIVsBUKbOhyAbtoRgTJOU2ikqq1URzZXxCaJBo45cgw7phnBUNuNUbC1YJt aCwtBnzmgr2vgDTZsbuGjrsfJF2xhresuOZXho+ELLfkZXRLkmbr5YwVCoxjyZjn T+E5AXW+n7HbTJFU8E0b4GBBCgQoZ1r0uBISfqHIVKyYMtrNEEQb3mk9U3bnZwty /v3LmYwFiEyq0gCg5CB+wm+coOeRBwcLxSiknNHkXQX+rgHoMrdGltkH5oDETPHV Cp4KBlbgRb5t+f0FT3ijOrdTtgGVamrzdyVbPSarLH1MygK+oe9suGCLReh0pyoB ohdPeJqCSQsFJo+vCC1LRgUtYq2ZjhSgFsfENRUZsi+1S1eSCWnW5glLYbE2RSRZ Dr4FRCInDSkyiHxCgs++zSmw59tgQ6+M3ERD3qxZYQ0FkatJgZMHYX+fmldvG3XP TQYkndxhDZgIu2von1WbJdC9ycD4SzDlGh1A8dLEx6Aad1GcGy6uzFO15pUiluz0 3ugoZM/ufNR3Itzvu6OtYoNk2G3MSgV/VGODU8iBmEdMsrlVkOcyXgB76yxeE0yU Bgsi08WIIS6Zej9EemceXF4u2C17FBD8Btn5URCGnvdkGM4FpFfnRsPOYxQWQSYD 3wSOB0TSOcMCjoCUgl1nvJLRFdtuaDkCBflBQJppVL2s0hTsaqAd67xUoB5gPa2K GL92z0mkWxWN/9NrJ0fMizRbVYJqvHmIBmhrsSXwvGZpCD00Cu3sdgVOaFRSk9eq psDpNTMPNIiV7Q7ZDQLk8JoFohzPwzINyTHIqDFbAhGtWMThXBH1FpbvqgCvkGTO C0et1CuwNoAmkSmTHuyTMGy5nKyWRECYQUzKQUOlgBXpIBjTnIUku+anEYEm10yo TLKkoWDx06kkaERx9tf69nNXLevwMjqlhhjSrTk9POgxgVquN5BA5wVXE+thSy0G gA1aO17TYsVc4pwX1abHEgnO/m7XT8FIh8EUjzUlR+j+TLRT6RgrTWo1YDqnhtNM aciHcFRgthwzjnEvBIn0QbI3RrZDtM529yYcjVLuJzNd4gzGa28bCNHPyHzutFOD Q+ll00v96K4sBPRmpEsoKjf0FiyB6bUT+QAOnzohuF3a+GENVXJgPQJi4ehGcKbu hXVAQsKD5Dr/iszrdSTQI999oPnVG7Tz5yD2AHJWGPZgayzngG0ZXWcyAxeNssLB
- 44 名前:名無しさん@お腹いっぱい。 mailto:sage [03/09/29 21:53]
- DW5rRJ0NqkDH+AOoZUVNTX+6JMOPEBFNANhz4GfQ0fYip/M1y1ZrFZrP/Rw10oX5
hLf+Rs7qEveQCNGIFE2yn1ZajQkHq+j73IguGqIazUR9k/h0jQ3/c+jPq03pMhgh cGyCY2Q6JV7TvGKWzRVXHNOpcNFjvFMv6uMwpjlsbsocEBhJDshopOgd3JZqX5wK uhMRuW41wnECAEOb6qVl/EnmeAzr9QZcr4S+ueMca9+5LHOocHASACeKRg+eBI1R CqSHVgP9rOC7xgrD+u+QyptiGGJI84Ks+Fvrnfvg2v8FU80Brw2EVQliuKLB2Myw DLlLQaU+j8EemiXibTgzSkGSqiZYa8pIHycWrV4G2HblpCDhUAHlP5z8agNOb5b0 omG9pwBzhtSCmaqqrYYHl6FGb0m12Wz1cwxOnNEoPEdvalLBMj2MaR05LGjHlgVq iNSLWQEdbK3e4LII3Fd1qT6Ppj+fd+B/NUomL1+cnb25IEfH5Ojtmx/Pj7+xz399 OP02RhD4Dl7AgeR8vKVkDR4Q0AfRlRyzWkngUSXNqEUw9CLdySw6+5zxG+iblSR1 jQ8YVAKZHJrYRRc6qHXJIFWA5aEOkdhJuumP3yKqMcW3SJ6kOFsipnDTozYCbpYV GXL7uAWq4UBOO16hrrMkl0F//0scfnkjKyA1XW+rgexlnamfvjz3aldWw5kYyy8b b6bY5JBC+xFlWIJmU9eZEQL9jjHlGPuDIur4ny+Pj785OXtlYunF0ekx+fYE/js/ +dfxpxVRTlWj8ZRnm8zOU+plPI6XYF84WO1BNNhehCSw4507QsX2LfrUfniktPYc CJaG2hssb26g/X1MHOFccqK2JRKUgIzzEcU2JRcU1FnZ6dEnEGzOxmPHV+ME2DT9 X2MM24qYKh1rga2wZ1qYoaLHATg8WIeqZRHUFfFDA/Sbk7fHLy/evP3pEDxME/PM fEc0DX5MSq3fBGCB4akz+M+ToDGz0RDGmTTdqRHUPEDF28Yn9asiVxdpMFfopKYO 0g9NN1EPklrFUvDvy8vF54/AOS1tow1AR7nDpnCyXGGRZGk2+w+XwZ+Eb1v/ljhz qjK5hkylbhjUjI0NICohhQ2OwuyLkLFeyRSfQ4M5U0nbp3UjkG/rZTcg63RFOI+P MEWYih5iIOio8Y4ZrZuUNhMDi9yaAAyMjFv9QJ3q/bNA0kKiKGYobocn2Ba6c4Go cGTDuR6y+BuZsaAh33h62a7YR7NQ9ygCvxN8hQ25tYmmK9iqyqnoUO0NeExV7kDq tPERCr+Puu/20OW2+ypiwkcHW4uR5p4qZSumCL/q177SV4BnoK+/Mn3fFwRBoSP9 bPRVzP5B2LbaUKE2YTmcJ6F9vGZqhqOIoVZy2qB+t9WIZWk3rwcNfS66KREy4rty hTmxtYvx6z4ka4EOc6Q3HWGIiniNg4WGpd4mkNoWqw89jrq7WErtfUgA2OSDgoxu 53rD9Jcfft7/5W8fs8e7u/b4GOKTtPMP6/+Vdr6mJK9J42stTMj+6z8cMprX8ol7 1SUJADGMX42jsJNz5lP2kMYcT3P9fk91bW/P2nTipYLnc6MH6Gxi3ZYIM3dOYTZY MVGOvkRwBKdP11H0uuTyExujYKKYSnNDA2jVb1jlwhueNDEpx/KbF0G/X7PX8PWH
- 45 名前:名無しさん@お腹いっぱい。 mailto:sage [03/09/29 21:54]
- zk/wc/L6xSvb6bnP793tZVI3exIqcS6wb4N6Ww8jdNXX7cTOuRDbT2ei4KfZUS9r
JYmmDIr5ZgN54I9ofIbN0/Q9vbrlYR7qC4wdz53u8Fv0Q3WrL9cMVGmV63X8VhVa SOvqQZy0uRtk7Xng41jCd8v0KfUqVBJRYasFeVLfl9N3EF2y7LitvpIwfc2h87K+ f0FieHCv75nd63156+JJ//JBH6F7DQXMXW6bHzaUcq7fndCyrscriE/30BFDALNF tYQaWkEti6SiZj7q5q7NFw/Z3FjxaYERdAla36Uz6q2vHA7cr7vP3p6+9Q1S66Q7 A4b0mPNBe3ze7001Ev7trsA8+DLKRKs5bM+OczQyeVeU3J2t1/jDje1wvrZsRY2+ naWb6hqo7kr0xv59zP49KHtDSm/0nXFOvYPfby3TsLefV9VpE6JyLJ12HGh319zJ kgrJPJG1OsGJ9LMWQnD5MtoEjeN07tqMYRUeSmHer01Alx50bZBpDOJhDLzwnUTe +fnp02fPDg7+evDLJBH94nqaDeGx0b39M4259jDbt3Sm8WQfrz2onsR+H/g+aNwQ 2259F4FK+b7JWc3laegq9GtK/8zqrprCP8ZWZccdAQE5SoNwgNJA4iDzv7gbflQY JQRH3nXsnu93UwwJvh+4JYSdvpawymvCpunwrljZtuVrHA6A4m6jotowkcWRnuJr LDjObJw04eZGCq1DrFaTnxDbN+LWnF+ZPo8m11kMZ6/iNuv7l2UhXxGZbcp82zqN DQ4ZvwSnuaSpvbcN7mi0o/9ADeiPEhkYkr6r78jvNCm/IwTewjE2o0kSIf8+sH6g Vbgzz+lmmVB9AMzayhm9j9kHHb2j2IB6Dt4+qFo+7lcd90FdtsPDiFwKfp0lrcv0 /wV3LINvtjEAAA== ----END BASE64---- はじめてマイナーモードを作ってみました。dired で上下2画面に割って、下 側にファイルの内容を表示するものです。なんか、禿しくガイシュツな気もす るのですが、習作ということで許してやってください。 ホントは画像も表示させるつもりでしたが、 www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=thumbs を見て落ち込みましたので、とりあえず保留さしてもらいます。 人の環境で動くかどうか不安なんですが。
- 46 名前:名無しさん@お腹いっぱい。 mailto:sage [03/09/30 00:38]
- >>45
insert-file-contents を使ってファイルの前の方だけを読み込むようにして、 大きいファイルも表示できるようにした方がいい。 そうするとコード変換がちょっと面倒だけどね。
- 47 名前:45 mailto:sage [03/09/30 08:11]
- >>46
ナルホドです。 そうすれば読み込みの時間も減らせますね。 暇を見つけてやってみます。 :: bf-mode 切 でもディレクトリ移動時にbf-mode 入 になってしまう不具合 :: を見つけてしまいますた。すんまそん。これも暇みつけて直しまふ。
- 48 名前:名無しさん@お腹いっぱい。 mailto:sage [03/09/30 11:46]
- >45
どっかで見たと思ったら広瀬さんのelisp本で やってたやつだ。
- 49 名前:45 mailto:sage [03/09/30 12:42]
- >>48
やっぱり既出でしたか。 「やさしいEmacs‐Lisp講座」でしょうか。 関係ないんですが、探してるうちに www.gentei.org/~yuuji/lispmind/ へたどり着きました。 コンスセルを「トロッコ」と「連結器」に例えているのが、すごく面白くて納 得しつつ爆笑してしまいました。このシリーズ、再開してホスィです。 あ、また脱線していく。
- 50 名前:46 mailto:sage [03/09/30 13:59]
- 大昔に作ったことがあったけど、元のアイデアは「秀見え」からだった。
ttp://hide.maruo.co.jp/software/index.html diredの標準だと、n/C-n/Down, p/C-p/Up にそれぞれ同じキーバインディングがあるので、 どれかに表示する機能をバインドすればいいだけ。
- 51 名前:名無しさん@お腹いっぱい。 mailto:sage [03/09/30 22:28]
-
'((spec ((:char-spec ascii :height any)))) の"height:"ってなんですか? Lispのマニュアルに載ってますか?
- 52 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/01 04:08]
- >51
それMeadowのフォント設定じゃない? だったらそれはMeadow独自だから、 EmacsLispのマニュアルには載って無い。
- 53 名前:厨房な質問なんですが。 mailto:sage [03/10/01 13:47]
- emacs ユーザーのスキルレベルというのはどんなもんなんでしょうか。
僕はぼんやりとですが、 初心者 寄せ集めでも.emacsを作れて、キーバインドができる 初級者 正規表現を操れて、簡単なelispが書ける 中級車 listを自由自在に操れて、人の書いたelispを書き直せる 上級者 マイナーモードやメジャーモードをスクラッチから書ける こういうもんかなと思ってますが。 実際のところ、どうなんでしょう>上級者の方々 教えていただけると、励みになりますんで。ひとつ。
- 54 名前:厨房な質問なんですが。 mailto:sage [03/10/01 13:49]
- × 中級車
○ 中級者 でした。 僕はまだまだ軽四レベルです。
- 55 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/01 16:31]
- >>53
変なことを知りたがるなー メジャーモードは簡単だから中級者だね。広瀬さんのページでも見てね。 上級者には ccl も求められるかも。 あと、XEmacs などの微妙な違い。
- 56 名前:厨房な質問なんですが。 mailto:sage [03/10/01 16:56]
- >>55
> メジャーモードは簡単だから中級者だね。 マジスカ。 cclなんてとてもなんで、当分中級を目指します。 道は険しいなぁ…
- 57 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/01 16:57]
- 別に階級付けしなくても。
> 人の書いたelispを書き直せる こんなん、元のlisp次第だしさ。
- 58 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/01 19:41]
- 中級は尊い
- 59 名前:名無しさん@お腹いっぱい。 [03/10/01 22:45]
- >>52
いや、Meadowのフォント設定の例なのはわかっているんですけど、 :heightとかの lispの言語的にどーいう扱いかと。 lisp modeではhighlightされるし、なんか特別な扱いがあるのかと? 誰か教えてください。
- 60 名前:kaoru mailto:sage [03/10/02 00:23]
- >>59
変数として評価すると自身を返すシンボル。 : が頭についているシンボルについてくわしく知りたいなら keyword-symbols-constant-flag の docstring でも見てくださいな。 t や nil とは微妙に違う、こんなことをしたときに。 (setq t t) (setq :foo :foo) > 中級は尊い
- 61 名前:59 mailto:sage [03/10/02 23:09]
-
>>60 なるほどです。 そのまんま、constantなsymbolなのですね。 これを使う側が、 (:char-spec ascii :height any) なんかで、リストの次の中身が何なのか、判断しているのですね。 ("char-spec" ascii "height" any) だと、文字列だから遅いんですか? lispでは、 (eq :hage :hage) は純粋にsymbolの比較onlyだから”軽い”ってことですか?
- 62 名前:kaoru mailto:sage [03/10/03 17:01]
- >>61
その手のやつは plist-get を使ってると思うんで docstring でも見てくださいな。 (plist-get '(nnsoup pink) 'nnsoup) => pink (plist-get '(:nnsoup pink) :nnsoup) => pink (plist-get '("nnsoup" pink) "nnsoup") => nil 中級は尊い
- 63 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/03 21:37]
- >>62
59 じゃないけど質問です。 plist で、普通のシンボルじゃなくって :hoge とかをよく使うのはなんでですか? 自分では、わかりやすいからなのかなーとか思ってます。
- 64 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/03 21:48]
- It's fukin' CLism.
- 65 名前:59 mailto:sage [03/10/03 23:46]
-
>>62 あぁ、なるほどね。 ありがとうございます。 すっきりしました。 もう一度Emacs Lispマニュアル読み直しに逝ってくるでつ。
- 66 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/04 21:55]
- 長い文字列をコピーすることが多いので、こんなのを作ってみました。
一応、C-u で コピー時に含める文字を追加できます。 デフォルトの状態で[と]を区切文字にできないのがちょっとナニですが。 (defvar my-copy-word-include-chars "a-zA-z0-9\-") (defun my-copy-word (&optional arg) (interactive "P") (let ((skip-chars (concat my-copy-word-include-chars (when arg (read-string "inc. chars: ")))) beg end str) (save-excursion (skip-chars-backward skip-chars) (setq beg (point)) (skip-chars-forward skip-chars) (setq end (point))) (setq str (buffer-substring-no-properties beg end)) (kill-new str) (message "copied \"%s\"" str) )) ;; (global-set-key [?\C-=] 'my-copy-word)とか
- 67 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/05 03:05]
- 自分以外に便利だと思う人がいるとは思えないけど
(defun my-recenter (&optional arg) (interactive "P") (if (equal last-command 'recenter) (recenter 0) (recenter arg) (setq this-command 'recenter)))
- 68 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/05 03:25]
- >>67
いちお簡単に機能ぐらい書いといたほうが。 equal は eq でいいね。 last-command が recenter と my-recenterの間で トグルするのを利用するわけか。
- 69 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/05 13:03]
- >>67
reposition-window ってのもあるけどな。
- 70 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/05 13:26]
- >>67
これを機会に docstring 書く癖つけれ
- 71 名前:66 mailto:sage [03/10/05 18:14]
- >>68,70
あ、僕もですね。肝心な説明を書いてませんでした。 >>66 は ポイント付近の語をkill-ringにコピーします。 docstringは、さしずめ "Copy a word at near the point to kill-ring." といったところでしょうか。 細かい説明書きは英語ではつらい…ボソ
- 72 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/06 09:40]
- ----BEGIN BASE64----(auto-vc-checkin.el.gz)
H4sICAy4gD8AA2F1dG8tdmMtY2hlY2tpbi5lbAClVk1v2zgQPSdA/sPAl0jbyknR WwwUcINFsUCQFmnaRY8UObK5kUiHpOTqsr+9Q4p0VNtx3NZIAEnz9ebN40izGbDW 6aLjBV8if5BqijUURREeN8xJDtGwKKSC1qKAjp+dzmb+f18w1w1aWEu3hPn7zx9v vtz/ffMNbj/Cv/O7u/nt/bdpiLxfSgtWV27NDAJdC2mdkWXrqEKrBBpwS4QPt1/g Ayo0rIZPbVkTnhvJUVmkND7RDK5106ByzPRXw6MhN/1V2hzuo2i0wAHP9chKofgd eYCiFUfADk0PQpMdLOuwKNuqQjOlSrpdLF9Dr9uQhTMFTPzXWkfomfupZsi01Gto mOrBSU+T0yHfdEPoP8o6VtdXmwefWp/KNyNr4klRRK2ZKFbMLc8Jn5AGudOmfw1M CSh7h34Eq+DtQFYhi0BLfmIKMCenVciJxE9d67VvCr+vDFortbJDDWrIwP8XU2wY t0/w/C8z+NhSNjjfmn7+5GLRPW6LozCcGs6BfFCxkvCtl+hH4QGQ7YVo3j0fTbZN dFTlaOYb8t/uYf1AxTBprlvlirJPT+FtPrCRxCcwyY5EZaBjRnp4Z6eZwIrujkz7 5vLsFGDy123blJSm7H/SjlfyIMIQCLraamWSP1/QM6dkHfNrVdANNMho1luuiVqt 4Prr54NJ/TB/Oend9eGkfDjKIel878ElXraCLjp+Mah0MoCJ+wD8OiFthKPu+av1 ggBayxb4pBA6a32AFCZI0kejaNX8yhTh0nfUsAcsUljcD0WtqcDOORnFpsLBQuXB 6NZJFeu2aqes0MWYjiz3PWcBN+NOdjg8qNFBlkU6n6OZXE+ykvEHpJ2QkX1zHeH7 lVMo1iBkvDUGvWKDJfc/X4hKca3EcOmPHk34Kg3M7xg13FBX0SfL8BFSoXNyj3nI Eg70Hp15mCM5HYHOKxPGXaZwwnFU/BCV1DIJsSQjqfYo58QlLjwBdG6eCNCq7vf2 TV4v9B1W2h/3/TsdaBqbuaK3HSi6JKGlDpxPnzzzJF0mOnohp0UUoQz6jabRc8hY RVLdWRFBu8xF9QZC4ts5qiwJemtrZm+K4/arh3tCef5U7gldRgtlR8mwM+MwBFlB 9g52sB/cCidxGFLxGpmNJAZrNL70ziJuXh2qMRTx3wZ6vGEHmlZGL1QqdHgH5cfi uczzSGTQjcK4l8cyUAJGR5VU5PP57x04H7lNOp5Wtv8aoPXjAXdSPPNNsvc7leIs kNJJYT8A6fvoYgYLAAA= ----END BASE64----
- 73 名前:72 mailto:sage [03/10/06 09:41]
- >>72
CVS or RCSをvc で使用時、ついついチェックインを忘れてしまい、古い版が 欲しいときに戻せないという歯がゆい思いをしました。 これを防ぐためにファイルセーブx回に1回は自動的にチェックインするelisp を書いてみました。要vcで、CVSと RCSにしか対応していません。 使うには .emacsに以下を追加します。 (require 'auto-vc-checkin) (setq auto-vc-checkin-rcs t) ;; RCSで有効にする (setq auto-vc-checkin-cvs t) ;; CVSで有効にする ;; 例:セーブ3回につき、1回チェックイン (setq auto-vc-checkin-save-count-by-checkin 3) RCSの場合はチェックインと同時にチェックアウトしますので、初回チェック アウト後はCVSと同じような使用感になると思います。 なお、auto-save-buffers.elを使ってる場合は処理待ち増大で操作不能になる 可能性があるかもです。リビジョン番号肥大にも要注意です。 あと、複数メンバーのプロジェクトでは使わないほうが無難だと思います。
- 74 名前:72 mailto:sage [03/10/06 09:50]
- >>73
× RCSの場合はチェックインと同時にチェックアウトしますので ○ RCSの場合はチェックイン直後にチェックアウトしますので でし。
- 75 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/11 15:31]
- いいんだけど、check inしたらアンドゥ情報が失われるというのはちょっと…
- 76 名前:72 mailto:sage [03/10/13 19:49]
- 確かに、です。
vc がよく分かってないままに書いたのがいけなかったです。 もちょっと調べます。
- 77 名前:名無しさん@お腹いっぱい。 [03/10/14 07:00]
- modeによってshow-paren-mode を切り替えたいのですが
lispがわかりません どのような設定になるのでしょうか?
- 78 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/14 07:05]
- (add-hook 'foobar-mode (function (lambda () (show-paren-mode 1))))
- 79 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/14 08:44]
- >>78
(add-hook 'foobar-mode-hook #'(lambda () (show-paren-mode 1))) でしょ? foobar-mode でなく foobar-mode-hook と。一般的にですが。
- 80 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/14 17:11]
- 78-79 有難う御座います
- 81 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/16 07:53]
- 初心者 寄せ集めでも.emacsを作れて、キーバインドができる
初級者 正規表現を操れて、簡単なelispが書ける listを自由自在に操れて、人の書いたelispを書き直せる マイナーモードやメジャーモードをスクラッチから書ける 中級者 Emacsにパッチをあてはじめる 上級者 Emacsをスクラッチから書ける
- 82 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/16 16:29]
- 中級は尊い。
- 83 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/16 17:58]
- >>79
> (add-hook 'foobar-mode-hook #'(lambda () (show-paren-mode 1))) (add-hook 'foobar-mode-hook (lambda () (show-paren-mode 1))) ではないの? (defmacro lambda (&rest cdr) : (list 'function (cons 'lambda cdr))) だじょ。
- 84 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/16 18:18]
- >>83
訂正するほどじゃない。
- 85 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/16 18:21]
- スタイルの問題でしょ。emacs/lisp/*.el 見ても両方使われてる。
- 86 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/16 18:42]
- #' を付けるほうが好きだけど、
nemacsからも利用する設定ファイルには使えない悲しさ。
- 87 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/16 19:01]
- >81 漏れはいまだ初心者でつね
- 88 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/18 01:53]
- >>81
上級者というのはxyzzyの亀井さんくらいのレベルなのか…。 道は遠い…というより一生かかってもムリ
- 89 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/18 21:16]
- 初心者 寄せ集めでも女を集めて、ハーレム を作れる
初級者 性器表現を操れて、簡単なエロ本が書ける チムポを自由自在に操れて、人に汚された女を調教し直せる S モードや M モードをスクラッチから調教できる 中級者 少女の頃から育成をはじめる 上級者 女を卵子から作り始める
- 90 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/18 21:25]
- >>89
はい、それから〜
- 91 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/18 21:34]
- 定義厨は失せて。
- 92 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/21 14:05]
- >>91
なんか Emacsスレのほうに飛び火してるみたいだが。
- 93 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/21 19:38]
- >>89
初心者のハードルやけに高いな、おい。
- 94 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/22 10:54]
- >>85
> スタイルの問題でしょ。emacs/lisp/*.el 見ても両方使われてる。 www.mew.org/~kazu/doc/elisp/function.html
- 95 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/22 11:11]
- >>94
結局「スタイルの問題」じゃないの?
- 96 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/22 11:26]
- >94
kazuのeispは信じられない程アレなので参考にならない。
- 97 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/22 11:43]
- #' ではなく ' を使うと、バイトコンパイルされない場合がある。ってことでしょ。
- 98 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/22 11:51]
- >>96
あ、mew 使ってないんでよく知らないんだけどどのへんがアレなの?
- 99 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/22 13:34]
- >>97
でもこのスレでは生のlambdaと functionで囲んだのだけ扱ってて、 quoteは関係無かったからさ。なのに 94が変な反応するから。
- 100 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/23 12:00]
- 今日、はじめて包囲アドバイスなるものを使ってみマスタ。
強力すぎてちょっと怖いけど、試しに ;; デフォルト動作でそのウィンドウも消すようにする。 (defadvice quit-window (around kill-window-adv activate) "quit-window with kill selected window" (unless (ad-get-arg 1) (ad-set-arg 1 (selected-window))) ad-do-it) こんな風なのを書いてみた。 たとえばapropos のウィンドウで q したときなんかはウィンドウが消えてくれます。 コレ一発で vc の log ウィンドウなんかもそんな挙動になってくれるからスゴイ楽でし。 でもやっぱし怖いす。
- 101 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/23 14:51]
- 包囲アドバイスって訳語は、日本語infoで使われちゃっていますけど、
あまり良さそうに思えないですね。語感が合わなくて。
- 102 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/24 06:20]
- >>96
> kazuのeispは信じられない程アレなので参考にならない。 どのへんが?
- 103 名前: ◆kXMewIMy86 mailto:sage [03/10/24 06:28]
- ま、いろいろとね。。。
- 104 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/24 08:30]
- >>103
FUD?
- 105 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/24 12:41]
- >>104
そうとも言いきれなさそうだから困る。 リスト遊びの評判もだが。
- 106 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/24 14:45]
- >>105
広瀬さんの本はどう?
- 107 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/24 17:10]
- 「リスト遊び」は純粋にとても良かったと思うが。
mewは使ってないからコードの評価はしないけど。
- 108 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/24 20:33]
- 2章を頭からちょっと読んでみたが
- nil を偽値として紹介した直後に not でなく null を紹介。 その後で空リスト。 偽値と空リストがごっちゃになってる taste がしてイヤでつ。 同じ lisp ばかりじゃねえんだぞと。 - predicate は「述語」でなしに「断言する」でよかったんだっけか? - "\n" が改行文字にすりかわるのは評価じゃなくてリーダーの問題だろ \n ならいいけど \\ が出てきたらこんな理解で困るんじゃないか。 regexp を扱うようになったらパニックだろ。 とか考えた漏れは逝ってよしでつか
- 109 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/24 20:50]
- でつ
- 110 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/24 20:54]
- >>108
> 同じ lisp ばかりじゃねえんだぞと。 違う Lisp 知らない。教えて。 Scheme は Lisp じゃないし。
- 111 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/25 09:12]
- >>99
まだ理解できていないようで・・・
- 112 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/25 09:30]
- >>111
あのー、罵倒されても構いませんから、 (lambda ...) と (function (lambda ...)) で具体的に何が変わってくるのか、 もうちょっと詳しく教えてください。 俺の理解では、バイトコンパイルされてしまえば同じ。 そのままだったら、functionのほうがマクロ展開ないぶん、 微妙に速いかもしれない(俺の勝手な推測)というところなんですが。 # quoteの場合が違うのは分かっています。
- 113 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/25 14:44]
- それでいいんじゃないの? 個人的には (lambda ...) よりも #'(lambda ...)
のほうがパッと見たときにわかりやすいので好み。
- 114 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/26 10:49]
- 時間がかかる処理をしていて、何かキーが押されたら中断する、ということを
考えています。試しに下のようなのを書いてみました。 (defun g () (interactive) (let ((i 0)) (while t (setq i (1+ i)) (when (input-pending-p) (keyboard-quit))))) これはうまくいきました。 今、やりたいのは 上記のwhile部分がブラックボックス扱いのときで、 (defun heavy-proc () (let ((i 0)) (while t (setq i (1+ i))) i)) という関数の中身を変更せずに、呼び出した後でキー入力があれば中断して戻 るということがしたいのです。割り込みのような感じです。 (defun f2 () (interactive) (condition-case nil (heavy-proc) ..... とやればいいのかなと思ったのですが、肝心のキーが押されたらエラーを発生 するやり方がさっぱり見当がつかないのです。 なにか良い方法を知っておられましたら、教えてやってくださいまし。
- 115 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/26 11:42]
- >>114
condition-case で quit 取るんじゃだめなん?
- 116 名前:114 mailto:sage [03/10/26 18:05]
- >>115
アドバイスありがとうございます。 (defun heavy-proc () (let ((i 0)) (while t (setq i (1+ i))) i)) (defun f2 () (interactive) (condition-case nil (heavy-proc) ((quit) (message "aborted.")))) こういうことでしょうか。 これだと、C-g以外のキーを押したときは中断できません。 もうちょっと練ってみます。
- 117 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/27 01:23]
- 全てのキーに signal発生させるよう設定したキーマップ使用すれば
いけるかも? signalの代わりに throwでもいいけど。
- 118 名前:114 mailto:sage [03/10/27 09:49]
- >>117
試しにこうしてみましたが… (defvar tmp-map nil "temporary key map for aborting.") (defun f2 () (interactive) (let ((previous-keymap (copy-keymap (current-local-map)))) (if tmp-map nil (setq tmp-map (make-sparse-keymap)) (define-key tmp-map "a" 'keyboard-quit) (define-key tmp-map "b" 'keyboard-quit) (define-key tmp-map "c" 'keyboard-quit)) (use-local-map tmp-map) (condition-case nil (heavy-proc) ((quit) (message "aborted."))) (use-local-map previous-keymap))) 中断してくれない(^^;
- 119 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/27 10:25]
- うーん、自分で bindした keyboard-quitと
C-g は扱いが違うって事なのかな?
- 120 名前:114 mailto:sage [03/10/27 11:47]
- >>119
今度は以下のようにsignalを使ってみましたが… (defvar tmp-map nil "temporary key map for aborting.") (defun my-quit () (interactive) (signal 'quit nil)) (defun f2 () (interactive) (let ((previous-keymap (copy-keymap (current-local-map)))) (if tmp-map nil (setq tmp-map (make-sparse-keymap)) (define-key tmp-map "a" 'my-quit)) (use-local-map tmp-map) (condition-case nil (heavy-proc) ((quit) (message "aborted."))) (use-local-map previous-keymap))) 相変わらず、中断せずでした。 edebugで追いかけてみると、キーマップ自体は変わってくれているのですが、 heavy-procを呼び出したらC-g以外をセンスしてくれないような感じがします です。
- 121 名前:114 mailto:sage [03/10/27 12:30]
- 助言を元に調べました。
なんとなく分かってきた気がします。(気がするだけかも…) (defun heavy-proc () (let ((i 0)) (while t (setq i (1+ i))) i)) (defun f3 () (interactive) (let ((previous-keymap (copy-keymap (current-local-map))) (previous-input-mode (current-input-mode))) (set-input-mode t nil 0 ?a) (condition-case nil (heavy-proc) ((quit) (message "aborted."))) (use-local-map previous-keymap) (set-input-mode (car previous-input-mode) (nth 1 previous-input-mode) (nth 2 previous-input-mode) (nth 3 previous-input-mode)))) キーマップ再定義はせずに、上記のようにすると aキーで中断できるようにな りますた。あとはこれを全部のキー文字に割り当てれば、と考えたのですが… (set-input-mode t nil 0 '(?a ?b)) のような複数指定は不可 (set-input-mode t nil 0 nil) ではデフォルトのC-gになる の様です。…もはや手詰まりか…
- 122 名前:114 mailto:sage [03/10/28 10:24]
- ふと思い立って、
(keyboard-translate ?b ?\C-g) とかやってみましたが、やはり中断してくれませんね。 コマンドループ内でC-gというのはかなりの特別扱いの感じがします。 こんなローレベルな関数が効かないなんて…。 # emvaders.elとかどうやってるのかな。ゲームなら割り込みみたいな処理を してると思うんだけど。
- 123 名前:114 mailto:sage [03/10/28 10:53]
- emvaders.elでは input-pending-pで処理してますた。
ゲーム的にはこのやり方は納得です。 にしても、ハマりすぎです。 誰かお願いです。ひとつ叩いてやってください。ガツンと。
- 124 名前:114 mailto:sage [03/10/29 15:54]
- 苦肉の策として、「最後に押したキーで中断する」というのを考えてみました。
(defadvice heavy-proc (before input-set disable) (set-input-mode t nil 0 last-input-event)) (defun heavy-proc () (interactive) (let ((i 0)) (while t (setq i (1+ i))) i)) (defun f3 () (interactive) (let ((previous-input-mode (current-input-mode))) ;; enable advice (ad-enable-advice 'heavy-proc 'before 'input-set) (ad-activate 'heavy-proc) (condition-case nil (heavy-proc) ((quit) (message "aborted."))) ;; disable advice (ad-disable-advice 'heavy-proc 'before 'input-set) (ad-activate 'heavy-proc) (set-input-mode (car previous-input-mode) (nth 1 previous-input-mode) (nth 2 previous-input-mode) (nth 3 previous-input-mode)))) ややこしいやり方になってしまいました。
- 125 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/29 16:16]
- unwind-protect使ったほうがいいよ。
- 126 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/29 16:46]
- なぜ C-g で quit がいやなのかようわからんが、アドバイスせんでも
(let ((previous-input-mode (current-input-mode))) (unwind-protect (progn (apply #'set-input-mode `(,@(butlast previous-input-mode) ,last-input-event)) (heavy-proc)) (apply #'set-input-mode previous-input-mode))) でいいような。
- 127 名前:114 mailto:sage [03/10/29 17:56]
- >>125, 126
助言、ありがとうございます。 今まで、unwind-protect は実際にどういう場面で用いるのかわかりませんでしたが、 なんかわかったような気がしますです。 > なぜ C-g で quit がいやなのかようわからんが、 bf-mode.elというelispをいじくっているのですが、html をw3mで表示したと きに重いので、キャンセルの手段が欲しいと思ったのです。
|

|