読者です 読者をやめる 読者になる 読者になる

xyzzy のファイラでファイル名をコピーする

こちらを参考に複数のファイルを、ファイル名、フルパス、フルパス(バックスラッシュ)、URL形式でコピーできるようにした。

;; ファイラでファイル名をコピーする
(defun filer-get-filenamestring (filename type)
  (interactive)
  (let (str)
    (cond
     ((= type 1) (setq str (if (file-directory-p filename)
                               (car (reverse (pathname-directory (concat filename "x"))))
                             (file-namestring filename))))
     ((= type 2) (setq str filename))
     ((= type 3) (setq str (map-slash-to-backslash filename)))
     ((= type 4) (setq str (concat "file:///" filename))))
    str))

(defun my-filer-make-clipboard-string (lst)
   (apply #'concat (mapcar #'(lambda (x) (concat x "\n")) lst)))

(defun filer-get-filenames (type)
  (interactive)
  (let ((selected-files (or (filer-get-mark-files)
                            (list (filer-get-current-file)))))
    (copy-to-clipboard (my-filer-make-clipboard-string
                        (mapcar #'(lambda (filename) (filer-get-filenamestring filename type)) selected-files)))
    (message "ファイル名をコピーしました")))

(defvar *get-filenamestring-menu* nil)
(define-key filer-keymap #\C-Insert
            #'(lambda () (interactive)
                (unless *get-filenamestring-menu*
                  (setq *get-filenamestring-menu*
                        (define-popup-menu
                          (:item nil "ファイル名のみコピー(&F)"
                           #'(lambda () (interactive) (filer-get-filenames 1)))
                          (:item nil "フルパス(/)でコピー(&S)"
                           #'(lambda () (interactive) (filer-get-filenames 2)))
                          (:item nil "フルパス(\\)でコピー(&E)"
                           #'(lambda () (interactive) (filer-get-filenames 3)))
                          (:item nil "URL表記でコピー(&U)"
                           #'(lambda () (interactive) (filer-get-filenames 4)))
                          )))
                (track-popup-menu *get-filenamestring-menu*)))