【问题标题】:Multikeys shortcuts in EmacsEmacs 中的多键快捷键
【发布时间】:2014-08-20 15:10:40
【问题描述】:

我正在使用以下解决方案在 Emacs 中快速打开文件(感谢 lawlist for the code

代码:OPTION # 2 -- 带有选项的函数:

(global-set-key (kbd "<f5>") 'lawlist-bookmark)

(defun lawlist-bookmark (choice)
  "Choices for directories and files."
  (interactive "c[D]ired | [v]ocab.org | [g]td.org | [d]iary.org | [n]otes.org")
    (cond
           ((eq choice ?D)
           (dired "/very/long/and/boring/path/which/make/me/use/tab/for/..."))
           ((eq choice ?v)
           (find-file "/Users/HOME/.0.data/vocab.org")
            (message "Opened:  %s" (buffer-name)))
          ((eq choice ?g)
           (find-file "/Users/HOME/.0.data/gtd.org")
            (message "Opened:  %s" (buffer-name)))
          ((eq choice ?d)
           (find-file "/Users/HOME/.0.data/diary.org")
            (message "Opened:  %s" (buffer-name)))
          ((eq choice ?n)
           (find-file "/Users/HOME/.0.data/notes.org")
            (message "Opened:  %s" (buffer-name)))
          (t (message "Quit"))))

效果很好。我按 F5 然后另一个键打开我的文件。但是,我现在有很多快捷方式,我想通过按两个(或更多)键来调用它们。

例如,我有一个名为“website-kate”的项目,它是一个包含两个主要文件index.htmlstylesheet.css 的文件夹。我想要两个快捷键ki(也就是说:按F5打开快捷键拨盘,先按k,然后按i,分别是“kate”和“index”)和ks(用于“kate”和“stylesheet”)

当然这段代码不起作用:

    ((eq choice ?ki)
    (find-file "/home/user/website-kate/index.html")
        (message "Opened:  %s" (buffer-name)))

【问题讨论】:

  • 您现有的解决方案存在严重的代码和数据混合问题。随着您收藏的书签文件的不断增长,我建议您认真考虑转到链接问题中的选项 #3。 (对于鼠标的使用,它似乎是硬连线的,但正确的键盘映射也是支持键盘的方法。)
  • @tripleee 我没有选择选项#3,因为我不喜欢使用鼠标。如果有一种简单的方法可以使选项#3 适应键盘快捷键,我很感兴趣。我试图用键盘替换鼠标指示,但我没有得到有效的代码......
  • 这种方法不能很好地扩展。并且更新可能改变的位置是乏味的。为什么不直接使用 Emacs 书签?这就是他们的目的。您可以使用诸如F5 之类的单键来提示输入书签,并且可以使用一个或多个字符作为书签名称:F5 k i RET
  • 我赞同@Drew 的建议。实施适合您的工作流程的高度专业化的解决方案可能是非常有益的,但有时退后一步,看看 Emacs 提供哪些开箱即用的功能来支持您尝试解决的用例是有意义的。我建议您首先阅读有关 Emacs 书签的 *info* 节点:C-h r m Bookmarks RET。如果您出于某种原因不想这样做,TLDR;是:
  • @itsjeyd(和 Drew)谢谢,我将探索书签的可能性。

标签: file emacs organization


【解决方案1】:

使用字符串的interactive表单只能读取单个key,但是interactive也可以采用表单来代替字符串来求值,所以你可以实现自己的多key读取表单。比如这样:

(interactive
 (list
  (let ((key (read-key "First key: ")))
    (cond
     ((equal key ?a)
      (message "a pressed"))
     ((equal key ?k)
      (let ((key (read-key "Second key: ")))
        (cond
         ((equal key ?i)
          (message "ki pressed"))
         (t
          (message "I don't know k%c" key)))))))))

这应该很容易扩展到您的完整用例。 (不过,以一种易于配置的方式进行操作会稍微困难一些。)

在内部,(interactive "cFoo: ") 只是使用 read-key,所以你只是在扩展相同的概念。

【讨论】:

  • 这个解决方案可以和前一个并行使用吗?
  • 您将不得不从交互式规范中返回“单个字符”以外的其他内容(例如符号可以工作)。或者,您可以完全跳过交互式规范并从函数体中进行用户查询。这将使该函数无法从 lisp 中使用,但我认为这不是问题。你想要一个完整的例子吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
相关资源
最近更新 更多