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
;; ν΄λ‘œμ € 1.8.0, μžλ°” 9.0.4
레인/λΆ€νŠΈ 버전
BOOT_CLOJURE_NAME=org.clojure/clojure
BOOT_CLOJURE_VERSION=1.8.0
λΆ€νŠΈ_버전=2.7.2

이λ§₯슀 버전
27.0.50

운영 체제
λ§₯ OS

bug stale

λͺ¨λ“  17 λŒ“κΈ€

λ³΄μ‹œλ‹€μ‹œν”Ό κΈ°ν˜ΈλŠ” lang.String λŒ€μ‹  java.lang.Character/toUpperCase에 λŒ€ν•΄μ„œλ„ 잘λͺ» ν•΄μ„λ©λ‹ˆλ‹€.

μ–΄λ–€ 버전을 선택할지 λ¬»λŠ” λ©”μ‹œμ§€κ°€ ν‘œμ‹œλ˜μ§€ μ•ŠμŠ΅λ‹ˆκΉŒ?

@bbatsov μ΄μƒν•˜κ²Œλ„ μ˜€λŠ˜μ€
image

ν™•μΈν–ˆλŠ”λ° κΈ°λ³Έ 단좕킀(Spacemacsμ—μ„œλŠ” evil-normal-stateμ—μ„œ , 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"))))))

이 λ‹¨μΆ•ν‚€λŠ” μ–΄λ–»κ²Œλ“  ν”„λ‘¬ν”„νŠΈλ₯Ό κ±΄λ„ˆλ›°κ³  λ¬Έμžμ— λŒ€ν•œ λ¬Έμ„œλ§Œ ν‘œμ‹œν•©λ‹ˆλ‹€.

BTW, eldoc의 νžŒνŠΈλŠ” λ‹€λ₯Έ λ°©λ²•μ˜ 인수 κ°„ 뢄리와 같은 일뢀 μž‘μ—…μ„ μ‚¬μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
image

μš°λ¦¬λŠ” 쒋은 뢄리λ₯Ό μ•Œμ•„λ‚Ό 수 μ—†μ—ˆκΈ° λ•Œλ¬Έμ— κ°€λŠ₯ν•œ λͺ¨λ“  λ²„μ „μ˜ μ„œλͺ…을 ν˜Όν•©ν–ˆμŠ΅λ‹ˆλ‹€. μ΄μƒμ μ΄μ§€λ§Œ λΆˆν–‰νžˆλ„ 이것이 μ–΄λ–»κ²Œ κ°œμ„ λ  수 μžˆλŠ”μ§€ μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€. Eldocμ—λŠ” ver λ¬Έμžμ—΄ ꡬ쑰가 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ λ§€κ°œλ³€μˆ˜μ˜ κ°•μ‘° ν‘œμ‹œκ°€ κΉ¨μ§‘λ‹ˆλ‹€.

@bbatsov 방금 Emacsλ₯Ό λ‹€μ‹œ μ‹œμž‘
image

Java 9 λŒ€μ‹  Java 8을 μ‚¬μš©ν•˜λ©΄ 상황이 λ‹¬λΌμ§€λŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€. Java 9λ₯Ό μ‚¬μš©ν•  μ‹œκ°„μ΄ λ§Žμ§€ μ•Šκ³  μš°λ¦¬κ°€ μˆ˜ν–‰ν•˜λŠ” 클래슀 경둜 μ‘°μž‘ 쀑 일뢀가 μ œλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•ŠλŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€. λ˜ν•œ - eldoc/cider-doc을 μ‹œλ„ν•˜κΈ° 전에 μ½”λ“œ 버퍼가 ν‰κ°€λ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€.

@bbatsov Java 8둜 μ „ν™˜ν–ˆμ§€λ§Œ μ—¬μ „νžˆ λ¬Έμ œκ°€ μ—†μ—ˆμŠ΅λ‹ˆλ‹€.
그리고 방금 κ·Έ 이야기λ₯Ό ν•˜λŠ” μ‚¬λžŒμ΄ λ‹Ήμ‹ μ΄λΌλŠ” 것을 μ΄ν•΄ν–ˆμŠ΅λ‹ˆλ‹€ ^__^ 어쩐지 λ‹Ήμ‹ μ˜ 아바타가 λ‚˜μ—κ²Œ λ„ˆλ¬΄ 곡격적으둜 λ³΄μ˜€κ³  이런 μ’…λ₯˜μ˜ λ‚˜λ₯Ό λ†€λΌκ²Œ ν–ˆμŠ΅λ‹ˆλ‹€ :)) λ‹Ήμ‹ μ˜ μž‘μ—…μ— κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€ ;) λ‚˜λŠ” λ‹Ήμ‹ μ˜ Clojure Bad Parts 이야기λ₯Ό μ§€κΈˆ 보고 μžˆμŠ΅λ‹ˆλ‹€ 😊

γ…‹!

그리고 λ‚˜λŠ” 이것이 λ‚˜μ˜ ν–‰λ³΅ν•œ 얼꡴이라고 μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€! πŸ˜„

μ•ˆλ…•ν•˜μ„Έμš”, (이λ§₯슀/사이닀 μ΄ˆλ³΄μžλŠ” μ—¬κΈ°)

일반 사이닀/ROADMAPμ—μ„œ 이 λ²„κ·ΈλŠ” 어디에 μžˆμŠ΅λ‹ˆκΉŒ?

