2015-06-21 6 views
1

В fish, возможно ли ссылаться или использовать функцию внутри другой функции с тем же именем? Например, fish имеет функцию ls в /usr/local/share/functions/ls.fish, которая устанавливает некоторые параметры по умолчанию, основанные на таких вещах, как ОС, и имеет ли оболочка цвета. Я хочу определить другую функцию, которая будет устанавливать для меня некоторые цвета по умолчанию, не сбивая эту другую функцию, если я хочу использовать более новую версию fish.Использование функции от ранее в пути функции

Самый простой способ установить псевдоним, кажется, использовать command, например, так:

function ls 
    command ls -F $argv 
end 

в файле ls.fish в папке ~/.config/fish/functions. Это папка по умолчанию для пользовательских функций. Обе эти папки и ~/.config/fish/functions находятся в $fish_function_path, но наступает ~/.config/fish/functions, поэтому пользователи могут устанавливать свои собственные функции, которые переопределяют функции по умолчанию fish. Однако, как сказано в документации fish,

command forces the shell to execute the program COMMANDNAME and ignore 
any functions or builtins with the same name. 

Как переопределить псевдоним/функции с одним определенным позже в $fish_function_path, без более писать это? В идеале в решениях также будет использоваться встроенная команда с таким же именем, как cd, так как в соответствии с указанной документацией это тоже невозможно, но это не требуется.

И, наконец, это хорошая идея? Если fish не делает это по умолчанию, должна быть причина, правильно?

ответ

3

Обычная Хитрость заключается в том, чтобы скопировать функцию, которую необходимо переопределить, а затем вызвать копию внутри переопределения:

functions --copy ls saved_ls 
function ls 
    saved_ls 
end 

Вы не можете сделать это в автозагрузкой ls.fish файла, так как это приведет к бесконечный цикл, но вы можете сделать это в config.fish.

+0

Почему это приведет к бесконечному циклу? Файл '~/.config/fish/functions/ls.fish' вызывается * после * файла'/usr/local/share/fish/functions/ls.fish', правильно? Или оба они одновременно вызываются и функции, определенные в предыдущем файле, переопределяют их в последнем файле, но оба вызываются одновременно при запуске команды? – trysis

+1

Это источник только первого 'ls.fish', найденного путем поиска' $ fish_function_path'. Таким образом, тот, что находится в '~/.config', замаскирует его в'/usr/local/share'. Причина, по которой он приводит к бесконечному циклу, заключается в том, что выполнение 'ls.fish' сначала пытается скопировать' ls', что означает автозагрузку 'ls', что означает выполнение' ls.fish' ... –

+0

Получил это, спасибо. Это может быть информация для ввода документов, предполагая, что она еще не существует, и я слепой и не видел ее. – trysis