1

ユーザーがキーをタップするとループが停止するように、一連のコマンド ライン コマンドを emacs 内のループで実行したいと考えています。

これは、Emacs で ascii 'video' が表示され、キーを押すと停止するのを見るためです。

画像からASCIIへのテキストをコメントとして持つのは楽しいだろうと思いました(画像は私のMacのカメラからのものです)。

imagesnap を使用してカメラ画像を取得し、jp2a を使用して ascii に変換します。imagesnapはMacのみだと思います。これまでのコードは次のとおりです。

(defun ascii-video-comment ()                                                          
    "Makes video comment, requires imagemagick, jp2a, imagesnap"                        
    (interactive)                                                                       
    (shell-command "imagesnap -q ~/Desktop/emacs-snap.jpg")                             
    (insert (shell-command-to-string "jp2a --width=48 ~/Desktop/emacs-snap.jpg"))                                                                                                                                                               
    (shell-command "rm ~/Desktop/emacs-snap.jpg")                                       
) 

これは、カメラからスナップを取得し、ASCII に変換し、それをファイルに挿入して、カーソルを配置するだけです。

私が言うように、キーをタップして現在の「フレーム」を選択するまで、ループを続けて、遅いASCIIビデオのように見せたいと思います。

これは可能ですか?


編集

これは私の現在のコードで、かなり満足しています。20回ループし、キャンセル(Cg)で現在の画像を選択できます。ただし、2回目にするとうまくいかないようです。

(defun ascii-video-comment ()
 "Makes video comment, requires imagemagick, jp2a, imagesnap"
 (interactive)
 (cl-loop repeat 20 do
  (shell-command "imagesnap -q ~/Desktop/ascii-video-comment.jpg")
  (cua-set-mark)
  (insert (shell-command-to-string "jp2a --width=120 ~/Desktop/ascii-video-comment.jpg"))
  (shell-command "rm ~/Desktop/ascii-video-comment.jpg")
  (comment-region (mark) (point))
  (cua-set-mark)
  (pop-global-mark)
  (sit-for 0.1)
  (undo)
 )
)
4

3 に答える 3

2

EDIT「最終的なコード」について: Lisp プログラムで対話型コマンドを使用しないでください。コードは脆弱で非効率的になります。たとえば、shell-command( C-h f shell-command RET) のドキュメント文字列は明示的に次のように述べています。

Elisp では、より多くの制御を提供し、(引数を引用する必要がある) シェルの使用を強制しないため、呼び出しcall-processまたは 直接によってより適切に機能することがよくあります。start-process

また、delete-fileの代わりに使用し(shell-command "rm ...")ます。

cua-set-markpop-global-mark、および、特にundoプログラムでは使用しないでください。代わりに変数をバインドします。

(let ((beg (point)))
  (call-process "jp2a" nil t t "--width=120" "~/Desktop/ascii-video-comment.jpg")
  (comment-region beg (point))
  (sit-for 0.1)
  (delete-region beg (point)))
于 2013-03-20T15:59:52.730 に答える
1

while-no-inputとで入力を待つことができますsit-for

あなたが説明するユースケースでsit-forは、それが必要です。

&&2つのシェル呼び出しを組み合わせるか、シェルスクリプトを作成する必要があることに注意してください。

これは、必要なことを実行するおもちゃのコマンドですが、乱数を点滅させるだけです。

(defun flash-me ()
  "flash random number until you press a key"
  (interactive)
  (let ((beg (copy-marker (point)))
        (end (copy-marker (point) t)))
    (loop do (progn
               (delete-region beg end)
               (insert (shell-command-to-string "echo $RANDOM")))
          while (sit-for 1))
    (set-marker beg nil)
    (set-marker end nil)))
于 2013-03-20T14:53:23.420 に答える