在emacs中的点处替换文件

在emacs中的点处替换文件,emacs,elisp,emacs24,Emacs,Elisp,Emacs24,我在此处找到了replace filen的函数,但它似乎无法正常工作:。它在点上正确地找到了文件,但替换似乎采用了您输入的文件,而不是我看到的最初检测到的文件。我不知道如何解决这个问题 如果我在/home/testfile上运行函数 首先它表示要替换的文件,例如:/home/secondfile 然后它说用:/home/secondfile替换“/home/secondfile” 然后它说:在点上没有文件 有什么想法吗 以下是函数: (autoload 'ffap-guesser "ffap")

我在此处找到了replace filen的函数,但它似乎无法正常工作:。它在点上正确地找到了文件,但替换似乎采用了您输入的文件,而不是我看到的最初检测到的文件。我不知道如何解决这个问题

如果我在/home/testfile上运行函数

首先它表示要替换的文件,例如:/home/secondfile 然后它说用:/home/secondfile替换“/home/secondfile” 然后它说:在点上没有文件

有什么想法吗

以下是函数:

(autoload 'ffap-guesser "ffap")
(autoload 'ffap-read-file-or-url "ffap")

(defun my-replace-file-at-point (currfile newfile)
"Replace CURRFILE at point with NEWFILE.

  When interactive, CURRFILE will need to be confirmed by user
  and will need to exist on the file system to be recognized,
  unless it is a URL.

  NEWFILE does not need to exist.  However, Emacs's minibuffer
  completion can help if it needs to be.
  " 

(interactive
 (let ((currfile (ffap-read-file-or-url "Replace filename: "
                                        (ffap-guesser))))
   (list currfile
         (ffap-read-file-or-url (format "Replace `%s' with: "
                                        currfile) currfile))))
(save-match-data
  (if (or (looking-at (regexp-quote currfile))
          (let ((filelen (length currfile))
                (opoint (point))
                (limit (+ (point) (length currfile))))
            (save-excursion
              (goto-char (1- filelen))
              (and (search-forward currfile limit
                                   'noerror)
                   (< (match-beginning 0) opoint))
                   (>= (match-end 0) opoint))))
      (replace-match newfile)
    (error "No file at point to replace"))))
(自动加载“ffap猜测器”ffap)
(自动加载“ffap读取文件”或url“ffap”)
(在点处取消我的替换文件(currfile newfile)
“将点处的CURRFILE替换为NEWFILE。
交互时,文件需要用户确认
并且需要存在于文件系统中才能识别,
除非它是一个URL。
NEWFILE不需要存在。但是,Emacs的minibuffer
如果需要,完成可以有所帮助。
" 
(互动
(让((currfile)(ffap读取文件或url)替换文件名:
(ffap猜测者)
(列表文件)
(ffap读取文件或url(格式为“将“%s”替换为:”
currfile)currfile)))
(保存匹配数据
(如果(或(查看(regexp报价文件))
(let((filelen(长度currfile))
(点(点))
(限制(+(点)(文件长度)))
(省去远足
(转到字符(1-filelen))
(和(向前搜索文件限制)
“没有错误)
(<(匹配起始点0)opoint))
(>=(匹配结束0)opoint)))
(替换匹配新文件)
(错误“在要替换的点没有文件”))
无法查看“ffap猜测器”的定义位置。看起来像只虫子

也许可以试试


“在点处查找文件”

这里可能有一些地方出错了。第一个是,执行此操作时的点位置。第二个问题是,如果您使用的是/home/user/something,那么很有可能在/home/user/something和~/something之间存在不匹配的情况(ffap返回后者,而您可能已经编写了前者)

第一名:

使用带有regexp引号的文件名的
查看
,期望点位于开头:例如
|/home/user/something

它的合作伙伴,
回头看
期望
/home/user/something |
。中间的某个地方会抛出这个错误。

一个快速解决方法是将查看
更改为查看点处的
东西

秒:

如果您已经编写了/home/user/something,那么ffap函数(在我的例子中)将使用~。 可能有一些设置可以控制这一点,但据我所知,最简单、快速的修复方法是使用
扩展文件名
。这将处理第一种情况,如果它被写为~/something,则
保存偏移
主体将在另一种情况下替换它

我看到的唯一负面结果是,有时您可能会替换:

/home/user/something
~/somethingelse

但是,不管怎样,这两个快速解决方案只是导致了这一彻底的变化:


(正在查看的东西(regexp引号(扩展文件名currfile))

对不起,我忘了添加自动加载。它在“ffap.el”中有定义,但这似乎不是我的问题所在。据我所知,它能正确识别文件的位置,但它似乎在替换内容的功能中。Replace似乎接受了我要替换的文件,而不是原始函数,因此当搜索发生时,它不会找到它应该替换的文件。我可能错了。我还添加了一个发生的确切步骤的示例。如果我当时使用了find文件,我可以用ffap guesser替换它吗?谢谢!!是的,就是它不能在完整路径名上正常工作,除非您使用扩展文件名,但正如您所说的,它将替换为缩短版本。如果它已经被扩展了,是否可以很容易地强制它进行扩展,或者如果将前缀arg(C-u)传递给函数,则最好只扩展文件名。