私的良スレ書庫
不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitterでログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。
【叩かれて】Emacs Lisp道場【強くなれ】
emacs スレッド一覧へ / emacs とは? / 携帯版 / dat(gz)で取得 / トップメニューみんなの評価 : ○
レスフィルター : (試験中)
kill-ring-save は 'invisible 属性のテキストもコピーしてしまいますが、
'invisible 属性のない普通のテキストのみをコピーするようにするにはどうすれ
ば良いでしょうか?
'invisible 属性のない普通のテキストのみをコピーするようにするにはどうすれ
ば良いでしょうか?
>>649
Windows だったら CraftDrop と組み合わせればいけるよ。
Windows だったら CraftDrop と組み合わせればいけるよ。
>>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)))
でっちあげてみた。
ただ、複数の 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)))
複数の 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)))
(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)))
>>653-654 さん
お返事ありがとうございます。
多分その関数は 21.3 までなら動くでしょうが、22.* では動かないかと思います。
(22 では (get-char-property pos 'invisible) が invisible 属性のテキストに対してうまく機能しないので。)
まあでもなんとか自力でやりたいことを達成することができました。
お世話になりました
お返事ありがとうございます。
多分その関数は 21.3 までなら動くでしょうが、22.* では動かないかと思います。
(22 では (get-char-property pos 'invisible) が invisible 属性のテキストに対してうまく機能しないので。)
まあでもなんとか自力でやりたいことを達成することができました。
お世話になりました
>>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文字ずつ進まないようにしてるので、ここら辺はもうちょっと
速くなるかもしれません。
そうですよね。
;; [ 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文字ずつ進まないようにしてるので、ここら辺はもうちょっと
速くなるかもしれません。
1文字ずつ → 1文字ずつしか
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)))))
(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)))))
>>664san
やっぱり自分の環境ではその関数も全く機能しません。
emacs-version
=> GNU Emacs 22.0.50.1 (i386-mingw-nt5.1.2600)
of 2005-07-11 on A208752
やっぱり自分の環境ではその関数も全く機能しません。
emacs-version
=> GNU Emacs 22.0.50.1 (i386-mingw-nt5.1.2600)
of 2005-07-11 on A208752
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
だと期待どおりの動作をするが。
(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
だと期待どおりの動作をするが。
>>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)))))
はい、今評価してみた所、 "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)))))
もしかしてこーゆーこと?
(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)))))
(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)))))
>>668
そうそれです。完璧に動作しました! しかも速度も高速ですね。
buffer-invisibility-spec が鍵を握るのはわかって
いたのですが、今コードを解釈する時間がない為、連絡だけさせていただきました。
そうそれです。完璧に動作しました! しかも速度も高速ですね。
buffer-invisibility-spec が鍵を握るのはわかって
いたのですが、今コードを解釈する時間がない為、連絡だけさせていただきました。
少しわかりずらいな。
つまり、
(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"
となって欲しかったという事でいい?
つまり、
(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"
となって欲しかったという事でいい?
もしかすると text-property -> char-property で overlay が認識される
ことで解決したってことかも。
何にせよ、Emacs 22 だからというより設定のせいっぽいが。
(デフォルトでは buffer-invisibility-spec は 22 でも t だし
invisible な overlay も存在しない)
ことで解決したってことかも。
何にせよ、Emacs 22 だからというより設定のせいっぽいが。
(デフォルトでは buffer-invisibility-spec は 22 でも t だし
invisible な overlay も存在しない)
あるソフトウェア独自の簡単なスクリプト言語に対応するメジャーモードを作りたいのですが、
コメント部の色をかえるにはどうしたらいいのでしょうか?
コメントはC言語の /* が @cs に、*/ が @ce になったような感じです。複数行可。
comment-start と comment-endにそれぞれ値をセットするばいいだけというわけではないのでしょうか?
よろしくお願い致します。
コメント部の色をかえるにはどうしたらいいのでしょうか?
コメントはC言語の /* が @cs に、*/ が @ce になったような感じです。複数行可。
comment-start と comment-endにそれぞれ値をセットするばいいだけというわけではないのでしょうか?
よろしくお願い致します。
>>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))
それっぽく色を付けるならこんな感じかな。
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))
強引にやってみた。
複数行にマッチするのは 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))
複数行にマッチするのは 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))
非同期にHTTPサーバとXMLなどのデータをやりとりする仕組みで、
ユーザイベントに動的に反応して、半リアルタイムに挙動を変える
ようなUIのelispって何かある?
ユーザイベントに動的に反応して、半リアルタイムに挙動を変える
ようなUIのelispって何かある?
re-search-forward で「カーソルのある位置から」マッチさせることって出来ないの?
(looking-at REGEXP) 使ってみたけど、(match-string 0) 使ったら
(args-out-of-range 0 0) って言われた。
(looking-at REGEXP) 使ってみたけど、(match-string 0) 使ったら
(args-out-of-range 0 0) って言われた。
(with-temp-buffer
(insert "hoge")
(goto-char (point-min))
(and (looking-at "hoge") (match-string 0)))
=> "hoge"
(insert "hoge")
(goto-char (point-min))
(and (looking-at "hoge") (match-string 0)))
=> "hoge"
普通にre-search-forwardするのと、事前にチェックした(point)を組み合わせる。
save-excursion と save-current-buffer の使い分けはどうすればいい?
faceを少しだけ明るく(もしくは暗く)する関数ってないですか?
(color-values "color-name")した値を加工して、そのままset-face-backgroundしようとしたら
stringpじゃねぇよボケ、と言われました。何か良い方法はないでしょうか。
(color-values "color-name")した値を加工して、そのままset-face-backgroundしようとしたら
stringpじゃねぇよボケ、と言われました。何か良い方法はないでしょうか。
質問age
なんで実際に書いたコードを隠すんだ?
stringp云々って根本的におかしなことやったとしか思えないんだけど
stringp云々って根本的におかしなことやったとしか思えないんだけど
>>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))
根本的におかしいことやってるのは分かってるので、何か良い方法を教えてほしい、
という質問なんですが。
(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))
>>693
色は、"#00aaff"みたいにすればいいんだよ。
色は、"#00aaff"みたいにすればいいんだよ。
>>693
brighter
brighter
これでいいかな。
(defun more-bright-color (color)
(apply #'format
(append '("#%02x%02x%02x")
(mapcar '(lambda (n)
(floor (min 255 (/ (* n 1.1) 256))))
(color-values color)))))
(defun more-bright-color (color)
(apply #'format
(append '("#%02x%02x%02x")
(mapcar '(lambda (n)
(floor (min 255 (/ (* n 1.1) 256))))
(color-values color)))))
前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / emacs スレッド一覧へ
みんなの評価 : ○類似してるかもしれないスレッド
- 【熱く】お前のEmacsにはまった理由【語れ】 (577) - [36%] - 2021/8/28 17:30 ○
- 「Emacsは消滅すべき」、ゴスリング氏 (127) - [17%] - 2023/1/12 15:45
トップメニューへ / →のくす牧場書庫について