пятница, 1 июля 2011 г.

Не обязательно быть гением, чтобы увеличить продуктивность в Emacs


На мой личный взгляд – дело в правильных 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 line
C-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





Таким образом, просто зажав Ctrl, можно перемещаться по тексту "стрелками" из клавиш ijkl, примерно так, как в стрелялках геймеры вместо стрелок используют wasd. А добавив клавишу Shift или Alt, получаем дополнительные бонусы в виде Page Up/Page Down, Home/End, Next word, Previous word и т.д.
Вот фрагмент моего файла конфигурации 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)

Комбинации для выделения, копирования, вырезания и вставки текста решил оставить стандартными, чтобы они не перекрывали столь необходимые C-x и C-c.

9 комментариев:

  1. >Попробуйте, к примеру, дотянитесь одной рукой одновременно до f и p.
    А вы попробуйте лучше нажимать f и p разными руками.
    F,b,n - левой, p - правой.

    На самом деле очень удобно, особенно если учесть тот факт, что это "стандарт". До emacs я и в консоли стрелочками перемещался, а теперь все очень удобно.

    ОтветитьУдалить
  2. Оно, конечно, дело вкуса. Мне лично нравится, чтобы правая рука задавала направление перемещения, а левая -- режим, который меняется клавишей Ctrl/Shift/Alt.

    ОтветитьУдалить
  3. Такой вопрос: какая у вас скорость слепой печати? Дефолтовые комбинации Emacs лично мне в основном представляются оптимальными.

    ОтветитьУдалить
  4. И ещё, надеюсь у вас Ctrl на месте ненужной клавиши CapsLock?

    ОтветитьУдалить
  5. Скорость слепой печати у меня более чем приличная, так что на разглядывание клавы не отвлекаюсь. Сaps ставил как Ctrl и продеражлся около месяца, после чего вернул как было. Неудобно SQL-команды набирать с шифтами.
    Возможно, дефолтовые комбинации и могут быть делом вкуса, если не так уж важна скорость. Но согласись, я быстрее наберу свои C-l и C-i, используя левую руку для Ctrl, а правую для букв, чем ты C-f и С-p, в две руки, как писал kreed. Дефолтные комбинации в Emacs проще запомнить, т.к. C-f -- forward или C-p -- previous. Но набирать все это неудобно. Думаю, если бы в английском языке направления передвижения не начинались бы на разные буквы, то Столлман не стал бы называть команды по аббревиатурам, а нашел бы просто удобное их расположение. Похоже, он просто не заморачивался, зная, как легко все настроить под себя. Но это же не значит, что нужно пользоваться дефолтными настройками.

    ОтветитьУдалить
  6. разделили C-i и tab?
    тогда сделайте то же с C-m и return
    если нет, но хочется, я закопипасчу код

    ОтветитьУдалить
  7. последний комментарий -- мой
    странно, что stackoverflow мою привязку к egotv.ru понимает, а blogstop ведет меня на гугл

    ОтветитьУдалить
  8. C-i пришлось пожертвовать. Ее можно переназначить на другую комбинацию; здесь же я привел только те, что помогают ускорить перемещение. На мой взгляд, привязки именно к позиционированию курсора сделаны в Emacs по-дефолту самым дурацким образом из всех возможных. Остальные keybinding'и -- вполне неплохо...

    ОтветитьУдалить
  9. Тоже столкнулся с этой проблемой - после перехода с Vim'а навигация по тексту была жутким неудобством. В моем случае ситуацию спасли Viper и Vimpulse :)

    ОтветитьУдалить