1

WindozePCからVNC経由で複数のモニターでGNUEMACSを使用しています。

(現在、タブレットPCの5〜4の大きなモニター、1つの小さなモニター。2つの垂直1200x1920、2つの水平1920x1200、および小さなモニター。)

私が現在これを行っている方法は、各モニターで個別のVNCを実行することです。次に、単一のemacsを開き、make-frame-other-displayを使用して他のVNCウィンドウでemacsのフレームを開きます。

さらに複雑にするために、私は最新のUbuntuシステムでVNCを実行していますが、残りのビルドツールが存在する非常に古いマシンでemacsを実行しています。つまり、VNCディスプレイはemacsと同じマシンに対してローカルではありません。

xhost +ではなく、各VNCでxtermを開き、emacsを実行しているマシンにSSHで接続します。これにより、localhost:16.0の形式のDISPLAYSが作成されます。次に、これらのlocalhostDISPLAYを使用してmake-frame-on-displayを使用します。

これは混乱します。

xtermウィンドウに「echo$DISPLAY」を残しておくと役に立ちます。または、xtermのタイトルを変更します。

同様にEMACSのフレームのタイトルを変更して、各フレームの現在の表示を反映させたいと思います。しかし、やって

(defvar frame-title-specific-ag "emacs"
 "title element from frame-title-format that is specific to a particular emacs instance; andy glew")
(setq frame-title-format
  (list
    "frame=%F "
    (format "%s" frame-title-specific-ag)
    " " 'system-name
    " DISPLAY="
    (getenv "DISPLAY")
    " %b"
    " " (format "pid:%d" (emacs-pid))
    " user:"(user-login-name))
  )

emacs全体のDISPLAY変数のみを取得します。

Q:特定のフレームに関連付けられている表示を見つける方法はありますか?

4

2 に答える 2

3

現在のフレームの表示名を取得するには、次を使用します。

(frame-parameter nil 'display)

またはnil、特定のフレームに置き換えて、現在のディスプレイの代わりにそのディスプレイの名前を取得します。たとえば、これを使用して、タイトルに表示を表示します。

(setq frame-title-format
      '("DISPLAY=" (:eval (frame-parameter nil 'display))))

このフォームが完全に引用されていることが重要であることに注意してください。そのため、使用されるリストに:evalは、フレームタイトルをレンダリングするたびにコードを実行するようにEmacsに指示するリストがあります。それがないと、次のようなものを書きたくなるかもしれません。

(setq frame-title-format
      (list "DISPLAY=" (frame-parameter nil 'display)))

しかし、これは機能しません。問題は、このフォームが評価されるとすぐに関数呼び出しが発生し、その結果、特定の文字列を保持するリストが作成されることです。これは、この評価が行われたフレームの名前であり、文字列は魔法のように変更されません。

于 2012-07-02T21:07:25.697 に答える
-1

EliBarzilayは私たちに

(frame-parameter nil 'display)

そこまでの道のりの90%です。

以下は、現在選択されているフレームに関連付けられている表示をフレームタイトルに配置します。

(setq frame-title-format
  '(
     "DISPLAY="
     (:eval (frame-parameter nil 'display))
    )
  )

グリュー:これにより、フレームが作成された時点で(たとえば、make-frame-on-displayを介して)、現在選択されているフレームがタイトルに表示されます。これは別のフレームである可能性があるため、完全に異なる表示では、必ずしも必要なものとは限りません。

引用符で囲まれていない、評価されていない形式は、setqが評価されたときに、現在選択されているフレームの表示をタイトルに入れます。これは、求められているものよりもさらに少ないです。

これが私が最終的に得たものです:

デフォルトのframe-title-formatを上記のように設定しました。しかし、私は以下をフックするので、実際にはそれを使用しません:

(defun ag-set-frame-title (frame)
  "set frame-title to glew preference, optional arg FRAME / default nil (currently selected frame)"
  (interactive)
  ;; TBD: make-variable-frame-local is deprecated in more recent versions of emacs
  ;; than the antiquated version at my work. use modify-frame-parameters instead
  (let (x)
    (setq x
      (concat
    (or frame-title-specific-ag "emacs")
    " " system-name
    " DISPLAY=" (frame-parameter frame 'display)
    " " (format "pid:%d" (emacs-pid))
    " user:" (user-login-name)
    ;;" " (buffer-name)
    )
      )
    (modify-frame-parameters frame (list (cons 'title x)))
    )
  )

;; TBD: this old emacs does not have modern hooks
(setq after-make-frame-functions '(ag-set-frame-title))

適切な測定のために:

(defun ag-fix-frame-titles ()
  "run ag-set-frame-title on frame-lits"
  (interactive)
  (mapc 'ag-set-frame-title (frame-list))
  )
(ag-fix-frame-titles)

注:コメント文字列ごとに、ここで説明する修正は21.4.1などの古いバージョンのemacsでのみ必要になる可能性があります。@EliBarzilayは、彼が使用しているemacsのバージョンに関係なく必要ないと言っています。

皆さん、あなたが望むすべてのポイントを引きます。真実。

于 2012-07-03T06:00:08.810 に答える