Добавить сокращения в конфигурации рыбы

Я хотел бы использовать функцию сокращений раковины рыбы, особенно для известной переменной bash !! или псевдонимы для общих команд git. Я знаю, что сокращения могут быть добавлены как в следующем фрагменте:

abbr -a gco git checkout

Я также знаю, что этот параметр сохраняется в файле, расположенном в .config/fish/fishd.host, но в этом файле также говорится, что его не следует редактировать, поскольку изменения могут быть потеряны (поскольку файл создается автоматически).

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

7 ответов

Решение

Я снова попробовал рыбу и нашел решение, которое работает для меня сейчас. Это также описано в документации по рыбе.

Они просто предлагают сбросить fish_user_abbreviations и позвонить каждому abbr опять и опять. (Я даже не использовал if в моем случае тоже хорошо работает)

if status --is-interactive
    set -g fish_user_abbreviations
    abbr --add first 'echo my first abbreviation'
    abbr --add second 'echo my second abbreviation'
    # etcetera
end

Это на самом деле похоже на то, что предлагал MJV, но без недостатка в том, что он кешируется. Компромисс, вероятно, заключается в том, что запуск немного медленнее, но я буду следить за этим. Я собираюсь с этим вариантом, так как он также упоминается в документации.

Извините, я не уверен, что понимаю, что вы спрашиваете. Но если ваш вопрос заключается в том, как установить abbr определения при запуске (и в файле, который вы можете хранить в репозитории и обмениваться между компьютерами), вы должны использовать файл ~/.config/fish/config.fish что эквивалентно Рыбе .bashrc в Баш.

Поскольку аббревиатуры хранятся в глобальных / универсальных переменных, их не нужно сбрасывать каждый раз, когда вы открываете окно терминала, так что вы можете поместить в этот файл конфигурации защиту, чтобы не сбрасывать их каждый раз (немного ускоряя процесс), как объяснено здесь: https://github.com/fish-shell/fish-shell/issues/1976

Изменить (апрель 2019 г.):

После того, как Fish изменил способ хранения универсальных переменных в версии 3.0.0, защитные функции, по-видимому, не позволяют вносить изменения, внесенные в список abbr, также после открытия новых окон терминала или перезагрузки компьютера. Итак, я удалил эти строки из примера.

Например мой config.fish выглядит так (для команд Git):

  echo -n Setting abbreviations... 

  abbr g 'git'
  abbr ga 'git add'
  abbr gb 'git branch'
  abbr gbl 'git blame'
  abbr gc 'git commit -m'
  abbr gca 'git commit --amend -m'
  abbr gco 'git checkout'
  abbr gcp 'git cherry-pick'
  abbr gd 'git diff'
  abbr gf 'git fetch'
  abbr gl 'git log'
  abbr gm 'git merge'
  abbr gp 'git push'
  abbr gpf 'git push --force-with-lease'
  abbr gpl 'git pull'
  abbr gr 'git remote'
  abbr grb 'git rebase'
  abbr gs 'git status'
  abbr gst 'git stash'

  echo 'Done'

Канонический способ инициализации универсальных сокращений Фиша заключается в созданииabbr.fishфайл в вашем~/.config/fish/conf.dэто делает инициализацию. В этом файле вы проверяете универсальную переменную на предмет того, были ли уже установлены ваши сокращения. Это установит их и переменную индикатора один раз, гарантируя, что вы не будете нести затраты при каждом вызове оболочки.

      # ~/.config/fish/conf.d/abbr.fish
if not set -q MY_ABBR_SET
    set -U MY_ABBR_SET true

    abbr -a -- - 'cd -'
    abbr -a la 'ls -la'
    abbr -a ldot 'ls -ld .*'
    abbr -a ll 'ls -lGFh'
    abbr -a lsa 'ls -aGF'
    abbr -a nv nvim
    abbr -a tarls 'tar -tvf'
    abbr -a untar 'tar -xv'
    abbr -a zz exit

    # git
    abbr -a gad 'git add'
    abbr -a gbn 'git rev-parse --abbrev-ref HEAD'
    abbr -a gcl 'git clean'
    abbr -a gco 'git checkout'
    abbr -a gwhoami 'echo "user.name:" (git config user.name) && echo "user.email:" (git config user.email)'
    # ... etc...
end

Если вы хотите изменить или добавить новые сокращения, просто измените файл abbr.fish, а затем сотрите переменную. При следующем вызове рыбы ваши сокращения будут установлены снова:

      # erasing this will cause abbr.fish
# to setup your abbreviations again
set -e MY_ABBR_SET

Если вам нужно удалить все сокращения и начать все сначала, эта функция может помочь:

      function abbr-erase-all --description 'Erase all your abbrs'
    while true
        read -l -P "This will erase all your abbreviations. You sure? [y/N] " confirm
        switch $confirm
            case Y y
                break
            case '' N n
                return 1
        end
    end
    for abbr_name in (abbr -l)
        abbr -e $abbr_name
    end
    set -q MY_ABBR_SET && set -e MY_ABBR_SET
end

Исправлено это! То, что я в итоге сделал, это просто сделать вывод abbr -s в сценарий Рыба. Итак вкратце:

abbr -s > abbr.fish
(edit abbr.fish, add the following line to the top:) #! /usr/bin/fish
chmod +x abbr.fish

И вы сделали!

Все, что вам нужно сделать, это просто запустить abbr.fish на любой машине Fish вы хотите, чтобы ваши сокращения и Presto.

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

Если вы хотите, чтобы эта конфигурация была доступна в других полях и синхронизировала их с вашими точечными файлами, я рекомендую создать функцию как gco.fishи т. д. вместо каждой аббревиатуры.

  • gco.fish

    function gco
        command git checkout $argv
    end
    

Функции лениво загружены в рыбу и всегда будут работать лучше, чем бег abbr (который также не является встроенной рыбой, но является регулярной функцией с определением type abbr) для каждой аббревиатуры в вашем config.fish,

Теперь у команды есть-g/--global возможность хранить сокращения глобально (внутри текущей оболочки), а не универсально, поэтому вы можете добавитьabbrкоманды вашемуconfig.fish:

      abbr --global --add ga 'git add'
...

Чтобы восстановить функциональность версии до 3.6.0abbrвы можете использовать эту команду:

      echo source '$__fish_config_dir/abbreviations' >> ~/.config/fish/config.fish

function abbrsave
    echo abbr -a -U -- $argv[1] (string join -- ' ' (string escape -- $argv[2..-1])) >> ~/.config/fish/abbreviations 
end

funcsave abbrsave

abbrsave ps ps -o etime,stat,command ww

Затемpsрасширится в новых оболочках

Но если вы хотите отредактировать или удалить аббревиатуру, вам придется отредактировать файл:~/.config/fish/abbreviations

Или используйте более хакерское решение, подобное этому (требуетсяmoreutils):

      function filterfile --argument file word
    if test -n "$word"
        grep -i "$word" "$file"
        grep -iv "$word" "$file" | sponge "$file"
    end
end
funcsave filterfile

function abbrsave
    abbr -a -U -- $argv[1] (string escape -- $argv[2..-1])

    filterfile ~/.config/fish/abbreviations "abbr -a -U -- $argv[1]"
    echo abbr -a -U -- $argv[1] (string escape -- $argv[2..-1]) >> ~/.config/fish/abbreviations
end
funcsave abbrsave

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

Но для более динамичных сокращений я бы последовал совету руководства и просто вписал их прямо вconfig.fish:

      function _abbr_zip
    echo zip -qr (datestamp).zip
end
abbr -a zip --function _abbr_zip
Другие вопросы по тегам