2016-06-10 4 views
3

В текстовом буфере я хочу проверить, заканчивается ли файл с помощью строки «abc», за которым следует только от нуля до двух строк (а затем удалять конечные символы) ,В emacs, как совместить регулярное выражение в конце буфера

Мне нужно что-то вроде looking-at-backwards или я хочу совместить в конце файла (а не в конце строки). Какой простой способ достичь этого?

+4

Описывает ли связь с записью Xah Lee о '\ ''? http://ergoemacs.org/emacs/emacs_regex_begin_end_line_string.html – lawlist

+0

@lawlist Хороший совет для использования '\ ''! Я не знал об этом. – halloleo

ответ

4

looking-back это функция, которую вы ищете, чтобы соответствовать задом

использовать общий оператор postifx к \{m,n\} в соответствии с 2 строками новой строки:

(save-excursion 
    (goto-char (point-max)) 
    (when (looking-back "^abc\n\\{,2\\}") 
    (delete-region (match-beginning 0) (match-end 0)))) 
+1

Док-строка для состояний «конца буфера» (частично): «* Эта функция предназначена только для интерактивного использования, а в коде Lisp используйте' (goto-char (point-max)) вместо. * «И , doc-строка для состояний начала буфера (частично): «* Эта функция предназначена только для интерактивного использования, а в коде Lisp используйте' (goto-char (point-min)) 'вместо. *« InAsuchuch поскольку люди, которые читают этот ответ в будущем, могут иметь тенденцию копировать и увековечить использование «конца буфера» программным образом, пожалуйста, подумайте об изменении вашего ответа соответственно. – lawlist

+0

Хороший улов. Я скорректировал код. –

0

То, что вы описали, не требует для того, что обычно называется регулярным выражением поиск в Emacs. Он вызывает сопоставление регулярного выражения в конце буфера (eob). Я отредактировал название вопроса и текст соответственно.

Для этого вы просто временно переходите к концу буфера и используете looking-back, чтобы проверить соответствие регулярного выражения.

(defun delete-abc-SPC-<-3-newlines() 
    "Delete `abc ' followed by up to 2 newlines at eob." 
    (interactive) 
    (let ((ends-w-<-3-newlines nil)) 
    (save-excursion 
     (goto-char (point-max)) 
     (setq ends-w-<-3-newlines (looking-back "abc \n?\n?\n?"))) 
    (when ends-w-<-3-newlines 
     (delete-region (match-beginning 0) (match-end 0))))) 

Если вы хотите, чтобы буфер не будет рассматриваться вновь модифицирована затем использовать это:

(defun delete-abc-SPC-<-3-newlines() 
    "Delete `abc ' followed by up to 2 newlines at eob." 
    (interactive) 
    (let ((ends-w-<-3-newlines nil) 
     (mod-buf    (buffer-modified-p))) 
    (save-excursion 
     (goto-char (point-max)) 
     (setq ends-w-<-3-newlines (looking-back "abc \n?\n?\n?"))) 
    (when ends-w-<-3-newlines 
     (delete-region (match-beginning 0) (match-end 0))) 
    (set-buffer-modified-p mod-buf))) 
+0

Относительно того, что я просил, но я думаю, что ответ @ hoelzel довольно сжатый. – halloleo

+0

(1) Это более красноречиво, потому что он не удосуживается определить команду (а также из-за других вещей, упомянутых здесь). (2) Он не включает 'SPC' после' abc', чего вы не попросили. (3) Ошибочно использует «конец буфера» (см. «Ch f» для этого: «** Не используйте эту команду в программах Lisp!» (Goto-char (point-max)) 'быстрее. ** "). (4) Ошибочно использует 'save-restriction' вместо' save-excursion' (и здесь нет необходимости «сохранять-ограничение»). (5) Он не восстанавливает состояние модификации буфера. (6) Он не затрагивает ваше замешательство по сравнению с поиском по сравнению с регулярным выражением. – Drew

+0

Некоторые из ваших замечаний очень важны и спасибо за то, что они указывают на проблемы с другим кодом. @hoetzel обратился к ним. В целом я предпочитаю менее подробный ответ. - Если вы хотите обсудить это дальше, я думаю, мы должны перейти к дискуссионным каналам. – halloleo

Смежные вопросы