Різноманітні команди – ЧАСТИНА 14

Emacs розрізняє ці два типи введення, коли використовується з X Window System Він обробляє ці особливі клавіші як функціональні з іменами tab, return, backspace, linefeed, escape і delete Ці функціональні клавіші автоматично транслюються у відповідні ASCII-знаки, якщо у них немає власних привязок У результаті ні користувачі, ні програми на Ліспі не зобовязані памятати про це відмінності, якщо тільки їм це не потрібно

Якщо ви не хочете розрізняти (наприклад) hTABi  і Ci, просто зробіть одну привязку для ASCII-знака hTABi  (Вісімковий код 011) Якщо ви дійсно хочете розрізняти їх, то зробіть одну привязку для цього ASCII-знака, а другий для функціональної клавіші tab

На звичайних ASCII-терміналах немає способу розрізняти hTABi  і Ci (і аналогічно для інших таких пар), тому що термінал посилає один і той же знак в обох випадках

3149  Чи не-ASCII-знаки на клавіатурі

Якщо на вашій клавіатурі є клавіші, які посилають знаки, що не входять в ASCII, наприклад наголосу, перепрівязка їх робиться кілька хитро Є два рішення Одне – вказати систему кодування для клавіатури, використовуючи set-keyboard-coding-system (див Розділ 189 [Завдання кодування], с 168) Потім ви можете привязувати ці клавіші звичайним способом, але записуючи

(Global-set-key [ Знак] якасьто-функція)

і підставляючи знак, який ви хочете привязати

Якщо ви не вказуєте систему кодування для клавіатури, цей спосіб не спрацює Замість цього вам потрібно зясувати код, який насправді посилає термінал Найпростіший спосіб зробити це в Emacs – Створити порожній буфер за допомогою Cx b temp hRETi, Зробити його однобайтное, набравши Mx toggle-enable-multibyte-characters hRETi, А потім натиснути клавішу, яка вставить в цей буфер потрібний знак

Розташуйте точку відразу перед цим знаком, потім наберіть Cx = Це відобразить у мінібуфер повідомлення, що показує вісімковий, шістнадцятковий і десятковий код знака, все в круглих дужках Використовуйте другий з цих трьох чисел, десяткове, всередині вектора для привязки:

(Global-set-key [десятковийкод] якасьто-функція)

31410  Перепрівязка кнопок миші

Emacs використовує лісповскіе символи і для позначення кнопок миші Звичайними подіями від миші в Emacs є події-клацання це трапляється, коли ви натискаєте і відпускаєте кнопку без переміщення миші Ви можете також отримати собитіепроведеніе, коли ви переміщаєте мишу, тримаючи натиснутою кнопку Події-проведення в дійсності відбуваються, коли ви відпускаєте кнопку миші

Символами для основних подій-клацань є mouse-1 для лівої кнопки миші, mouse-2 для наступної кнопки і так далі Ось як можна перевизначити другу кнопку миші для розділення поточного вікна:

(global-set-key [mouse-2]  ’split-window-vertically)

Символи для події-проведення схожі на попередні, але мають префікс drag- перед словом mouse. Наприклад, проведення за допомогою першої кнопки генерує подія drag-mouse-1

Ви також можете визначити привязки для подій, які виникають в момент натискання на кнопку миші Імена цих подій починаються зі слова down- замість

‘Drag-. Такі події генеруються, тільки якщо вони мають привязку Коли ви отримаєте подія-натискання, то за ним завжди будуть слідувати відповідна подія-клацання або проведення

Якщо хочете, ви можете розрізняти поодинокі, подвійні і потрійні клацання Подвійне клацання означає клацання кнопкою миші двічі майже в одному і тому ж місці Перше клацання генерує звичайна подія-клацання Друге клацання, якщо він приходить досить швидко, генерує подію-подвійне клацання Тип події для подвійного клацання починається з double-: наприклад, double-mouse-3

