Как заставить emacs вставить определенное выражение из строки x в строку y - PullRequest
1 голос
/ 25 декабря 2011

В некоторых моих программах, с опозданием, мне часто приходилось вручную вводить значения длинных std::vector.Поэтому для вектора размера 30 я должен продолжать набирать

myvec[0]=1.0;
myvec[1]=4.6;
myvec[2]=6.7;
myvec[3]=7.8;
.
.
myvec[29]=87;

Я использую Emacs в качестве текстового редактора.Можно ли в Emacs как-то указать, что, скажем, из строк 30–59 вставить строки

myvec[0]= ;
myvec[1]= ;
myvec[2]= ;
.
.
myvec[29]= ;  

Отдельные значения вектора, конечно, нужно будет вводить вручную, но это спасет менямного печатать или копировать / вставлять myvec[] снова и снова.

Ответы [ 5 ]

6 голосов
/ 25 декабря 2011

Клавиатурные макросы is более простой способ сделать это.

Cx (myvec[ Cx Ск Ci ] = ; RET Cx )

  • C-x ( запускает определение макроса
  • C-x ) завершает макрос определение

А потом М-3 * +1048 * М-9 * 1 051 * С-х * +1052 * е

  • М-3 М-9 - это сокращение для C-u 39 и используется для отправки 39 как Аргумент
  • C-x e выполняет последний макрос записано

Таким образом, комбинация обоих выполняет макрос 39 раз.

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

4 голосов
/ 25 декабря 2011

Попробуйте эту последовательность (оценка гольфа Emacs = 17):

м у v е C [] * * ГОК одна тысяча двадцать-одна * ** тысяча двадцать-дв +1023 * = * * ГКА тысяча двадцать пять * ** тысяча двадцать шесть * тысячи двадцать-семь; * * Cj тысячи двадцать-девять М-3 0

2 голосов
/ 25 декабря 2011

Cx (, чтобы начать запись макроса клавиатуры. Затем введите myvec[ F3 ] ; и RET , а затем Cx ) , чтобы завершить определение макроса.

Теперь вы можете просто сказать Cu 29 и Cx e .Он будет запускать макрос 29 раз, и позиция, в которой вы нажмете F3 , будет заполнена счетчиком макроса, что даст вам приращение.

Это звучит сложнее, чем написание функции, как предложил Том, но я бы порекомендовал вам попробовать и освоить макросы клавиатуры.Объем работы, которую они могут сократить, когда вы освоитесь с ними, поистине невероятен.

2 голосов
/ 25 декабря 2011

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

(defun my-insert-numbered-template (string start end)
  (interactive "sString (use %%s as a placeholder for the number) : \nnSequence start: \nnSequence end: ")
  (while (<= start end)
    (insert (format string start) "\n")
    (incf start)))
1 голос
/ 26 декабря 2011

Еще один способ сделать это - использовать поиск и замену регулярных выражений.

Сначала введите myVec[]=;<ret>.

Затем скопируйте весь регион , включая перевод строки. Затем вставьте его столько раз, сколько необходимо. Теперь у вас есть куча myVec[]=; строк.

Теперь выберите весь регион из myVec s и выполните M-x replace-regexp ] \#], который будет нумеровать его для вас.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...