元スレEmacs Part 42
emacs覧 / PC版 /みんなの評価 : △
901 = :
>>897
start-processとか普通にあるやん
902 = :
>>901
emacsとプロセスとのデータのやりとりは?
特にプロセスからemacsにデータとかわたせるの?しかも非同期にとか
903 = :
中身全然読んでないけど非同期IOはできるみたいだね
http://www.gnu.org/software/emacs/manual/html_node/elisp/Processes.html
905 = :
githubにdeffered.elとかあるけど使い方がよくわからん
同作者のemacs-epcとか使ってemacs外部と直接関数呼び出し、戻り値の形式でやり取りできたら面白そうと思ったけど
プロトコルがわからん
単に長さ付きのS式でやり取りしてるなっていうのはまぁわかるけど
906 = :
dbus.elを使えばデータの受け渡しなどはできそう。
907 = :
>>902
> >>901
> emacsとプロセスとのデータのやりとりは?
> 特にプロセスからemacsにデータとかわたせるの?しかも非同期にとか
立ち上げたプロセスと標準入出力でやり取りする。
send-process~とかあるよ。
あとはset-process-filterとかsentinelとか使えばやりとりできます。
908 = :
それが面倒だからわざわざdbus.elとか使うんだよなぁ…
非同期プロセス関連は長年メンテされてるelispでもバグだらけで
とても素人が使えるものじゃないって代物だわ
909 = :
>>908
> 非同期プロセス関連は長年メンテされてるelispでもバグだらけで
例えばどのelispだろう?そんなに酷くない気がするけど。
910 = :
vc.elとかgnus.elみたいな標準のでもバグ報告でしょっちゅうerror in process sentinelでてる
ためしにこのエラーメッセージで検索したらひっかかるわひっかかるわ
ノンブロッキングIOなんて昔からバグの温床だしそんなもんといえばそんなもんか
911 = :
buffer消しちゃったりしたときのアレかな。バグといっていいのかどうか。
Emacsが対話環境も提供する以上、ある程度は仕方ない気がする。
912 = :
>>908
> それが面倒だからわざわざdbus.elとか使うんだよなぁ…
ん、dbus.elってなに?全然しんらないんだけど・・。
913 = :
>>898
あざーっす。
試してみます。
914 = :
lispで質問です。
以下のようなリストがあるとします。
(hoge '(("a" a) ("b" b) ("b" b) ("b" b) ("c" c) ("b" b) ("b" b) ("b" b)))
このなかでシンボルcを持つエレメントをみつけて削除したいのですが、すごくめんどくさくて困ってます。
hogeの中身が連想リストの場合は
(setq hoge (delete (rassq 'c hoge) hoge)
ですむのですが、
hogeが連想リストじゃないので、rassqが使えません。
なので do をつかって
(let* ((hoge '(("a" a)
("b" b)
("b" b)
("b" b)
("c" c)
("b" b)
("b" b)
("b" b)))
find)
(do ((cnt 0 (1+ cnt)) ) ((or find (null (nth cnt hoge))) )
(when (setq find (eq 'c (car (cdr (nth cnt hoge)))))
(setq hoge (delete (nth cnt hoge) hoge))))
hoge)
といったコードになってしまいます。
もっとシンプルにできる方法はないでしょうか?
915 = :
>>914
("c" c) って要は ("c" . (c)) のことなんだから
eq?じゃなくてequal?を使うrassocの方を使って
(setq hoge (delete (rassoc '(c) hoge) hoge)
でいいんじゃないの?
918 = :
そもそも cons cell にしとけばいいのに
別にいいけど
919 = :
>>918
お前わかってねーな
920 = :
まーな
921 = :
>>899
できました。ありがとう俺!
922 = :
ある特定のメジャーモードで動いているとき、もしくは特定のバッファだけ、
ある既存関数の挙動を置き換えたいんですが方法ありますか?
defadviceとかだと、他のモードやバッファでの動作もかわっちゃいますよね。
923 = :
defadvice の先頭にメジャーモードの判定を入れるのはどう?
(defadvice hoge (around hoge-advice activate )
(if (eq major-mode 'huga-mode)
(なんか処理)
ad-do-it))
924 = :
defadviceしてその中でmajor-modeとか使って分岐すればいいじゃん。
925 = :
速さも中身でも負けた。完敗です。
926 = :
>>923
ありがとうございます。
これでいってみます。
929 = :
>>922
after-change-major-mode-hook とかでアドバイス自体を有効/無効にする
ってのはどうでしょ
ad-enable-regexp と ad-disable-regexp でまとめて切り替えられるし
930 = :
define-minor-modeでマイナーモード作ってるんですが
(my-minor-mode)
が呼ばれたときに、内部で条件判定を行ってモードをonにしたくないときってどうすればいいんでしょうか?
define-minor-modeのbody内部の記述だけでは無理?
931 = :
リストにあるファイルをstart-processに渡すdolistを書いていたのですが
ファイルがある一定数以上になると
Creating pipe: too many open files
といわれてしまいどう対処すべきかわかりません。
パイプ数を増やそうとおもってulimit -pしてみたのですが変更できないみたいです。
デフォではパイプが8ぽいので、ファイルが8までは大丈夫でそれを超えると上記のメッセージがでます。
パイプ数を変更できない場合は、どのように対処したらよいでしょうか?
932 = :
>>930
define-globalized-minor-mode あたり使うといいかも。
auto-complete-mode-maybe が参考になるはず。
あるいは (my-minor-mode -1) して関数内で強制的に off にするとかかな?
>>931
concurrent.el あたりを使えばできそうな気はする。
dolist の中で待ちが発生していいなら start-process じゃなくて call-process を使うべき。
933 = :
>>932
ありがとうございます。
>define-globalized-minor-mode
調べてみます。
>concurrent.el
こんな便利なのがあるんですね。
deferredとかも。
いろいろ使えそうなので見てみます。
>dolist の中で待ちが発生していいなら start-process じゃなくて call-process を使うべき。
待たせたくないので↑の方法でいってみます。
934 = :
make-variable-buffer-localで作成した変数を削除することはできませんか?
たとえば
(setq hoge 10)
(make-variable-buffer-local 'hoge)
(setq hoge 0)
(print hoge)
で 0 になり
(kill-local-variable 'hoge)
(print hoge)
10 になります。
しかしここで
(setq hoge 5)
を行うと、hogeはlocal-varになってしまうようです。
上のコードをdescrible-variableで確認すると
global > global + local > global > global + local
になっているようで、kill はあくまで現在の参照先をglobalにするだけで、
localの存在そのものを消しているわけではないような気がします。
これを完全に削除するにはどうしたらいいでしょうか?
936 = :
make-variable-buffer-local ではなく make-local-variable を使う
937 = :
>>936
外部パッケージでmake-variable-buffer-localされているので無理な状態です。
初期化関数内でmake-variable-buffer-localされているなら
defadviceでおきかえてmake-local-variableを使うようにできますが
関数外なのでそれも無理です。
938 = :
>>937
どうしたいのかいまいちわからんな。
具体的なパッケージの名前も出してみたら?
939 = :
>>938
emacs-clang-complete-asyncです。
c++-modeバッファ毎にclang-completeプロセスを常駐させるので
8個以上開くと、pipe errorになります。
これを回避するために、バッファ毎にプロセス作成しているのをやめて、
常に1つのみ常駐にして
window-configuration-change-hook
でウィンドウ切り替えを検出し、
selected-window
のバッファローカル変数のcflagsをプロセスに送信してコマンドライン更新を行うようにしたいのです。
ぶっちゃけ、パッケージソースのほうをいじってしまえば直ぐに終わるのですが
あまり外のを汚したくないので自分側でパッチを当ててます。
その一環で、プロセスオブジェクトを保存する変数が
make-variable-buffer-localされてしまっているのを
kill-local-variableして、globalにしようとして上記の書き込みになりました。
940 = :
>>938
ちょっと、パッケージのほうを書き換えて実験してみたんですが
window-configuration-change-hook
はあくまでサイズ変更とかでcallされるのであって
ウィンドウ選択だけでは呼ばれないのですね。
というわけで失敗・・。
C-x oでウィンドウを選択操作する毎に呼び出されるフックとかがあるといいのですが・・。
最悪 other-windowをdefadviceすればできますが・・。
other-windowだけでなく、
その他バッファをウィンドウに表示する関数や切り替え系をいろいろやらないと
どんなケースでもよろしく動くようにならない気がします。
とりあえず、可視ウィンドウでかつ選択されているバッファを取得して処理したい。
取得&処理したいタイミングは、それらに切り替わった瞬間。
ということですかね。
あちこちにdefadviceしたりせずにもっと、シンプルに扱える仕組みとかないですかね。
941 = :
とりあえずやりたいことは
defadvice select-window (after
で全て解決できました。
ただ、こういうbuilt-inのもっともよく使われる基底の関数をdefadviceするってどうなんですかね。
942 = :
>>937
(unintern 'hoge)
944 = :
勢いが足りない
945 = :
C-SPCでset-mark-commandして、マウスでキャレットを移動させた後にC-wでkill-regionしても動作しない。
C-SPCからキーボードでキャレット移動させた場合はきちんとkill-regionできるようにはできないですかね?
946 = :
emacsでwindows31Jって使えない?
ruby書いてる時に
Warning (mule): Invalid coding system `Windows-31J' is specified
for the current buffer/file by the :coding tag
って何回も出て来るんだけど
948 = :
>>945
24.3.1だと希望通りの動作です。
右ボタンだとどうなりますか?
950 = :
fletを使って既存の関数の挙動を変えたいんだけど、flet中で元の(オリジナルの)関数を呼びだすのってどうやればいいの?
例えば message を「与えられた引数にhogeを付け加えて表示する」に変える場合、愚直に
(flet ((original-message (str)
(message str))
(message (str)
(original-message (concat "hoge " str))))
(message "hello"))
とすると当然無限ループになってしまう。
みんなの評価 : △
類似してるかもしれないスレッド
- Emacs Part 40 (1001) - [92%] - 2012/9/7 0:30
- Emacs Part 47 (995) - [92%] - 2015/4/19 13:01
- Emacs Part 41 (1001) - [92%] - 2012/12/24 4:15
- Emacs Part 43 (1001) - [92%] - 2013/12/14 11:30
- Emacs Part 44 (1001) - [92%] - 2014/2/8 8:01 △
- Emacs Part 46 (984) - [92%] - 2014/12/24 14:15
- Emacs Part 45 (1001) - [92%] - 2014/6/23 9:45
- Emacs Part 48 (997) - [92%] - 2015/12/9 15:15
- Emacs Part 49 (974) - [92%] - 2016/12/7 9:45
- Emacs Part 32 (1001) - [92%] - 2009/12/20 2:04 ○
- Emacs Part 52 (984) - [92%] - 2021/5/13 1:45
- Emacs Part 53 (989) - [84%] - 2022/12/5 12:45
- Emacs Part 31 (1001) - [84%] - 2009/10/23 10:31 ○
- Emacs Part 33 (1001) - [84%] - 2010/3/9 20:01 ○
トップメニューへ / →のくす牧場書庫について