Це означає, що ви можете надати особливий сенс другого клацання в тому ж самому місці, але він повинен діяти в припущенні, що звичайне визначення одинарного клацання вже оброблені, коли був отриманий перший клацання

Це обмежує ваші можливості з використання подвійних клацань, але дизайнери користувальницьких інтерфейсів кажуть, що цього обмеження потрібно слідувати в будь-якому випадку Подвійне клацання повинен робити щось подібне одиночного клацання, тільки

“Трохи більше. Команда для події-подвійного клацання повинна виконувати більше роботи для подвійного клацання

Якщо для події подвійного клацання немає привязки, воно змінюється на відповідну подію одиночного клацання Таким чином, якщо ви не визначите спеціально подвійне клацання, то буде двічі виконуватися команда для одиночного клацання

Emacs також підтримує події-потрійні клацання, чиї імена починаються з

‘Triple-. Emacs не розрізняє Четвертня натискання як тип події клацання понад третього генерують додаткові події-потрійні клацання Однак повне кількість клацань зберігається в списку подій, так що ви можете розрізняти такі випадки, якщо вам це дійсно потрібно Ми не рекомендуємо особливих значень для більш ніж трьох клацань, але іноді корисно, щоб наступні клацання проходили по циклу того ж набору трьох значень, так що чотири клацання еквівалентні одному, пять еквівалентні двом, а шість – трьом

Emacs також записує множинні натискання в подіях проведення та натискання Наприклад, коли ви двічі натиснете кнопку, а потім перемістіть миша, тримаючи кнопку натиснутою, Emacs отримає подію double-drag-. А коли ви натискаєте на кнопку вдруге, Emacs отримає подію double-down- (яке ігнорується, подібно всім подіям натискання, якщо у них немає привязки)

Мінлива double-click-time задає проміжок часу, який може пройти між двома клацаннями, щоб вони вважалися парою Її значення вимірюється в мілісекундах Якщо значення дорівнює nil, то подвійний клацання не розпізнає зовсім Якщо значення дорівнює t, то немає ніякого тимчасового обмеження

Символи для подій миші також показують статус клавіш-модифікаторів, з зви-

вими префіксами C-, M-, H-, s-, A- і S-. Вони завжди стоять перед double- або

‘Triple-, які завжди передують drag- або down-.

Фрейм включає області, які не відображають текст буфера, такі як рядок режиму і лінійка прокручування Ви можете судити про те, що кнопка миші натиснута на спеціальній області екрану, за допомогою префіксних псевдо-ключів Наприклад, якщо ви клацнете мишею в рядку режиму, то ви отримаєте префіксний ключ mode-line перед звичайним символом, обозначающем кнопку миші Ось як визначити клацання першою кнопкою на рядку режиму для запуску scroll-up:

(global-set-key  [mode-line mouse-1] ’scroll-up)

Ось повний список таких префіксних псевдо-ключів і їх значень:

mode-line

Миша перебувала на рядку режиму вікна

vertical-line

Миша перебувала на вертикальній лінії, що розділяє вікна (Якщо ви використовуєте смужки прокрутки, вони зявляються замість цих вертикальних ліній)

vertical-scroll-bar

Миша перебувала на вертикальній смужці прокрутки (Поки це єдність-

ная різновид смужок прокрутки, які підтримує Emacs)

Ви можете помістити в послідовність ключів більше однієї події від кнопок миші, але зазвичай так не далают

31411  Блокування команд

Блокування позначає команду як вимагає підтвердження до того, як вона буде виконана Мета блокування полягає в тому, щоб зщітіть початківців користувачів від випадкового виконання команд, які могли б їх запитати

Спроба інтерактивного виклику блокованої команди в Emacs відображає вікно, що містить імя команди, її опис і деякі рекомендації про те, що треба зробити негайно потім Emacs запитає у вас введення, який вказує, чи потрібно виконувати цю команду, як запитано, розблокувати її або скасувати запит Якщо ви вирішите розблокувати команду, то вас запитають, чи виконати це постійно або тільки для поточного сеансу Постійне розблокування проводиться шляхом автоматичного редагування вашого файлу . Emacs.

