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

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

    emacs覧 / PC版 /
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter

    353 = :

    どうも、解決しました。
    (ここ結構人居るんですね)
    other-windowを組み合わせようとしてたんですが、
    これが引数とるのに気が付かなくて二重にはまってました。
    M-xから呼ぶときは引数いらないのに...いまだに意味不明です。

    354 = :

    (other-window ARG &optional ALL-FRAMES)
    だから引数は必要。
    M-x でいらない(ように見える)のは (interactive "p") で
    (prefix-numeric-value current-prefix-arg) が渡されるから。

    355 = :

    >>353
    要らない世話かも知れないけど>>354に補足すると
    (interactive "p") で渡っているのは ARG の方だけね

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

    詳しくは info を

    356 = :

    Lispはちょっと触った事あったんでいけるかと思ってたんですが、
    Emacsの仕様もあって結構難しいですね。
    ちょっと勉強してみます。

    357 = :

    (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 = :

    >>357
    はい。

    (with-temp-buffer
    (set-buffer-multibyte nil)
    (insert "a")
    (multibyte-string-p (buffer-substring-no-properties (point-min) (point-max))))
    => nil

    359 = :

    >>358
    むむ、なるほど、どうもです。
    じつは任意の buffer から substring してきた文字列に multibyte (とりあえ
    ずは日本語) が含まれてるかどうかを判定したいんですが、そんな場合はどう
    するのが常套手段なんでしょう。思い付いたのは↓なんですが

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

    (´・ω・`)

    360 = :

    (find-charset-string "abc")
    => (ascii)
    (find-charset-string "abcほげ")
    => (ascii japanese-jisx0208)

    (let ((str "あ"))
    (if (memq 'japanese-jisx0208 (find-charset-string str))
    "日本語あり"
    "日本語なし"))
    => "日本語あり"

    361 = :

    (re-search-forward "\\cj" (point-max) t)

    Emacs21 なら
    (re-search-forward "[[:nonascii:]]" (point-max) t)
    が使えたはず。

    362 = :

    Emacsのunibyte/multibyteってのはタダのバイト列として読むか
    なんらかのエンコーディングで表現された文字として読むかってとこで生じる。
    単に表現されたときに1バイトになるかってのは関係ない。

    363 = :

    >>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 = :

    はいはい。それはmake_string_from_bytesだからでしょ。
    それは考慮してるんじゃなくてunibyteにするかmutlibyteにするかっていう
    判定材料に使ってるだけだよ。
    その関数の使われるところがどういうところかも見れば自明だと思うんだけど。

    365 = :

    自日月

    366 = :

    >>364
    はいはい。じゃあ
    (multibyte-string-p (string 97)) => nil
    (multibyte-string-p (string 53794)) => t
    を説明してみ。

    367 = :

    アホだな。Fstringってmake_string_from_bytesを使ってる例でしかないじゃん。
    それはインタフェースからしてmultibyteかどうかの情報が与えられないから、
    multibyteかどうかを判定するのに文字の範囲から推定するしかできないからでしょ。

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

    まあソースコード読みなよ。
    Emacsでのunibyte/multibyteの扱いってものについて学習してらっしゃい。

    368 = :

    >>362
    > 単に表現されたときに1バイトになるかってのは関係ない。
    に対し、SINGLE_BYTE_CHAR_P でない文字を含む文字列は常に multibyte にな
    ると言ってるのに、SINGLE_BYTE_CHAR_P だけからなる文字列も multibyte に
    なり得ると反論してもしょうがないだろうに。

    369 = :

    > に対し、SINGLE_BYTE_CHAR_P でない文字を含む文字列は常に multibyte にな
    > る
    そこが問題なのか? 違うだろ。だって当たり前すぎるほど当たり前じゃん。
    >>363はタダのバイト列として読むんじゃなくてEmacsの内部表現で表現された
    文字列として読んでるんだから。

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

    370 = :

    >>366がどういう意図をもっているのか自分で説明すべきだろ。
    何を根拠に何を主張したいのか書かなきゃ単なる煽りの手口。

    371 = :

    >>360
    > (find-charset-string "abc")

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

    > (re-search-forward "\\cj" (point-max) t)
    うぼあ、なんたる初歩的ミス orz

    372 = :

    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 = :

    閑話休題。
    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 = :

    >>373
    おおぅ、ナイスです。
    ありがたく使わせていただきます。

    378 = :

    (defadvice next-error (after next-error-plus-alpha activate)
    (insert "OMOITSUKANAI"))
    定義してgrep+next-error実行しても, OMOITSUKANAIがバッファに挿入され
    ないのはどうしてなのだろうか

    379 = :

    >>378
    (with-current-buffer ) を抜けたあとだから。

    380 = :

    >>379 with-current-buffer 以後でも insert を可能にする方法は何
    かありますか?

    381 = :

    >>380
    with-current-buffer

    382 = :

    >>381
    (defadvice next-error (after next-error-plus-alpha activate)
     (with-current-buffer next-error-last-buffer
       (insert "OMOITSUKANAI")))

    なりませんけど・・・?

    383 = :

    >>382
    (when (setq next-error-last-buffer (next-error-find-buffer))
    ...

    384 = :

    >>383
    その中に入れても結局なりませんでした。。。

    385 = :

    >>384
    最新の Emacs だと grep バッファは読み込み専用だけど,あらかじめちゃんと
    書き込めるように対処はしてあるの?

    386 = :

    >>385
    書き込みしたいのは、次のエラー箇所が見つかったファイル (この場合はマッチするファイル)に
    なので、 *grep* バッファ上でではありません。。
    `next-error-last-buffer' がそのファイルじゃないのですか?

    388 = :

    emacs 21.4 を使っています。
    カーソル配下のtextのface取得方法が解からないので、教えてください。
    やりたいことは、特定の単語の色の変更では無く、
    その単語の所属するキーワードグループまるごと色を変更したい為、
    カーソル配下の単語から、faceを特定したいということです。

    お願いします。

    389 = :

    (get-text-property (point) 'face)

    390 = :

    >>389
    thx

    391 = :

    Emacs には「グラフ」データ構造の library がないように思えます。
    ここでプログラムしてみちゃってください。

    392 = :

    ム板でやると盛り上がると見た。

    393 = :

    >>392
    ここでよくない? こういうプログラミング練習の為にこのスレッドがあるんじゃないの?

    394 = :

    ライブラリ的なのはあっちっしょ。好きそうな人もいるし。

    395 = :

    cons と car と cdr で事足りる

    396 = :

    >>395
    おまえは、 「情報なんて 0 と 1 のみで事足りる」
    とでも言うのか?

    アホ。

    397 = :

    「ハッカーと画家」に
    car, cdr, cons, quote, cond, atom, eq
    だけで Lisp の関数は書けるとかって書いてあった。
    四則演算はどうやってやるんだ?

    398 = :

    (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 = :

    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 = :

    おいおまえら、知能ベースを elisp で書けよ。
    はやくしろ。


    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / emacs一覧へ
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

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


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