Ретроспективно, я нашел, что самый легкий путь путем выполнения:
gconftool-2 --set /apps/guake/general/use_vte_titles --type boolean false
из командной строки.
Определите функцию 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
вариант.
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
.
Указывайте -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
Вы можете добавить другие пользовательские правила сопоставления имен файлов в случае
.
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
], если язык не может быть обнаружен - намного лучше, чем игнорировать все ошибки В дополнение к просмотру расширения файла , source-highlight есть и другие способы определения языка. Вы можете аннотировать файлы сценария оболочки следующим образом:
#! / Bin / sh
или #! / Bin / bash
в первую строку файла. . # - * - shell - * -
или # - * - bash - * -
(не должна быть первой строкой). Подробнее см. Как определяется язык ввода в руководстве по выделению исходного текста.