| @@ -625,6 +625,8 @@ return nil if LIB unfound and downloading failed, otherwise the path of LIB." | |||||
| (add-to-list 'auto-mode-alist (cons "\\.ol$" 'outline-mode)) | (add-to-list 'auto-mode-alist (cons "\\.ol$" 'outline-mode)) | ||||
| (add-to-list 'auto-mode-alist (cons "\\.md$" 'outline-mode)) | (add-to-list 'auto-mode-alist (cons "\\.md$" 'outline-mode)) | ||||
| (setq markdown-command (or (executable-find "markdown") | |||||
| (executable-find "markdown.pl"))) | |||||
| (when (dllib-if-unfound "markdown-mode" | (when (dllib-if-unfound "markdown-mode" | ||||
| "http://jblevins.org/projects/markdown-mode/markdown-mode.el" | "http://jblevins.org/projects/markdown-mode/markdown-mode.el" | ||||
| t) | t) | ||||
| @@ -1091,115 +1093,6 @@ return nil if LIB unfound and downloading failed, otherwise the path of LIB." | |||||
| (diff (cadr files) (dired-get-filename)) | (diff (cadr files) (dired-get-filename)) | ||||
| (message "One files must be marked!")))) | (message "One files must be marked!")))) | ||||
| (require 'dired-aux) ;; needed to use dired-dwim-target-directory | |||||
| (defun my-dired-do-pack-or-unpack () | |||||
| "pack or unpack files. | |||||
| if targetting one file and that is archive file defined in `pack-program-alist', unpack that. | |||||
| otherwise, pack marked files. prompt user to decide filename for archive." | |||||
| (interactive) | |||||
| (let* ((infiles (dired-get-marked-files t)) | |||||
| (onefile (and (eq 1 ; filename if only one file targeted, otherwise nil. | |||||
| (length infiles)) | |||||
| (car infiles)))) | |||||
| (if (and onefile | |||||
| (my-pack-file-name-association onefile)) | |||||
| (when (y-or-n-p (format "unpack %s? " onefile)) | |||||
| (my-unpack onefile)) | |||||
| (let* ((dir-default (dired-dwim-target-directory)) | |||||
| (archive-default (my-pack-file-extension (file-name-nondirectory (car infiles)))) | |||||
| (archive ;; (if (interactive-p) | |||||
| (read-file-name "Output file to pack : " | |||||
| dir-default | |||||
| nil | |||||
| nil | |||||
| archive-default) | |||||
| ;; (concat dir-default archive-default) | |||||
| )) | |||||
| (apply 'my-pack | |||||
| archive | |||||
| infiles)))) | |||||
| (revert-buffer) | |||||
| ;; (dired-unmark-all-marks) | |||||
| ) | |||||
| (defun my-file-name-extension-with-tar (filename) | |||||
| "if FILENAME has extension with tar, like \"tar.gz\", return that. | |||||
| otherwise, return extension normally." | |||||
| (if (string-equal "tar" (file-name-extension (file-name-sans-extension filename))) | |||||
| (concat "tar." | |||||
| (file-name-extension filename)) | |||||
| (file-name-extension filename))) | |||||
| (defun my-pack-file-extension (filename) | |||||
| "if FILENAME has extension and it can be used for pack, return FILENAME. | |||||
| otherwise, return FILENAME with `my-pack-default-extension'" | |||||
| (if (my-pack-file-name-association filename) | |||||
| filename | |||||
| (concat filename "." my-pack-default-extension))) | |||||
| (defvar my-7z-program-name | |||||
| (or (executable-find "7z") | |||||
| (executable-find "7za") | |||||
| (executable-find "7zr")) | |||||
| "7z program.") | |||||
| (defvar my-pack-default-extension | |||||
| "7z" | |||||
| "default suffix for packing. filename with this suffix must matches one of `pack-program-alist'") | |||||
| (defun my-pack-file-name-association (filename) | |||||
| "if the pattern matching FILENAME is found at car of the list in `pack-program-alist', return cdr of that list. | |||||
| otherwise, return nil." | |||||
| (let ((case-fold-search nil)) | |||||
| (assoc-default filename | |||||
| my-pack-program-alist | |||||
| 'string-match-p | |||||
| nil))) | |||||
| (defvar my-pack-program-alist | |||||
| `( | |||||
| ("\\.7z\\'" ,(concat my-7z-program-name " a") ,(concat my-7z-program-name " x")) | |||||
| ("\\.zip\\'" "zip -r" "unzip") | |||||
| ("\\.tar\\'" "tar cf" "tar xf") | |||||
| ("\\.tgz\\'" "tar czf" "tar xzf") | |||||
| ("\\.tar\\.gz\\'" "tar czf" "tar xzf") | |||||
| ) | |||||
| "Alist of filename patterns, command for pack and unpack. | |||||
| Each element looks like (REGEXP PACKING-COMMAND UNPACKING-COMMAND). | |||||
| PACKING-COMMAND and UNPACKING-COMMAND can be nil if the command is not available. | |||||
| alist is searched from the beginning so pattern for \".tar.gz\" should be ahead of pattern for \".gz\"") | |||||
| ;; (string-match-p "\\.gz\\'" "aaa.gz") ; \' matches string end, $ also matches the point before newline. | |||||
| (defun my-unpack (archive) | |||||
| "unpack ARCHIVE. command for unpacking is defined in `pack-program-alist'" | |||||
| (interactive "fArchive to extract: ") | |||||
| (let* ((earchive (expand-file-name archive)) | |||||
| (cmd (nth 1 | |||||
| (my-pack-file-name-association earchive))) | |||||
| ) | |||||
| (if cmd | |||||
| (shell-command (concat cmd | |||||
| " " | |||||
| (shell-quote-argument earchive))) | |||||
| (message "this is not archive file defined in `pack-program-alist'!")))) | |||||
| (defun my-pack (archive &rest files) | |||||
| "pack FILES into ARCHIVE. | |||||
| if ARCHIVE have extension defined in `pack-program-alist', use that command. | |||||
| otherwise, use `pack-default-extension' for pack." | |||||
| (let* ((archive-ext (my-pack-file-extension (expand-file-name archive))) | |||||
| (cmd (car (my-pack-file-name-association archive-ext))) | |||||
| ) | |||||
| (if cmd | |||||
| (shell-command (concat cmd | |||||
| " " | |||||
| (shell-quote-argument archive-ext) | |||||
| " " | |||||
| (mapconcat 'shell-quote-argument | |||||
| files | |||||
| " "))) | |||||
| (message "invalid extension for packing!")))) | |||||
| (defun my-pop-to-buffer-erase-noselect (buffer-or-name) | (defun my-pop-to-buffer-erase-noselect (buffer-or-name) | ||||
| "pop up buffer using `display-buffer' and return that buffer." | "pop up buffer using `display-buffer' and return that buffer." | ||||
| (let ((bf (get-buffer-create buffer-or-name))) | (let ((bf (get-buffer-create buffer-or-name))) | ||||
| @@ -1348,7 +1241,7 @@ otherwise, use `pack-default-extension' for pack." | |||||
| (define-key dired-mode-map "h" 'my-dired-echo-file-head) | (define-key dired-mode-map "h" 'my-dired-echo-file-head) | ||||
| (define-key dired-mode-map "@" (lambda () (interactive) (my-x-open "."))) | (define-key dired-mode-map "@" (lambda () (interactive) (my-x-open "."))) | ||||
| (define-key dired-mode-map (kbd "TAB") 'other-window) | (define-key dired-mode-map (kbd "TAB") 'other-window) | ||||
| (define-key dired-mode-map "P" 'my-dired-do-pack-or-unpack) | |||||
| ;; (define-key dired-mode-map "P" 'my-dired-do-pack-or-unpack) | |||||
| (define-key dired-mode-map "a" 'my-dired-display-all-mode) | (define-key dired-mode-map "a" 'my-dired-display-all-mode) | ||||
| (define-key dired-mode-map "/" 'dired-isearch-filenames) | (define-key dired-mode-map "/" 'dired-isearch-filenames) | ||||
| (define-key dired-mode-map (kbd "DEL") 'dired-up-directory) | (define-key dired-mode-map (kbd "DEL") 'dired-up-directory) | ||||
| @@ -1360,6 +1253,14 @@ otherwise, use `pack-default-extension' for pack." | |||||
| (when (file-readable-p file) | (when (file-readable-p file) | ||||
| (delete-file file))))) | (delete-file file))))) | ||||
| (and (dllib-if-unfound "pack" | |||||
| "https://github.com/10sr/emacs-lisp/raw/master/pack.el" | |||||
| t) | |||||
| (require 'pack nil t) | |||||
| (add-hook 'dired-mode-hook | |||||
| (lambda () | |||||
| (define-key dired-mode-map "P" 'dired-do-pack-or-unpack)))) | |||||
| ;; http://blog.livedoor.jp/tek_nishi/archives/4693204.html | ;; http://blog.livedoor.jp/tek_nishi/archives/4693204.html | ||||
| (defun my-dired-toggle-mark() | (defun my-dired-toggle-mark() | ||||