Org-mode 记笔记截图工具

刚刚又用了下这个 lisp 简直就是赞的不行 @kirchhoff 受小弟一拜 orz

1 个赞

发现没有写 Windows 的,还得根据自己的常用工具添一点代码

杨家将没看过 佘老太君啊

非常有用,感谢楼主,代码收藏了

我在用这个函数: my-org-screenshot ()

不知道有没有人遇到这个问题,截图的时候,有时会在图上出现多余的横纵线。 如图: 20190616_145603_iRUSlu

这图本是纯色的,多出了一横一竖两条线。有时候会多出很多很多条!

PS:Ubuntu16.04,[email protected] (spacemacs)


用了一下 org-download,似乎更好哦。

我的也会出现这个问题。另外:我的系统是manjaro系统,i3wm桌面管理。这个在实际使用过程中其实不是太好使用,一个是截取的区域显示的不友好,另外一个就是最好有延时功能,比如自己需要截取的文件在另外的一个区域或者需要重新打开这个文件,此时这个就很麻烦了。不知道大家使用 org来记录笔记针对截图这个功能大家又没有比较完美的解决方案了。

这种截图方法有个限制, 就是无法离开emacs的窗口, 想要截取的图可能会被emacs窗口遮挡.

最好是用其他方法截图, 保存在剪切版, 然后emacs里可以读取剪切版内容, 存文件并插入图片.

代码稍微改了一下, 截图前隐藏emacs窗口, 截图后恢复emacs窗口. 可能会受限于wm, 在xfce环境下ok.

(defun my-org-screenshot ()
  "Take a screenshot into a time stamped unique-named file in the
same directory as the org-buffer and insert a link to this file."
  (interactive)
  (org-display-inline-images)
  (setq filename
        (concat
         (make-temp-name
          (concat (file-name-nondirectory (buffer-file-name))
                  "_imgs/"
                  (format-time-string "%Y%m%d_%H%M%S_")) ) ".png"))
  (unless (file-exists-p (file-name-directory filename))
    (make-directory (file-name-directory filename)))
					; take screenshot
  (make-frame-invisible nil t)
  (if (eq system-type 'darwin)
      (progn
	(call-process-shell-command "screencapture" nil nil nil nil " -s " (concat
									    "\"" filename "\"" ))
	(call-process-shell-command "convert" nil nil nil nil (concat "\"" filename "\" -resize  \"50%\"" ) (concat "\"" filename "\"" ))
	))
  (if (eq system-type 'gnu/linux)
      (call-process "import" nil nil nil filename))
					; insert into file if correctly taken
  (make-frame-visible)
  (if (file-exists-p filename)
      (insert (concat "[[file:" filename "]]")))
  (org-display-inline-images)
  )

(global-set-key (kbd "C-c s c") 'my-org-screenshot)

用了一下,还是没有避免多余线条的问题

使用 PicGo + GitHub 图床,可以截完图按一个快捷键上床然后粘贴到文档中,这样可以保证导出的时候图片也是 ok 的。唯一的缺点就是有些私密的图片不太适合。

我也是这个环境,解决方法是延迟3秒后运行截图程序,延迟的时间可以切换窗口,切换buffer等,然后将图片路径保存在剪切板,自己手动将路径粘贴到文件中。截图工具使用deepin-screenshot,截图后能很方便的做一些批注。

;;;###autoload
(defun +my-blog-kill-new-img-link(prefix imagename)
  (kill-new (format "[[file:%s%s]] " prefix imagename)))

;;;###autoload
(defun +my-blog/gen-file-name(&optional basename)
  (interactive)
  (unless (and basename (not (string= basename "")))
    (setq basename (file-name-base buffer-file-name)))
  (concat basename (format-time-string "_%Y%H%M%S")))


;;;###autoload
(defun +my-blog/capture-screenshot(basename &optional filename)
  (interactive "sScreenshot name: ")
  (setq filename (+my-blog/gen-file-name basename))
  (run-with-idle-timer 3 nil (lambda (filename)
                               (progn
                                 (call-process-shell-command (concat "deepin-screenshot -s " (concat (expand-file-name +my-blog-img-dir) filename)))
                                 (+my-blog-kill-new-img-link +my-blog-img-dir (concat filename ".png")))) filename))

你这个如何延迟3秒钟,代码中好像没有。这个还是必须的一个功能,因为很多时候需要截图的文件和emacs可能不在一个工作区(我使用的是平铺的桌面管理方案 iwm)。

字数大大补丁

为什么不先用通用截图软件截屏,然后自由粘贴到emacs中呢。可以参考我之前的帖子: 粘贴剪切板中的图片为 Markdown 链接(概念验证)