더 λ§Žμ€κ°€?

  • 아무도 이것에 λŒ€ν•΄ 일할 μ‹œκ°„μ΄ μ—†μŠ΅λ‹ˆλ‹€
  • 그것은 κ³Όμˆ˜μ›μœΌλ‘œ/κ³Όμˆ˜μ›μœΌλ‘œ 해결될 κ²ƒμž…λ‹ˆλ‹€
  • 그것은 μ˜λ„ ν•œλŒ€λ‘œ μž‘λ™ν•©λ‹ˆλ‹€
  • μ§€κΈˆ μž‘λ™ν•˜μ§€ μ•Šμ•„μ•Όν•©λ‹ˆκΉŒ?

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.

진전 !

λ‚˜λŠ” λ‹€μŒκ³Ό 같은 일이 μΌμ–΄λ‚˜κ³  μžˆλ‹€κ³  μƒκ°ν•œλ‹€.


μ „μ œ: MELPA의 사이닀λ₯Ό μ‚¬μš©ν•˜λŠ” spacemacsλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. ν˜„μž¬ 0.20.0 + cider-nrepl 0.20.0μž…λ‹ˆλ‹€.

cider-nrepl 0.20.0은 κ³Όμˆ˜μ› 0.3.1을 μ‚¬μš©ν•©λ‹ˆλ‹€.


문제:

orchardλŠ” jdk-sources -> jdk-resource-url 및 λΉ„νŒμ μœΌλ‘œ -> 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) 및 μš°λΆ„νˆ¬ openjdk-11-jre-headless_11.0.1+13-2ubuntu1_amd64 νŒ¨ν‚€μ§€μ—μ„œ μžλ°”λŠ” /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

λ˜λŠ” μ•„μΉ˜λ¦¬λˆ…μŠ€

# ~ $ 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.xml 파일과 같은 "ν‘œμ€€"이 μ—†λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. 집은 μ •λ§λ‘œ μ˜λ―Έκ°€ μžˆμŠ΅λ‹ˆλ‹€)

그게 λˆ„κ΅°κ°€μ—κ²Œ 도움이 λ˜λ‚˜μš”?

λ„€, 도움이 λ©λ‹ˆλ‹€! 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 ν•˜μœ„ λ””λ ‰ν† λ¦¬λŠ” 사라지고 κ·Έ λ‚΄μš©μ€ java.home κ°€ κ°€λ¦¬ν‚€λŠ” JDK 루트둜 ν•œ μˆ˜μ€€ μœ„λ‘œ λ³‘ν•©λ©λ‹ˆλ‹€.

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 μ°Έμ‘°)

λ°λΉ„μ•ˆ νŒŒμƒ 배포판 μ‚¬μš©μžλ₯Ό μœ„ν•΄ 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

κ³Όμˆ˜μ›μ€ 두 곳을 λͺ¨λ‘ ν™•μΈν•˜κ³  src.zip λ₯Ό 읽을 수 μžˆλŠ”μ§€ ν…ŒμŠ€νŠΈν•΄μ•Ό ν•  것 κ°™μŠ΅λ‹ˆλ‹€. 그렇지 μ•Šμ€ 경우 STDERR에 squelchable κ²½κ³ λ₯Ό μΈμ‡„ν•˜λŠ” 것도 μ’‹μŠ΅λ‹ˆλ‹€.
이것이 ν•©λ¦¬μ μœΌλ‘œ 듀리면 PR을 μ œμΆœν•˜κ²Œ λ˜μ–΄ κΈ°μ©λ‹ˆλ‹€.

κ·Έ λ™μ•ˆ src.zip 사본을 μ°Ύμ•„ μˆ˜λ™μœΌλ‘œ 클래슀 κ²½λ‘œμ— μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€(예: :local/root deps.edn ν•­λͺ© μ‚¬μš©)(tools.deps https:/에 μžˆλŠ” 경우). /clojure.org/reference/deps_and_cli#_dependencies).

흠, jdk-sources -> jdk-root 호좜 체인은 boot-class-loader에 μžˆμ„ λ•Œλ§Œ ν˜ΈμΆœλ˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ (.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>

μ—¬μ „νžˆ λ¬Έμ„œκ°€ μ—†μŠ΅λ‹ˆλ‹€

https://github.com/clojure-emacs/orchard/issues/20 이 μˆ˜μ •λ  λ•ŒκΉŒμ§€ Java 11μ—μ„œ 이 λ¬Έμ œκ°€ 해결될 것 κ°™μŠ΅λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ Java 8은 μž‘λ™ν•΄μ•Ό ν•©λ‹ˆλ‹€. μžλ™μœΌλ‘œ μΆ”κ°€λ˜μ–΄μ•Ό ν•˜λŠ” 클래슀 κ²½λ‘œμ— src.zip 및 tools.jar κ°€ λͺ¨λ‘ ν•„μš”ν•©λ‹ˆλ‹€. 그런 λ‹€μŒ λ‹€μŒκ³Ό 같은 것을 μ‹œλ„ν•  수 μžˆμŠ΅λ‹ˆλ‹€(cider 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 문제λ₯Ό ν•΄κ²°ν–ˆμœΌλ―€λ‘œ 이 문제λ₯Ό 닫을 수 μžˆμ„ 것 κ°™μŠ΅λ‹ˆλ‹€.

λ°λΉ„μ•ˆ 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 μ†ŒμŠ€κ°€ ν¬ν•¨λœ zip이 ν¬ν•¨λœ 디렉토리λ₯Ό λ¦¬μ†ŒμŠ€λ‘œ Leiningen ν”„λ‘œν•„( ~/.lein/profiles.clj )에 μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.

{:user {:resource-paths ["/usr/lib/jvm/openjdk-8"]}}
이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
1 / 5 - 1 λ“±κΈ‰