关于 wdired

突然有一个想法,wdired 很好用,如果能编辑子目录及文件就更牛逼了!但是现在貌似不可以,因为dired并不显示下一级目录中的内容。大家怎么看?

在某个目录上按 i 试试

1 个赞

以前还真没用过这个,比较接近我想要的了——比如直接把中间层级的目录删掉

用ivy选择目录然后插入怎么样

(defun cm/dired-insert-selected-dir (&rest args)
  (interactive
   (list (expand-file-name (read-directory-name "Select a dir: "))
         (if current-prefix-arg
             (read-string "Switches for listing: "
                          (or dired-subdir-switches dired-actual-switches)))))
  (apply #'dired-maybe-insert-subdir args))

Dired 跟 ls 绑定在一块儿,要所有列出子目录的话,可以用 -R / --recursive 选项。在 Dired 中使用 C-u s (dired-sort-toggle-or-edit) 调整 ls 命令行参数。

ls 不支持 --tree,不清楚为什么不加入,感觉是很有用的功能,树状输出也比 -R 紧凑。ls 也不支持忽略特定的文件,感觉也是很实用的功能。

Dired 和 wdired 的功能很容易实现,下面第一个实现 Dired,第二个实现 wdired,不过 Emacs Lisp 实现的话容易卡住 Emacs,而且用 directory-files-recursively 估计会使这个问题更严重。

开发 ls / Dired 的替代品应该有足够的理由,不少人应该已经分别写过了。

(defun my-edit-directory (dir)
  (interactive "DDir: ")
  (with-current-buffer (get-buffer-create (format "Edit %s" dir))
    (display-buffer (current-buffer))
    (erase-buffer)
    (dolist (filename (directory-files-recursively dir ""))
      (insert (propertize filename 'filename filename) "\n"))))

(defun my-edit-directory-commit (&optional query)
  (interactive "P")
  (save-excursion
    (goto-char (point-min))
    (while (not (eobp))
      (pcase (get-text-property (line-beginning-position) 'filename)
        ('nil (user-error "Text property filename is missing"))
        (old (let ((new (buffer-substring (line-beginning-position)
                                          (line-end-position))))
               (unless (string= old new)
                 (when (or (not query) (y-or-n-p (format "Rename? %s -> %s" old new)))
                   (message "Renaming %s -> %s" old new)
                   (rename-file old new))))))
      (forward-line))))

Dired 也支持别的程序,比如 find(1),通过 M-x find-dired,也能输出子目录。

1 个赞

moreutils的vidir,当然比dired差远了