Как настроить Firefox для запуска emacsclientw по определенным ссылкам? - PullRequest
3 голосов
/ 10 сентября 2009

У меня есть Perl-скрипт, который ищет кучу файлов журналов, ищущих «интересные» строки, для некоторого определения интересных. Он генерирует HTML-файл, который состоит из таблицы, столбцы которой представляют собой временную метку, ссылку на имя файла / белья и "интересный" бит. Я хотел бы, чтобы имя файла / linenum было реальной ссылкой, которая выведет этот файл с курсором, расположенным на этом номере строки, в emacs.

emacsclientw разрешит такую ​​вещь (например, emacsclientw +60 foo.log), но я не знаю, какой тип URL / URI создать, который позволит FireFox вызывать emacsclientw. Исходный HTML-файл будет локальным, поэтому проблем нет.

Должен ли я определить свой собственный тип MIME и перехватывать таким образом?

Версия Firefox 3.5, и я использую Windows, на случай, если что-то из этого имеет значение. Спасибо!

Ответы [ 3 ]

8 голосов
/ 10 сентября 2009

Перейти на страницу about:config в Firefox. Добавить новую строку:

network.protocol-handler.app.emacs

значение: путь к сценарию, который анализирует URL без протокола (что после emacs://), а затем вызывает emacsclient с правильным аргументом.

Вы не можете просто указать путь к emacsclient, потому что все, что после протокола передается как один аргумент в исполняемый файл, так что ваш +60 foo.log будет новым файлом с таким именем.

Но вы можете легко представить себе что-то вроде emacs:///path/to/your/file/LINENUM и иметь небольшой скрипт, который удаляет последний / и номер и вызывает emacsclient с номером и файлом: -)

РЕДАКТИРОВАТЬ: Я мог бы сделать это в bash, если хотите, но я не знаю, как это сделать с помощью "оболочки" Windows или как там это называется.

РЕДАКТИРОВАТЬ 2: Я что-то не так, протокол передается в строке arg! Вот небольшой bash-скрипт, который я только что сделал для себя, кстати, спасибо за идею: -D

#!/bin/bash
ARG=${1##emacs://}
LINE=${ARG##*/}
FILE=${ARG%/*}
if wmctrl -l | grep emacs@romuald &>/dev/null; then # if there's already an emacs frame
  ARG="" # then just open the file in the existing emacs frame
else
  ARG="-c" # else create a new frame
fi
emacsclient $ARG -n +$LINE "$FILE"
exit $?

и мой network.protocol-handler.app.emacs в моей ледяной ласке (firefox) равен /home/p4bl0/bin/ffemacsclient. Работает просто отлично!

И да, мой ноутбук зовут romuald ^^.

3 голосов
/ 10 сентября 2009

Спасибо за указатель, p4bl0. К сожалению, это работает только на реальной ОС; Windows использует совершенно другой метод. См. http://kb.mozillazine.org/Register_protocol для получения дополнительной информации.

Но вы, конечно, обеспечили мне старт, в котором я нуждался, так что большое вам спасибо!

Вот решение для Windows:

Сначала вам нужно правильно настроить реестр для обработки этого нового типа URL. Для этого сохраните в файле следующее, отредактируйте его в соответствии со своей средой, сохраните его и дважды щелкните по нему:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\emacs]
@="URL:Emacs Protocol"
"URL Protocol"=""

[HKEY_CLASSES_ROOT\emacs\shell]

[HKEY_CLASSES_ROOT\emacs\shell\open]

[HKEY_CLASSES_ROOT\emacs\shell\open\command]
@="\"c:\\product\\emacs\\bin\\emacsclientw.exe\" --no-wait -e \"(emacs-uri-handler \\\"%1\\\")\""

Это не так надежно, как сценарий оболочки p4bl0, потому что он не гарантирует, что Emacs будет запущен первым. Затем добавьте следующее в ваш файл .emacs:

(defun emacs-uri-handler (uri)
  "Handles emacs URIs in the form: emacs:///path/to/file/LINENUM"
  (save-match-data
    (if (string-match "emacs://\\(.*\\)/\\([0-9]+\\)$" uri)
        (let ((filename (match-string 1 uri))
              (linenum (match-string 2 uri)))
          (with-current-buffer (find-file filename)
            (goto-line (string-to-number linenum))))
      (beep)
      (message "Unable to parse the URI <%s>"  uri))))

Приведенный выше код не проверяет, существует ли файл, а обработка ошибок в лучшем случае является элементарной. Но это работает!

Затем создайте файл HTML, содержащий строки, подобные следующим:

<a href="emacs://c:/temp/my.log/60">file: c:/temp/my.log, line: 60</a>

и затем нажмите на ссылку.

Сценарий публикации:

Я недавно перешел на Linux (Ubuntu 9.10) и вот что я сделал для этой ОС:

$ gconftool -s /desktop/gnome/url-handlers/emacs/command '/usr/bin/emacsclient --no-wait -e "(emacs-uri-handler \"%s\")"' --type String
$ gconftool -s /desktop/gnome/url-handlers/emacs/enabled --type Boolean true

Используя тот же emacs-uri-handler сверху.

0 голосов
/ 10 сентября 2009

Может быть отличная причина написать свой первый плагин FF;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...