【问题标题】:Why Emacs project C-c p is undefined?为什么 Emacs 项目 C-c p 未定义?
【发布时间】:2015-07-15 03:41:38
【问题描述】:

我是 Emacs 的新手。我已经安装了弹丸。

当我执行C-c p 时,它会说:

C-c p is undefined

想知道哪里出了问题?

以下是我的~/.emacs 文件。

(require 'package)

(add-to-list 'package-archives
                      '("melpa" . "http://melpa.milkbox.net/packages/") t)
(package-initialize)

(defvar required-packages
  '(
    projectile
    ) "a list of packages to ensure are installed at launch.")

(require 'cl)

                    ; method to check if all packages are installed
(defun packages-installed-p ()
  (loop for p in required-packages
    when (not (package-installed-p p)) do (return nil)
    finally (return t)))

                    ; if not all packages are installed, check one by one and install the missing ones.
(unless (packages-installed-p)
                    ; check for new packages (package versions)
  (message "%s" "Emacs is now refreshing its package database...")
  (package-refresh-contents)
  (message "%s" " done.")
                    ; install the missing packages
  (dolist (p required-packages)
    (when (not (package-installed-p p))
      (package-install p))))

(require 'projectile)
(projectile-global-mode)

编辑

我的 .projectile 文件

-/venv
-*.pyc
-*.pyc~
-.git
-.gitignore
-.DS_Store

编辑 2

C-h vprojectile-keymap-prefix 的输出如下:

projectile-keymap-prefix is a variable defined in `projectile.el'.
Its value is "^Cp"

Documentation:
Projectile keymap prefix.

You can customize this variable

编辑 3

我使用的是 OS X 10.10.4。我从命令行$emacs 启动emacs。我已经使用以下命令安装了 Emacs:

brew install emacs --with-cocoa 

而且,第一次(当我启动 emacs 时)。如果做M-x,我不会得到project-switch-project,而是得到project-switch-to-buffer。切换缓冲区后,我可以切换项目。

【问题讨论】:

  • 您在某处有.projectile 文件吗?如果您不在项目中,我的理解是这可能行不通。
  • 我还应该指出,您的.init 代码在安装projectile 和使命令运行方面对我有用。试试重启emacs吧。
  • 嗨,我的目录中有 .projectile 文件
  • 我在基本模式下看到暂存缓冲区的相同行为。如果我尝试在初始暂存缓冲区中使用 C-c p 它不起作用,但在我编辑其他文件时它会起作用。是不是你在 Emacs 启动时在初始暂存缓冲区中尝试 C-c p ?显然,如果 C-c p 也可以在暂存缓冲区中工作会很好,但这不是什么大问题。

标签: emacs projectile emacs-projectile


【解决方案1】:

您现在需要显式启用它并设置前缀。启用带有 C-c C-p 前缀的 Projectile 的步骤:

(projectile-mode +1)
(define-key projectile-mode-map (kbd "C-c C-p") 'projectile-command-map)

这在 2018 年发生了几次变化。鲍里斯过去将 C-c p 设置为默认领导,然后将其更改为 C-c C-p 以符合 the emacs keybinding conventions (第 2 条提到它。)。但是现在它已经完全删除了,所以你应该自己设置它。

【讨论】:

  • 你引用的键绑定约定的链接,似乎没有说C-c C-pC-c p 有什么不同,所以我只是想知道,使用C-c p 感觉一样好。它似乎没有打破任何惯例。
  • @DanielDinnyes, C-c <letter> for any 为最终用户保留大写或小写字母(如手册链接页面所述 - 这是项目符号第 2 点)。任何库绑定这样的序列实际上是一个错误。
【解决方案2】:

您需要在~/.emacs 文件中手动激活投射模式:

(projectile-mode 1)

【讨论】:

    【解决方案3】:

    Projectile 的默认键盘映射前缀由变量 projectile-keymap-prefix 定义。您可以使用C-h v 查看该变量的值。如果没有设置或者不是^Cp,可以使用下面的代码设置为C-c p

    (setq projectile-keymap-prefix (kbd "C-c p"))
    

    或者任何你喜欢的键绑定。

    【讨论】:

    • 嗨 Tinker,似乎已经为 projectile-keymap-prefix 设置了 ^Cp 变量。我在上面的问题中添加了edit2。
    • 哦,这很奇怪。让我看看。你能先执行命令projectile-find-file 看看它是否有效。然后使用C-h f 查看绑定键。作为我的电脑,它是C-c p f。所以我可以用它来执行弹丸命令。一切正常,但是您还有问题,那我对此一无所知。
    • projectile-find-file 按预期工作。 C-h f 也可以。但是C-c p f 不起作用。
    • 这很奇怪。也许你可以toggle-debug-on-error 看看内部发生了什么。我对此并不熟悉。很抱歉无法提供更多帮助。
    【解决方案4】:

    我最近遇到了一个类似的问题,在我将 projectile 包固定到 melpa stable 存档后,projectile-global-mode 不能像以前那样工作,这是版本 @ 987654325@.

    projectile-global-mode 之前的行为方式是,当打开时,任何缓冲区都可以使用键绑定,但现在在 emacs 启动后在启动画面(处于基本模式)时我无法让它工作,就像 Menno Smits 在评论中指出的那样。

    为了好奇,我git bisectprojectile的源代码历史,找出是哪个commit引入了这个行为改变,最后得到this,它不再使用define-globalized-minor-mode定义全局minor模式而是定义了projectile-mode 默认为全局,(define-minor-mode xxxxxx :global t),区别可以从define-globalized-minor-mode 的文档中看出:

    全局启用该模式还会影响随后通过访问文件创建的缓冲区,以及使用除基本模式以外的主要模式的缓冲区;但在基本模式下它不会检测到新缓冲区的创建。 Source

    不确定这是否相关,但这是我想出来的,希望它能帮助任何和我有同样困惑的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-08
      • 2019-11-17
      • 2021-08-19
      • 2017-10-31
      • 2018-05-20
      • 2018-01-04
      • 2013-02-23
      相关资源
      最近更新 更多