Linux용 Windows 하위 시스템에서 실행되는 Emacs 조직 모드에 이미지를 붙여넣는 방법
내 환경
Doom(WSL2) 내의 Windows 10 시스템에서 구성 프레임워크Windows Subsystem for Linux 2를 사용하여 GNU Emacs 버전 27.1을 실행하고 있습니다. Ubuntu Linux 20.04 LTS 배포판을 사용하고 버전 1.20.8.1의 VcXsrv Windows X Server을 사용하여 Emacs GUI를 내 Windows 데스크탑에 통합합니다. 또한 PowerShell 버전 5.1(기본값은 Windows 10과 함께 제공됨)이 있습니다.
문제
작업하는 동안 Windows 클립보드 도구를 사용하여 스크린샷을 찍어 메모장에 직접 붙여넣는 경우가 많습니다. 조직 모드에서는 가능하며 link images from a text file and display them within Emacs paste and display images directly into org files 에 대한 기존 솔루션이 있습니다. 불행히도 VcXsrv는 클립보드를 통한 이미지 공유를 지원하지 않으므로(오픈feature request) 기존 솔루션이 모두 작동하지 않습니다.
해결책
WSL2에서는 Linux 셸에서 Windows 응용 프로그램을 시작할 수 있습니다. 따라서 PowerShell을 호출하고 스크립팅 기능을 활용할 수 있습니다. 클립보드에서 이미지를 저장하는 것은 다음과 같은 하나의 라이너로 달성할 수 있습니다.
(Get-Clipboard -Format image).Save('somefilename.png')
이것의 도움으로 다음 lisp 함수를 조합하여 작업을 완료할 수 있었습니다.
(defun my-org-paste-image ()
"Paste an image into a time stamped unique-named file in the
same directory as the org-buffer and insert a link to this file."
(interactive)
(let* ((target-file
(concat
(make-temp-name
(concat (buffer-file-name)
"_"
(format-time-string "%Y%m%d_%H%M%S_"))) ".png"))
(wsl-path
(concat (as-windows-path(file-name-directory target-file))
"\\"
(file-name-nondirectory target-file)))
(ps-script
(concat "(Get-Clipboard -Format image).Save('" wsl-path "')")))
(powershell ps-script)
(if (file-exists-p target-file)
(progn (insert (concat "[[" target-file "]]"))
(org-display-inline-images))
(user-error
"Error pasting the image, make sure you have an image in the clipboard!"))
))
(defun as-windows-path (unix-path)
"Takes a unix path and returns a matching WSL path
(e.g. \\\\wsl$\\Ubuntu-20.04\\tmp)"
;; substring removes the trailing \n
(substring
(shell-command-to-string
(concat "wslpath -w " unix-path)) 0 -1))
(defun powershell (script)
"executes the given script within a powershell and returns its return value"
(call-process "powershell.exe" nil nil nil
"-Command" (concat "& {" script "}")))
먼저 생성되어야 하는 파일의 절대 Unix 경로인 target-file
라는 변수를 생성합니다(예: ' /home/user/test.png
'). 문제는 이 경로가 Unix 파일 시스템 내에서만 유효하기 때문에 PowerShell이 이 경로에 액세스할 수 없다는 것입니다. 운 좋게도 WSL2는 Unix 파일 시스템을 네트워크 경로를 정의하는 창에 매핑합니다\wsl$\
. 또한 Unix와 Windows 규칙 간에 경로를 앞뒤로 변환하는 유틸리티wslpath
를 제공합니다. 이를 활용하여 wsl-path
의 Windows 호환 버전인 변수 target-file
를 정의할 수 있으며 결과ps-script
를 PowerShell로 넘겨야 합니다.
마지막으로 ps-script
로 PowerShell을 호출하여 성공 시 target-path
에 새 png 파일이 생성됩니다. 성공하면 현재 문서에 링크로 삽입하고 인라인 이미지로 표시합니다. 파일이 생성되지 않은 경우(일반적으로 클립보드에 이미지가 없을 때 발생) 사용자에게 오류 메시지를 표시합니다.
결론
WSL2 시스템에서 PowerShell을 활용하는 것은 정말 강력한 것 같습니다. 몇 줄의 lisp로 Emacs에서 직접 Windows 명령을 호출할 수 있습니다. 이 사실은 Windows 시스템에서 Emacs(및 조직 모드)를 통합할 수 있는 새로운 가능성을 열어줍니다.
이 기사는 출판되었습니다originally on my personal blog.
Reference
이 문제에 관하여(Linux용 Windows 하위 시스템에서 실행되는 Emacs 조직 모드에 이미지를 붙여넣는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/bitschupser/how-to-paste-images-into-emacs-org-mode-running-in-windows-subsystem-for-linux-2pc0
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
작업하는 동안 Windows 클립보드 도구를 사용하여 스크린샷을 찍어 메모장에 직접 붙여넣는 경우가 많습니다. 조직 모드에서는 가능하며 link images from a text file and display them within Emacs paste and display images directly into org files 에 대한 기존 솔루션이 있습니다. 불행히도 VcXsrv는 클립보드를 통한 이미지 공유를 지원하지 않으므로(오픈feature request) 기존 솔루션이 모두 작동하지 않습니다.
해결책
WSL2에서는 Linux 셸에서 Windows 응용 프로그램을 시작할 수 있습니다. 따라서 PowerShell을 호출하고 스크립팅 기능을 활용할 수 있습니다. 클립보드에서 이미지를 저장하는 것은 다음과 같은 하나의 라이너로 달성할 수 있습니다.
(Get-Clipboard -Format image).Save('somefilename.png')
이것의 도움으로 다음 lisp 함수를 조합하여 작업을 완료할 수 있었습니다.
(defun my-org-paste-image ()
"Paste an image into a time stamped unique-named file in the
same directory as the org-buffer and insert a link to this file."
(interactive)
(let* ((target-file
(concat
(make-temp-name
(concat (buffer-file-name)
"_"
(format-time-string "%Y%m%d_%H%M%S_"))) ".png"))
(wsl-path
(concat (as-windows-path(file-name-directory target-file))
"\\"
(file-name-nondirectory target-file)))
(ps-script
(concat "(Get-Clipboard -Format image).Save('" wsl-path "')")))
(powershell ps-script)
(if (file-exists-p target-file)
(progn (insert (concat "[[" target-file "]]"))
(org-display-inline-images))
(user-error
"Error pasting the image, make sure you have an image in the clipboard!"))
))
(defun as-windows-path (unix-path)
"Takes a unix path and returns a matching WSL path
(e.g. \\\\wsl$\\Ubuntu-20.04\\tmp)"
;; substring removes the trailing \n
(substring
(shell-command-to-string
(concat "wslpath -w " unix-path)) 0 -1))
(defun powershell (script)
"executes the given script within a powershell and returns its return value"
(call-process "powershell.exe" nil nil nil
"-Command" (concat "& {" script "}")))
먼저 생성되어야 하는 파일의 절대 Unix 경로인 target-file
라는 변수를 생성합니다(예: ' /home/user/test.png
'). 문제는 이 경로가 Unix 파일 시스템 내에서만 유효하기 때문에 PowerShell이 이 경로에 액세스할 수 없다는 것입니다. 운 좋게도 WSL2는 Unix 파일 시스템을 네트워크 경로를 정의하는 창에 매핑합니다\wsl$\
. 또한 Unix와 Windows 규칙 간에 경로를 앞뒤로 변환하는 유틸리티wslpath
를 제공합니다. 이를 활용하여 wsl-path
의 Windows 호환 버전인 변수 target-file
를 정의할 수 있으며 결과ps-script
를 PowerShell로 넘겨야 합니다.
마지막으로 ps-script
로 PowerShell을 호출하여 성공 시 target-path
에 새 png 파일이 생성됩니다. 성공하면 현재 문서에 링크로 삽입하고 인라인 이미지로 표시합니다. 파일이 생성되지 않은 경우(일반적으로 클립보드에 이미지가 없을 때 발생) 사용자에게 오류 메시지를 표시합니다.
결론
WSL2 시스템에서 PowerShell을 활용하는 것은 정말 강력한 것 같습니다. 몇 줄의 lisp로 Emacs에서 직접 Windows 명령을 호출할 수 있습니다. 이 사실은 Windows 시스템에서 Emacs(및 조직 모드)를 통합할 수 있는 새로운 가능성을 열어줍니다.
이 기사는 출판되었습니다originally on my personal blog.
Reference
이 문제에 관하여(Linux용 Windows 하위 시스템에서 실행되는 Emacs 조직 모드에 이미지를 붙여넣는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/bitschupser/how-to-paste-images-into-emacs-org-mode-running-in-windows-subsystem-for-linux-2pc0
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
(Get-Clipboard -Format image).Save('somefilename.png')
(defun my-org-paste-image ()
"Paste an image into a time stamped unique-named file in the
same directory as the org-buffer and insert a link to this file."
(interactive)
(let* ((target-file
(concat
(make-temp-name
(concat (buffer-file-name)
"_"
(format-time-string "%Y%m%d_%H%M%S_"))) ".png"))
(wsl-path
(concat (as-windows-path(file-name-directory target-file))
"\\"
(file-name-nondirectory target-file)))
(ps-script
(concat "(Get-Clipboard -Format image).Save('" wsl-path "')")))
(powershell ps-script)
(if (file-exists-p target-file)
(progn (insert (concat "[[" target-file "]]"))
(org-display-inline-images))
(user-error
"Error pasting the image, make sure you have an image in the clipboard!"))
))
(defun as-windows-path (unix-path)
"Takes a unix path and returns a matching WSL path
(e.g. \\\\wsl$\\Ubuntu-20.04\\tmp)"
;; substring removes the trailing \n
(substring
(shell-command-to-string
(concat "wslpath -w " unix-path)) 0 -1))
(defun powershell (script)
"executes the given script within a powershell and returns its return value"
(call-process "powershell.exe" nil nil nil
"-Command" (concat "& {" script "}")))
WSL2 시스템에서 PowerShell을 활용하는 것은 정말 강력한 것 같습니다. 몇 줄의 lisp로 Emacs에서 직접 Windows 명령을 호출할 수 있습니다. 이 사실은 Windows 시스템에서 Emacs(및 조직 모드)를 통합할 수 있는 새로운 가능성을 열어줍니다.
이 기사는 출판되었습니다originally on my personal blog.
Reference
이 문제에 관하여(Linux용 Windows 하위 시스템에서 실행되는 Emacs 조직 모드에 이미지를 붙여넣는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/bitschupser/how-to-paste-images-into-emacs-org-mode-running-in-windows-subsystem-for-linux-2pc0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)