2014-07-02 2 views
0

J'ai une fonction personnalisée qui obtient des noms de fichiers marqués par dired (ie, les noms de chaque fichier marqué) si plus d'un a été marqué , ou si seulement un, il obtient le nom du fichier au point. Un problème survient lorsque le curseur est no-man's-land car dired-mark (ou moi, parce que je suis le pilote) est trop zélé sur la répétition et déplace le curseur sur une ligne vide à la fin du tampon où il n'y a pas de fichier. Dans ce cas, l'erreur est la suivante:Emacs - modifier `dired-mark` pour éviter de déplacer le curseur sur une ligne vide à eob

Debugger entered--Lisp error: (error "No file on this line") 
    signal(error ("No file on this line")) 
    error("No file on this line") 
    dired-get-file-for-visit() 
    (file-directory-p (dired-get-file-for-visit)) 
    (if (file-directory-p (dired-get-file-for-visit)) nil (let ((lawlist-filename (if (or (re-search-backward "^*" nil t) (re-search-forward "^*" nil t)) (dired-get-marked-files) (dired-get-file-for-visit)))) (wl-draft-mailto) (attach-multiple-files lawlist-filename))) 
    (lambda nil (interactive) (if (file-directory-p (dired-get-file-for-visit)) nil (let ((lawlist-filename (if (or (re-search-backward "^*" nil t) (re-search-forward "^*" nil t)) (dired-get-marked-files) (dired-get-file-for-visit)))) (wl-draft-mailto) (attach-multiple-files lawlist-filename))))() 
    funcall-interactively((lambda nil (interactive) (if (file-directory-p (dired-get-file-for-visit)) nil (let ((lawlist-filename (if (or (re-search-backward "^*" nil t) (re-search-forward "^*" nil t)) (dired-get-marked-files) (dired-get-file-for-visit)))) (wl-draft-mailto) (attach-multiple-files lawlist-filename))))) 
    call-interactively((lambda nil (interactive) (if (file-directory-p (dired-get-file-for-visit)) nil (let ((lawlist-filename (if (or (re-search-backward "^*" nil t) (re-search-forward "^*" nil t)) (dired-get-marked-files) (dired-get-file-for-visit)))) (wl-draft-mailto) (attach-multiple-files lawlist-filename)))) nil nil) 
    command-execute((lambda nil (interactive) (if (file-directory-p (dired-get-file-for-visit)) nil (let ((lawlist-filename (if (or (re-search-backward "^*" nil t) (re-search-forward "^*" nil t)) (dired-get-marked-files) (dired-get-file-for-visit)))) (wl-draft-mailto) (attach-multiple-files lawlist-filename))))) 

J'aime la capacité de maintenir la touche dired-mark vers le bas pour la répétition, mais je voudrais à arrêter à la dernière ligne avec un fichier dans la mémoire tampon en mode dired . Toute idée sur la façon d'atteindre cet objectif serait grandement appréciée. Passant ce point, effectuer un test, puis revenir au point précédent semble pas être un moyen très efficace de le gérer. Il peut être préférable de terminer le tampon dired à la fin de la dernière ligne avec un fichier, de sorte qu'il n'y a pas de ligne vide - c'est-à-dire s'il n'y a pas de ligne vide à la fin du tampon en mode dired, dired-mark n'y allez pas (donc ce serait bien?).


EDIT: Le message de débogage a été mis à jour avec un complet backtrace. Ce qui suit est la fonction personnalisée qui peut être, comme @Drew suggère, la cause racine du message d'erreur que je reçois:

;; E-mail attachments using Wanderlust. 
(define-key dired-mode-map (kbd "C-c e") (lambda() (interactive) 
    ;; if hovering over a directory, then do nothing 
    (unless (file-directory-p (dired-get-file-for-visit)) 
    (let ((lawlist-filename 
     (if (or (re-search-backward "^*" nil t) 
       (re-search-forward "^*" nil t)) 
     (dired-get-marked-files) 
     (dired-get-file-for-visit)))) 
    (wl-draft-mailto) 
    (attach-multiple-files lawlist-filename))))) 

