2012-03-30 2 views
4

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

my 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))) 

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

ответ

2

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

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

Что-то вроде этого следует сделать трюк.

+0

Это слишком наивно, так как это не удастся, например, если параграф начинается в начале файла. Но основной подход правильный. – deong

+0

Вы правы, конечно, но для первого абзаца все еще можно нажать 'M-h' :-) –

+0

thnks я обновил вопрос с рабочим кодом –

1

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

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

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

(defun dg-mark-paragraph() 
    (interactive) 
    (mark-paragraph) 
    (goto-char (region-beginning)) 
    (when (= (string-match paragraph-separate (thing-at-point 'line)) 0) 
    (forward-line))) 
3

Принятая в настоящее время ответ имеет два недостатка: 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))))) 
Смежные вопросы