Отключить ESC как мета в режиме Emacs Viper?
Я давний пользователь 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 ответа
Я был в одной лодке, и эта проблема уже давно мешает мне попробовать emacs. Но у меня наконец-то появилось время для расследования, и я думаю, что у меня есть решение / обходной путь.
Посмотрев на источник гадюки, я понял, что это странно для всей документации, которую я нахожу, viper-translate-all-ESC-keysequences
это функция. Поэтому установка переменной с тем же именем ничего не даст.
Так что теперь у меня есть (defun viper-translate-all-ESC-keysequences () nil)
после моего (require 'vimpulse)
строка в моем файле.emacs. И, похоже, я могу спамить свой ключ ESC столько, сколько я хочу сейчас. Почему документация вводит в заблуждение, я не знаю, но сейчас я, по крайней мере, смог попробовать emacs с этим обходным путем. Надеюсь это поможет!
Приведенные выше ответы не работают для меня. Я просмотрел документацию по viper и нашел две команды (viper-fast-keyseq-timeout) против (viper-ESC-keyseq-timeout). Первый - позволить режиму Vi интерпретировать любые комбинации клавиш, разделенные определенным временем, как макрос Vi. Последнее, кажется, то, что мы хотим, то есть игнорировать особое значение ESC в режиме vi. Установка последнего в 0 решает проблему для меня. (iterm2, mac os X lion)
[Ссылка]
viper-ESC-keyseq-timeout 200 на tty, 0 на оконном дисплее Последовательности клавиш сброса, разделенные такой большой задержкой (в миллисекундах), интерпретируются как команда, игнорируя особое значение ESC в VI. По умолчанию подходит для большинства терминалов. Однако, если ваш терминал работает очень медленно, вы можете немного увеличить его. Вы узнаете, работает ли ваш терминал медленно, если последовательности клавиш ESC, испускаемые клавишами со стрелками, интерпретируются как отдельно вводимые символы (и, следовательно, клавиши со стрелками не будут работать). Слишком большое значение замедлит вас, поэтому соблюдайте сдержанность.
viper-fast-keyseq-timeout 200 Последовательности клавиш, разделенные таким количеством миллисекунд, рассматриваются как макросы клавиатуры в стиле Vi. Если последовательность клавиш определена как такой макрос, он будет выполнен. В противном случае он обрабатывается как обычная последовательность набранных клавиш. Установка слишком высокой переменной может замедлить ваш набор текста. Установка слишком низкого значения может затруднить достаточно быстрый ввод макросов.
viper-translate-all-ESC-keysequence t на tty, nil на оконном дисплее Обычно Viper позволяет Emacs переводить только те последовательности ключей ESC, которые определены в низкоуровневой карте преобразования ключей или карте функциональных клавиш, например те, которые испускаются стрелкой и функциональными клавишами. Другие последовательности, например, \e/, обрабатываются как команда ESC, за которой следует /. Это хорошо для людей, которые печатают быстро и стремятся поразить других персонажей сразу после того, как они нажали ESC. Другие люди, такие как Emacs, постоянно переводят последовательности ESC. По умолчанию переводятся все последовательности только при использовании тупого терминала. Это позволяет вам использовать ESC в качестве мета-ключа в режиме вставки. Например, быстрое нажатие ESC x приведет к вводу Mx. Если ваш тупой терминал не такой тупой и понимает мета-ключ, то вам, вероятно, будет лучше установить эту переменную в ноль. Попробуйте и посмотрите, какой путь подходит вам лучше всего.
Эта проблема произошла со мной в режиме консоли (т.е. при запуске 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
когда в режиме вставки.
(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)