Next: , Previous: Process Buffers, Up: Output from Processes   [Contents][Index]


36.9.2 ¥×¥í¥»¥¹¥Õ¥£¥ë¥¿´Ø¿ô

¥×¥í¥»¥¹¤Î¥Õ¥£¥ë¥¿´Ø¿ô¡Êfilter function¡Ë¤Ï¡¢ ÂбþÉÕ¤±¤é¤ì¤¿¥×¥í¥»¥¹¤«¤é¤Îɸ½à½ÐÎϤò¼õ¤±¼è¤ë´Ø¿ô¤Ç¤¹¡£ ¥×¥í¥»¥¹¤Ë¥Õ¥£¥ë¥¿¤¬¤¢¤ë¤È¡¢¤½¤Î¥×¥í¥»¥¹¤«¤é¤Î¤¹¤Ù¤Æ¤Î½ÐÎÏ¤Ï ¥Õ¥£¥ë¥¿¤ËÅϤµ¤ì¤Þ¤¹¡£ ¥×¥í¥»¥¹¤Ë¥Õ¥£¥ë¥¿¤¬¤Ê¤¤¾ì¹ç¤Ë¸Â¤Ã¤Æ¡¢ ¥×¥í¥»¥¹¤«¤é¤Î½ÐÎϸþ¤±¤Ë¥×¥í¥»¥¹¥Ð¥Ã¥Õ¥¡¤òľÀܻȤ¤¤Þ¤¹¡£

¥Õ¥£¥ë¥¿´Ø¿ô¤Ï¡¢Emacs¤¬¤Ê¤Ë¤«¤òÂԤäƤ¤¤ë¤È¤­¤Ë¤Î¤ß¸Æ¤Ð¤ì¤Þ¤¹¡£ ¤½¤Î¤è¤¦¤Ê´ü´Ö¤Ë¤Î¤ß¥×¥í¥»¥¹¤Î½ÐÎϤ¬ÅþÃ夹¤ë¤«¤é¤Ç¤¹¡£ Emacs¤¬ÂԤĤΤϡ¢Ã¼ËöÆþÎϤòÆÉ¤ó¤Ç¤¤¤ë¤È¤­¡¢ sit-for¤äsleep-for¤ò¼Â¹ÔÃæ¤Î¤È¤­¡Êsee Waiting¡Ë¡¢ accept-process-output¡Êsee Accepting Output¡Ë¤ò¼Â¹ÔÃæ¤Î¤È¤­¤Ç¤¹¡£

¥Õ¥£¥ë¥¿´Ø¿ô¤Ï2¤Ä¤Î°ú¿ô¡¢ ÂбþÉÕ¤±¤é¤ì¤¿¥×¥í¥»¥¹¤È¤½¤Î¥×¥í¥»¥¹¤«¤é¼õ¤±¼è¤Ã¤¿¤Ð¤«¤ê¤Î½ÐÎϤǤ¢¤ëʸ»úÎó¤ò ¼õ¤±¼è¤ê¤Þ¤¹¡£ ´Ø¿ô¤Ï½ÐÎϤËÂФ·¤Æ¤Ê¤Ë¤ò¹Ô¤Ã¤Æ¤â¤«¤Þ¤¤¤Þ¤»¤ó¡£

¥Õ¥£¥ë¥¿´Ø¿ô¤ÎÆâ¦¤Ç¤ÏÃæÃǤÏÉáÄ̤϶ػߤµ¤ì¤Æ¤¤¤Þ¤¹¡£ ¤µ¤â¤Ê¤¤¤È¡¢¥³¥Þ¥ó¥É¥ì¥Ù¥ë¤ÇÂǤä¿C-g¤Î¸ú²Ì¤ä¡¢ ¥æ¡¼¥¶¡¼¥³¥Þ¥ó¥É¤òÃæÃǤ¹¤ë¤¿¤á¤ËÂǤä¿C-g¤Î¸ú²Ì¤Ïͽ¬¤Ç¤­¤Þ¤»¤ó¡£ ¥Õ¥£¥ë¥¿´Ø¿ô¤ÎÆâ¦¤ÇÃæÃǤò¹Ô¤¤¤¿¤¤¾ì¹ç¤Ë¤Ï¡¢ inhibit-quit¤Ënil¤ò«Çû¤·¤Þ¤¹¡£ See Quitting¡£

¥Õ¥£¥ë¥¿´Ø¿ô¤Î¼Â¹ÔÃæ¤Ë¥¨¥é¡¼¤¬È¯À¸¤¹¤ë¤È¤½¤Î¥¨¥é¡¼¤Ï¼«Æ°Åª¤ËÊ᪤µ¤ì¡¢ ¥Õ¥£¥ë¥¿´Ø¿ô¤ò»Ïư¤·¤¿¤È¤­¤Ëư¤¤¤Æ¤¤¤¿ ¥×¥í¥°¥é¥à¤Î¼Â¹Ô¤òÄä»ß¤·¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£ ¤·¤«¤·¡¢debug-on-error¤¬nil°Ê³°¤Ç¤¢¤ë¤È¡¢ ¥¨¥é¡¼¤òÊ᪤·¤Þ¤»¤ó¡£ ¤³¤ì¤Ë¤è¤ê¡¢Lisp¥Ç¥Ð¥Ã¥¬¤Ç¥Õ¥£¥ë¥¿´Ø¿ô¤ò¥Ç¥Ð¥Ã¥°¤Ç¤­¤Þ¤¹¡£ See Debugger¡£

