Как вы печатаете lisp эффективно, с таким количеством скобок?

Я стараюсь держать пальцы на домашнем ряду как можно больше.

ввод всех скобок заставляет меня отойти от них немного.

Я использую Emacs; сами скобки не являются проблемой, мне с ними комфортно. И мне не нравятся режимы, которые печатают их для меня автоматически.

Я думал о переназначении квадратных скобок в скобки и наоборот. Это хорошая идея? Что делают все остальные?

16 ответов


Я бы лично рекомендовал смертельную комбинацию Emacs, муть & paredit.el Paredit позволяет псевдо-семантически редактировать код LISP на уровне sexp, и это делает скобки исчезают почти полностью. Вы можете передвигаться по sexps, как если бы они были простыми словами, и даже мутировать их с помощью всего нескольких нажатий клавиш. Существует также второстепенный режим под названием Redshank который работает совместно с Paredit и который обеспечивает большая мощность.

рассмотрим простые эти примеры (|- это положение курсора):

(foo bar (baz| quux) zot) + C-( => (foo (bar baz| quux) zot)
(foo (bar |baz) quux zot) + C-) => (foo (bar |baz quux) zot)

(foo (bar baz |quux) zot) + C-{ => (foo bar (baz |quux) zot)
(foo (bar |baz quux) zot) + C-} => (foo (bar |baz) quux zot)

Я сделал несколько серьезных общих программирования Lisp, в свое время, и paredit оказался бесценным для меня. Я даже не могу думать о написании нетривиального кода LISP без моего набора инструментов. И в конце концов, так и должно быть; вам никогда не придется считать или сопоставлять свои скобки... как только вы освоите Paredit, скобки просто исчезнут перед вашим глаза.

переназначение [] в () поможет, но вы перестанете заботиться много после того, как вы начнете использовать Paredit.

Не стесняйтесь использовать LISP конкретные части из моей точки-emacs.


со многими раскладками клавиатуры не-США, набрав квадратные скобки или фигурные скобки еще более громоздко, чем набрав скобки, в любом случае, что делает программирование на большинстве языков очень напряженным, поэтому считайте, что вам повезло. ;)

Что касается меня, я использую программистскую нестандартную раскладку клавиатуры, которая позволяет мне вводить скобки через [Super] - j и [Super] - k.


У меня есть педали. LeftFoot = открытая скобка, правую ногу = рядом парень.

Ну, я не, но я не использую Lisp. Хотя это не кажется плохой идеей.

можете ли вы представить себе вариант Lisp, который использовал отступ вместо parens? (взяв страницу из спецификации Python)


Я убираю пальцы с клавиш....


Я попытался переназначить в Emacs, но это создает новые проблемы: скажем, вы редактируете в окне терминала через ssh и вставляете фрагмент в окно; затем parens и скобки меняются местами при вставке, а не только при вводе текста. Если вы попробуете это, переназначите на более низком уровне в вашей системе, например xmodmap.

(конечно, очевидная другая проблема-использование других компьютеров без переназначения. Это тоже было неприятно, хотя и терпимо.)


Я переназначил [] в () с xmodmap и нравится. Это было немного странно писать код на языках, которые используют [], но как и любое изменение, вы привыкнете к нему. Наличие непереводимых родителей в Lisp лучше, чем отсутствие непереводимых скобок на других языках, поэтому это работает.

в любом случае, вот необходимое заклинание xmodmap для моей клавиатуры в США:

!! swap () and []
keycode  18 = 9 bracketleft
keycode  19 = 0 bracketright
keycode  34 = parenleft braceleft
keycode  35 = parenright braceright

"... так много паренетезиса"

первое, что я сделал, это привязать " ("ключ к последовательности" ( " + " ) " +right (), поэтому моя скобка автоматически балансирует, оставляя половину того, что осталось ввести при написании нового кода.

вам также нужен удобный способ навигации по одному paren -- bind C -] для поиска последовательности (')')+right (). Авторство становится короче, так как вам не нужно отрывать руки от домашней позиции - просто введите C -] каждый раз, когда вы завершаете S-expr.

следующее, что я сделал, это привязать ключ к подпрограмме, которая толкает существующий элемент в текущий список ... поэтому, если / / является позицией курсора, то эта команда преобразует:

(if (< //) (+ x 1) 
    (x) 
  (y))

to

(if (< (+ x 1) //)
    (x) 
  (y))

эффективное нажатие одного элемента справа в текущий список - очень полезно для редактирования существующего кода. Последовательность ' ( ' ,'

@jamesnvc, Я не думал о привязке () к [] ключам... Я должен попробовать, thx!


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

и как только вы набираете левый-parens, электрические-parens дают вам право.


Если вы используете круглые скобки больше, чем квадратные скобки, обязательно переназначьте. Я не вижу, как это может создать больше проблем, чем, скажем, левша, меняющий кнопки мыши.


когда я пишу код, я обычно трачу гораздо больше времени на размышления и чтение кода, чем на его ввод. В прошлом я пару раз пытался переключиться на раскладку клавиатуры Dvorak, но у меня нет очевидной мотивации, потому что я могу печатать намного быстрее, чем я могу думать. Синтаксис языка программирования аналогичная проблема-до тех пор, пока я могу ввести код, не выходя из клавиатуры (т. е. использование мыши было бы плохо), я счастлив.


в основном, я просто набираю их, но иногда я использую M-( и M-) (особенно когда я добавляю привязку LET "в конце этапа"), чтобы заключить соответствующий nnumber выражений.


Я также изменил раскладку клавиатуры (dvorak) (через xmodmap), чтобы переключить скобки ("[]") и parens, в сочетании с paredit-mode (к чему действительно нужно привыкнуть).


Я использую пакеты paredit и pair-mode, но для быстрого ввода скобок я использую electric-dot-and-dash для замены двойного периода в A () на задержке 5 мс (если я набираю медленно, я получаю две точки). Это замечательный пакет (я немного взломал для моих личных предпочтений; когда я печатаю с клавиатурой Dvorak, Я заменил клавишу тире косой чертой (//не так распространен в lisp)).

чтобы избежать беспорядка в parens, я добавляю пакет с именем "выделить скобки" в мой набор инструментов и для максимального эффективность на sexp grabbings или текстовой навигации в целом, я также использую vimpulse (как я наркоман ВИМ).


drscheme выступает есть коды для круглых и квадратных скобок полистай по умолчанию. У него также есть функция, где он волшебным образом угадывает, какой из двух вы имели в виду, поэтому вы редко достигаете shift-9.

кряк имеет аналогичную функцию с функцией DrScheme.

DivaScheme (мой редактор) - это нечто совершенно иное. Он редактируется на уровне sexp, так что родители больше не мешают.


Rebind capslock to " ("и иметь редактор autoinsert") " для вас.

(Это также помогает для других языков с большим количеством скобок, например HTML...)