Какие редакторы Emacs, Vim и JEdit поддерживают несколько одновременных точек ввода текста?

Фон: JEdit (и некоторые другие текстовые редакторы) поддерживают функцию Несколько точек одновременного ввода текста. (по крайней мере, то, что я называю здесь).

Чтобы понять, что это значит, взгляните на ссылку.

Из всех функций, используемых в современных текстовых редакторах, первоначальные исследования, похоже, указывают на то, что это одна из функций, которую Emacs и Vim фактически не поддерживают. Если это правильно, это было бы довольно необычным, так как довольно сложно найти функцию текстового редактора, которая не попала ни в один из этих двух редакторов старой школы.

Вопрос: Кто-нибудь видел или реализовал эту функцию в Emacs, Vim или обоих? Если это так, укажите мне ссылку, script, ссылку или резюме, объясняющие детали.

Если вы знаете альтернативный способ сделать то же (или подобное), пожалуйста, дайте мне знать.

Ответ 1

Способ vim для этого - это. команда, которая повторяет последнее изменение. Так, например, если я изменяю указатель на ссылку, и у меня есть куча obj- > функ что я хочу изменить obj.func тогда я ищу obj- > , do 2cw, чтобы изменить obj- > на obj., тогда do n.n.n. пока все экземпляры не будут изменены.

Возможно, не гибкий, как вы говорите, но он работает часто и очень интуитивно и быстро, когда он это делает.

Ответ 2

moccur-edit.el почти делает то, что вы хотите. Отображаются все местоположения, соответствующие регулярному выражению, и редактирование совпадений вносит изменения в соответствующий источник. Однако редактирование выполняется в одном экземпляре события.

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

Существует демо-версия здесь.

Оказывается, новейшие версии moccur-edit не применяют изменения в режиме реального времени - вы должны применить изменения. Изменения также теперь отменены (хороший выигрыш).

Ответ 3

В EMACS вы можете/могли бы сделать это с помощью M-x find-grep и макроса. Если вы действительно настаиваете на том, что он будет полностью автоматическим, тогда вы должны включить find-next в макрос.

Но, честно говоря, это поражает меня как своего рода Microsoft-функцию: да, она добавляет в список функций, но зачем беспокоиться? И вы помните, что это существовало через шесть месяцев, когда вы хотите снова использовать его?

Ответ 5

Я не думаю, что эта функция имеет прямой аналог либо в Emacs, либо в Vim, что не означает, что все, достижимое с помощью этой функции, невозможно каким-то образом с помощью двух редакторов "старой школы". И, как и большинство вещей Emacs и Vim, опытные пользователи, вероятно, смогут достичь такой задачи чрезвычайно быстро, даже если простые смертные, подобные мне, могут потратить пять минут, чтобы выяснить правильный поиск grep и заменить их соответствующими обратными ссылками.

Ответ 6

YASnippet пакет для Emacs использует его. См. 2:13 и 2:44 в screencast.

Ответ 7

В vim должно быть что-то вроде этого:

%s/paint.\((.*),/\1.paint(/ 

Или что-то в этом роде, я действительно плохо отношусь к "макету" регулярных выражений.

Идея заключается в замене шаблона:

/paint(object,/ 

с

/object.paint(/ 

Итак, да, это "поддерживается"

Ответ 8

Казалось, просто сделать базовую версию этого в Emacs lisp. Это происходит, когда вы просто хотите, чтобы два места вставляли текст параллельно:

(defun cjw-multi-insert (text)
  "insert text at both point and mark"
  (interactive "sText:")
  (insert-before-markers text)
  (save-excursion
    (exchange-point-and-mark)
    (insert-before-markers text)))

Когда вы запустите его, он запрашивает текст и вставляет его в обе точки (текущую позицию) и отметку. Вы можете установить знак с помощью C-SPC. Это можно было бы легко расширить для N разных позиций. Функция типа set-insert-point будет записывать текущую позицию (сохраненную как Emacs marker) в список, а затем при запуске многопозиционной вставки команды, он просто выполняет итерацию через список, добавляющий текст в каждый.

Я не уверен в том, что будет простым способом обработки более общей функции "многократного редактирования".

Ответ 9

Еще одно небольшое сходство: в Emacs функции редактирования прямоугольника, предоставляемые cua-selection-mode (или cua-mode), автоматически дают вам несколько точек вставки по левому или правому краю отмеченного прямоугольника, так что вы можете ввести общий префикс или суффикс для всех этих строк.

например.:
M-x cua-selection-mode RET (включите глобальный вспомогательный режим, если вы еще не используете этот режим или cua-mode)
C-RET down down down (отметит прямоугольник символа 1x3)
тип префикса здесь
C-RET (отмените прямоугольник, чтобы вернуться к обычному редактированию)

Ответ 10

Неа. Это было бы довольно сложно сделать с главным образом консольным интерфейсом.

Тем не менее, есть похожие функции в vim (и emacs, хотя я не использовал его почти так же) - поиск и замена, как говорили люди, и, более того, режим вставки столбцов: http://pivotallabs.com/users/brian/blog/articles/350-column-edit-mode-in-vi

Ответ 11

Это выглядит как поиск регулярных выражений/замена для чайников. Проблема начинается, когда пользователь не понимает, что предложенное компьютером обобщение неверно. И проблема ухудшается, когда выбранное альтернативное обобщение создает катастрофу в 1200-й области редактирования, которая находится вне экрана.

Говоря - нет, в Emacs нет поддержки, насколько мне известно.