Прямий механізм блокування команди – приміщення відмінного від nil властивості disabled в лісповскій символ для даної команди Ось програма на Ліспі, яка робить це:

(put ’delete-region ’disabled t)

Якщо значення властивості disabled є рядком, то цей рядок включається в пові-

щення, що виводиться при використанні цієї команди:

(put ’delete-region ’disabled

&quotIt’s better to  use ‘kill-region’  instead\n&quot)

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

‘. Emacs, або за допомогою команди Mx disable-command, яка радактірует файл

‘. Emacs за вас Подібним чином команда Mx enable-command змінює . Emacs для постійного дозволу команди Див Розділ 317 [Файл ініціалізації], с 366

Блокування команди не залежить від того, який ключ використовується для її запуску блокування також діє, якщо команда викликається через Mx Блокування не має ефекту при виклику команди як функції з програм на Ліспі

315  Переклад клавіатури

Деякі клавіатури не дозволяють зручно посилати всі спеціальні знаки, які використовує Emacs Найбільш загальним випадком цієї проблеми є знак hDELi Деякі клавіатури не забезпечують зручного способу для набору цього дуже важливого знака

– Зазвичай тому що вони спроектовані в припущенні, що для видалення використовуватиметься знак Ch На таких клавіатурах, якщо ви натиснете клавішу, яка зазвичай використовується для видалення, то Emacs обробить Ch як префіксний ключ і запропонує вам список параметрів, а це не те, що вам потрібно

Ви можете обійти цю проблему всередині Emacs, підготувавши переклад клавіатури для перетворення Ch в hDELі hDELв C-h, як показано:

;; Перекладає C-h в hDELi

(keyboard-translate \C-h  \C-)

;; Перекладає hDELв C-h

(keyboard-translate \C-  \C-h)

Переклад клавіатури – це не те ж саме, що і привязка ключів в таблицях ключів (див Розділ 3141 [Таблиці ключів], с 356) Emacs містить численні таблиці ключів, які застосовуються в різних ситуаціях, але тільки один набір перекладів клавіш, і він застосовується до кожного знаку, який Emacs зчитує з терміналу Переклад клавіатури відбуваються на нижчому рівні обробки введення ключі, пошук яких відбувається в таблицях ключів, містять знаки, що зявляються після переведення клавіатури

При роботі в X, клавіша з імям hDELETEє функціональною клавішею, і вона відрізняється від ASCII-знака з імям hDELi Див Розділ 3148 [Іменовані ASCII-знаки], с 362 Переклад клавіатури зачіпає тільки введення ASCII-знаків, але не функціональних клавіш таким чином, приклад вище, застосований під X, не впливає на клавішу hDELETEi Однак такий переклад не є необхідним під X, тому що Emacs може також розрізняти клавішу hBACKSPACEі C-h і зазвичай він розглядає hBACKSPACEяк hDELi

Для більш повної інформації про використання перекладу клавіатури дивіться розділ

“Translating Input в The Emacs Lisp Reference Manual

316  Синтаксична таблиця

Всі команди Emacs, які розбирають слова або балансують дужки, управляються синтаксичної таблицею Синтаксична таблиця говорить, які знаки є що відкривають обмежувачами, частинами слів, лапками строкових констант і так далі У кожного основного режиму є своя синтаксична таблиця (хоча родинні основні режими часто поділяють одну), яка встановлюється в будь-якому буфері, использующем цей режим Всі команди застосовують синтаксичну таблицю, встановлену в поточному буфері саме її ми маємо на увазі, коли ми говоримо просто синтаксична таблиця. Синтаксична таблиця – це лісповскій обєкт, таблиця знаків, чиїми елементами є числа

