На мой личный взгляд – дело в правильных key binding'ах. Комбинации Emacs легко запомнить, но очень сложно ими пользоваться. Неприятно не только набивать длинные аккорды из аббревиатур команд Emacs. Даже простое перемещение по тексту может стать сложной задачей, если не настроить редактор «как надо».
В философии Emacs преобладает идея о том, что стрелочки и прочие дополнительные клавиши вроде Backspace, Delete, Page Up/Page Down, Home/End только замедляют работу в редакторе, т. к. заставляют убирать руки с алфавитно-цифровой клавиатуры и переносить на дополнительную. Т.е. в теории, если перещмещаться по тексту и одновременно редактировать его используя только алфавитно-цифровую клавиатуру, то можно получить прирост в производительности. На практике же набирать стандартные C-f, C-b, C-p, C-n еще хуже. Попробуйте, к примеру, дотянитесь одной рукой одновременно до f и p. Клавиши находятся на большом расстоянии друг от друга, и точное позиционирование курсора с использованием стандартных комбинаций – жуткая морока. Да и что уж греха таить, запоминать все способы перемещения по тексту – тоже долго. В том же vim ситуация и то лучше. Перемещение курсора в нормальном режиме делается клавишами hjkl – для этого, по крайней мере, не нужна растяжка пальцев, как у пианиста.
Я настроил свою клавиатуру следующим образом. Заметьте, очень удобно, что самая левая клавиша на средней линии здесь -- j. На ней находится "пимпочка", нащупав которую, легко позиционировать пальцы на клавиатуре.
u C-u -- begin of lineC-S-u -- begin of buffer | i C-i -- up C-S-i -- page up M-i -- window up | o C-o -- end of line C-S-o -- end of buffer |
j C-j -- left C-S-j -- previous word M-j -- window left | k C-k -- down C-S-k -- page down M-k -- window down | l C-l -- right C-S-l -- next word M-l -- window right |
n C-n -- backspace C-S-n -- delete | m C-m -- Enter | |
Вот фрагмент моего файла конфигурации Emacs.
(define-key (current-global-map) (kbd "C-j") 'backward-char)
(define-key (current-global-map) (kbd "C-k") 'next-line)
(define-key (current-global-map) (kbd "C-l") 'forward-char)
(define-key (current-global-map) (kbd "C-i") 'previous-line)
(define-key (current-global-map) (kbd "C-u") 'move-beginning-of-line)
(define-key (current-global-map) (kbd "C-o") 'move-end-of-line)
(define-key (current-global-map) (kbd "C-z") 'undo)
(define-key (current-global-map) (kbd "C-S-j") 'backward-word)
(define-key (current-global-map) (kbd "C-S-l") 'forward-word)
(define-key (current-global-map) (kbd "C-S-i") 'scroll-down)
(define-key (current-global-map) (kbd "C-S-k") 'scroll-up)
(define-key (current-global-map) (kbd "C-n") 'backward-delete-char-untabify)
(define-key (current-global-map) (kbd "C-S-n") 'delete-char)
(define-key (current-global-map) (kbd "C-m") 'reindent-then-newline-and-indent)
(define-key (current-global-map) (kbd "M-j") 'windmove-left)
(define-key (current-global-map) (kbd "M-k") 'windmove-down)
(define-key (current-global-map) (kbd "M-l") 'windmove-right)
(define-key (current-global-map) (kbd "M-i") 'windmove-up)
(define-key (current-global-map) (kbd "C-b") 'bookmark-set)
(define-key (current-global-map) (kbd "M-b") 'bookmark-jump)
(define-key (current-global-map) (kbd "C-S-u") 'beginning-of-buffer)
(define-key (current-global-map) (kbd "C-S-o") 'end-of-buffer)
(define-key (current-global-map) (kbd "C-k") 'next-line)
(define-key (current-global-map) (kbd "C-l") 'forward-char)
(define-key (current-global-map) (kbd "C-i") 'previous-line)
(define-key (current-global-map) (kbd "C-u") 'move-beginning-of-line)
(define-key (current-global-map) (kbd "C-o") 'move-end-of-line)
(define-key (current-global-map) (kbd "C-z") 'undo)
(define-key (current-global-map) (kbd "C-S-j") 'backward-word)
(define-key (current-global-map) (kbd "C-S-l") 'forward-word)
(define-key (current-global-map) (kbd "C-S-i") 'scroll-down)
(define-key (current-global-map) (kbd "C-S-k") 'scroll-up)
(define-key (current-global-map) (kbd "C-n") 'backward-delete-char-untabify)
(define-key (current-global-map) (kbd "C-S-n") 'delete-char)
(define-key (current-global-map) (kbd "C-m") 'reindent-then-newline-and-indent)
(define-key (current-global-map) (kbd "M-j") 'windmove-left)
(define-key (current-global-map) (kbd "M-k") 'windmove-down)
(define-key (current-global-map) (kbd "M-l") 'windmove-right)
(define-key (current-global-map) (kbd "M-i") 'windmove-up)
(define-key (current-global-map) (kbd "C-b") 'bookmark-set)
(define-key (current-global-map) (kbd "M-b") 'bookmark-jump)
(define-key (current-global-map) (kbd "C-S-u") 'beginning-of-buffer)
(define-key (current-global-map) (kbd "C-S-o") 'end-of-buffer)
Комбинации для выделения, копирования, вырезания и вставки текста решил оставить стандартными, чтобы они не перекрывали столь необходимые C-x и C-c.
>Попробуйте, к примеру, дотянитесь одной рукой одновременно до f и p.
ОтветитьУдалитьА вы попробуйте лучше нажимать f и p разными руками.
F,b,n - левой, p - правой.
На самом деле очень удобно, особенно если учесть тот факт, что это "стандарт". До emacs я и в консоли стрелочками перемещался, а теперь все очень удобно.
Оно, конечно, дело вкуса. Мне лично нравится, чтобы правая рука задавала направление перемещения, а левая -- режим, который меняется клавишей Ctrl/Shift/Alt.
ОтветитьУдалитьТакой вопрос: какая у вас скорость слепой печати? Дефолтовые комбинации Emacs лично мне в основном представляются оптимальными.
ОтветитьУдалитьИ ещё, надеюсь у вас Ctrl на месте ненужной клавиши CapsLock?
ОтветитьУдалитьСкорость слепой печати у меня более чем приличная, так что на разглядывание клавы не отвлекаюсь. Сaps ставил как Ctrl и продеражлся около месяца, после чего вернул как было. Неудобно SQL-команды набирать с шифтами.
ОтветитьУдалитьВозможно, дефолтовые комбинации и могут быть делом вкуса, если не так уж важна скорость. Но согласись, я быстрее наберу свои C-l и C-i, используя левую руку для Ctrl, а правую для букв, чем ты C-f и С-p, в две руки, как писал kreed. Дефолтные комбинации в Emacs проще запомнить, т.к. C-f -- forward или C-p -- previous. Но набирать все это неудобно. Думаю, если бы в английском языке направления передвижения не начинались бы на разные буквы, то Столлман не стал бы называть команды по аббревиатурам, а нашел бы просто удобное их расположение. Похоже, он просто не заморачивался, зная, как легко все настроить под себя. Но это же не значит, что нужно пользоваться дефолтными настройками.
разделили C-i и tab?
ОтветитьУдалитьтогда сделайте то же с C-m и return
если нет, но хочется, я закопипасчу код
последний комментарий -- мой
ОтветитьУдалитьстранно, что stackoverflow мою привязку к egotv.ru понимает, а blogstop ведет меня на гугл
C-i пришлось пожертвовать. Ее можно переназначить на другую комбинацию; здесь же я привел только те, что помогают ускорить перемещение. На мой взгляд, привязки именно к позиционированию курсора сделаны в Emacs по-дефолту самым дурацким образом из всех возможных. Остальные keybinding'и -- вполне неплохо...
ОтветитьУдалитьТоже столкнулся с этой проблемой - после перехода с Vim'а навигация по тексту была жутким неудобством. В моем случае ситуацию спасли Viper и Vimpulse :)
ОтветитьУдалить