Страницы

Поиск по вопросам

понедельник, 15 июля 2019 г.

Emacs. Помогите исправить функцию move-text-up

Настраиваю под себя Emacs (v 24.5.1). Нужную мне функцию для перемещения блока кода (например line или region) вверх/вниз нашел здесь: https://www.emacswiki.org/emacs/move-text.el Функция корректно работает как со строкой(line), так и с блоком (region), но есть небольшая проблема при перемещении строки вверх, а именно, если становишься точкой на строку и вызываешь функцию move-text-up. Строка перемещается вверх один раз, точка остается на той же строке где и была. Соответственно повторное нажатие только обратно опускает ту строку, которую нужно было переместить на несколько строк выше.
Ниже привожу только конкретный фрагмент с функциями, полный текст файла можно найти по ссылке выше.
(defun move-text-internal (arg) (cond ((and mark-active transient-mark-mode) (if (> (point) (mark)) (exchange-point-and-mark)) (let ((column (current-column)) (text (delete-and-extract-region (point) (mark)))) (forward-line arg) (move-to-column column t) (set-mark (point)) (insert text) (exchange-point-and-mark) (setq deactivate-mark nil))) (t (let ((column (current-column))) (beginning-of-line) (when (or (> arg 0) (not (bobp))) (forward-line) (when (or (< arg 0) (not (eobp))) (transpose-lines arg)) (forward-line -1)) (move-to-column column t)))))
;;;###autoload (defun move-text-down (arg) "Move region (transient-mark-mode active) or current line arg lines down." (interactive "*p") (move-text-internal arg))
;;;###autoload (defun move-text-up (arg) "Move region (transient-mark-mode active) or current line arg lines up." (interactive "*p") (move-text-internal (- arg)))
;;;###autoload (defun move-text-default-bindings () "Bind `move-text-up' and `move-text-down' to M-up and M-down." (global-set-key [M-up] 'move-text-up) (global-set-key [M-down] 'move-text-down))
(provide 'move-text)
P.S. Да, искать ошибки в чужом коде не обязательно. Возможно есть лучшее решение.


Ответ

Рекомендую использовать модуль shift-text из melpa. Сам какое-то время использовал ваш сниппет, но у него есть и другие проблемы.
Из моего конфига
(use-package shift-text
:ensure t
:bind
(("C-M-n" . shift-text-down) ("C-M-p" . shift-text-up) ("C-M-f" . shift-text-right) ("C-M-b" . shift-text-left) ("C-M-j" . shift-text-down) ("C-M-k" . shift-text-up) ("C-M-l" . shift-text-right) ("C-M-h" . shift-text-left)))
(помимо стандарта, для навигации я использую vim-стайл HJKL)

Комментариев нет:

Отправить комментарий