Щоб вивести на екран опис вмісту поточної синтаксичної таблиці, наберіть Ch s (describe-syntax) Опис кожного знака включає рядок, яку ви передали б modify-syntax-entry для установки поточного синтаксису, і невелике пояснення цього рядка англійською, якщо необхідно

Для отримання повної інформації про синтаксичні таблицях дивіться розділ Syntax

Tables в The Emacs Lisp Reference Manual

317  Файл ініціалізації, ‘~/emacs

Коли Emacs запускається, він зазвичай загружет Лісп-програму з файлу . Emacs у вашому початковому каталозі Ми називаємо цей файл вашим файлом ініціалізації, оскільки він вказує, як ініціалізувати Emacs для вас Ви можете використовувати ключі командного рядка -q, щоб запобігти завантаження файлу ініціалізації, і -u (або -user), щоб вказати файл ініціалізації іншого користувача (див Глава 3 [Вхід в Emacs], с 33)

Також може бути файл ініціалізації за замовчуванням, це бібліотека з імям

‘Defaultel, находиме по стандартному шляху пошуку для бібліотек У дистрибутиві Emacs немає такої бібліотеки вона може бути створена на вашій системі для локальних налаштувань Якщо ця бібліотека існує, вона завантажується при запуску Emacs (тільки якщо ви не задали -q) Але ваш файл ініціалізації, якщо він існує, завантажується перший якщо він встановлює inhibit-default-init в відмінне від nil значення, то

‘Default не завантажується

На вашій системі також може бути системний файл запуску він називається

‘Site-startel, якщо існує Emacs завантажує цю бібліотеку до вашого файлу ініціалізації Щоб придушити завантаження цієї бібліотеки, використовуйте ключ

‘-no-site-file’

Якщо ваш файл . Emacs містить великий обсяг коду, вам варто перемістити його в інший файл, як ~ / щонібудьel , скомпілювати його і зробити так, щоб ваш файл

‘. Emacs завантажував його через (load ~ / щонебудь ) Див розділ Byte Compilation в the Emacs Lisp Reference Manual, Для отримання більшої інформації про компілюванні програм на Emacs Lisp

Якщо ви збираєтеся писати справжні програми на Emacs Lisp, які йдуть далі простого налаштування, вам потрібно прочитати книгу Emacs Lisp Reference Manual

3171  Синтаксис файлу ініціалізації

Файл . Emacs містить одне або кілька лісповскіх виразів викликів функцій

Кожне з них складається з імені функції, за яким слідують аргументи, все в окру-

жении круглих дужок Наприклад, (setq fill-column 60) викликає функцію setq для установки змінної fill-column (див Розділ 215 [Заповнення], с 185) в значення 60

Другий аргумент setq – це вираження для нового значення змінної Це може бути константа, змінна або виклик функції У файлі . Emacs найчастіше використовуються константи Це можуть бути:

Числа: Числа записуються в десятковій формі, з необовязковим знаком мінус на початку

Рядки: Синтаксис лісповскіх рядків такий же, як в Сі, але з деякими додатковими рисами Для початку і завершення строкової константи використовуйте знак подвійних лапок

У строкових константах ви можете писати переклади рядків і спеціальні знаки буквально Але часто для ясності краще використовувати для них послідовності із зворотного косою рисою: \ n для перекладу рядка, \ B для повернення на одну позицію, \ r для повернення каретки, \ t для табуляції, \ f для прогону сторінки (control-L), \ e для escape, \ \ для зворотного косою риси, \ ‘ для подвійних лапок або \oooДля знака з вісімковий кодом ooo Зворотна коса риса і подвійні лапки – це єдині знаки, для яких такі послідовності обовязкові

‘\ C- можна використовувати як префікс для керуючого знака, як \ C-s для ASCII control-S, а \ M- можна застосовувати в якості префікса для Meta-знака, як \ M-a для Meta-A або \ M-\ C-a для Control-Meta-A

