Заменить файл в точке в Emacs
Я нашел здесь функцию замены файла, но она не работает должным образом: http://www.emacswiki.org/emacs/InsertFileName. Он правильно находит файл в точке, но замена, кажется, берет введенный вами файл, а не файл, обнаруженный первоначально из того, что я вижу. Я не уверен, как это исправить.
Если я запускаю функцию в / 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"))))
2 ответа
Здесь, вероятно, есть несколько вещей, которые не так или происходят здесь. Во-первых, ваша позиция, когда вы выполняете это. Во-вторых, если вы используете / home / user / что-то, существует большая вероятность того, что у вас будет несоответствие между / home / user / что-то и ~/ чем-то (ffap возвращает последнее, тогда как в тот момент, когда вы могли написать бывший).
Первый:
Использование looking-at
с указанным в regexp имени файла ожидает, что точка будет в начале: например |/home/user/something
,
Его партнер, looking-back
надеется /home/user/something|
, Находясь где-то посередине, выдает эту ошибку
Одно быстрое решение для этого меняется looking-at
в thing-at-point-looking-at
,
Во-вторых:
Если вы написали / home / user / что-то, функции ffap (в моем случае) сокращают это, используя ~. Вероятно, есть некоторые настройки, которые управляют этим, но самое простое и быстрое решение, которое я знаю, использует expand-file-name
, Это позаботится о первом случае, и если оно записано как ~/ что-то, save-excursion
кузов заменит его в альтернативном корпусе.
Единственный отрицательный результат, который я вижу, это то, что иногда вы можете заменить:
/home/user/something
с ~/somethingelse
Но, в любом случае, эти два быстрых исправления приводят к полному изменению:
(thing-at-point-looking-at (regexp-quote (expand-file-name currfile)))
Не может видеть, где определяется "ffap-guesser". Похоже, ошибка.
Может быть, попробовать вместо
"Найти-файл-в-точку"