¿¤¯¤Î¥Õ¥£¥ë¥¿´Ø¿ô¤Ï¡¢¤È¤­¤É¤­¤¢¤ë¤¤¤Ï¤Ä¤Í¤Ë¡¢ ¥×¥í¥»¥¹¤Î¥Ð¥Ã¥Õ¥¡¤Ë¥Æ¥­¥¹¥È¤òÁÞÆþ¤·¤Þ¤¹¡£ ¤³¤ì¤Ï¥Õ¥£¥ë¥¿´Ø¿ô¤¬¤Ê¤¤¤È¤­¤ÎEmacs¤Îưºî¤òÌÏÊ魯¤ë¤â¤Î¤Ç¤¹¡£ ¤½¤Î¤è¤¦¤Ê¥Õ¥£¥ë¥¿´Ø¿ô¤Ç¤Ï¡¢ÂоݤΥХåե¡¤ËÁÞÆþ¤¹¤ë¤¿¤á¤Ë set-buffer¤ò»È¤¦É¬Íפ¬¤¢¤ê¤Þ¤¹¡£ ¥«¥ì¥ó¥È¥Ð¥Ã¥Õ¥¡¤ò¤Ê¤«¤Ð¹±µ×Ū¤ËÀÚ¤êÂØ¤¨¤Ê¤¤¤è¤¦¤Ë¡¢ ¤³¤ì¤é¤Î¥Õ¥£¥ë¥¿´Ø¿ô¤Ï¥«¥ì¥ó¥È¥Ð¥Ã¥Õ¥¡¤òµ­Ï¿¡¿Éü¸µ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ¥×¥í¥»¥¹¥Þ¡¼¥«¤ò¹¹¿·¤·¡¢É¬Íפ˱þ¤¸¤Æ¥Ý¥¤¥ó¥È¤ÎÃͤ⹹¿·¤·¤Þ¤¹¡£ ¤³¤ì¤é¤Ï¤Ä¤®¤Î¤è¤¦¤Ë¹Ô¤¤¤Þ¤¹¡£

(defun ordinary-insertion-filter (proc string)
  (with-current-buffer (process-buffer proc)
    (let ((moving (= (point) (process-mark proc))))
      (save-excursion
        ;; ¥Æ¥­¥¹¥È¤òÁÞÆþ¤·¡¢¥×¥í¥»¥¹¥Þ¡¼¥«¤ò¿Ê¤á¤ë
        (goto-char (process-mark proc))
        (insert string)
        (set-marker (process-mark proc) (point)))
      (if moving (goto-char (process-mark proc))))))

¥«¥ì¥ó¥È¥Ð¥Ã¥Õ¥¡¤òµ­Ï¿¡¿Éü¸µ¤¹¤ë¤¿¤á¤Ësave-excursion¤Ç¤Ï¤Ê¤¯ with-current-buffer¤ò»È¤¦¤Î¤Ï¡¢ 2ÈÖÌܤÎgoto-char¤Î¸Æ¤Ó½Ð¤·¤Ç¹Ô¤¦¥Ý¥¤¥ó¥È¤Î°Üư¸ú²Ì¤ò Í­¸ú¤Ë¤¹¤ë¤¿¤á¤Ç¤¹¡£

¿·¤¿¤Ë¥Æ¥­¥¹¥È¤¬ÅþÃ夹¤ë¤¿¤Ó¤Ë¥×¥í¥»¥¹¥Ð¥Ã¥Õ¥¡¤¬¸«¤¨¤ë¤è¤¦¤Ë ¥Õ¥£¥ë¥¿´Ø¿ô¤Ç¶¯À©¤¹¤ë¤Ë¤Ï¡¢ ¤Ä¤®¤Î¤è¤¦¤Ê¹Ô¤òwith-current-buffer¤ÎľÁ°¤ËÆþ¤ì¤Þ¤¹¡£

(display-buffer (process-buffer proc))

¥Ý¥¤¥ó¥È°ÌÃ֤˴ؤï¤é¤º¤Ë¿·¤¿¤Ê½ÐÎϤÎËöÈø¤Ë¥Ý¥¤¥ó¥È¤ò°Üư¤¹¤ë¤Ë¤Ï¡¢ ÊÑ¿ômoving¤òºï½ü¤·¤Æ¡¢ ̵¾ò·ï¤Ëgoto-char¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£

