2014-01-10 2 views
3

Я хотел бы создать макрос для Emacs, который будет вставить блок комментария латекса с некоторым centerd текстом, как: возможноEmacs вставка по центру блока комментария

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
%%%    Comment 1     %%% 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
%%%   Comment 2 Commenttext 3   %%% 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 

Является ли это в emacs-lisp?

ответ

3

Emacs поставляется с командой comment-box для этой цели. Он создает центральные поля комментариев, хотя ширина окна зависит от содержимого. Например, с областью расположены вокруг следующей строки:

This is a comment 

при вызове M-x comment-box текст преобразуется в:

;;;;;;;;;;;;;;;;;;;;;;; 
;; This is a comment ;; 
;;;;;;;;;;;;;;;;;;;;;;; 

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

(defun ty-box-comment (beg end &optional arg) 
    (interactive "*r\np") 
    (when (not (region-active-p)) 
    (setq beg (point-at-bol)) 
    (setq end (point-at-eol))) 
    (let ((fill-column (- fill-column 6))) 
    (fill-region beg end)) 
    (comment-box beg end arg) 
    (ty-move-point-forward-out-of-comment)) 

(defun ty-point-is-in-comment-p() 
    "t if point is in comment or at the beginning of a commented line, otherwise nil" 
    (or (nth 4 (syntax-ppss)) 
     (looking-at "^\\s *\\s<"))) 

(defun ty-move-point-forward-out-of-comment() 
    "Move point forward until it's no longer in a comment" 
    (while (ty-point-is-in-comment-p) 
    (forward-char))) 
+0

Ради completenes, может быть, вы должны включать в себя определение 'ты- шаг трехточечный вперед-аута -of-comment' или заменить его на стандартную команду ('forward-paragraph'?), чтобы не-lispers могли использовать ее сразу ... – Francesco

+0

Упс, не заметил, что у меня были некоторые личные функции. Исправлена! – Tyler

2

Вот yasnippet, что вы можете использовать:

# -*- mode: snippet -*- 
# name: huge_comment 
# key: hc 
# -- 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
%%%${1:$(repeat-char (- 33 (/ (length yas-text) 2)) " ")}$1${1:$(repeat-char (- 74 (length yas-text) (- 33 (/ (length yas-text) 2))) " ")}%%% 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
$0 

Как использовать: тип hc, вызовите yas-expand и начните вводить текст. Он автоматически перестроит себя .

Этот фрагмент будет работать с latex-mode или text-mode. Я заметил, однако, что ошибка испортила позицию курсора, если вы используете AUCTeX. В этом случае вы можете мгновенно переключить на text-mode.

0

Вопрос в том, возможно ли это в emacs-lisp. Да. Есть несколько способов сделать это. Я покажу один способ, где вы также можете прокомментировать несколько строк текста. Возможно, в первой строке есть название части текста, а во втором - автор этой части.

Лучшим способом было бы дать совет LaTeX-indent-line функция. Таким образом, вы можете редактировать текст комментария и повторный отступ. Когда я найду время, я покажу вам этот вариант.

Использование: Напишите свой комментарий как чистый текст. Отметьте текст как область с помощью мыши, а затем выполните следующую команду.

(defun LaTeX-centered-comment (b e) 
    "Convert region into centered comment." 
    (interactive "r") 
    (let* ((n (count-lines b e))) 
    (goto-char b) 
    (beginning-of-line) 
    (insert-char ?% fill-column) 
    (insert ?\n) 
    (setq b (point)) 
    (center-line n) 
    (goto-char b) 
    (loop for i from 1 upto n do 
     (replace-region (point) (+ (point) 3) "%%%") 
     (end-of-line) 
     (insert-char ?\ (max 0 (- fill-column (- (point) (line-beginning-position)) 3))) 
     (insert "%%%") 
     (forward-line)) 
    (insert-char ?% fill-column) 
    (insert ?\n) 
    )) 
Смежные вопросы