【叩かれて】Emacs Lisp道場【強くなれ】
emacs覧 / PC版 /みんなの評価 : ○
801 = :
xyzzy は Common Lisp じゃない。cl ですら実装されてるのに
(mapcar (lambda (x) (typecase x
(integer "整数")
(string "文字列")
(t "その他")))
'(10 3.3 "ほげ"))
こんなのが動かないし。
802 = :
>>801
それだけ?他にもあるでしょ。おせーて。
804 = :
>>798
insert-file-contents系で分けて読むとか、catあたりをstart-processしてfilterで読むとか。
テキストの場合マルチバイト文字の切れ目の処理が必要になるとちょっといやらしいかも
805 = :
>>801
適当だけど。
(defmacro?typecase?(check?&rest?type-list)
??(let?((#1=#:case))
???????(dolist?(item?(reverse?type-list)?#1#)
?????????(push?(if?(eq?(car?item)?t)
???????????????????`(t?,(cadr?item))
?????????????????`((subtypep?(type-of?,check)
?????????????????????????????',(car?item))
?????????????????????????????,(cadr?item)))
???????????????#1#))
????(cons?'cond?#1#)))
806 = :
あらら。。もう一回。
(defmacro typecase (check &rest type-list)
(let ((#1=#:case))
(dolist (item (reverse type-list) #1#)
(push (if (eq (car item) t)
`(t ,(cadr item))
`((subtypep (type-of ,check)
',(car item))
,(cadr item)))
#1#))
(cons 'cond #1#)))
807 = :
未編集のリードオンリーのバッファ上で、何かあるタイミングで、
recenter すると変更フラグが立つことがある。
という現象に遭遇した人いないですか、とか聞いてみようと思った。
が、recenter の前に、(sit-for 0) を入れたら解決したみたい。
808 = :
Emacs21とか22とかになると、デフォルトでいろんな機能が
組込まれてしまったので (occurとかgrepとか、検索もパワーアップしたり)、
新しい機能を作る機会が減って、最近このスレッドが寂しいのかなぁ、
などと思ったりした。
まとめサイトや紹介サイトも増えたしね。
ネタが出てくることを願って期待sage。
809 = :
ちまちまと一年以上かけて作ってきたが、とうとうやる気が無くなったので晒すテスト。
使い方はソース読んでくれ。
http://grinocat.googlepages.com/yawn.el
810 = :
ネ(・∀・)申!
811 = :
>>809
すげぇ。すげぇよ、あんた。
813 = :
この板の趣旨とは、ちょっと内容がずれてますが、教えて下さい。
shell-command-to-string 関数を使って、perl を呼び出そうとしていますが、
日本語引数を渡すとどこの段階でか分かりませんが、文字がばけます。
(shell-command-to-string "c:/Perl/bin/perl.exe e:/work/0my/scripts/test.pl てすと表示")
で、「test.pl」 では、
my $outfile = "e:/work/0my/scripts/test.txt";
my $out;
open ($out, "> $outfile") || die ("couldn't open $outfile to write into.");
print ($out $ARGV [0]);
close($out);
で、"test.txt" を shift_jis とかで開いても化けています。
DOS 上で日本語引数は、問題なく処理されるので、Elisp から、
perl に渡されるときに壊れると解釈していますが、どうすればいいのでしょう?
814 = :
>>813
> perl に渡されるときに壊れると解釈していますが、どうすればいいのでしょう?
表の後に\を付ける、とか?
815 = :
>>814
レスサンクス。
表のあとに\マークってことは、「てすと表\示」って感じにですか?
日本語文字は何を入れてもだめなので、それでもだめだと思います。
気になるのは、エンコーディングがどうやって認識されるかです。
elisp -> shell -> perl と引数として指定された文字列が渡されると思いますが、
このプログラム間のエンコードは、どうやって指定するのかが、よく分かりません。
おそらく日本語 OS 下では、デフォルトが shift_jis になると思いますが、
これは、elisp からシェルの間も同じかな?
816 = :
process-coding-system とか coding-system-for-write とか?
817 = :
>>816 さんありがとう
(setq coding-system-for-write 'sjis)
でうまくいきました。m(_ _)m
819 = :
>>818
この変数に対して値をグローバルに設定すべきではないということですね。
了解、let を使います。
820 = :
emacs上でschemeの勉強しているんですが、
emacsのコメント行のインデントのしかたが気に入らないので
直したいと思っているのですが、
どこから始めたらいいのか、
さっぱり分かりません。
とりあえず
scheme-modeが定義されている場所の調べ方を教えていただけませんか?
821 = :
>>820
> scheme-modeが定義されている場所の調べ方を教えていただけませんか?
find-function
> emacsのコメント行のインデントのしかたが気に入らないので
確かに comment-dwin は腐ってるからな
823 = :
初歩的な質問で聞き難いのですが教えて下さい。
バッファ中の文章の特定の文字を置き換えるようなコードを
作りたいのですが、condを使うのかifとprognを使うのかよく分かりません。
たとえば、文章中の”Red Hat”なら”赤帽”、”Vine”なら”葡萄”、”Windows”なら
”窓”というようにバッファ中の文章を変えたいです。
824 = :
>>823
replace-stringじゃだめなん?
825 = :
複数の文字列を一括して置換とかかな
826 = :
>>824
検索関数(search-forward)などでマッチした文字列を
replace-matchなどで変えようと思ったのですが、条件分岐が
よくわからなくて・・・
>>825
たぶん、そんな感じです。
827 = :
まずは仕様をきっちり決めれ。
「たぶん、そんな感じ」じゃなんだかわからん。
829 = :
ありがとうございます。もう少し読んでみます。
830 = :
レス下さった方々、どうもありがとうございました。
非常に無駄な処理をしていますが、望む結果が得られました。
(defun change-font ()
(interactive)
(let ((p (point)))
(goto-char (point-min))
(while (not (eobp))
(if (search-forward "Led Hat" nil t) (replace-match "赤帽")
(forward-line 1)))
(goto-char (point-min))
(while (not (eobp))
(if (search-forward "Vine" nil t) (replace-match "葡萄")
(forward-line 1)))
(goto-char (point-min))
(while (not (eobp))
(if (search-forward "Windows" nil t) (replace-match "窓")
(forward-line 1)))
(goto-char p)))
過去ログ読んで勉強してきます。
831 = :
一行に2回出てきたらだめじゃね?
832 = :
検索語を \\| で分けて match-string で抜き出し cond で振り分けろ
833 = :
>>831
いえ、ちゃんと置き換えてくれました。
>>832
ご教授ありがとうございます。しばらくにらめっこします。
834 = :
教授じゃなくて教示
835 = :
> >>833
> > 一行に2回出てきたらだめじゃね?
>>831
> いえ、ちゃんと置き換えてくれました。
ホントに?
試していないけど VineVine とかいう行があったらダメっぽく見える。
836 = :
`XWindows' も `X窓' になりそうだし、`divine' も `di葡萄' になりそう。
(後者は `case-fold-search' の値によるけど)
837 = :
>>835
>>836
ご指摘ありがとうございます。例外処理(?)を考えていませんでした。
まだ>>832さんの方法で出来ていないしどんだけバカなんだろ私・・・
838 = :
自分で頑張れてるのだから、頭が悪いとは思わないけどな。
やりつけないことは何でも最初は大変だ。
>>832, >>836とも正規表現が必要だし。
まず>>830の改善点としては(forward-line 1)、これは置換が終わったら次へ進む
ってことで入れたのだろうけど、次の行じゃなくて置換したテキストの直後に
移動すれば十分な筈。ところがreplace-match自身が
Leave point at the end of the replacement text.
という動作をしてくれる。
>>836は、正規表現を使うと「単語の先頭」という位置にだけ合うパターンが
使えるのでそれを使う。必要なら同様に「単語の末尾」というのも使える。
正規表現による検索はre-search-forward.
ここまでで一応、要求は満たされるんじゃないのかな。
>>832は正規表現を使うと「AまたはBまたはC」にマッチするパターンというのが
書ける。それで検索して、その後でそれがAだったかBだったかCだったかを調べ、
対応する文字列(A'なりB'なりC'なり)に置換するという方法。
これだとバッファの先頭から検索を始めるのが一回で済む。
840 = :
replace-regexp を使う。
842 = :
(defun foo (alist)
(let ((regexp (regexp-opt (mapcar #'car alist) 'words))
(table (make-hash-table :test 'equal))
(normalize (if case-fold-search #'downcase #'identity)))
(dolist (pair alist)
(puthash (funcall normalize (car pair)) (cdr pair) table))
(save-excursion
(while (re-search-forward regexp nil t)
(let ((new (gethash (funcall normalize (match-string 0)) table)))
(replace-match new))))))
844 = :
俺、elispでハッシュとか使ったことねーや
846 = :
論理的にはOKだけど、計算量がぜんぜん違うよ?
何かアルゴリズムの入門書を読んだほうがよさげ
847 = :
最近知ったんだけど、バイトコンパイルした結果って
直接実行もできるんだね。
(defun fn(x)
(* x 2))
(byte-compile 'fn)
#[(x) "\211\\\301\\\207" [x 0] 2]
(#[(x) "\211\\\301\\\207" [x 0] 2] 10)
20
848 = :
ワロタ
つくづくエディタなんだな
849 = :
つまらん
850 = :
お前等の中にシリコンバレーで働いてる人いる?
みんなの評価 : ○
類似してるかもしれないスレッド
- 【熱く】お前のEmacsにはまった理由【語れ】 (577) - [36%] - 2021/8/28 17:30 ○
- 「Emacsは消滅すべき」、ゴスリング氏 (127) - [17%] - 2023/1/12 15:45
トップメニューへ / →のくす牧場書庫について