Какие редакторы из Emacs, Vim и JEdit поддерживают несколько точек вставки текста одновременно? - PullRequest
21 голосов
/ 28 декабря 2008

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

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

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

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

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

Ответы [ 11 ]

8 голосов
/ 28 декабря 2008

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

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

7 голосов
/ 30 декабря 2008

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

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

Здесь есть демоверсия .

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

6 голосов
/ 28 декабря 2008

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

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

4 голосов
/ 24 июля 2015

Для emacs несколько курсоров делает именно это.

Взгляните на emacsrocks эпизод 13 , автора модуля.

3 голосов
/ 06 января 2009

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

3 голосов
/ 28 декабря 2008

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

2 голосов
/ 05 августа 2011

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

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

1 голос
/ 04 августа 2011

Казалось, просто сделать базовую версию этого в 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 ) в список, а затем, когда вы запускаете команду multi-insert, она просто перебирает список, добавляя текст к каждому.

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

1 голос
/ 06 января 2009

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

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

Или что-то в этом роде, я плохо разбираюсь в регулярных выражениях

Идея заменить шаблон:

/paint(object,/ 

с

/object.paint(/ 

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

0 голосов
/ 06 января 2009

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

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

...