Как заставить source-highlight по умолчанию окрашивать .dotfiles?

Ретроспективно, я нашел, что самый легкий путь путем выполнения:

gconftool-2 --set /apps/guake/general/use_vte_titles --type boolean false

из командной строки.

4
13.04.2017, 15:36
4 ответа

Определите функцию cdc как

cdc() {
    for fn do
        if [[ "${fn##*/}" == .* ]]
        then
            source-highlight --src-lang=sh --out-format=esc -i "$fn"
        else
            source-highlight               --out-format=esc -i "$fn"
        fi 2> /dev/null  ||  /bin/cat "$fn"
    done
}
  • для fn do - это сокращение от для fn в "$ @ "; сделать .
  • $ {fn ## * /} проверяет значение $ fn и удаляет все от начала до (включительно) последнего / . То есть, если $ fn - полный путь, это будет только часть имени файла.
  • [[ (the_above) ==. *]] проверяет , соответствует ли имя файла . * шаблон glob / подстановочный знак; то есть, начинается ли имя файла с . . Обратите внимание, что такое использование == работает только внутри [[…]] ; не работает внутри […] .
  • Итак, если $ fn является «точечным файлом», запустите source-highlight с - src-lang = sh вариант.

    • Вы всегда должны заключать ссылки на переменные оболочки в двойные кавычки , если у вас нет веской причины не делать этого, и вы уверены, что знаете, что делаете. Имена файлов Unix / Linux могут содержать пробелы. Если у вас есть файл с именем foo bar , и вы сказали / bin / cat "foo bar" , cat отобразит содержимое файла foo bar . Но если бы вы сказали cdc "foo bar" (с текущей версией вашей функции cdc ), вы бы запустите source-highlight с помощью -i foo bar , , который будет искать файл с именем foo и, как правило, вносит беспорядок. И тогда он завершится неудачно, и ваша функция попытается выполнить / bin / cat foo bar , , что тоже не сработает. Использование "$ fn" делает эту работу для имен файлов, содержащих пробелы.
    • Программа cp требует, чтобы вы указали в списке аргументов имя файла или каталога, в который вы хотите записать. Это одно из немногих исключений из правила, которое большинство программ по умолчанию записывают в стандартный вывод (если не указано иное). Вам не нужно говорить -o STDOUT , и мне интересно, почему автор (ы) программы даже позволил вам указать это.

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

  • Очевидно, что если $ fn не является точечным файлом, просто запустите source-highlight обычным способом и дайте ему проверить наличие расширения.
  • Обратите внимание, что 2> / dev / null и || / bin / cat "$ fn" может быть выполнено для блока if… then… else… fi целиком; они не обязаны повторяться для каждой ветви.

Хм. В моей версии source-highlight (3.1.7) есть опция - src-lang = LANGUAGE ( -s ЯЗЫК , как используется yaegashi,коротко). Я только что заметил, что его нет в source-highlight выдержке из справочной страницы , которую вы включили в свой вопрос. Итак, очевидно, , если ваша версия source-highlight не поддерживает эту опцию, мой ответ вам не подойдет. (И, конечно же, yaegashi тоже.) Если это так, вы должны посмотреть, можете ли вы установить версию 3.1.7 (или совместимую) из source-highlight .

2
27.01.2020, 20:48

Указывайте -s sh только тогда, когда $ fn выглядит как точечный файл.

cdc() {
  for fn in "$@"; do
    OPTIONS="-f esc"
    case "${fn##*/}" in
      .*) OPTIONS="$OPTIONS -s sh" ;;
    esac
    source-highlight $OPTIONS -i "$fn" 2>/dev/null || \cat "$fn"
  done
}
alias cat=cdc

Вы можете добавить другие пользовательские правила сопоставления имен файлов в случае .

3
27.01.2020, 20:48

yaegashi имеет правильную идею , хотя я бы сделал это так:

cdc() {
    for path
    do
        command=(source-highlight --out-format=esc -o STDOUT --failsafe)
        case "${path##*/}" in
            .*) command+=(-s sh)
                ;;
        esac
        "${command[@]}" -i "$path"
    done
}
  • - отказоустойчивый действует как cat ], если язык не может быть обнаружен - намного лучше, чем игнорировать все ошибки
  • Использует массив для аргументов команды
3
27.01.2020, 20:48

В дополнение к просмотру расширения файла , source-highlight есть и другие способы определения языка. Вы можете аннотировать файлы сценария оболочки следующим образом:

  1. Строка shabang: поместите #! / Bin / sh или #! / Bin / bash в первую строку файла. .
  2. Аннотации типов файлов в стиле Emacs: добавьте в файл комментарий типа # - * - shell - * - или # - * - bash - * - (не должна быть первой строкой).

Подробнее см. Как определяется язык ввода в руководстве по выделению исходного текста.

2
27.01.2020, 20:48

Теги

Похожие вопросы