(defun attach-multiple-files (&optional lawlist-filename) 
"Either (dired-get-marked-files) or (dired-get-file-for-visit) when exiting recursive edit." 
(interactive) 
    (let* (
     new-dir 
     (beg (point)) 
     (dir "/Users/HOME/.0.data")) 
     (goto-char (point-min)) 
    (when (and (re-search-forward "[email protected]" nil t) (not (re-search-forward "[email protected]\n" nil t))) 
     (goto-char (point-max)) 
     (newline 2)) 
    (catch 'done 
     (while t 
     (goto-char (point-max)) 
     (let* (
      (multi-attach-variable t) 
      (next-file 
      (if lawlist-filename 
       lawlist-filename 
       (dired-read-file-name 
       (if new-dir 
        new-dir 
        dir))))) 
      (setq new-dir 
      (cond 
       ((and next-file (stringp next-file)) 
       (file-name-directory next-file)) 
       ((and next-file (listp next-file)) 
       (file-name-directory (car next-file))))) 
      (cond 
      ((stringp next-file) 
       (mime-edit-insert-file next-file t)) 
      ((listp next-file) 
       (mapcar (lambda (x) (mime-edit-insert-file x t)) next-file))) 
      (setq lawlist-filename nil) 
      (if (not (lawlist-y-or-n-p "Attach another? ")) 
       (progn 
        (goto-char beg) 
        (throw 'done nil)))))))) 
+0

1. Où pensez-vous que er Ror message? Je ne le vois pas avec 'emacs -Q' ou n'importe où dans' dired-mark'. 'dired-repeat-over-lines' renvoie zéro lorsqu'il passe à eob. Le message provient d'actions particulières sur une ligne sans fichier. Pour l'éviter, vérifiez si le point est sur une ligne avec un fichier. 2. Pourquoi voulez-vous arrêter avant eob - est-ce juste pour éviter cette erreur msg? (3. Pas directement lié, mais peut-être d'intérêt: avec les touches [** Dired + **] (http://www.emacswiki.org/DiredPlus) 'Cn',' Cp', 'down' et' up' autour de la fin/début au début/fin. Vous pourriez faire de même pour 'm', si vous le vouliez.) – Drew

+0

@Drew - merci - J'ai mis à jour la question avec la fonction personnalisée qui peut (comme vous suggéré) être responsable de l'erreur (plutôt que «dired-mark»). Il n'y a pas de raison particulière de s'arrêter avant eob, sauf pour éviter le message d'erreur. De temps en temps j'aime regarder Dired + pour des idées astucieuses - j'ai emprunté votre mise en évidence de la mémoire tampon en mode dired - c'est une excellente bibliothèque. – lawlist

+0

@Drew - Merci de m'avoir aidé à identifier le problème. La fonction personnalisée que j'utilisais était l'une de mes premières tentatives pour obtenir les noms de fichiers en mode dired. Ailleurs dans mes bibliothèques personnalisées, j'avais déjà basculé sur la méthode utilisée par 'dired-do-create-files'. Donc, ma fonction personnalisée en question dans ce thread doit incorporer cette même méthode. J'ai posté une réponse qui résoudra le problème. Comme toujours, votre aide est grandement appréciée! Sans votre aide, j'aurais probablement fini par essayer de réécrire quelque chose en mode dired inutilement. – lawlist

Répondre

0

Réponse précédente (17 Octobre, 2014): Voici 3 lignes de code arrêtera la fonction si le curseur est pas sur un fichier ou un répertoire et si rien n'a été marqué:

(when (null (dired-get-marked-files)) 
    (let ((debug-on-quit nil)) 
    (signal 'quit `("You are not on a line containing a valid file or directory.")))) 

réponse révisée (20 Janvier, 2015): la fonction dired-insert-directory peut être modifiée pour supprimer de nouvelles lignes de fuite et/ou un espace à la fin du tampon comme suit:

(goto-char (point-max)) 
(let ((trailing-whitespace+newlines (abs (skip-chars-backward "\s\r\n\t")))) 
    (when (> trailing-whitespace+newlines 0) 
    (delete-char trailing-whitespace+newlines))) 
0

Essayez defadvice sur dired-mark pour éviter l'atterrissage en no man land:

(defadvice dired-mark (after stop-at-last-file activate) 
    (when (eobp) 
    (previous-line 1))) 

Le « aller de l'avant après avoir marqué » fonctionnalité est cuit dans dired-mark (en fait, si vous voulez entrer dans les entrailles de celui-ci, en dired-repeat-over-lines), donc ce contrôle des conseils si vous mettez sur cette ligne vide et se déplace vous retour si oui. Votre dernier paragraphe suggère que vous n'êtes peut-être pas très friand de cette option, mais cela me semble moins gênant que de modifier les interned dired.

+0

Merci pour l'idée - j'y réfléchirai un peu plus dans le cadre de ma fonction personnalisée, et rendrai compte. – lawlist

Questions connexes