Ordenar por sufijo en los nombres de archivo en dired

Pregunta:

Me gustaría ordenar el búfer dired por un sufijo en los nombres de los archivos. Por ejemplo, con el siguiente contenido de búfer:

/nixos/nix/store:
total used in directory 140344 available 17530560
drwxrwxr-t 1612 root  30000  1810432 Mar  4 21:41 .
drwxr-xr-x    4 root  root      4096 Feb  4  2015 ..
dr-xr-xr-x    5 root  root      4096 Dec 31  1969 01l09wxficgyw6yhd812xzxldxrp4yma-pangomm-2.34.0
dr-xr-xr-x    5 root  root      4096 Dec 31  1969 03afp0sdvnvj9aj8k18s7ikkh4pnzlij-perl-HTTP-Message-6.06
dr-xr-xr-x    4 root  root      4096 Dec 31  1969 04yx1lnhzbiy4hkwkhnw7cw2i6zmfhf4-xmlto-0.0.26
dr-xr-xr-x    3 root  root      4096 Dec 31  1969 0534201di00hs189hzvx8gv8kxgbl2q1-unit-script
dr-xr-xr-x    2 root  root      4096 Dec 31  1969 06g99nk2q4pjq4xx3p6qw77zxmnyr5rn-kmod-blacklist-3ubuntu1
dr-xr-xr-x    4 root  root      4096 Dec 31  1969 06l8iksb8mndiis047z5f7b1zaqc1i4a-feh-2.14
dr-xr-xr-x    4 root  root      4096 Dec 31  1969 06s10661ji3s3cwsmrxc38kx856jds8i-nixos-system-jrm.no-ip.org-16.03pre77568.40c586b
dr-xr-xr-x    5 root  root      4096 Dec 31  1969 06wqzjsbjlhimn18g9ah04klhslj8b04-libkrb5-1.14
dr-xr-xr-x    7 root  root      4096 Dec 31  1969 06xdwfrhbjwhgxcsp2d2qlxhkv3ck01b-gcc-4.9.3
dr-xr-xr-x    3 root  root      4096 Dec 31  1969 079ix6d3aarvjjh83r7vcc6nk9pjcb25-mesa-noglu-11.1.1-drivers
dr-xr-xr-x    2 root  root      4096 Dec 31  1969 07k6b606sxwfib3f1srbdi1pifpb9gj3-unit-firewall.service
dr-xr-xr-x    5 root  root      4096 Dec 31  1969 07yqgv4n248xrigrnk9xn7ami5dyz3q8-lzo-2.09
dr-xr-xr-x    5 root  root      4096 Dec 31  1969 09i3xn0lbi268354l9y2nm8302qc5dhg-poppler-qt4-0.36.0
drwxr-xr-x    2 30001 30000     4096 Mar  4 20:39 09jszxa0cdd65g7yxb64fc87dq7ayy5s-jwm-s1406
dr-xr-xr-x    6 root  root      4096 Dec 31  1969 0ac359cfc4a8kw95g494z0x5vn37vrqa-libwacom-0.15

los nombres de los archivos constan de una secuencia hash, seguida de un - , seguido de un sufijo (la parte realmente interesante del nombre). Quiero ordenar por esta última parte.

¿Cómo se puede lograr esto?

Respuesta:

Dired se basa en el comando ls para hacer el listado y la clasificación. Las opciones para ordenar están limitadas a lo que puede hacer el comando ls (a través de interruptores agregados con Cu s ( dired-sort-toggle-or-edit )). En ELPA, puedo encontrar paquetes que facilitan el cambio de los conmutadores ls , pero no paquetes que permiten personalizar el orden de clasificación.

Parece que la única forma de personalizar el orden de clasificación es invocar su propio programa en lugar de ls . El programa invocado está determinado por la variable insert-directory-program . Por lo tanto, podría configurarlo localmente en un contenedor que llame a ls y luego clasifique el resultado. Aquí hay una envoltura de shell que puede usar; poner eso en un script, hacerlo ejecutable ( Mx chmod con el permiso +x ), y configurar insert-directory-program a eso localmente.

#!/bin/sh
ls_output=$(ls "$@")
nl='
'
echo "${ls_output%%"$nl"*}" # The total... line
ls_output=${ls_output#*"$nl"}
# Isolate the //DIRED stuff, which must go last
case "$ls_output" in
  *"$nl//DIRED"*)
    dired_stuff="//DIRED${ls_output##*"$nl//DIRED"}$nl"
    ls_output="${ls_output%"$nl//DIRED"*}";;
  *) dired_stuff=;;
esac
# Now sort, ignoring the first 8 fields (metadata) and the first 33 characters of the 9th field
printf '%s\n' "$ls_output" | sort -k 9.34
printf '%s' "$dired_stuff"

Entonces

M-: (make-local-variable 'insert-directory-program) RET
M-: (setq insert-directory-program "/path/to/wrapper") RET

Leave a Comment

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

Scroll to Top

web tasarım