Сдвиньте область или линию в emacs
Я ищу способ в emacs, чтобы сдвинуть текст вправо или влево на пробелы n
. Аналогичная функциональность есть в vim <<
или >>
. Он должен работать над областью или если ни одна область не выбрана в текущей строке и не перемещает курсор из текущего местоположения.
Решение EmacsWiki работает не очень хорошо, как M-x indent-rigidly
, поскольку оно несколько запоминает последний использованный регион и сдвигает его один вместо этого. Самое близкое, кажется, здесь, но мне не удалось заставить его работать. Я не разработчик lisp, поэтому мне сложно изменить код. Я буду признателен за любую помощь.
Спасибо!
Ответы
Ответ 1
Возможно, это работает так, как вы хотите.
(defun shift-text (distance)
(if (use-region-p)
(let ((mark (mark)))
(save-excursion
(indent-rigidly (region-beginning)
(region-end)
distance)
(push-mark mark t t)
(setq deactivate-mark nil)))
(indent-rigidly (line-beginning-position)
(line-end-position)
distance)))
(defun shift-right (count)
(interactive "p")
(shift-text count))
(defun shift-left (count)
(interactive "p")
(shift-text (- count)))
Ответ 2
Вы можете выбрать область, затем C-u C-x <tab>
сдвинет 4 пробела. Вы можете ввести число после C-u, чтобы изменить 4 на что-либо еще.
Ответ 3
Для этого я обычно делаю трюк:
- активировать режим CUA
- перейти к началу строки
- C-RET, теперь, если вы переместите курсор, вы увидите прямоугольную красную область
- Переместите курсор вниз по строкам и введите пробел, пока не получите правильное смещение.
Это может быть сделано также программно каким-то образом (таким же образом).
EDIT:
Я только что прочитал статью в emacs wiki, это же решение, за исключением режима CUA, который бесконечно более мощный, чем "общий" прямоугольный выбор (так как он визуальный).