vc-mode – * vc-dir * muestra archivos ignorados

Pregunta:

Desde alguna versión más nueva de Emacs (yo actualmente en 24.5.1) después de alguna operación *vc-dir* buffer comienza a mostrar archivos ignorados .

.hgignore creo .hgignore para hacer que la lista de .hgignore de hg status corta. Pero el vc-mode Emacs no respeta mis preferencias.

¿Es posible ignorar archivos ignorados ?

Reproducir:

  • abrir *vc-dir*
  • modificar archivo
  • deshacer cambios en el archivo de *vc-dir*
  • actualizar *vc-dir* contenido

Hice una envoltura para diagnosticar el problema:

#!/bin/sh
echo hg "$@" >> ~/tmp/hg.log
/usr/bin/hg "$@"

De los pasos de instrucción anteriores obtengo el registro:

root       # here I press C-x v d
id -b
id -t
status -C ./   # below I edit and save file
hg --config alias.status=status --config defaults.status= status -A hg.rst
hg --config alias.status=status --config defaults.status= status -A hg.rst
hg parent --template {rev} hg.rst
hg --config alias.status=status --config defaults.status= status -A hg.rst
hg --config alias.status=status --config defaults.status= status -A hg.rst
hg diff hg.rst       # <== revert file in *vc-dir* by C-x v u
hg revert hg.rst
hg --config alias.status=status --config defaults.status= status -A hg.rst
hg root            # <== here I press g
hg id -b
hg id -t
hg status -C ./
hg status -mardui -C hg.rst ./

El último comando incluye la opción -i que causa el problema. Las fuentes tienen:

$ grep -R -n mardu
lisp/vc/vc-hg.el:640:         (concat "-mardu" (if files "i"))

cual es:

(defun vc-hg-dir-status-files (dir files update-function)
  (apply 'vc-hg-command (current-buffer) 'async dir "status"
         (concat "-mardu" (if files "i"))
         "-C" files)
  (vc-run-delayed
    (vc-hg-after-dir-status update-function)))

lisp/vc/vc.el que:

;; - dir-status-files (dir files update-function)
;;   If FILES is non-nil, this function should report on all requested
;;   files, including up-to-date or ignored files.

ACTUALIZAR Abro error: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=22003

Recibo una recomendación para escribir x para borrar la entrada innecesaria.

Respuesta:

Finalmente logré resolver este problema. El siguiente código usa 'vc-exec-after' para ser compatible con Emacs 23.x.

Con el comando personalizable 'vcx-dir-hide-states', asignado a 'X' en los búferes * vc-dir *:

(require 'vc-dir)
(require 'vc-hooks)

(defvar vcx-dir-hide-states-list
  '(up-to-date ignored unregistered)
  "VC states of entries to be hidden after VC directory refresh.")

(defun vcx-dir-hide-states ()
  "Hide VC directory entires for states from ‘vcx-dir-hide-states-list’."
  (interactive)
  (when (derived-mode-p 'vc-dir-mode)
    (dolist (state vcx-dir-hide-states-list)
      (vc-dir-hide-state state))
    ))

(define-key vc-dir-mode-map "X" 'vcx-dir-hide-states)

el comando 'vcx-dir-refresh'

(defun vcx-dir-refresh (&optional full)
  "Refresh VC directory, if in ‘vc-dir-mode’ or call ‘vc-dir’ interactively.
Automatically hides entries accoridng to ‘vcx-dir-hide-states-list’.
With prefix arg, the regular ‘revert-buffer’ is called."
  (interactive "P")
  (if (derived-mode-p 'vc-dir-mode)
      (revert-buffer)
    (call-interactively 'vc-dir))
  (unless full
    (let ((vcx-dir-buffer (buffer-name (current-buffer))))
      (with-current-buffer
      (or (and (buffer-live-p vc-dir-process-buffer)
           vc-dir-process-buffer)
          (current-buffer))
    (vc-exec-after
     `(let ((vcx-dir-buffer ,vcx-dir-buffer))
        (with-current-buffer vcx-dir-buffer
          (vcx-dir-hide-states))))))))

se puede utilizar para reemplazar 'Cx v d'

(define-key vc-prefix-map "d" 'vcx-dir-refresh)

y 'g' en 'vc-dir-mode':

(define-key vc-dir-mode-map "g" 'vcx-dir-refresh)

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım