Где значение по умолчанию переменной среды ТЕРМИНА становится установленным?

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

Для переопределения установки для конкретного режима свяжите его в его контурной карте.

(defun insert-two-spaces (&optional count)
  (interactive "*p")
  (insert (make-string (* 2 count) ?\ )))
(add-hook 'python-mode-hook '(local-set-key "\t" 'insert-two-spaces))

Для переопределения установки везде можно определить постоянный незначительный режим. См. руководство Elisp для того, как определить незначительный режим.

(define-minor-mode magnus-minor-mode
  "Override the binding of the TAB key."
  :keymap '(([?\t] . insert-two-spaces))
  :global t)
(magnus-minor-mode 1)

¹ то, Что Вы называете “волшебным волшебным режимом файла”, является главным режимом. Если Вам не нравится редактор, который делает вещи автоматически, я предлагаю нано.

27
27.04.2015, 11:51
3 ответа

Во многих местах, в зависимости от

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

Настоящие последовательные клеммы могут различаться по типу в зависимости от того, что находится на другом конце провода. Поэтому обычно программа getty вызывается с аргументом, указывающим тип терминала, или передается программе TERM из данных конфигурации службы диспетчера служб.

  • В системах van Smoorenburg init это можно увидеть в записях / etc / inittab , которые будут читать что-то вроде

     S0: 3: respawn: / sbin / agetty ttyS0 9600 vt100-nav 
    Последний аргумент agetty в этой строке, vt100-nav , - это тип терминала, установленный для / dev / ttyS0 . Итак, / etc / inittab - это место, где можно изменить тип терминала для реальных терминалов в таких системах.
  • В системах systemd это можно увидеть в модульном файле /usr/lib/systemd/system/serial-getty@.service ( / lib / systemd / system / serial-getty @ .service в не объединенных системах), который читает

     Environment = TERM = vt100 
    , устанавливая переменную TERM в среде, переданной в agetty . В этом файле служебной единицы можно изменить тип терминала для реальных терминалов в таких системах. Обратите внимание, что это применимо ко всем реальным терминалам, которые используют этот шаблон служебной единицы. (Чтобы изменить его только для отдельных терминалов, необходимо вручную создать экземпляр шаблона.)
  • В BSD init берет тип терминала из третьего поля записи каждого терминала в / etc / ttys и устанавливает TERM из той среды, в которой он выполняет getty . Итак, / etc / ttys - это место, где можно изменить тип терминала для реальных терминалов на BSD.

Виртуальные терминалы ядра, как вы заметили, имеют фиксированный тип.В отличие от NetBSD, которая может изменять тип виртуального терминала ядра на лету, Linux и другие BSD имеют один фиксированный тип терминала, реализованный во встроенной программе эмуляции терминала ядра. В Linux этот тип соответствует linux из базы данных terminfo. (Эмуляция терминала ядра FreeBSD представляет собой ограниченное подмножество xterm , начиная с версии 9.)

  • В системах, использующих mingetty или vc-get-tty (от nosh package) программа «знает», что она может разговаривать только с виртуальным терминалом, и они жестко подключают «известные» типы виртуальных терминалов, соответствующие операционной системе, для которой была скомпилирована программа.
  • В системах systemd это можно увидеть в модульном файле /usr/lib/systemd/system/getty@.service ( /lib/systemd/system/getty@.service в не объединенных системах), который читает

     Environment = TERM = linux 
    , устанавливая переменную TERM в среде, переданной в agetty .

Для виртуальных терминалов ядра: не изменяет тип терминала. В конце концов, программа эмулятора терминала в ядре не меняется. неверно изменять тип. В частности, это приведет к замораживанию курсора / клавиши редактирования распознавания последовательности CSI. Последовательности CSI linux , отправляемые эмулятором терминала ядра Linux, отличаются от последовательностей CSI xterm или vt100 , отправляемых программами эмулятора терминала GUI в режиме DEC VT.

Эмулятор терминала с графическим интерфейсом пользователя - одна из многих программ, от демона SSH до экрана , использующих псевдотерминалы. Тип терминала зависит от того, какая программа-эмулятор терминала работает на главной стороне псевдотерминала и как она настроена. Большинство эмуляторов терминала GUI запускают программу на ведомой стороне с переменной TERM , значение которой совпадает с их эмуляцией терминала на ведущей стороне. Такие программы, как SSH-сервер, будут пытаться «пройти» через тип терминала, который находится на стороне клиента соединения.Обычно есть какое-то меню или параметр конфигурации для выбора среди эмуляций терминала.

Захватывающая рука

Правильный способ определить способность к цвету - это , а не , чтобы зашить список типов терминалов в вашем скрипте. Существует очень много типов терминалов, поддерживающих цвет.

Правильный способ - посмотреть, что termcap / terminfo говорит о вашем типе терминала.

colour=0
if tput Co > /dev/null 2>&1
then
    test "`tput Co`" -gt 2 && colour=1
elif tput colors > /dev/null 2>&1
then
    test "`tput colors`" -gt 2 && colour=1
fi

Дополнительная литература

  • Джонатан де Бойн Поллард (2018). СРОК . Руководство по телефону . Программное обеспечение.
17
27.01.2020, 19:39

Пожалуйста, смотрите https://shubuntu.com/a/614714/398785 Для моего подробного ответа на то, почему я думаю Term = Xterm-Color Является ли неправильный подход и Ubuntu .Bashrc устарел. Я рекомендую вам пойти с помощью Term = xterm-256Color (который является по умолчанию, по умолчанию, поскольку Gnome-Terminal 3.16, но также безопасно использовать с более старыми гномами-клеммами) и настроить .bashrc соответственно.

2
27.01.2020, 19:39

Для Linux эта среда определена в init/main.c :

static const char *argv_init[MAX_INIT_ARGS+2] = { "init", NULL, };
const char *envp_init[MAX_INIT_ENVS+2] = { "HOME=/", "TERM=linux", NULL, };

и затем вызывается с помощью do -execve():

static int run_init_process(const char *init_filename)
{
    argv_init[0] = init_filename;
    pr_info("Run %s as init process\n", init_filename);
    return do_execve(getname_kernel(init_filename),
        (const char __user *const __user *)argv_init,
        (const char __user *const __user *)envp_init);
}

Эта информация pr _()отображается как:

]# dmesg |grep 'Run'
[    1.291323] Run /init as init process

Итак, с самого начала по умолчанию используется "TERM=linux".

1
16.03.2020, 15:56

Теги

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