Alexander Polyakhov 28.09.2012 17:09

Есть вопрос!Сортировка списка файлов при автодополнении (Tab bash)

Хочется настроить автокомплит так, чтобы выпадающий список имён файлов и папок был бы отсортирован по времени последнего изменения. Предлагаю разобраться как это сделать.


Тэги: autocomplete bash настройка
+ 0 -
Похожие Поделиться

Dagron 29.09.2012 10:38 #
Предполагаю что есть несколько функций в /etc/bash_completion
отвечающих за вывод списка => если их подкоректировать... :)
Alexander Polyakhov 29.09.2012 11:58 #
если их подкоректировать
Подскажи куда именно смотреть
Dagron 29.09.2012 13:36 #
Если бы я знал)
вообще очень похоже что это _filedir(), но у меня очень плохой bash и гарантировать я не могу
Dagron 29.09.2012 13:42 #
тебе нужна функция _filedir()

_filedir()
{
....
# COMPREPLY=( "${COMPREPLY[@]}" "${toks[@]}" )
COMPREPLY=( "май тест стринг" )
} # _filedir()
ЗЫ: учти что она у тебя будет работать для всех програм
так что возможно лучше редактировать например дополнение к mplayer(ну или где тебе надо)
Dagron 29.09.2012 13:50 #
дабы людям не лазить в файл приведу его здесь
Тебе нужно заполнить переменную COMPREPLY
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# This function performs file and directory completion. It's better than
# simply using 'compgen -f', because it honours spaces in filenames.
# @param $1 If `-d', complete only on directories. Otherwise filter/pick only
# completions with `.$1' and the uppercase version of it as file
# extension.
#
_filedir()
{
local i IFS=$'\n' xspec

_tilde "$cur" || return 0

local -a toks
local quoted tmp

_quote_readline_by_ref "$cur" quoted
toks=( ${toks[@]-} $(
compgen -d -- "$quoted" | {
while read -r tmp; do
# TODO: I have removed a "[ -n $tmp ] &&" before 'printf ..',
# and everything works again. If this bug suddenly
# appears again (i.e. "cd /b<tab>" becomes "cd /"),
# remember to check for other similar conditionals (here
# and _filedir_xspec()). --David
printf '%s\n' $tmp
done
}
))

if [[ "$1" != -d ]]; then
# Munge xspec to contain uppercase version too
[[ ${BASH_VERSINFO[0]} -ge 4 ]] && \
xspec=${1:+"!*.@($1|${1^^})"} || \
xspec=${1:+"!*.@($1|$(printf %s $1 | tr '[:lower:]' '[:upper:]'))"}
toks=( ${toks[@]-} $( compgen -f -X "$xspec" -- $quoted) )
fi
[ ${#toks[@]} -ne 0 ] && _compopt_o_filenames

# If the filter failed to produce anything, try w/o it (LP: #533985)
if [[ -n "$1" ]] && [[ "$1" != -d ]] && [[ ${#toks[@]} -lt 1 ]] ; then
toks=( ${toks[@]-} $( compgen -f -X -- $quoted) )
fi

COMPREPLY=( "${COMPREPLY[@]}" "${toks[@]}" )
# COMPREPLY=( "му тест стринг" )
} # _filedir()


ЗЫ: почему то не работает code и sploiler вместе
Alexander Polyakhov 01.10.2012 11:41 #
Тебе нужно заполнить переменную COMPREPLY
А что в неё вписывать хоть примерно?

Вообще не совсем понятно как использовать эту функцию. Смотрю в скрипт и по ходу для автодополнения параметров (или ключей) команды.

А мне нужно например такое:
1
2
3
4
5
6
less foo <tab>
foom
foog
foot
fooa
fooz

,
где
1
2
3
4
5
6
7
ls -l foo*
total 4
-rw-rw-r-- 1 is is 0 Oct 1 11:29 fooa
-rw-rw-r-- 1 is is 0 Oct 1 11:32 foog
-rw-rw-r-- 1 is is 0 Oct 1 11:37 foom
-rw-rw-r-- 1 is is 0 Oct 1 11:31 foot
-rw-rw-r-- 1 is is 0 Oct 1 11:27 fooz