在使用ORG的时候有的时候需要用到外部链接。。
一般使用C-u, C-c, C-l.
但是他给出来的是让你查找链接。
请问如何设置,使得他可以直接按照本文件名(如:abc.org)(如果不存在,则建立)然后打开刚刚创建的子目录(如:abc.d),让你在里面寻找或者创建文件?
我想在整理文档的时候,这是一个好方法!
elisp经验有限啊。。。
ORG mode使用的链接问题
-
- 帖子: 6
- 注册时间: 2009-08-22 8:57
-
- 帖子: 78
- 注册时间: 2009-09-04 16:42
Re: ORG mode使用的链接问题
代码: 全选
(defun my-org-insert-link (&optional complete-file link-location)
(interactive "P")
(if (member complete-file '((4)))
(let* ((default-dir default-directory)
(file (buffer-file-name)) ;文件名(含路径)
(file-dir (file-name-directory file)) ;文件路径
(file-name (file-relative-name file file-dir)) ;文件名
(dir-name (concat file-name ".d"))) ;要创建的子目录名
(setq default-directory file-dir)
(if (not (file-directory-p dir-name))
(make-directory-internal dir-name))
(setq default-directory (concat file-dir dir-name "/"))
(org-insert-link complete-file link-location)
(setq default-directory default-dir))
(org-insert-link complete-file link-location)))
-
- 帖子: 6
- 注册时间: 2009-08-22 8:57
Re: ORG mode使用的链接问题
我研究了很久。放进去,调用函数。还是不行。。。啊。。要死了。lhui 写了:这个函数有C-u前缀时会进入子目录查找文件,其他情况下和org-insert-link一样代码: 全选
(defun my-org-insert-link (&optional complete-file link-location) (interactive "P") (if (member complete-file '((4))) (let* ((default-dir default-directory) (file (buffer-file-name)) ;文件名(含路径) (file-dir (file-name-directory file)) ;文件路径 (file-name (file-relative-name file file-dir)) ;文件名 (dir-name (concat file-name ".d"))) ;要创建的子目录名 (setq default-directory file-dir) (if (not (file-directory-p dir-name)) (make-directory-internal dir-name)) (setq default-directory (concat file-dir dir-name "/")) (org-insert-link complete-file link-location) (setq default-directory default-dir)) (org-insert-link complete-file link-location)))
他总是提示Insert a link.
出现一个新的buffer。叫做org link:
然后开始提示:
Use TAB to complete link prefixes, then RET for type-specific completion supportInsert a link.
查手册,n多自定义变量。。真是解决不了。。。
等过一段时间,我有时间学了,一定把这个函数搞定了!
Thx a lot...至少让我有点思路。
其中代码的最后一行和倒数第三行完全一样,我看了一下,可能有问题。。。
-
- 帖子: 78
- 注册时间: 2009-09-04 16:42
Re: ORG mode使用的链接问题
很抱歉,由于没有仔细测试,上面的函数确实有bug,已经在下面更新了。
但你上面说的问题并不是bug,我想你没有看函数下面的那句话吧。简单地说,如果用绑定该函数到 C-c C-l,那么C-c C-l 就会调用原来的`org-insert-link',也就是你上面的情况;如果是C-u C-c C-l,就正是你想要的(C-u是传递的参数)。所以这个函数是可以代替原来的`org-insert-link'使用的。
但你上面说的问题并不是bug,我想你没有看函数下面的那句话吧。简单地说,如果用
代码: 全选
(define-key org-mode-map "\C-c\C-l" 'my-org-insert-link)
代码: 全选
(defun my-org-insert-link (&optional complete-file link-location)
(interactive "P")
(if (equal complete-file '(4))
(let* ((default-dir default-directory) ;获取 default-directory
(org-link-file-path-type 'absolute) ;上面的函数少了这句,会导致bug
(file (buffer-file-name)) ;获取文件名(含路径)
(file-dir (file-name-directory file)) ;文件路径
(file-name (file-relative-name file file-dir)) ;文件名
(dir-name (concat file-name ".d"))) ;设置要创建的子目录名
(setq default-directory file-dir)
;; 判断是否存在子目录名;若不存在则创建
(if (not (file-directory-p dir-name))
(make-directory-internal dir-name))
;; org-insert-link 是根据 default-directory 查找文件的,所以需要改变目录
(setq default-directory (concat file-dir dir-name "/"))
(unwind-protect ;如果没有这句,会导致C-g退出时无法恢复 default-directory
(org-insert-link complete-file link-location)
(setq default-directory default-dir))) ;恢复 default-directory
(org-insert-link complete-file link-location)))