Копировать персонажа в Emacs - PullRequest
2 голосов
/ 10 ноября 2011

Я написал интерактивную функцию, которая вставляет «символ над точкой» в текущую строку. Например, учитывая строку, содержащую «12345», за которой следует строка «abcdef» и точку, расположенную на букве «c», при копировании вниз вторая строка станет «ab3cdef». повторное копирование приведет к тому, что вторая строка станет "ab34cdef".

Моя функция не работает (с использованием GNU Emacs 23.3.1 под windows 7) во второй раз, когда я вызываю ее, вставляя текст из первого вызова и не продвигаясь должным образом. Если я помещаю какие-либо "манипуляции" в emacs между вызовами, это работает нормально. (Например, если я делаю копирование вниз, «стрелка влево», «стрелка вправо», копирование работает нормально для обоих вызовов.)

Вот моя функция:

(defun copy-down ()
  "Grab the character in the line above and insert at the current location."
  (interactive)
  (let ((beg (progn (previous-line 1) (point)))
        (end (progn (forward-char) (point))))
    (backward-char)
    (next-line 1)
    (insert-buffer-substring (current-buffer) beg end)))

Если это имеет значение, я обычно привязываю свою функцию к клавише: (global-set-key [f5] 'copy-down)

PS. Я привык использовать эту возможность в редакторе, который использовал до перехода на emacs много лет назад, и мне не хватает его в GNU Emacs. : - (

Ответы [ 3 ]

2 голосов
/ 10 ноября 2011

То, что у вас есть, прекрасно работает для меня.Тем не менее, previous-line взаимодействует с другими настройками (в частности, goal-column) и, как правило, не должно использоваться при написании elisp.Вместо этого вы должны использовать (forward-line -1).Но, конечно, ваш код опирается на goal-column ... Вы можете проверить это, запустив Emacs без других ваших конфигураций, ala emacs -q.

Вот немного другая версия вашего кода, которая не 'не полагайтесь на goal-column:

(defun copy-down ()
  "Grab the character in the line above and insert at the current location."
  (interactive)
  (let* ((col (current-column))
         (to-insert (save-excursion
                     (forward-line -1)
                     (move-to-column col)
                     (buffer-substring-no-properties (point) (1+ (point))))))
    (insert to-insert)))

Если проблема не в использовании previous-line, тогда я не думаю, что мой код будет иметь большое значение.

Другойу вас есть возможность запустить его в отладчике, чтобы увидеть, где ваш код выходит из строя.Переместите точку внутри defun для copy-down и введите Mx edebug-defun , и при следующем ее запуске вы сможете пройти по коду.Документы для edebug можно найти здесь .

0 голосов
/ 10 ноября 2011

Попробуйте

(defun copy-down (arg)
  (interactive "p")
  (let ((p (+ (current-column) (point-at-bol 0))))
    (insert-buffer-substring (current-buffer) p (+ p arg))))

, которая имеет дополнительную функцию получения префиксного аргумента для копирования n (по умолчанию 1) символов вниз.

0 голосов
/ 10 ноября 2011

Вам нужно использовать let* вместо let.Первый позволяет использовать более ранние значения в более поздних формах в одном и том же операторе.

Кстати, это нетрадиционный способ написания elisp, вы можете посмотреть другие примеры кода.

РЕДАКТИРОВАТЬЭй, кто-то полностью перестроил вашу функцию!Это может сработать сейчас.

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