Изменить поведение абзаца - PullRequest
4 голосов
/ 30 марта 2012

Как изменить стандартное поведение функции метки-абзаца emacs, чтобы не выбирать первую пустую строку?

мои emacs http://dl.dropbox.com/u/1019877/e2.PNG


Я сделал обновленную версию Bohzidars, и она работаетдля первой строки тоже.

(global-set-key (kbd "M-h") (lambda ()
                    (interactive)
                    (mark-paragraph)
                    (if (> (line-number-at-pos) 1)
                        (next-line))                    
                    (beginning-of-line)))

спасибо ребятам за советы.

Ответы [ 3 ]

3 голосов
/ 28 июня 2012

В настоящее время принятый ответ имеет два недостатка: 1) не принимает аргументы и 2) не позволяет отмечать больше абзацев повторными вызовами (особенно это очень полезно) Вот мое решение - это оригинальный абзац с командой следующей строки в конце. Условие гарантирует, что оно работает и с первым файлом.

Возможно, более экономичным решением является использование советов, но я пока не знаю, как их использовать:).

(defun rs-mark-paragraph (&optional arg allow-extend)
"The original default mark-paragraph, but doesn't mark the first
empty line. Put point at beginning of this paragraph, mark at
end.  The paragraph marked is the one that contains point or
follows point.

With argument ARG, puts mark at end of a following paragraph, so that
the number of paragraphs marked equals ARG.

If ARG is negative, point is put at end of this paragraph, mark is put
at beginning of this or a previous paragraph.

Interactively, if this command is repeated
or (in Transient Mark mode) if the mark is active,
it marks the next ARG paragraphs after the ones already marked."
  (interactive "p\np")
  (unless arg (setq arg 1))
  (when (zerop arg)
    (error "Cannot mark zero paragraphs"))
  (cond ((and allow-extend
          (or (and (eq last-command this-command) (mark t))
          (and transient-mark-mode mark-active)))
     (set-mark
      (save-excursion
        (goto-char (mark))
        (forward-paragraph arg)
        (point))))
    (t
     (forward-paragraph arg)
     (push-mark nil t t)
     (backward-paragraph arg)
     (if (/= (line-number-at-pos) 1)
                        (next-line)))))
2 голосов
/ 30 марта 2012

Я не уверен, что вижу удобный способ сделать это. mark-paragraph вызывает forward-paragraph и backward-paragraph, чтобы выполнить большую часть работы, и в документации для backward-paragraph мы имеем «если первой реальной строке абзаца предшествует пустая строка, абзац начинается с эта пустая строка. "

Наиболее релевантными переменными, на которые следует обратить внимание, являются paragraph-start и paragraph-separate, два регулярных выражения, которые используются внутри paras.el для выяснения такого рода вещей. Я бы не хотел их менять, поскольку они будут иметь довольно много других эффектов.

Другой вариант - написать собственную функцию, которая выполняет что-то вроде следующего:

(defun dg-mark-paragraph ()
  (interactive)
  (mark-paragraph)
  (goto-char (region-beginning))
  (when (= (string-match paragraph-separate (thing-at-point 'line)) 0)
    (forward-line)))
2 голосов
/ 30 марта 2012

Вы не можете изменить поведение mark-paragraph, но вы можете легко привязать другую команду к нажатию клавиши C-M-h (чтобы напоминать исходное M-h):

(global-set-key (kbd "C-M-h") (lambda ()
                    (interactive)
                    (mark-paragraph)
                    (next-line)
                    (beginning-of-line)))

Нечто подобное должно сработать.

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