「o」を使用してdired / ibufferから別のフレームに開く方法


8

2つのウィンドウを開いて縦に分割しています(単一フレーム)。

A)自分の作品を含む
B)diredまたはibufferを含む

ペインBでファイル/バッファに移動し、ペインAでファイルを開いて「o」を押すことができるようにしたいのですが、これは可能ですか?現在、emacsはペインAの下部にファイルを開くための新しいペインを作成しています。

編集:ユーザーの法律家によれば、上記の動作はフレームが大きい場合に発生します。これは私には当てはまるように見えます。なぜなら、私は(外付けモニターではなく、より小さなフレームで)家にいるので、emacsが思い通りに動作しているからです。現在の質問は、現在のフレームが大きいときにemacsが新しいウィンドウを開かないようにすることはできますか?


1
Emacsベータフォーラムへようこそ。Emacsの専門用語/専門用語の一部としてwindow、同じ内のバッファー象限を指すためにこの単語を使用しframeます。A frameは子猫の全体像であると考えられており、中には多くのウィンドウがあり得る。Emacsは複数のフレームを生成でき、各フレームは複数のウィンドウを含みます。
弁護士

説明してくれてありがとう!私は長い間emacsユーザーでしたが、用語を完全には理解していません。
ロバート

回答:


6

ここでは4つ(4)サンプルのカスタムdisplay-bufferカスタムユーザーの特定のニーズに合うように調整することができる機能のファミリ- の上以下 ; ; - バッファのinteractive現在の行のファイルまたはディレクトリを表示する4つの関数がありますdired-mode。条件は3つしかありません。 (a)ターゲットバッファを表示するウィンドウがすでにある場合は、それを選択します。(b)利用可能な望ましい方向にウィンドウがある場合は、それを使用します。(c)キャッチオールは、他の条件が満たされない場合に、目的の方向に新しいウィンドウを作成することです。

使用法:

M-x dired-display-above

M-x dired-display-below

M-x dired-display-left

M-x dired-display-right

そこ非常に多くのキーバインディングは、すでにビルトインへdired-modedired+、私は自分を作るしようとしないあえてこと。ユーザーは自分のキーボードショートカットを自由に選択できますが、これはこの限定的な例の範囲を超えています。

ユーザーはdisplay-buffer、関数のサンプルファミリーに条件を追加して、より多くの状況を処理することができます。

