Emacs vs Vim: файловые менеджеры

05 March 2019 #emacs#vim

Последние несколько лет много работал с редактором Vim, и он меня почти всем устраивал. Почти, это значит что были определенные проблемы, которые я смог решить только недавно.

Но каждый раз, как я читал блоги своих знакомых, обращал внимание на то, что многие используют Emacs. Ох, сколько раз я пытался его использовать, переписывал конфигурацию вдоль и поперек нескончаемое число раз. И тратил на это столько времени, что если бы писал программы, давно реализовал бы свою операционную систему.

Что интересно, в обоих редакторах столкнулся с одной и той проблемой, а именно: файловые менеджеры. В Vim, если открыть NetRW, он у меня оказывался в отдельных группах буферов, что затрудняло переключение между рабочими буферами. А в Emacs стандартный Dired просто бесил тем, что каждый переход в новую директорию создавал новый буфер. В результате после непродолжительной работы с Dired у меня оказывалось открытыми масса буферов, и приходилось тратить время только на то, чтобы закрыть их.

Много времени потратил на решение проблем в Emacs, не меньше времени потратил на разбирательство с Vim. В результате нашел решения. Итак, для начала Emacs.

Emacs

Первым нашел пакет под названием Dired+. Красивый и функциональный файловый менеджер, расширяющий возможности стандартного Dired. Но критичным минусом является то, что он не представлен в репозиториях ELPA или MELPA. И устанавливать его нужно либо вручную, либо используя сторонние пакетные менеджеры, типа quelpa.

Пробовал задавать различные параметры самого Dired, но безрезультатно. В конце концов наткнулся на пакет dired-single, который предоставляет несколько новых функций, которые можно использовать в Dired. Остается только назначить их на стандартные сочетаний клавиш:

(use-package dired-single :ensure t
  :config
  (progn
    (setq dired-single-use-magic-buffer t)
    (defun my-dired-init ()
      "Bunch of stuff to run for dired, either immediately or when it's loaded."
      ;; <add other stuff here>
      (define-key dired-mode-map [return] 'dired-single-buffer)
      (define-key dired-mode-map [mouse-1] 'dired-single-buffer-mouse)
      (define-key dired-mode-map "^"
        (function
         (lambda nil (interactive) (dired-single-buffer "..")))))
    (if (boundp 'dired-mode-map)
        (my-dired-init)
      (add-hook 'dired-load-hook 'my-dired-init))
    (setq-default dired-omit-files-p t) ; Buffer-local variable
(setq dired-omit-files "^\\..*$")))

После чего получаем только один буфер Dired, который удобно использовать.

Vim

Стандартный NetRW вполне удобен и хорош. За исключением того, что буфер со списком файлов открывается в отдельном пространстве. В результате чего переход между буферами по :bn и :bp оказывается затруднительным. Плагин vim-vinegar делает работу с файлами очень простой. Но из-за того, что после открытия буфера ты не можешь переключиться на другой буфер, сильно затрудняло работу. Долгое разбирательство показало, что достаточно было избавиться от опции set hidden в конфигурации и добавить следующую строку:

let g:netrw_altfile = 1

Для того, чтобы изменить поведение NetRW и сделать его буфер вполне обычным.

Что бы мне не говорили про мощь Emacs, и как бы его не нахваливали, уходить с Vim я уже не собираюсь. Так сказать ИМХО.