Отключить ESC как мета в режиме Emacs Viper? - PullRequest
5 голосов
/ 12 июля 2010

Я давний пользователь vim, пытающийся переключиться на emacs.

Я использую viper-mode в emacs и продолжаю набирать ESC (чтобы выйти из режима вставки), а затем клавишу (скажем, j). Я печатаю быстро и часто бью их одновременно. Emacs тогда думает, что я нажимаю META-j и запускает функцию, которую я не собираюсь.

Мне нравится использовать option в качестве мета, и я не хочу, чтобы ESC был мета, когда я в viper.

У кого-нибудь есть предложения, как полностью отключить ESC как мету в режиме viper?

Вот несколько связанных вариантов, которые я пробовал. Ни один из них не решает проблему.

(setq viper-no-multiple-ESC t)                                                                                   
(setq viper-translate-all-ESC-keysequences t)                                                                        
(setq viper-fast-keyseq-timeout 0)

Ответы [ 4 ]

3 голосов
/ 30 октября 2010

Я был в одной лодке, и эта проблема уже давно мешает мне попробовать emacs. Но у меня наконец-то появилось время для расследования, и я думаю, что нашел решение / обходной путь.

Посмотрев на источник гадюки, я понял, что вся информация, которую я нахожу, viper-translate-all-ESC-keysequences - это функция. Поэтому установка переменной с тем же именем ничего не даст.

Так что теперь у меня есть (defun viper-translate-all-ESC-keysequences () nil) после моей строки (require 'vimpulse) в моем файле .emacs. И, похоже, я могу спамить свой ключ ESC столько, сколько я хочу сейчас. Почему документация так вводит в заблуждение, я не знаю, но сейчас я, по крайней мере, смог попробовать emacs с этим обходным путем. Надеюсь, это поможет!

1 голос
/ 19 ноября 2011

Эта проблема возникла у меня в режиме консоли (т. Е. При запуске emacs -nw).

Добавление следующего к моему init.el кажется мне решением:

(set 'viper-fast-keyseq-timeout 0)
(set 'viper-no-multiple-ESC t)
(defun viper-translate-all-ESC-keysequences () t)

Мне также нужно было добавить:

maptimeout 0

в мой файл .screenrc для запуска emacs внутри сеанса экрана GNU, иначе проблема появится снова.


Также:

(defun viper-translate-all-ESC-keysequences () nil)

, казалось, "работал", но имел непреднамеренный эффект отключения команд в стиле M-, поэтому (например) я не мог использовать M-/ для запуска dabbrev-expand при вставкережим.

1 голос
/ 28 августа 2011

Приведенные выше ответы не сработали для меня.Я просмотрел документацию по viper и нашел две команды (viper-fast-keyseq-timeout) против (viper-ESC-keyseq-timeout).Первый - позволить режиму Vi интерпретировать любые комбинации клавиш, разделенные определенным временем, как макрос Vi.Последнее, кажется, то, что мы хотим, то есть игнорировать особое значение ESC в режиме vi.Установка последнего в 0 решает проблему для меня.(iterm2, mac os X lion)

[ref]

viper-ESC-keyseq-timeout 200 для tty, 0 на оконном дисплее: экранирование последовательностей клавиш, разделенных этимБольшая задержка (в миллисекундах) интерпретируется как команда, игнорируя особое значение ESC в VI.По умолчанию подходит для большинства терминалов.Однако, если ваш терминал работает очень медленно, вы можете немного увеличить его.Вы узнаете, работает ли ваш терминал медленно, если последовательности клавиш ESC, испускаемые клавишами со стрелками, интерпретируются как отдельно вводимые символы (и, следовательно, клавиши со стрелками не будут работать).Если сделать это значение слишком большим, это замедлит вас, поэтому проявляйте сдержанность.

viper-fast-keyseq-timeout 200 Последовательности клавиш, разделенные таким количеством миллисекунд, рассматриваются как макросы клавиатуры в стиле Vi.Если последовательность клавиш определена как такой макрос, он будет выполнен.В противном случае он обрабатывается как обычная последовательность набранных клавиш.Установка слишком высокой переменной может замедлить ваш набор текста.Установка слишком низкого значения может затруднить достаточно быстрый набор макросов.

последовательности ключей viper-translate-all-ESC-key t для tty, ноль для отображения окна Обычно, Viper позволяет Emacs переводить только Emacs.те последовательности клавиш ESC, которые определены в низкоуровневой карте трансляции ключей или карте функциональных клавиш, например, излучаемые стрелкой и функциональными клавишами.Другие последовательности, например, \ e /, обрабатываются как команда ESC, за которой следует /.Это хорошо для людей, которые печатают быстро и стремятся поразить других персонажей сразу после того, как они нажали ESC.Другие люди, такие как Emacs, постоянно переводят последовательности ESC.По умолчанию переводятся все последовательности только при использовании тупого терминала.Это позволяет вам использовать ESC в качестве мета-ключа в режиме вставки.Например, быстрое нажатие ESC x приведет к вводу Mx.Если ваш тупой терминал не такой тупой и понимает мета-ключ, то вам, вероятно, будет лучше установить эту переменную в ноль.Попробуйте и выясните, какой путь вам больше подходит.

0 голосов
/ 25 апреля 2011

Решение (defun viper-translate-all-ESC-keysequences () nil) у меня не работало с терминальными emacs, работающими в iTerm2 -> ssh на Slackware 11 -> screen -> emacs 22.3.1

Все, что мне нужно было сделать:

(custom-set-variables
  '(viper-translate-all-ESC-keysequences t))

Обратите внимание, что значение «t», а не «nil».

Однако решение для моего OSX iTerm2 -> emacs 23.2.1 было исправлено:

(setq viper-fast-keyseq-timeout 0)                                                    
...