Спасибо всем. Я знал, что что-то не так, когда тратил столько усилий на реализацию простого всплывающего окна.
Сначала я отклонил эту мысль, потому что было странно прибегать к координатам x и y, чтобы найти искомый узел, но я думаю, что это способ сделать это.
// add MouseListener to tree
MouseAdapter ma = new MouseAdapter() {
private void myPopupEvent(MouseEvent e) {
int x = e.getX();
int y = e.getY();
JTree tree = (JTree)e.getSource();
TreePath path = tree.getPathForLocation(x, y);
if (path == null)
return;
tree.setSelectionPath(path);
My_Obj obj = (My_Obj)path.getLastPathComponent();
String label = "popup: " + obj.getTreeLabel();
JPopupMenu popup = new JPopupMenu();
popup.add(new JMenuItem(label));
popup.show(tree, x, y);
}
public void mousePressed(MouseEvent e) {
if (e.isPopupTrigger()) myPopupEvent(e);
}
public void mouseReleased(MouseEvent e) {
if (e.isPopupTrigger()) myPopupEvent(e);
}
};
(...)
JTree tree = new JTree();
tree.addMouseListener(ma);
На самом деле нет никакой разницы между двумя ситуациями, кроме того факта, что сервер устанавливает некоторое локальное состояние буфера, чтобы включить Cx #
(также известный как server- edit
).
Вы можете ограничить поведение Mx list-buffers
, как вы просите, следующим советом:
(defadvice list-buffers-noselect (before list-buffers-noselect-limit-to-those-for-emacsclient activate)
"When the current buffer is a being viewed by an emacclient, restrict the buffers to those associated with the emacsclient"
(when (and (null (ad-get-arg 1)) server-buffer-clients)
(let ((blist (delete-dups (reduce 'append
(mapcar (lambda (proc) (process-get proc 'buffers))
server-buffer-clients)))))
(ad-set-arg 1 blist))))
Теперь, когда вы делаете Mx buffer-menu
в буфере, который посещает emacsclient
, вы видите только другие буферы, посещаемые тем же клиентом (ами). Он работает как обычно, когда буфер не посещается emacsclient
.
Я не использую ido
, но полагаю, что настройка будет аналогичной (если этот совет не t работает как есть).
Детали таковы, что когда вы запускаете emacsclient
, открываемые буферы связаны с серверным процессом (их может быть несколько, потому что вы можете открыть один и тот же файл с помощью нескольких вызовов emacsclient
). Серверные клиенты буфера хранятся в локальной переменной буфера server-buffer-clients
.
Чтобы узнать, какие буферы связаны с конкретным вызовом emacsclient
, найдите процесс для что emacsclient, и do: (process-get proc 'buffers)
(где proc
- это конкретный процесс emacsclient - один из элементов списка, найденного в server-buffer -клиенты
).
Это все, что дает совет.
клиенты сервера хранятся в локальной переменной буфера server-buffer-clients
.
Чтобы узнать, какие буферы связаны с конкретным вызовом emacsclient
, найдите процесс для этого emacsclient, и do: (process-get proc 'buffers)
(где proc
- это конкретный процесс emacsclient - один из элементов списка в server-buffer- клиенты
).
Это все, что дает совет.
s серверных клиентов хранятся в локальной переменной буфера server-buffer-clients
.
Чтобы узнать, какие буферы связаны с конкретным вызовом emacsclient
, найдите процесс для этого emacsclient, и do: (process-get proc 'buffers)
(где proc
- это конкретный процесс emacsclient - один из элементов списка в server-buffer- клиенты
).
Это все, что дает совет.
buffers) (где proc
- это конкретный процесс emacsclient - один из элементов списка в server-buffer-clients
).
Это все, что дает совет.
buffers) (где proc
- это конкретный процесс emacsclient - один из элементов списка в server-buffer-clients
).
Это все, что дает совет.
В emacs 23 нет никакой разницы, пока работает emacsserver. Список буферов будет одинаковым в каждом.