diff --git a/contrib/!vim/vinegar/README.org b/contrib/!vim/vinegar/README.org new file mode 100644 index 000000000..10682ef48 --- /dev/null +++ b/contrib/!vim/vinegar/README.org @@ -0,0 +1,54 @@ +#+TITLE: Vinegar contribution layer for Spacemacs + +* Table of Contents :TOC@4: + - [[#desciption][Desciption]] + - [[#features][Features]] + - [[#mouse-bindings][Mouse bindings]] + - [[#key-bindings][Key bindings]] + +* Desciption + +This layer is a port contribution layer for vim-vinegar for emacs. + +A port of tpope's vinegar.vim +[vinegar][https://github.com/tpope/vim-vinegar], simplifying =dired= +with a limited number of details and exposing the ~-~ command in all +buffers to enter dired. + +** Features + +- navigation up folders with ~-~ key +- simplify dired buffer to show only file names +- better evil/vim bindings for navigation within dired buffer +- keep only one active dired buffer +- Use dired-k extension to show time / vcs related information in + single bar +- right mouse click moves up directory if in blank space or shows context menu + +** Mouse bindings + +| Mouse Binding | Description | +|---------------+-----------------------------------------------| +| ~mouse-1~ | (Dired) Open selected file | +| ~mouse-2~ | (Dired) Open clicked file in other-window | +| ~mouse-3~ | (Dired) Open context popup or go up directory | + +** Key bindings + +| Key Binding | Description | +|-------------+----------------------------------------------------| +| ~-~ | Navigate to parent directory in dired | +| ~0~ | (Dired) Move to the beginning of the file in dired | +| ~=~ | (Dired) Diff between selected files | +| ~C-j~ | (Dired) Move to next subdirectory | +| ~C-k~ | (Dired) Move to previous sbdirectory | +| ~I~ | (Dired) Toggle showing dotfiles | +| ~~~ | (Dired) Navigate to home directory | +| ~f~ | (Dired) Helm find file | +| ~C-f~ | (Dired) dired-find | +| ~H~ | (Dired) Show dired history | +| ~T~ | (Dired) Move down in dired tree | +| ~K~ | (Dired) Kill marked lines (hide, do not delete) | +| ~r~ | (Dired) Redisplay buffer | +| ~C-r~ | (Dired) Revert buffer | + diff --git a/contrib/!vim/vinegar/funcs.el b/contrib/!vim/vinegar/funcs.el new file mode 100644 index 000000000..9778970f8 --- /dev/null +++ b/contrib/!vim/vinegar/funcs.el @@ -0,0 +1,137 @@ +;; funcs.el file for vinegar contribution layer + +(defun vinegar/dotfiles-toggle () + "Show/hide dot-files" + (interactive) + (when (equal major-mode 'dired-mode) + (if (or (not (boundp 'dired-dotfiles-show-p)) dired-dotfiles-show-p) ; if currently showing + (progn + (set (make-local-variable 'dired-dotfiles-show-p) nil) + (message "h") + (dired-mark-files-regexp "^\\\.") + (dired-do-kill-lines)) + (progn (revert-buffer) ; otherwise just revert to re-show + (set (make-local-variable 'dired-dotfiles-show-p) t))))) + +(defun vinegar/back-to-top () + "Move to first file" + (interactive) + (beginning-of-buffer) + (dired-next-line 1)) + +(defun vinegar/jump-to-bottom () + "Move to last file" + (interactive) + (end-of-buffer) + (dired-next-line -1)) + +(defun vinegar/move-up () + "Move to previous file" + (interactive) + (dired-previous-line 1) + (if (bobp) + (dired-next-line 1))) + +(defun vinegar/move-down () + "Move to next file" + (interactive) + (dired-next-line 1) + (if (eobp) + (dired-next-line -1))) + +(defun vinegar/up-directory (&optional other-window) + "Run Dired on parent directory of current directory." + (interactive "P") + (let* ((dir (dired-current-directory)) + (orig (current-buffer)) + (up (file-name-directory (directory-file-name dir)))) + (or (dired-goto-file (directory-file-name dir)) + ;; Only try dired-goto-subdir if buffer has more than one dir. + (and (cdr dired-subdir-alist) + (dired-goto-subdir up)) + (progn + (kill-buffer orig) + (dired up) + (dired-goto-file dir))))) + +(defun vinegar/dired-diff () + "Ediff marked files in dired or selected files in separate window" + (interactive) + (let* ((marked-files (dired-get-marked-files nil nil)) + (other-win (get-window-with-predicate + (lambda (window) + (with-current-buffer (window-buffer window) + (and (not (eq window (selected-window))) + (eq major-mode 'dired-mode)))))) + (other-marked-files (and other-win + (with-current-buffer (window-buffer other-win) + (dired-get-marked-files nil))))) + (cond ((= (length marked-files) 2) + (ediff-files (nth 0 marked-files) + (nth 1 marked-files))) + ((= (length marked-files) 3) + (ediff-files3 (nth 0 marked-files) + (nth 1 marked-files) + (nth 2 marked-files) + )) + ((and (= (length marked-files) 1) + (= (length other-marked-files) 1)) + (ediff-files (nth 0 marked-files) + (nth 0 other-marked-files))) + ((= (length marked-files) 1) + (dired-diff)) + (t (error "mark exactly 2 files, at least 1 locally"))))) + + +(defun vinegar/dired-setup () + "Setup custom dired settings for vinegar" + (setq dired-omit-verbose nil) + + ;; hide details by default + (dired-hide-details-mode t) + ;; omit the .. in dired + (dired-omit-mode t) + + ;; allow selection with mouse + (make-local-variable 'mouse-1-click-follows-link) + (setq mouse-1-click-follows-link nil) + + (local-set-key (kbd "") 'vinegar/dired-mouse-click) + (local-set-key (kbd "") 'vinegar/up-directory) + (local-set-key (kbd "") nil) + ) + +(defun vinegar/dired-mouse-click (event) + "In Dired, visit the file or directory name you click on." + (interactive "e") + (let (window pos file) + (save-excursion + (setq window (posn-window (event-end event)) + pos (posn-point (event-end event))) + (if (not (windowp window)) + (error "No file chosen")) + (set-buffer (window-buffer window)) + (goto-char pos) + (setq file (dired-get-file-for-visit))) + (find-alternate-file file))) + +(defun vinegar/dired-mouse-click-3 (event) + "In Dired, show context menu or go up a directory." + (interactive "e") + (let (window pos file) + (save-excursion + (setq window (posn-window (event-end event)) + pos (posn-point (event-end event))) + (if (not (windowp window)) + (error "No file chosen")) + (set-buffer (window-buffer window)) + (goto-char pos) + (condition-case ex + (progn + (setq file (dired-get-file-for-visit)) + (dired-find-file-other-window)) + ('error + (vinegar/up-directory) + )) + ))) +;; ) diff --git a/contrib/!vim/vinegar/keybindings.el b/contrib/!vim/vinegar/keybindings.el new file mode 100644 index 000000000..b709978d2 --- /dev/null +++ b/contrib/!vim/vinegar/keybindings.el @@ -0,0 +1,27 @@ +(require 'dired-x) +(define-key evil-normal-state-map (kbd "-") 'dired-jump) + +(add-hook 'dired-mode-hook 'vinegar/dired-setup) + +(eval-after-load "dired-mode" + (evilify dired-mode dired-mode-map + "j" 'vinegar/move-down + "k" 'vinegar/move-up + "-" 'vinegar/up-directory + "0" 'dired-back-to-start-of-files + "=" 'vinegar/dired-diff + (kbd "C-j") 'dired-next-subdir + (kbd "C-k") 'dired-prev-subdir + "I" 'vinegar/dotfiles-toggle + (kbd "~") '(lambda ()(interactive) (find-alternate-file "~/")) + (kbd "RET") 'dired-find-alternate-file + "f" 'helm-find-files + (kbd "C-f") 'find-name-dired + "H" 'diredp-dired-recent-dirs + "T" 'dired-tree-down + "K" 'dired-do-kill-lines + "r" 'dired-do-redisplay + (kbd "C-r") 'revert-buffer + "gg" 'vinegar/back-to-top + "G" 'vinegar/jump-to-bottom + )) diff --git a/contrib/!vim/vinegar/packages.el b/contrib/!vim/vinegar/packages.el new file mode 100644 index 000000000..53346a7d6 --- /dev/null +++ b/contrib/!vim/vinegar/packages.el @@ -0,0 +1,40 @@ +;;; packages.el --- vinegar Layer packages File for Spacemacs +;; +;; Copyright (c) 2012-2014 Sylvain Benner +;; Copyright (c) 2014-2015 Sylvain Benner & Contributors +;; +;; Author: Sylvain Benner +;; URL: https://github.com/syl20bnr/spacemacs +;; +;; This file is not part of GNU Emacs. +;; +;;; License: GPLv3 + +(setq vinegar-packages + '( + diff-hl + ;; dired+ + )) + +(setq vinegar-excluded-packages '()) + +(defun vinegar/init-dired+ () + (use-package dired+ + :defer t + :init + (progn + (setq diredp-hide-details-initially-flag t) + (setq diredp-hide-details-propagate-flag t) + ;; use single buffer for all dired navigation + ;; disable font themeing from dired+ + (setq font-lock-maximum-decoration (quote ((dired-mode . 1) (t . t)))) + (toggle-diredp-find-file-reuse-dir 1) + ))) + +(defun vinegar/post-init-diff-hl () + (use-package diff-hl + :defer t + :init + (progn + (add-hook 'dired-mode-hook 'diff-hl-dired-mode) + )))