Cider: CIDER 不显示 Java 文档

创建于 2018-04-17  ·  17评论  ·  资料来源: clojure-emacs/cider

预期行为

image

实际行为

image

环境 & 版本信息
CIDER 版本信息
;; 连接到 nREPL 服务器 - nrepl://localhost :59990
;; CIDER 0.17.0snapshot(包:20180413.51),nREPL 0.2.13
;; Clojure 1.8.0,Java 9.0.4
Lein/引导版本
BOOT_CLOJURE_NAME=org.clojure/clojure
BOOT_CLOJURE_VERSION=1.8.0
BOOT_VERSION=2.7.2

Emacs 版本
27.0.50

操作系统
macOS

bug stale

所有17条评论

如您所见,符号也被错误地解析为 java.lang.Character/toUpperCase 而不是 lang.String。

没有提示您选择哪个版本?

@bbatsov奇怪的是,今天是这样的(好多了😂):
image

我检查过,当我使用默认热键时确实得到了提示(在 Spacemacs 中,它在邪恶正常状态下是, h h ),但是当我使用这个热键时我自己配置​​了:

(key-chord-define-global "fd" '(lambda () (interactive "")
                                   (cond
                                    ((or (eq evil-state 'normal) (eq evil-state 'visual)) (execute-kbd-macro (kbd "<escape> , h h")))
                                    ((eq evil-state 'insert) (execute-kbd-macro(kbd "<escape> l , h h i"))))))

这个热键以某种方式跳过提示,只显示字符的文档。

顺便说一句,eldoc 的提示也可以使用一些工作,例如,不同方法的 args 之间的分离:
image

我们无法找到一个好的分离,这就是为什么我们只是混合了所有可能版本的签名。 这是理想的,但不幸的是,我也看不到如何改进。 Eldoc 必须有一个 ver 字符串结构,否则那里的 params 的突出显示会中断。

@bbatsov我刚刚重新启动了我的 Emacs,而 Javadocs 又不见了。 :(
image

我想知道如果您尝试使用 Java 8 而不是 9,情况是否会有所改变。我没有太多时间玩 Java 9,我想知道我们所做的某些类路径操作是否在那里无法正常工作或其他什么。 另外 - 确保在尝试 eldoc/cider-doc 之前已经评估了代码缓冲区)。

@bbatsov我切换到 Java 8,但仍然没有任何问题(但我没有做过太多编码,所以谁知道呢)。
我才知道你就是那个演讲的人 ^__^ 不知何故,你的头像对我来说看起来如此咄咄逼人,这让我感到惊讶:)) 谢谢你的工作 ;) 我现在正在看你的 Clojure 坏零件谈话 😊

哈哈!

我以为这是我快乐的脸! 😄

嗨,(这里是 emacs/苹果酒初学者)

在一般的苹果酒/道路地图中,此错误位于何处?

是不是更多

  • 没有人有时间做这件事
  • 它将与/由果园解决
  • 它按预期工作
  • 它现在不应该工作吗?

每次我花一些时间学习 clj/emacs 时,我最终都想查找一些类并感到沮丧 - 这完全取决于我,但我一直问自己:

我的设置是错误的还是损坏的,或者做“真正的”clojure 开发人员永远不需要查找 javadoc - 这对我来说会很困惑。

我的测试用例是通过cider-doc java.util.concurrent.PriorityBlockingQueue查找,结果是https://imgur.com/a/TaQXfpS


简而言之:这对我还是对每个人来说都是破碎的,没有它人们如何应对?

PPS:我尝试过安装了 java-doc 和 java-src 的 java 8 - 11


输出:

在一堂课上

java.util.concurrent.PriorityBlockingQueue
   Extends: java.util.AbstractQueue
Implements: java.util.concurrent.BlockingQueue
            java.io.Serializable

Not documented.

For additional documentation, see the Javadoc.

Definition location unavailable.

在一个方法上

java.util.concurrent.PriorityBlockingQueue/add
 [this java.lang.Object]
Not documented.

For additional documentation, see the Javadoc.

Definition location unavailable.

进步!

我认为以下正在发生


前提:我使用 spacemacs,它使用 MELPA 的苹果酒,目前为 0.20.0 + cider-nrepl 0.20.0

cider-nrepl 0.20.0 使用果园 0.3.1


问题:

orchard 通过jdk-sources -> jdk-resource-url和critically -> jdk-root检测java源

(def jdk-root
  "The JDK root directory (parent of the `java.home` JRE directory)"
  (-> (io/file (System/getProperty "java.home"))
      (.getParentFile)))

(https://github.com/clojure-emacs/orchard/blob/v0.3.1/src/orchard/java.clj#L47)

在我的系统 (archlinux) 和 ubuntus openjdk-11-jre-headless_11.0.1+13-2ubuntu1_amd64包中,javas 似乎被布局为/usr/lib/jvm下的文件夹

# ~/Downloads/openjdk-11-jre-headless_11.0.1+13-2ubuntu1_amd64/data $ tree usr/lib/jvm/ -L 2
usr/lib/jvm/
├── java-1.11.0-openjdk-amd64 -> java-11-openjdk-amd64
└── java-11-openjdk-amd64

或 archlinux

# ~ $ tree /usr/lib/jvm/ -L 2
/usr/lib/jvm/
├── default -> java-11-openjdk
├── default-runtime -> java-11-openjdk
├── java-11-openjdk
├── java-8-openjdk
└── java-default-runtime -> default

在演示 emacs/cider repl java.home是:

(System/getProperty "java.home") 
; =>  /usr/lib/jvm/java-11-openjdk

_我不知道是否有来自外部的东西传入了这个,或者它是否是当前 java 的默认主页。_

如果我没记错的话,那意味着在我的系统上 jdk-root 是

(-> (io/file (System/getProperty "java.home"))
      (.getParentFile))) 
; => /usr/lib/jvm/

导致jdk-resource-url在错误的(父)文件夹中查找内容


结论:

jdk-roots “JDK 根目录( java.home JRE 目录的父目录)”注释/前提似乎是错误的(我很快在网上查了一下,似乎没有什么“标准”作为 java.lang.家真的应该是)

这对任何人都有帮助吗?

是的,它有帮助! 通过 java 8, java.home系统属性指向 JDK 根目录中的 JRE。 这是根据https://docs.oracle.com/javase/7/docs/technotes/tools/linux/jdkfiles.html预期的

user=> (System/getProperty "java.home")
"/usr/lib/jvm/java-8-openjdk-amd64/jre"

从 java 9 开始,JRE 子目录消失了,它的内容被合并到 JDK 根目录中,现在java.home指向:

user=> (System/getProperty "java.home")
"/usr/lib/jvm/java-11-openjdk-amd64"

(参见 https://docs.oracle.com/en/java/javase/11/install/installed-directory-structure-jdk.html)

作为 Debian 衍生发行版用户的一个旁白, openjdk-11-source包安装了一个到src.zip的损坏符号链接(参见 https://bugs.launchpad.net/ubuntu/+source/openjdk-lts /+错误/1791219)
安装后,我有:

$ pwd
/usr/lib/jvm
$ ls -l java-11-openjdk-amd64/src.zip
lrwxrwxrwx 1 root root 21 Nov 20 04:13 java-11-openjdk-amd64/src.zip -> ../openjdk-11/src.zip
$ find openjdk-11 -type f
openjdk-11/lib/src.zip

似乎 orchard 应该检查两个地方并测试src.zip是否可读。 如果没有,也可以向 STDERR 打印可抑制的警告。
如果这听起来合理,我很乐意提交 PR。

同时,您可以找到src.zip副本并将其手动添加到类路径中,例如使用:local/root deps.edn 条目(如果您碰巧在 tools.deps https:/ /clojure.org/reference/deps_and_cli#_dependencies)。

嗯,似乎调用链jdk-sources -> jdk-root只在引导类加载器中被调用,否则它是(.getContextClassLoader (Thread/currentThread))

我通过 project.clj 在类路径上强制 zip

:profiles {:repl {:resource-paths ["/usr/lib/jvm/default/lib/src.zip"]}}

并通过检查

> (System/getProperty "java.class.path") ; in repl buffer
; "/home/_/Projekte/repos/temp/test/test:/_/patrik/Projekte/repos/temp/test/src:
   /usr/lib/jvm/default/lib/src.zip:  <snip>

仍然没有文档

看起来这将在 Java 11 上被打破,直到https://github.com/clojure-emacs/orchard/issues/20被修复。
不过 Java 8 应该可以工作。 您将需要自动添加的类路径上的src.ziptools.jar 。 然后你可以尝试如下(在苹果酒 v0.21.1 上):

(clojure.java.io/resource "java/util/AbstractQueue.java")
;; => #object[java.net.URL 0x2e00bc76 "jar:file:/usr/lib/jvm/java-8-openjdk-amd64/src.zip!/java/util/AbstractQueue.java"]

(require '[mranderson049.orchard.v0v4v0.orchard.java.parser :as ojp])

(keys (ojp/source-info 'java.util.AbstractQueue))
;; => (:class :doc :line :column :members :file :path)

此问题已自动标记为过时,因为它最近没有活动。 如果没有进一步的活动发生,它将被关闭。 感谢您的贡献和理解!

@jeffvalk最近解决了关联的 Orchard 问题,所以我想我们可以关闭这个问题。

在 Debian 10 上,我所要做的就是安装openjdk-11-source 。 我去尝试符号链接src.zip ,发现它已经创建了。

在带有 Emacs 26.3 CIDER 0.24.0 nREPL 0.6.0 Java 1.8.0_242 的 Ubuntu 18.04 上,我添加了一个包含 Java 源代码的目录作为 Leiningen 配置文件 ( ~/.lein/profiles.clj ) 的资源:

{:user {:resource-paths ["/usr/lib/jvm/openjdk-8"]}}
此页面是否有帮助?
1 / 5 - 1 等级