Общая функция выравнивания по правому краю

Теперь, когда я знаю, как выравнивать столбцы числовых значений по правому краю в Emacs, у меня есть две проблемы с этим решением:

  • трудно вспомнить
  • это не гибко

Например, это не работает, когда некоторые значения в первом столбце содержат числа.

И, к сожалению, он вставляет вкладки.

Теперь я довольно часто использую функции прямоугольника (C-xrk). Это заставило меня задуматься: возможно ли иметь функцию, которая выравнивает весь текст по правому краю в выделенном прямоугольнике?


person Michel de Ruiter    schedule 06.06.2012    source источник
comment
Вот как применить политику отсутствия вкладок для выравнивания: stackoverflow.com/questions/915985/   -  person phils    schedule 06.06.2012
comment
И я должен добавить, что align-regexp и вся библиотека align чрезвычайно гибки, так что это скорее вопрос определения правильного регулярного выражения или правил для текущей работы.   -  person phils    schedule 06.06.2012
comment
@phils Это сводится к тому, что я могу понять / запомнить, что делают прямоугольники, а не то, что делает align-regexp.   -  person Michel de Ruiter    schedule 07.06.2012


Ответы (1)


(defun right-justify-rectangle (start end)
  (interactive "r")
  (apply-on-rectangle (lambda (c0 c1)
                        (move-to-column c1 t)
                        (let ((start (- (point) (- c1 c0)))
                              (end (point)))
                          (when (re-search-backward "\\S-" start t)
                            (transpose-regions start (match-end 0)
                                               (match-end 0) end))))
                      start end))

Чтобы не использовать Tab, настройте переменную indent-tabs-mode.

Редактировать:

Вот версия, которая относится к indent-tabs-mode более разумно:

(defun right-justify-rectangle (start end)
  (interactive "r")
  (let ((indent-tabs-mode nil))
    (apply-on-rectangle (lambda (c0 c1)
                          (move-to-column c1 t)
                          (let ((start (- (point) (- c1 c0)))
                                (end (point)))
                            (when (re-search-backward "\\S-" start t)
                              (transpose-regions start (match-end 0)
                                                 (match-end 0) end))))
                        start end))
  (when indent-tabs-mode (tabify start end)))
person huaiyuan    schedule 06.06.2012
comment
...медленный хлопок... столько хорошего в этом ответе apply-on-rectangle \\S-, transpose-region. - person event_jr; 06.06.2012
comment
Согласованный; очень хорошо. Однако вам нужно будет (require 'rect). - person phils; 06.06.2012
comment
На самом деле это ненадежно с indent-tabs-mode true, так как смесь табуляции и пробелов, созданная в конце строки с move-to-column, может не подходить для транспонирования. - person phils; 06.06.2012
comment
Вместе с (global-set-key "\C-xr\r" 'right-justify-rectangle) это именно то, что мне всегда было нужно! - person Michel de Ruiter; 07.06.2012