Emacs¤Î½é´ü¤ÎÈǤǤϡ¢Àµµ¬É½¸½¤òõº÷¤·¤¿¤ê°ìÃ×½èÍý¤¹¤ë¥Õ¥£¥ë¥¿´Ø¿ô¤Ç¤Ï¡¢ ¥Þ¥Ã¥Á¥Ç¡¼¥¿¤òÌÀ¼¨Åª¤ËÊݸ¡¿Éü¸µ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤·¤¿¡£ º£¤ÎEmacs¤Ï¡¢¥Õ¥£¥ë¥¿´Ø¿ô¤ËÂФ·¤Æ¤Ï¤³¤ì¤ò¼«Æ°Åª¤Ë¹Ô¤¤¤Þ¤¹¤«¤é¡¢ ¥Õ¥£¥ë¥¿´Ø¿ô¤ÇÌÀ¼¨Åª¤Ë¹Ô¤¦É¬ÍפϤ¢¤ê¤Þ¤»¤ó¡£ See Match Data¡£

¥×¥í¥»¥¹¤Î¥Ð¥Ã¥Õ¥¡¤Ë½ÐÎϤò½ñ¤­¹þ¤à¥Õ¥£¥ë¥¿´Ø¿ô¤Ï¡¢ ¤½¤Î¥Ð¥Ã¥Õ¥¡¤¬Í­¸ú¤Ç¤¢¤ë¤«¤É¤¦¤«¤ò¸¡ºº¤¹¤ë¤Ù¤­¤Ç¤¹¡£ ̵¸ú¤Ê¥Ð¥Ã¥Õ¥¡¤ËÁÞÆþ¤·¤è¤¦¤È¤¹¤ë¤È¥¨¥é¡¼¤Ë¤Ê¤ê¤Þ¤¹¡£ ¥Ð¥Ã¥Õ¥¡¤¬Ìµ¸ú¤Ç¤¢¤ì¤Ð¡¢ ¼°(buffer-name (process-buffer process)) ¤ò¼Â¹Ô¤¹¤ë¤Ènil¤òÊÖ¤·¤Þ¤¹¡£

´Ø¿ô¤ËÅϤµ¤ì¤ë½ÐÎϤÏǤ°Õ¤Î¥µ¥¤¥º¤Î²ô¤Ç¤­¤Þ¤¹¡£ Ʊ¤¸½ÐÎϤò2²óÀ¸À®¤¹¤ë¥×¥í¥°¥é¥à¤Ï¡¢ ¤¢¤ë¤È¤­¤Ë¤Ï°ìÅÙ¤Ë200ʸ»ú¤Î²ô¤ò1¤ÄÁ÷¤ë¾ì¹ç¤â¤¢¤ì¤Ð¡¢ 40ʸ»ú¤Î²ô¤ò5¤ÄÁ÷¤ë¾ì¹ç¤â¤¢¤ê¤Þ¤¹¡£ ¥µ¥Ö¥×¥í¥»¥¹¤Î½ÐÎϤ«¤éÆÃÄê¤Î¥Æ¥­¥¹¥Èʸ»úÎó¤òõ¤¹¥Õ¥£¥ë¥¿¤Ç¤Ï¡¢ ¤½¤Î¤è¤¦¤Êʸ»úÎó¤¬2¤Ä¤«¤½¤ì°Ê¾å¤Î½ÐÎϤβô¤Ëʬ³ä¤µ¤ì¤ë¾ì¹ç¤â °·¤¨¤ë¤è¤¦¤Ë¤·¤Þ¤¹¡£

Function: set-process-filter process filter

¤³¤Î´Ø¿ô¤Ï¡¢¥×¥í¥»¥¹process¤Ë¥Õ¥£¥ë¥¿´Ø¿ôfilter¤ò»ØÄꤹ¤ë¡£ filter¤¬nil¤Ç¤¢¤ë¤È¡¢¥×¥í¥»¥¹¤Ë¥Õ¥£¥ë¥¿¤Ï¤Ê¤¤¡£

Function: process-filter process

¤³¤Î´Ø¿ô¤Ï¡¢¥×¥í¥»¥¹process¤Î¥Õ¥£¥ë¥¿´Ø¿ô¤òÊÖ¤¹¡£ ¤¢¤ë¤¤¤Ï¡¢¥Õ¥£¥ë¥¿´Ø¿ô¤¬¤Ê¤±¤ì¤Ðnil¤òÊÖ¤¹¡£

¥Õ¥£¥ë¥¿´Ø¿ô¤Î»ÈÍÑÎã¤ò¤Ä¤®¤Ë¼¨¤·¤Þ¤¹¡£

(defun keep-output (process output)
   (setq kept (cons output kept)))
     ⇒ keep-output
(setq kept nil)
     ⇒ nil
(set-process-filter (get-process "shell") 'keep-output)
     ⇒ keep-output
(process-send-string "shell" "ls ~/other\n")
     ⇒ nil
kept
     ⇒ ("lewis@slug[8] % "
"FINAL-W87-SHORT.MSS    backup.otl              kolstad.mss~
address.txt             backup.psf              kolstad.psf
backup.bib~             david.mss               resume-Dec-86.mss~
backup.err              david.psf               resume-Dec.psf
backup.mss              dland                   syllabus.mss
"
"#backups.mss#          backup.mss~             kolstad.mss
")