LINUX.ORG.RU

настройка emacsclient


0

0

Запущен emacs. При запуске emacsclient ИМЯФАЙЛА открывается новый фрейм.

В Customize:

server-mode = on
server-window = switch-to-buffer-other-frame
В .emacs:
(defun close-server-buffer ()
  (interactive)
  (server-edit))

;; server-edit - функция, которая обычно вызывается по C-x #
;; для закрытия буфера emacsclient

(add-hook 'delete-frame-hook 'close-server-buffer)

Почему при удалении фреймов emacsclient по C-x 5 0 (в emacs) и Alt-F4 (в window manager'е) буфер emacsclient'а не закрывается?



Последнее исправление: ipc (всего исправлений: 2)
Ответ на: комментарий от yoghurt

>Потому что по Alt-F4 и C-x 5 0 ты закрываешь фрейм, но не убиваешь буффер

У стоит меня хук на закрытие фрейма, который должен убивать буфер.

При вызове server-edit вручную буфер убивается и emacsclient освобождает терминал.

ipc
() автор топика
(defun close-server-buffer (frame) 
  (interactive) 
  (server-edit)) 

Функция в хуке требует 1 аргумент. См. документацию на delete-frame-functions и этот хук.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

>Функция в хуке требует 1 аргумент. См. документацию на delete-frame-functions и этот хук.
Спасибо. Странно, что emacs не выдает ошибки.

ipc
() автор топика
Ответ на: комментарий от ipc

>Спасибо. Странно, что emacs не выдает ошибки.

А вот это уже надо выяснить, почему так происходит. У меня выдает ошибку, я проверил. Возможно, кто-то тут же это сообщение затирает по цепочке исполнения.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

У меня выдает ошибку, я проверил.

Как оказалось, в *Messages* он всё-таки пишет:

Error during redisplay: (wrong-number-of-arguments (lambda nil (interactive) (server-edit)) 1)
Я просто ожидал увидеть ошибку во «всплывающем» буфере (окно напополам и новый буфер внизу). Как это бывает при запуске emacs с кривым dot-emacs.

ipc
() автор топика
Ответ на: комментарий от ipc

>Я просто ожидал увидеть ошибку во «всплывающем» буфере (окно напополам и новый буфер внизу). Как это бывает при запуске emacs с кривым dot-emacs.

Ну вот и странно. У меня сообщение строчкой выдается в минибуфер.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Возможно, кто-то тут же это сообщение затирает по цепочке исполнения.

Действительно, в минибуфере его подменяет сообщение «When done with a buffer, type C-x #». Hу и Dired (если вызывать не emacsclient FILENAME, а emacsclient ~) тоже пишет свое

Omitting...
(Nothing to omit)
Not omitting: directory larger than 30000 characters.

Ну вот и странно. У меня сообщение строчкой выдается в минибуфер.

Даже не знаю, как можно обойти вывод «When done ...».



Еще вопрос: как открыть новый активный фрейм emacsclient, не связанный с файлом? emacsclient -e '(raise-frame (make-frame))' создает и «поднимает» фрейм, но неактивный. То есть фокус остается у браузера, например, а не у emacs.

ipc
() автор топика
Ответ на: комментарий от ipc

>создает и «поднимает» фрейм, но неактивный
Даже нет. Создает, но не «поднимает», оставляет неактивным.

ipc
() автор топика
Ответ на: комментарий от ipc

Может, просто make-frame? Это все может быть завязано на поведение WM, а не на Emacs. Например, в IceWM есть глюк, который я зарепортил, но он ен исправлен. Если я поднимаю frame при помощи (iconify-or-deiconify-frame) или тем же raise-frame, то проблемы возникают только с приложениями на GTK. если до поднятия было активным GTK-приложение, то фокус на секунду отдается поднятому фрейму Emacs, а потом тут же убегает к предыдущему активному приложению. С приложениями на Qt, lesstif, Xaw и т . д. все нормально. Если, например, поставить openbox, то со всеми приложениями нормально. Ясно, что тут WM виноват.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Может, просто make-frame?

Да. В общем, единственное работающее решение:

#!/bin/bash

emacsclient --eval '(make-frame)'

CURR_DESK=`xdotool get_desktop`

for wnd in `xdotool search --name 'Emacs'`
do
    WND_DESK=`xdotool get_desktop_for_window $wnd`

    if [[ $WND_DESK = $CURR_DESK ]]
    then
        xdotool windowactivate $wnd
        break
    fi
done

Открывает и фокусирует новый фрейм на текущем рабочем столе.

ipc
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.