Знаки: Синтаксис лісповскіх знакових констант складається з ?’, За якими йде або знак, або послідовність, що починається з \. Приклади: X, \ N, \ ,

? \) Зауважте, що рядки і знаки не синоніми в Ліспі в деяких контекстах вимагається одне, в деяких іншого

Істина: t позначає істину. Брехня: nil позначає брехня. Інші лісповскіе обєкти:

Пишіть поодинокі лапки () і за нею бажаний лісповскій обєкт

3172  Приклади файлу ініціалізації

Ось кілька прикладів виконання часто потрібних речей за допомогою лісповскіх ви-

раженій:

Зробити так, щоб hTABi  в режимі C просто вставляв табуляцію, якщо точка нахо-

диться в середині рядка

(setq c-tab-always-indent nil)

Тут ми маємо змінну, чиє значення звичайно дорівнює t, тобто істина, а альтер-

Натіва йому – nil, брехня.

Зробити так, щоб пошук проводився з урахуванням регістра (у всіх буферах, які не перекривають це)

(setq-default case-fold-search nil)

Це встановлює значення за замовчуванням, воно поширюється на всі буфери, в яких немає локальних значень для цієї змінної Установка case-fold-search за допомогою setq зачіпає тільки локальне значення поточного буфера, а це не те, що ви, швидше за все, хочете зробити у файлі ініціалізації

Вказати вашу адресу електронної пошти, якщо Emacs не може правильно зясувати його сам

(setq user-mail-address &quotcoon@yoyodynecom&quot)

Різні пакети Emacs, яким потрібно знати вашу адресу, використовують значення

user-mail-address

Зробити режим Text режимом для нових буферів за умовчанням

(setq  default-major-mode ’text-mode)

Зауважте, що використовується text-mode, оскільки це команда для входу в режим Text Одиночна лапка перед ним робить цей символ константою інакше text-mode розглядався б як імя змінної

Підготувати установки за замовчуванням для набору знаків Latin-1, який підтримай-

кість більшість західноєвропейських мов

(set-language-environment &quotLatin-1&quot)

Включати режим Auto Fill автоматично в режимі Text і споріднених з ним

(add-hook  ’text-mode-hook

’(lambda  () (auto-fill-mode  1)))

Це показує, як додати функцію-пастку до змінної-пастці (див Розділ 3123 [Пастки], с 349) Функція, яку ми надаємо – це список, що починається з lambda, з одиночною лапкою на початку, щоб зробити цей список константою, а не виразом

Пояснення функцій Лиспа виходить за рамки даного керівництва, але для цього прикладу досить знати, що дією буде обчислення (auto-fill-mode 1), коли ви входите в режим Text При бажанні ви можете замінити це на інший вираз або на декілька виразів поспіль

Emacs поставляється з функцією з імям turn-on-auto-fill, чиє визначення – це (lambda () (auto-fill-mode 1)) Таким чином, більш простий спосіб написати наведене вище вираз виглядає так:

(add-hook  ’text-mode-hook ’turn-on-auto-fill)

Завантажити встановлену лісповскую бібліотеку з імям foo (насправді файл

‘Fooelc або fooel з стандартного каталогу Emacs)

(load &quotfoo&quot)

Коли аргументом load є відносне імя файлу, що не починається з / або

‘~, Load переглядає каталоги з load-path (див Розділ 237 [Бібліотеки Лиспа],

с 253)

Завантажити скомпільований Лісп-файл fooelc з вашого початкового каталогу

(load &quot~/fooelc&quot)

Тут використано абсолютне імя файлу, тому пошук не проводиться

Перепривязати ключ Cx l на запуск функції make-symbolic-link

(global-set-key &quot\C-xl&quot  ’make-symbolic-link)

або

(define-key global-map  &quot\C-xl&quot ’make-symbolic-link)

Ще раз зверніть увагу, одиночна лапка використовується для посилання на символ

