のくす牧場
コンテンツ
牧場内検索
カウンタ
総計:127,062,825人
昨日: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
    651 : 名無しさん@お腹 - 2005/10/27(木) 13:49:43 (+9,-30,-33)
    kill-ring-save は 'invisible 属性のテキストもコピーしてしまいますが、
    'invisible 属性のない普通のテキストのみをコピーするようにするにはどうすれ
    ば良いでしょうか?
    652 : 名無しさん@お腹 - 2005/10/28(金) 01:25:52 (+33,-29,-2)
    >>649
    Windows だったら CraftDrop と組み合わせればいけるよ。
    653 : 名無しさん@お腹 - 2005/10/28(金) 02:15:52 (+10,-30,-284)
    >>651
    でっちあげてみた。
    ただ、複数の invisible 属性があるような場合だとうまく動かない。
    たとえばこんなの
    (concat "a" (propertize "b" 'invisible 'test1) (propertize "c" 'invisible 'test2) "d")

    (defun kill-ring-save-without-invisible (beg end)
    (interactive "r")
    (kill-ring-save beg end)
    (let ((kill (car kill-ring))
    new-kill pos)
    (when (get-text-property 0 'invisible kill)
    (setq kill
    (substring kill
    (or (next-single-property-change 0 'invisible kill)
    (length kill)))))
    (while (setq pos (next-single-property-change 0 'invisible kill))
    (setq new-kill (concat new-kill (substring kill 0 pos)))
    (setq kill
    (substring kill
    (or (next-single-property-change pos 'invisible kill)
    (length kill)))))
    (setq new-kill (concat new-kill kill))
    (kill-new new-kill t)))
    654 : 名無しさん@お腹 - 2005/10/28(金) 05:44:14 (+3,-30,-194)
    複数の invisible 属性に対応してみた。

    (defun kill-ring-save-without-invisible (beg end)
    (interactive "r")
    (kill-ring-save beg end)
    (let ((kill (car kill-ring))
    (pos 0)
    new-kill)
    (while (> (length kill) 0)
    (setq pos (or (next-single-property-change 0 'invisible kill)
    (length kill)))
    (unless (get-text-property 0 'invisible kill)
    (setq new-kill (concat new-kill (substring kill 0 pos))))
    (setq kill (substring kill pos)))
    (kill-new new-kill t)))
    655 : 名無しさん@お腹 - 2005/10/28(金) 10:25:41 (+62,+29,-24)
    >>652

    だんな!

    このご恩は一生わすれませんぜ!
    マウス使わないでOKなとこもGoodですぜ!
    656 : 名無しさん@お腹 - 2005/10/28(金) 13:03:48 (+52,+29,-15)
    どこが道場なんだ?
    657 : 名無しさん@お腹 - 2005/10/28(金) 13:28:05 (+38,+20,+0)
    ここ。
    658 : 名無しさん@お腹 - 2005/10/28(金) 14:03:40 (+42,+24,+0)
    六三郎
    659 : 名無しさん@お腹 - 2005/10/28(金) 15:52:28 (+88,-30,-30)
    >>653-654 さん
    お返事ありがとうございます。

    多分その関数は 21.3 までなら動くでしょうが、22.* では動かないかと思います。
    (22 では (get-char-property pos 'invisible) が invisible 属性のテキストに対してうまく機能しないので。)

    まあでもなんとか自力でやりたいことを達成することができました。
    お世話になりました
    660 : 名無しさん@お腹 - 2005/10/28(金) 16:08:26 (+8,-26,-17)
    んじゃ22で動くようにしたものを貼ってよう。giveはするがtakeはしない?
    661 : 名無しさん@お腹 - 2005/10/28(金) 16:09:02 (+13,-14,-1)
    まちがった、giveとtakeが逆だった……orz
    662 : 659 - 2005/10/29(土) 00:04:49 (+17,-30,-229)
    >>660 san
    そうですよね。

    ;; [ 2005-10-28 (00:38) ]
    (defun kill-ring-save-visible (beg end)
    (interactive "r" )
    (let ((s "") from to)
    (save-excursion
    (save-restriction
    (narrow-to-region beg end)
    (setq from (goto-char (point-min)))
    (while (not (eobp))
    (if (point-invisible-p)
    (progn
    (setq to (point))
    (setq s (concat s (buffer-substring-no-properties from to)))
    (end-of-visible-line)
    (setq from (point)))
    (forward-char)))
    (if (> (setq to (point)) from)
    (setq s (concat s (buffer-substring-no-properties from to))))
    (kill-new s)))))

    invisible になるまで1文字ずつ進まないようにしてるので、ここら辺はもうちょっと
    速くなるかもしれません。
    663 : 659 - 2005/10/29(土) 00:06:03 (-6,-29,-2)
    1文字ずつ → 1文字ずつしか
    664 : 名無しさん@お腹 - 2005/10/29(土) 02:29:21 (+9,-30,-127)
    22 で確認
    (defun kill-ring-save-visible (begin end)
    (interactive "r")
    (let ((r '()) (p begin) n)
    (while (and (setq n (next-single-property-change p 'invisible nil end))
    (> n p))
    (unless (get-text-property p 'invisible)
    (push (buffer-substring p n) r))
    (setq p n))
    (kill-new (apply #'concat (nreverse r)))))
    665 : 659 - 2005/10/29(土) 14:06:12 (+4,-30,-67)
    >>664san
    やっぱり自分の環境ではその関数も全く機能しません。

    emacs-version
    => GNU Emacs 22.0.50.1 (i386-mingw-nt5.1.2600)
    of 2005-07-11 on A208752
    666 : 名無しさん@お腹 - 2005/10/29(土) 18:56:32 (+9,-30,-301)
    next-single-property-change が nil を返した時の処理が抜けてるせいかな。
    (defun remove-invisible (s)
    (interactive "r")
    (let ((r '()) (p 0) n)
    (while (and (setq n (next-single-property-change p 'invisible s))
    (> n p))
    (unless (get-text-property p 'invisible s)
    (push (substring s p n) r))
    (setq p n))
    (unless (get-text-property p 'invisible s)
    (push (substring s p) r))
    (apply #'concat (nreverse r))))
    (remove-invisible (concat "a" (propertize "b" 'invisible 'test1) (propertize "c" 'invisible 'test2) "d"))
    => "ad"
    になる?
    GNU Emacs 22.0.50.2 (i386-unknown-freebsd6.0, X toolkit, Xaw3d scroll bars) of 2005-10-29
    だと期待どおりの動作をするが。
    667 : 659 - 2005/10/29(土) 20:35:40 (+5,-30,-173)
    >>666
    はい、今評価してみた所、 "ad" になりました。

    >>662 に追加:
    すみません、肝心な関数を貼るのが抜けていました。 >>662 の側に置いてあげて下さい。

    (defun point-invisible-p ()
    (line-move-invisible-p (point)))


    ↑でも使用してある通り、 `line-move-invisible-p' であれば invisible をうまく見つける
    ことができるのですけどね。。。

    (defun line-move-invisible-p (pos)
    "Return non-nil if the character after POS is currently invisible."
    (let ((prop (get-char-property pos 'invisible)))
    (if (eq buffer-invisibility-spec t)
    prop
    (or (memq prop buffer-invisibility-spec)
    (assq prop buffer-invisibility-spec)))))


    668 : 名無しさん@お腹 - 2005/10/29(土) 23:16:07 (+9,-30,-277)
    もしかしてこーゆーこと?
    (defun invisible-p (position &optional object)
    (let ((invisible (get-char-property position 'invisible object)))
    (if (eq buffer-invisibility-spec t)
    invisible
    (catch :result
    (dolist (prop (if (consp invisible) invisible (list invisible)))
    (when (or (memq prop buffer-invisibility-spec)
    (assq prop buffer-invisibility-spec))
    (throw :result t)))))))

    (defun kill-ring-save-visible (begin end)
    (interactive "r")
    (let ((r '()) (p begin) n)
    (while (and (setq n (next-single-char-property-change p 'invisible
    nil end))
    (> n p))
    (unless (invisible-p p)
    (push (buffer-substring p n) r))
    (setq p n))
    (unless (invisible-p p)
    (push (buffer-substring p end) r))
    (kill-new (apply #'concat (nreverse r)))))
    669 : 659 - 2005/10/30(日) 05:21:17 (+4,-29,-51)
    >>668
    そうそれです。完璧に動作しました! しかも速度も高速ですね。
    buffer-invisibility-spec が鍵を握るのはわかって
    いたのですが、今コードを解釈する時間がない為、連絡だけさせていただきました。
    670 : 名無しさん@お腹 - 2005/10/30(日) 06:24:23 (+79,+29,-11)
    >>659 で言っていたうまく機能しないと言うのは見えているものまで一緒に消えちゃっ
    ていたと言う事でOK?
    671 : 670 - 2005/10/30(日) 06:34:20 (+3,-30,-111)
    少しわかりずらいな。
    つまり、
    (with-current-buffer (window-buffer (display-buffer (get-buffer-create "*test*")))
    (erase-buffer)
    (add-to-invisibility-spec '(test1 . t))
    (insert (concat "a" (propertize "b" 'invisible 'test1) (propertize "c" 'invisible 'test2) "d")))
    をした結果の *test* buffer の中身に対して kill-ring-save-visible を実行した結果が
    => "acd"

    となって欲しかったという事でいい?
    672 : 名無しさん@お腹 - 2005/10/30(日) 19:48:20 (+3,-30,-45)
    もしかすると text-property -> char-property で overlay が認識される
    ことで解決したってことかも。
    何にせよ、Emacs 22 だからというより設定のせいっぽいが。
    (デフォルトでは buffer-invisibility-spec は 22 でも t だし
    invisible な overlay も存在しない)
    673 : 名無しさん@お腹 - 2005/10/30(日) 22:50:13 (+0,-30,-102)
    あるソフトウェア独自の簡単なスクリプト言語に対応するメジャーモードを作りたいのですが、
    コメント部の色をかえるにはどうしたらいいのでしょうか?
    コメントはC言語の /* が @cs に、*/ が @ce になったような感じです。複数行可。
    comment-start と comment-endにそれぞれ値をセットするばいいだけというわけではないのでしょうか?
    よろしくお願い致します。
    674 : 名無しさん@お腹 - 2005/10/31(月) 11:27:48 (-6,-29,+1)
    Emacs Lisp神社
    675 : 名無しさん@お腹 - 2005/11/01(火) 02:51:02 (+0,+0,+0)
    >>673
    それっぽく色を付けるならこんな感じかな。
    modify-syntax-entry でコメント開始/終了文字の1文字目と2文字目を指定する。
    実は Emacs で3文字以上からなるコメント文字を扱うのは結構面倒臭い。
    どこかにお手軽に扱える elisp が転がってないかな?

    (defvar hoge-mode-syntax-table nil)
    (unless hoge-mode-syntax-table
    (setq hoge-mode-syntax-table (make-syntax-table))
    (modify-syntax-entry ?@ ". 13" hoge-mode-syntax-table)
    (modify-syntax-entry ?c ". 24" hoge-mode-syntax-table))
    (defvar hoge-font-lock-keywards nil)
    (defun hoge-mode ()
    (interactive)
    (kill-all-local-variables)
    (setq comment-start "@cs")
    (setq comment-end "@ce")
    (set-syntax-table hoge-mode-syntax-table)
    (set (make-local-variable 'font-lock-defaults) '(hoge-font-lock-keywards))
    (setq mode-name "Hoge")
    (setq major-mode 'hoge-mode))

    676 : 675 - 2005/11/01(火) 03:17:06 (+0,+0,+0)
    強引にやってみた。
    複数行にマッチするのは font-lock で激しくすすめられてないっぽいけど、おーけー
    としとく。
    実は hoge-font-lock-comment-matcher は内部で comment-start, comment-end を使う
    ようにすると色んな mode で使えて嬉しいかもしれないとか思った。

    (defvar hoge-font-lock-keywards nil)
    (defvar hoge-font-lock-syntax-keywords '((hoge-font-lock-comment-matcher (1 "!") (2 "!"))))

    (defun hoge-font-lock-comment-matcher (limit)
    (let (beg end)
    (when (re-search-forward "@cs" limit t)
    (setq beg (cons (copy-marker (match-beginning 0))
    (copy-marker (match-end 0))))
    (when (re-search-forward "@ce" limit t)
    (setq end (cons (copy-marker (match-beginning 0))
    (copy-marker (match-end 0))))
    (set-match-data
    (list (car beg) (cdr end) (car beg) (cdr beg) (car end) (cdr end)))
    t))))

    (defun hoge-mode ()
    (interactive)
    (kill-all-local-variables)
    (setq comment-start "@cs")
    (setq comment-end "@ce")
    (set (make-local-variable 'font-lock-defaults) '(hoge-font-lock-keywards))
    (set (make-local-variable 'font-lock-syntactic-keywords) hoge-font-lock-syntax-keywords)
    (setq mode-name "Hoge")
    (setq major-mode 'hoge-mode))
    677 : 名無しさん@お腹 - 2005/11/01(火) 21:34:42 (+8,-29,-75)
    非同期にHTTPサーバとXMLなどのデータをやりとりする仕組みで、
    ユーザイベントに動的に反応して、半リアルタイムに挙動を変える
    ようなUIのelispって何かある?
    678 : 名無しさん@お腹 - 2005/11/01(火) 21:46:00 (-1,-28,-13)
    ajax ですか?
    679 : 名無しさん@お腹 - 2005/11/01(火) 23:08:31 (-2,-29,+0)
    emacs-w3m
    680 : 677 - 2005/11/02(水) 13:49:44 (-2,-29,-72)
    >>678
    Ajaxのelisp版を想定中。alax? aelax?

    >>679
    少なくとも現状のままでは、「非同期」ではなく動的ではないと思う。
    681 : 名無しさん@お腹 - 2005/11/02(水) 14:24:42 (-11,-29,+0)
    slime
    682 : 名無しさん@お腹 - 2005/11/12(土) 21:34:51 (+0,-29,-19)
    リストを連結する関数は何ですか。
    RubyでいうとArray#joinです。
    683 : 名無しさん@お腹 - 2005/11/12(土) 22:39:40 (-6,-29,+1)
    >>682
    mapconcat
    684 : 名無しさん@お腹 - 2005/11/16(水) 14:10:37 (+3,-30,-60)
    re-search-forward で「カーソルのある位置から」マッチさせることって出来ないの?

    (looking-at REGEXP) 使ってみたけど、(match-string 0) 使ったら
    (args-out-of-range 0 0) って言われた。
    685 : 名無しさん@お腹 - 2005/11/16(水) 18:23:41 (+3,-30,-53)
    (with-temp-buffer
    (insert "hoge")
    (goto-char (point-min))
    (and (looking-at "hoge") (match-string 0)))
    => "hoge"
    686 : 名無しさん@お腹 - 2005/11/17(木) 00:03:45 (-1,-29,-25)
    普通にre-search-forwardするのと、事前にチェックした(point)を組み合わせる。
    687 : 名無しさん@お腹 - 2005/11/17(木) 03:08:58 (-2,-30,-12)
    save-excursion と save-current-buffer の使い分けはどうすればいい?
    688 : 名無しさん@お腹 - 2005/11/17(木) 04:04:48 (+18,-29,+0)
    pointやmarkをどうするか次第
    689 : 名無しさん@お腹 - 2005/11/18(金) 11:51:29 (+13,-30,-53)
    faceを少しだけ明るく(もしくは暗く)する関数ってないですか?
    (color-values "color-name")した値を加工して、そのままset-face-backgroundしようとしたら
    stringpじゃねぇよボケ、と言われました。何か良い方法はないでしょうか。
    690 : 689 - 2005/11/18(金) 11:51:57 (-9,-27,+0)
    質問age
    691 : 名無しさん@お腹 - 2005/11/18(金) 12:18:02 (-8,-26,+0)
    28秒
    692 : 名無しさん@お腹 - 2005/11/18(金) 12:34:04 (+64,+29,-26)
    なんで実際に書いたコードを隠すんだ?
    stringp云々って根本的におかしなことやったとしか思えないんだけど
    693 : 688 - 2005/11/18(金) 13:31:54 (+17,-30,-179)
    >>692
    根本的におかしいことやってるのは分かってるので、何か良い方法を教えてほしい、
    という質問なんですが。

    (defun more-bright-color (color)
    (mapcar '(lambda (n) (* n * 1.1)) (color-values color))
    )

    (make-face 'brightly-face)
    (set-face-background 'brightly-face (more-bright-color "khaki"))

    > Debugger entered--Lisp error: (wrong-type-argument stringp (65535 65021 39578))
    694 : 名無しさん@お腹 - 2005/11/18(金) 13:42:01 (+34,-29,+0)
    >>693
    色は、"#00aaff"みたいにすればいいんだよ。
    695 : 名無しさん@お腹 - 2005/11/18(金) 13:46:07 (-4,-29,+1)
    >>693
    brighter
    696 : 名無しさん@お腹 - 2005/11/18(金) 14:11:42 (+84,-30,-78)
    これでいいかな。

    (defun more-bright-color (color)
    (apply #'format
    (append '("#%02x%02x%02x")
    (mapcar '(lambda (n)
    (floor (min 255 (/ (* n 1.1) 256))))
    (color-values color)))))
    697 : 688 - 2005/11/18(金) 14:16:40 (+63,+29,-9)
    >>694
    なるほど。

    >>696
    今手元で同じような関数が出来た。目的を達成することが出来ました。
    ありがとう。
    698 : 名無しさん@お腹 - 2005/11/18(金) 15:45:49 (+7,-29,-14)
    >>696
    brighter だっつってんだろが。
    "more bright" なんて英語通じないっつーの
    699 : 名無しさん@お腹 - 2005/11/18(金) 16:01:04 (+52,+29,-4)
    不自然だと感じるけど通じるよ
    700 : 名無しさん@お腹 - 2005/11/18(金) 16:05:38 (+69,-29,-23)
    >>698
    "brighter" とだけレスされても日本語通じないっつーの。
    「brighter だと英語としておかしい」とキチンと書けばいいのに。
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / emacs スレッド一覧へ
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

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


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