Как эффективно печатать на Lisp с таким количеством скобок?[закрыто]

StackOverflow https://stackoverflow.com/questions/386854

Вопрос

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

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

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

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

Это было полезно?

Решение

Лично я бы порекомендовал смертельную комбинацию Эмакс, СЛИЗЬ & paredit.elParedit позволяет псевдосемантически редактировать код LISP на уровне sexp, в результате чего круглые скобки исчезают почти полностью.Вы можете перемещаться по секспам, как будто это простые слова, и даже изменять их всего парой нажатий клавиш.Существует также второстепенный режим под названием Редшанк который работает в сочетании с 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)

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

"...так много скобок»

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

Вам также нужен удобный способ выйти из одной скобки — привязать C-] к последовательности search(')')+right().Создание теперь становится короче, так как вам не нужно убирать руки из исходного положения — просто набирайте C-] каждый раз, когда выполняете S-выражение.

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

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

к

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

Эффективное перемещение одного элемента справа в текущий список — очень полезно для редактирования существующего кода.Последовательность '(', '<', C-S-], Space, '2' добавляет к существующему выражению «сравнить меньше 2».В сочетании с C-] это позволяет очень быстро создавать новые выражения из существующих.

@jamesnvc, я не думал о Binding () с клавишами ...Надо будет попробовать, спасибо!

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

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

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

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

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

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

Я использую пакеты Paredit и Pair-Mode, но для быстрого набора скобок я использую электрическую точку и тире для замены двойной точки в () с задержкой в ​​5 мс (если я печатаю медленно, я получаю две точки).Это замечательный пакет (я немного изменил его для своих личных предпочтений;когда я печатал на клавиатуре Дворжака, я заменил клавишу тире косой чертой (// не так часто встречается в Лиспе)).

Чтобы избежать путаницы в круглых скобках, я добавляю в свой набор инструментов пакет под названием «highlight-круглые скобки», а для максимальной эффективности захвата sexp или навигации по тексту в целом я также использую vimpulse (поскольку я зависим от Vim).

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

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

ДиваСхема (мой редактор) — это нечто совершенно другое.Он редактирует на уровне sexp, поэтому круглые скобки больше не мешают.

Снова привяжите capslock к "(" и редактор автоматически вставит ")".

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

Я использую Vim с vim-sexp и vim-sexp-отображения-для-обычных-людей затем нанесли на карту <leader>u чтобы перевести меня в нормальный режим внутри нового (.

map <leader>u i(

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top