Редактирование: UNИX, весна 2008, 09 лекция (от 09 апреля)
Материал из eSyr's wiki.
Внимание: Вы не представились системе. Ваш IP-адрес будет записан в историю изменений этой страницы.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия | Ваш текст | ||
Строка 1: | Строка 1: | ||
- | + | Лектор был всю прошлую неделю в Якутске. Там нашёл линуксоида, который самостоятельно перевёл контору на Линукс. | |
- | + | Про линукс в школах ... | |
- | + | Господа из тех, кто лучше знаком с предметом: проявляйте активность и говорите, о чём расск. заранее. | |
- | + | Маленькое дополнение к пред. лекции о file name generation: в zsh есть **, и **/*.c развернётся во все *.c во всех подкаталогах текущего каталога | |
- | + | ||
- | Маленькое дополнение к пред. лекции о file name generation: в zsh есть **, | + | |
Тема: редактирование ввода | Тема: редактирование ввода | ||
- | Шелл един в трёх лицах, у него 3 ипостаси: шелл это оболочка, шелл это интегратор, шелл это | + | Шелл един в трёх лицах, у него 3 ипостаси: шелл это оболочка, шелл это интегратор, шелл это интерфейс с человеком. Про то, как последнее можно сделать более удобным, лектор и попытается обозреть. Одним шеллом это не ограничивается, и не с него начинается. Начинается всё с терминала, который не просто устройство для ввода и вывода человекочитаемых байтов, он их ещё и обрабатывается (cooked-режим). Он позволяет обрабатывать Ctrl-c, и другие в некоторые специальные сигналы. Почему так происходит? Потому что мы stty настроили таким образом, что Ctrl+C посылает SIGINT. Разговор о том, что помоимо превращю. в сигналы, терминальная линия обесп. ещё некоторые вещи. Например, преобразование сиволов конца строки. Например, в принтерах CR-LF, в фапйлах просто символы конца строки. И терминал этим занимается. В частности, в линуксе в терминале уже определно три символа: удаление символа, слова, всей строки. Команда stty выведет ERASE (символ), KILL (строка), WERASE (слово). Соответственно, обычно это Backspace, Ctrl+U, Ctrl+W. Проблема с BS, который в разных терминалах разный, в частности, одно из исключений --- терминал Linux. Соотв., с этим BS возникнет ряд проблем, например, в vim это решили тем, что ручками вбили все возм. варианты. Кроме того, чтение line-buffered, то есть программе не придёт данные, пока не нажмёте конец строки (ещё один спецсимвол), и редактируя эту строку, уже имеете три команды едактирования. Это не просто примитив, а минимализм устрашающий. Кстати, sh и ash не имеют встроенных средств ред. строки в принципе. Это дисциплинир. польз. --- если команда слишком длинная, то это значит, что надо открыть текстовый редактор и написать скрипт. |
- | Есть очень большой раздел про редактирование командной строки. | + | Есть очень большой раздел про редактирование командной строки. Этот встроенный предактор командной строки характерен для многих утилит, которые выходит из GNU, и не только. Тот же питон написан с libreadline. Для того, чтобы освоить весь readline, читайте ман, обычно работают стрелочки, Home|end, это следствие того, что исп. readline. libreadline имеет свой настроечный файл, который наз. .inputrc, про который лектор тоже расскажет. |
- | Что такое .inputrc? Это привязка клавиш, которые нажимаете на клавиатуре (например, стрелочек) к командам текстового редактора, редактора командной строки. Вы сами всё можете перенастроить в inputrc. Команд этих в баше в районе полусотни. Что это за команды помимо команд перемещ. по строке? | + | Что такое .inputrc? Это привязка клавиш, которые нажимаете на клавиатуре (например, стрелочек) к командам текстового редактора, редактора командной строки. Вы сами всё можете перенастроить. Например, если у вас есть специфические команды, например, перемещение по словам. Вписываете это в inputrc. Команд этих в баше в районе полусотни. Что это за команды помимо команд перемещ. по строке? |
- | * | + | * Перемещ. на разные единицы строки |
- | * Команды редактирования ( | + | * Команды редактирования (апкейс/даункейс) |
- | * Глупости типа | + | * Глупости типа переставления местами символов |
- | Реально редактирование символов устроено на уровне vi. Кстати сказать, для больших фанатов vi, а также для тех, у кого плохо с ... обратите внимание на то, что в отл. от обычных буковок (когда | + | Реально редактирование символов устроено на уровне vi. Кстати сказать, для больших фанатов vi, а также для тех, у кого плохо с ... обратите внимание на то, что в отл. от обычных буковок (когда передаётся один байтик) всякие клавиши, не явл. обычными клавишами, типа стрелочек, возвращ. не один символ, а сразу несколько. Это сделано по аналогии с терминалом, с управл. последовательностями. Например, перемещение в начало ... --- ^]]A, где ^] --- Ctrl+], Esc. (срезается 6-й бит). В terminfo хранится именно то, какие упр. посл. посыл. при нажатии клавиш. Есть программа ...dump, начинаете нажимать на кнопки и смотрите на дамп. Вот это вот можно забиндить в .initrc на выполнение команд в readline, и поскольку с reasdline собрано много программ, от оно будет приниматься во внимание многими программами. |
Есть встроенная в шелл команда bind, которая позволяет на ходу это записать. Далеко не все функции, которые есть в бинде, относятся к функциям именно редактирования командной строки. Например, есть такая отдельная и совершенно естественная для польз. штука, как работа с историей. Лектор не зря при рассказе не упоминал про стрелки вверх/вниз, это уже свойство редактора, в котором вы работаете. То есть, это требует от шелла сущей безделицы --- где-то хранить команды и осущ. по ним поиск. Есть обычное пролистывание, есть также поиск: по умолчанию есть ^R (reverse search), и это возм. поискать в истории команд подстроку. Например, Дима Левин, когда ему пришла в голову команда, а потом решил её не выполнять, он ставит перед ней решёточку, и жмёт ентер, а потом находит её по ^R. Разумеется, поиск и в другую сторону работает. Про историю надо знать три важные вещи: | Есть встроенная в шелл команда bind, которая позволяет на ходу это записать. Далеко не все функции, которые есть в бинде, относятся к функциям именно редактирования командной строки. Например, есть такая отдельная и совершенно естественная для польз. штука, как работа с историей. Лектор не зря при рассказе не упоминал про стрелки вверх/вниз, это уже свойство редактора, в котором вы работаете. То есть, это требует от шелла сущей безделицы --- где-то хранить команды и осущ. по ним поиск. Есть обычное пролистывание, есть также поиск: по умолчанию есть ^R (reverse search), и это возм. поискать в истории команд подстроку. Например, Дима Левин, когда ему пришла в голову команда, а потом решил её не выполнять, он ставит перед ней решёточку, и жмёт ентер, а потом находит её по ^R. Разумеется, поиск и в другую сторону работает. Про историю надо знать три важные вещи: | ||
- | * по умолчанию историю выключают. История ваших команд призрачный, но security flaw. Вообще говоря, поднимаясь на уровень достаточной параноидальности, историю команд лучше хранить в памяти | + | * по умолчанию историю выключают. История ваших команд призрачный, но security flaw. Вообще говоря, поднимаясь на уровень достаточной параноидальности, историю команд лучше хранить в памяти. История может храниться в файле, размер файла задаётся в строках в переменной HISTSIZE. |
- | Что ещё можно вспомнить из команд редактирования? Лектор не знает, есть ли это в баше, но в zsh есть фича, которая позволяет сделать inplace file name generation. Для чего это нужно: чтобы ручками подредактировать | + | Что ещё можно вспомнить из команд редактирования? Лектор не знает, есть ли это в баше, но в zsh есть фича, которая позволяет сделать inplace file name generation. Для чего это нужно: чтобы ручками подредактировать. |
- | Ещё одна главная вещь: достраивание. | + | Ещё одна главная вещь: достраивание. Очень часто бывает вещь (очень часто это бывает с именами файлов), что начало написали, а дальше лень. Если файл один, то можно дописать звёздочку. В командной строчке никому не хочется писать имя файла длиной в пять шагов. Но какая проблема с таким FNG? Проблемы две: /u*/sh*/doc/vo*/RE* читается намноого хуже. Второе --- не факт, что файл всего один. Но помнить имена всех файлов невозможно. Поэтому неплохо этот процесс контролировать. Делается это следующим образом: нажали таб и шелл достроил. Это то самое, о чём всегда мечтали. При этом процесс контроллируемый и последовательный. Это резко отличается от того, когда написали шаблон и посмотрели, что получается. Кроме того, могут быть ветвления. Эта проблема процедурой достр. также решается. Если упираетесь в ветвление, например, если есть voodoo и voobla, то он достроит voo и пискнет. А дальше, в зависимости от крутизны шелла, могут быть варианты. Может быть сразу начнёт перебирать варианты, может после второго шага, может список показать. Соответственно, ответственность переваливается на пользователя, ибо думать должен человек, а не машина. И человек уже решает, что строить дальше. |
- | Использование достраивание сокращает время | + | Использование достраивание сокращает время в разы. Кроме того поведение достр. в случае неоднозначности настраиваемо. По умолчанию баш пищит, потом перебирать начинает. |
- | Достраивание контекстнозависимое, например в случае с echo $PA будет работать подстановка имени переменных. Возможно, в баше есть другие вариант достраивания. Но в zsh оно устроено так, что святых выноси. Для польз. это выглядит след. образом: | + | Достраивание контекстнозависимое, например в случае с echo $PA будет работать подстановка имени переменных. Возможно, в баше есть другие вариант достраивания. Но в zsh оно устроено так, что святых выноси. Для польз. это выглядит след. образом: достравивание в zsh настолько контекстно, что он разбирается в том, к какой команде производится достраивание. |
Если некую задачу по написанию строки можно доверить компьютеру, можно доверить компьютеру. | Если некую задачу по написанию строки можно доверить компьютеру, можно доверить компьютеру. | ||
Строка 38: | Строка 36: | ||
* По словам в тексте | * По словам в тексте | ||
* По спец. списку ключ. слов | * По спец. списку ключ. слов | ||
- | * По словарю для | + | * По словарю для рабоы с консретным ЯП |
* По чёрт ещё знает чему | * По чёрт ещё знает чему | ||