(defun my-display-buffer-below (buffer alist)
"Doc-string."
  (let (
      (window
        (cond
          ((get-buffer-window buffer (selected-frame)))
          ((window-in-direction 'below))
          (t
            (split-window (selected-window) nil 'below)))))
    (window--display-buffer buffer window 'window alist display-buffer-mark-dedicated)
    window))

(defun my-display-buffer-above (buffer alist)
"Doc-string."
  (let (
      (window
        (cond
          ((get-buffer-window buffer (selected-frame)))
          ((window-in-direction 'above))
          (t
            (split-window (selected-window) nil 'above)))))
    (window--display-buffer buffer window 'window alist display-buffer-mark-dedicated)
    window))

(defun my-display-buffer-left (buffer alist)
"Doc-string."
  (let (
      (window
        (cond
          ((get-buffer-window buffer (selected-frame)))
          ((window-in-direction 'left))
          (t
            (split-window (selected-window) nil 'left)))))
    (window--display-buffer buffer window 'window alist display-buffer-mark-dedicated)
    window))

(defun my-display-buffer-right (buffer alist)
"Doc-string."
  (let (
      (window
        (cond
          ((get-buffer-window buffer (selected-frame)))
          ((window-in-direction 'right))
          (t
            (split-window (selected-window) nil 'right)))))
    (window--display-buffer buffer window 'window alist display-buffer-mark-dedicated)
    window))

(defun dired-display-above ()
"Doc-string."
(interactive)
  (let* (
      (file-or-dir (dired-get-file-for-visit))
      (buffer (find-file-noselect file-or-dir)))
    (my-display-buffer-above buffer nil)))

(defun dired-display-below ()
"Doc-string."
(interactive)
  (let* (
      (file-or-dir (dired-get-file-for-visit))
      (buffer (find-file-noselect file-or-dir)))
    (my-display-buffer-below buffer nil)))

(defun dired-display-left ()
"Doc-string."
(interactive)
  (let* (
      (file-or-dir (dired-get-file-for-visit))
      (buffer (find-file-noselect file-or-dir)))
    (my-display-buffer-left buffer nil)))

(defun dired-display-right ()
"Doc-string."
(interactive)
  (let* (
      (file-or-dir (dired-get-file-for-visit))
      (buffer (find-file-noselect file-or-dir)))
    (my-display-buffer-right buffer nil)))

編集:上記のコンセプトの少し洗練された/楽しい実装を以下に示します。これにより、ユーザーはこれを非インタラクティブまたはインタラクティブに使用できます。例M-x dired-display-buffer--ユーザーがでファイルにdired-modeカーソルを合わせていない場合はディレクトリを選択し、表示方向(左、右、上、下)を選択するように求められます。

(defun my-display-buffer (buffer-or-name alist direction &optional size pixelwise)
"BUFFER:  The buffer that will be displayed.
ALIST:  See the doc-string of `display-buffer' for more information.
DIRECTION:  Must use one of these symbols:  'left 'right 'below 'above
SIZE:  See the doc-string for `split-window'.
PIXELWISE:  See the doc-string for `split-window'.
There are three possibilities:
-  (1) If a window on the frame already displays the target buffer,
then just reuse the same window.
-  (2) If there is already a window in the specified direction in relation
to the selected window, then display the target buffer in said window.
-  (3) If there is no window in the specified direction, then create one
in that direction and display the target buffer in said window."
  (let* ((buffer
           (if (bufferp buffer-or-name)
             buffer-or-name
             (get-buffer buffer-or-name)))
         (window
           (cond
             ((get-buffer-window buffer (selected-frame)))
             ((window-in-direction direction))
             (t
               (split-window (selected-window) size direction pixelwise)))))
    (window--display-buffer buffer window 'window alist display-buffer-mark-dedicated)
    window))

(defun dired-display-buffer (&optional direction alist)
"Display a dired-mode buffer or a file underneath point in a dired-mode buffer."
(interactive)
  (let* ((file-or-dir (or (and (eq major-mode 'dired-mode) (dired-get-file-for-visit))
                               (read-directory-name "Directory:  ")))
         (buffer (find-file-noselect file-or-dir))
         (direction
           (if direction
             direction
             (let ((char (read-char-exclusive (concat
                      "["
                      (propertize "l" 'face '(:foreground "red"))
                      "]"
                      (propertize "eft" 'face '(:foreground "blue"))
                      " | ["
                      (propertize "r" 'face '(:foreground "red"))
                      "]"
                      (propertize "ight" 'face '(:foreground "blue"))
                      " | ["
                      (propertize "a" 'face '(:foreground "red"))
                      "]"
                      (propertize "bove" 'face '(:foreground "blue"))
                      " | ["
                      (propertize "b" 'face '(:foreground "red"))
                      "]"
                      (propertize "elow" 'face '(:foreground "blue"))))))
                (cond
                  ((eq char ?l)
                    'left)
                  ((eq char ?r)
                    'right)
                  ((eq char ?a)
                    'above)
                  ((eq char ?b)
                    'below)
                  ;;; FIXME:  @lawlist may add a loop similar to `org-capture'
                  ;;; whereby a new `read-char-exclusive' will be initiated if
                  ;;; a user did not initially choose a valid option (l/r/a/b).
                  (t
                    (let ((debug-on-quit nil)
                          (msg (concat "dired-display-buffer:  "
                                       "You did not select l/r/a/b "
                                       "-- exiting.")))
                      (signal 'quit `(,msg)))))))))
    (my-display-buffer buffer alist direction)))

ああ、これは完璧です。誰かがdired-mode-map、にバインドされo、次にhjkldisplay-above / below / left / rightの単純なヒドラで私を助けてくれますか?
iLemming 2016年

ああ、わかったと思います: (defhydra dired-open (dired-mode-map "O" :exit t) "dired-open" ("j" dired-display-below "below") ("k" dired-display-above "above") ("h" dired-display-left "left") ("l" dired-display-right "left"))
iLemming 2016年

アプローチについての小さなこと-それは新しく作成されたウィンドウにジャンプしません。強制する方法がわかりません。
iLemming 2016年

2
@Agzam-この関数select-windowは、各my-display-buffer-...関数の末尾で使用できます。ご覧のとおり、最後の行の最後にスローされる結果/値はwindowです。結果/値を別の関数と組み合わせて使用​​する必要がない場合は、window 最後の行を次のようラップします (select-window window)。4つすべての関数でそれを行います-つまり、my-display-buffer-below; my-display-buffer-above; my-display-buffer-left; とmy-display-buffer-right
法律家、2016年

3

あなたの質問は不明確なので、閉じられるリスクがあります。2つのフレームまたは2つのEmacsウィンドウを持つ単一のフレームがありますか?それらが何であれ、2つある場合、それぞれは垂直に分割されますか?「垂直分割」とはどういう意味ですか?「ペイン」とはどういう意味ですか?「ペインAで開いていますか」の「それ」はどういう意味ですか?

大まかな推測では、2つのEmacsウィンドウAとBに分割された単一のEmacsフレームがあり、ウィンドウAがウィンドウBの上にあり、ウィンドウBが選択されており、ウィンドウBがDiredバッファーを表示しています。

oデフォルトではにバインドされていますdired-find-file-other-window。上記のワイルドな推測が正しい場合、oBのファイル名はAで開くはずです。これは、initファイルなしでEmacsを起動したときに表示されるものですemacs -Q。見えませんか?

これがシナリオではない場合は、から始めて、ステップバイステップで何をしているのかを明確に説明してくださいemacs -Q


2
これはフレームのサイズによって異なります。フレームが大きいと、OPによって記述された動作が発生します。一方、フレームが小さいと、Drewが説明した動作になります。
弁護士、2015

法律家それはまさに起こっていることだと思います。大きなフレームを備えた外部モニターに接続すると、説明したようなことが起こりますが、小さなラップトップディスプレイを使用しているので、必要に応じて、別のウィンドウを開かないように強制する方法はありますか?
ロバート

こんにちはドリュー申し訳ありませんが、フレームとウィンドウの違いに関して、emacsの専門用語を完全に理解することはできません。(ウィンドウとフレームを正しく理解した場合)元の質問で私が意味したのは、1つのemacsフレームと2つのemacsウィンドウが横に並んでいる(垂直方向にCx 3)ことです。私のラップトップを使用していてフレームが小さい場合、すべてが意図したとおりに機能しますが、法律家がフレームが大きい場合に指摘するように、私が説明していることが起こります。
ロバート

はい、可能です。ただし、display-buffer変数のファミリーの一般的な設定は、まだ予測されていない他の状況に影響を与えます。をカスタマイズすることもできdisplay-buffer-alistます。これは、経験豊富なEmacsユーザーにとってもやや混乱を招きます。いつウィンドウを分割するかとウィンドウの最小サイズを制御する変数があり、リストは何度も続きます。集団発生を封じ込めるにはdired-find-file-other-window、許可されたバージョンので助言することができdisplay-buffer-alistますが、その回答は別のフォーラム参加者にお任せします。さまざまなソリューションがあります。:)
法律家、2015

0

:次の変数はグローバルです。つまり、これらの変数は他の関数に影響を与えますdired-find-file-other-window。ユーザーは、他の機能にグローバルに影響を及ぼさないように、問題の機能に助言したい場合があります。[ただし、この作成者はそのオプションを別のフォーラム参加者に任せます。]または、この作成者が投稿した別の回答で、他に影響を与えないように使用できるカスタム関数が含まれています。


変数にsplit-width-thresholdは、次のようなdoc-stringがあります。

Minimum width for splitting windows sensibly.
If this is an integer, ‘split-window-sensibly’ may split a window
horizontally only if it has at least this many columns.  If this
is nil, ‘split-window-sensibly’ is not allowed to split a window
horizontally.

.emacsファイルに以下を設定すると、目的の効果が得られます。ユーザーは、値をより大きな値に設定することもできます。デフォルト値は160です。

(setq split-width-threshold nil)

マニュアルの関連セクションへのリンクは次のとおりです。

https://www.gnu.org/software/emacs/manual/html_node/emacs/Window-Choice.html


関連する変数も参照してください。split-height-thresholdデフォルト値は80です。

doc-stringは次のように述べています。

Minimum height for splitting windows sensibly.
If this is an integer, `split-window-sensibly' may split a window
vertically only if it has at least this many lines.  If this is
nil, `split-window-sensibly' is not allowed to split a window
vertically.  If, however, a window is the only window on its
frame, `split-window-sensibly' may split it vertically
disregarding the value of this variable.

これは実際にはかなりうまくいきました!何かおかしいことが起こったら、少なくともどこを見ればいいのかわかっています。再度、感謝します!
ロバート
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.