make-symbolic-link, а не на його значення як змінної

Зробити те ж саме, тільки для режиму Lisp

(define-key lisp-mode-map  &quot\C-xl&quot ’make-symbolic-link)

Перевизначити всі ключі, які зараз запускають next-line в режимі Fundamental, щоб вони замість цього запускали forward-line

(substitute-key-definition  ’next-line  ’forward-line global-map)

Зробити Cx Cv невизначеним

(global-unset-key &quot\C-x\C-v&quot)

Одна з причин для видалення визначення ключа полягає в тому, щоб ви могли зробити його префіксом Просто визначення Cx Cv щозавгодно зробить Cx Cv префіксом, але спочатку потрібно позбавити Cx Cv його звичайного непрефіксного визначення

Присвоїти $ синтаксичну категорію пунктуації в режимі Text Зверніть ува-

мание на використання знакової константи для $.

(modify-syntax-entry \$  &quot.&quot text-mode-syntax-table)

Дозволити використання команди narrow-to-region без підтвердження

(put ’narrow-to-region ’disabled nil)

3173  Ініціалізація терміналу

Для кожного типу терміналу може бути бібліотека, завантажувана в Emacs, коли він запускається на цьому типі терміналу Для типу терміналу з імям типтерм ця бібліотека називається term / типтерм , і вона знаходиться, як зазвичай, шляхом пошуку в каталогах load-path, при цьому пробуються закінчення. elc і. el . Зазвичай вона зявляється в підкаталозі term з каталогу, де зберігається більшість бібліотек Emacs

Звичайне призначення специфічною для терміналу бібліотеки – відображення escapeпоследовательностей, використовуваних функціональними клавішами терміналу, в більш осмислені імена за допомогою функції function-key-map Приклад того, як це робиться, дивіться у файлі term/lk201el. Багато функціональні клавіші відображаються автоматично в соответсвтіі з базою даних Termcap в специфічною для терміналу бібліотеці потрібно описати тільки ті функціональні клавіші, які на вказані в Termcap

Коли тип терміналу містить дефіс, при виборі імені бібліотеки має значення

ня тільки частина перед першим дефісом Таким чином, типи терміналів aaa-48 і

‘Aaa-30-rv обидва використовують бібліотеку term / aaa. Код бібліотеки може застосовувати

(Getenv TERM) для зясування повного імені типу терміналу

Імя бібліотеки конструюється конкатенацією значення змінної term-file-prefix і типу терміналу Ваш файл . Emacs може запобігти завантаження специфічною для терміналу бібліотеки, встановлюючи term-file-prefix рівний nil

Наприкінці ініціалізації, коли лічені і ваш файл . Emacs, і будь-яка специфічна для терміналу бібліотека, Emacs запускає пастку term-setup-hook Додайте до цієї пастці функції, якщо ви хочете перекрити частина специфічною для терміналу бібліотеки або визначити ініціалізацію для терміналів, до яких немає бібліотеки Див Розділ 3123 [Пастки], с 349

3174  Як Emacs знаходить файл ініціалізації

Зазвичай для пошуку файлу . Emacs Emacs використовує змінну середовища HOME знак ~ в імені файлу позначає саме це Але якщо ви зробили su, Emacs намагається знайти ваш власний . Emacs, а не того користувача, за кого ви себе зараз видаєте Ідея в тому, щоб ви отримували свої власні настройки редактора, навіть якщо працюєте як привілейований користувач

Більш точно, Emacs спочатку визначає, файл ініціалізації якого користувача потрібно використовувати Він отримує імя користувача з змінних середовища LOGNAME і USER якщо жодна з них не існує, береться ефективний ID користувача Якщо імя користувача відповідає реальному користувальницькому ID, то Emacs використовує HOME інакше, він знаходить початковий каталог в системній базі даних про користувачів

Джерело: Річард Столмен, Керівництво по GNU Emacs

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*