代码之家  ›  专栏  ›  技术社区  ›  Joe Casadonte

如何配置firefox在某些链接上运行emacsclientw?

  •  3
  • Joe Casadonte  · 技术社区  · 15 年前

    我有一个Perl脚本,它搜索一堆日志文件,寻找“有趣的”行,寻找有趣的定义。它生成一个HTML文件,该文件由一个表组成,该表的列是时间戳、文件名/linenum引用和“有趣的”位。我想做的是让文件名/linenum是一个实际的链接,它将在emacs中将光标定位在该行号上,从而调出该文件。

    emacsclientw将允许这样的事情(例如emacsclientw+60 foo.log),但我不知道要构造哪种URL/uri,它将允许firefox调用emacsclientw。原始的HTML文件将是本地的,因此没有问题。

    我应该这样定义我自己的mime类型和钩子吗?

    火狐版本是3.5,我运行的是Windows,以防有任何问题。谢谢!

    3 回复  |  直到 14 年前
        1
  •  8
  •   p4bl0    15 年前

    about:config 火狐页面。添加新字符串:

    network.protocol-handler.app.emacs
    

    值:在没有协议的情况下解析URL的脚本的路径(后面是什么 emacs:// )然后用适当的参数调用EmacClient。

    您不能只放置emacsclient的路径,因为协议之后的所有内容都作为一个参数传递给可执行文件,因此 +60 foo.log 会是一个新的文件,以这种方式命名。

    但你很容易想象 emacs:///path/to/your/file/LINENUM 然后用一个小脚本删除最后一个/和数字,并用数字和文件调用emacsclient:-)

    编辑:如果你愿意的话,我可以在bash中这样做,但是我不知道如何使用windows“shell”或者它被称为什么。

    edit2:我说错了,协议在arg字符串中传递给了! 这是我刚为自己做的一个小bash脚本,顺便说一句,谢谢你的想法。

    #!/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 在我的Icewasel(火狐)里 /home/p4bl0/bin/ffemacsclient . 它工作得很好!

    是的,我的笔记本电脑的名字是romuald ^。

        2
  •  3
  •   Joe Casadonte    14 年前

    谢谢你的指针,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的shell脚本那么健壮,因为它不能确保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(Ubuntu9.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 从上面。

        3
  •  0
  •   Russell Leggett    15 年前

    可能是编写第一个FF插件的重要原因;)