2009-04-08 4 views
53

Иногда мне нужно прочитать файлы журналов, которые имеют^M (control-M) в конце строки. Я могу сделать глобальную замену, чтобы избавиться от них, но затем что-то еще записывается в файл журнала и, конечно же, все они возвращаются.Hiding^M in emacs

Установка кодировки конца строки в стиле unix или dos-стиле не имеет большого значения (но стиль unix - это мое значение по умолчанию). Я использую систему кодирования unecided- (unix | dos).

Я нахожусь в окнах, читаю файлы журналов, созданные log4net (хотя log4net, очевидно, не единственный источник этой досады).

Любые подсказки?

+1

К сожалению, набор-буфер файлы кодирование-система не делает. Буфер открывается с помощью строки режима, описывающей UNIX. Давая ему C-x RET f UNIX RET только заканчивает тем, что маркирует буфер как измененный, не скрывая притягательных^M. –

+0

Письма в GNUS - это еще одно место, где вы можете встретить буферы со смешанным кодированием конца строки. Например, если вы отправляете из учреждения, ориентированного на Windows, возможно, Outlook. Информация заголовка получает кодировку Unix EOL. –

ответ

3

Я считаю, что вы можете изменить систему кодирования линии файл, используя в формат Unix с

C-x RET f UNIX RET 

Если вы сделаете это, то режим линия должна измениться, чтобы добавить слово «(Unix)», и все те^М должны уйти.

+0

Не полезно, я думаю. set-buffer-file-coding-system, похоже, изменяет фактическое содержимое отредактированного файла. – hillu

+0

Только решение, которое сработало для меня. Спасибо –

+0

Задание системы кодирования 'unix' не сработало для меня, но указав' dos' (после того, как я вернул буфер). –

4

Если вы хотите просмотреть файлы журнала и просто скрыть файлы^M, а не заменить их, вы можете использовать Drew Adam's highlight extension, чтобы сделать это.

Вы можете написать Elisp код или сделать клавиатуры макрос сделать следующее

select the whole buffer 
hlt-highlight-regexp-region 
C-q C-M 
hlt-hide-default-face 

Это первый выделить^M, а затем скрыть их. Если вы хотите, чтобы их использовали, используйте `hlt-show-default-face '

+0

Спасибо за штепсель, Justin. Ниже я добавил другое (другое) решение. Более одного способа скинуть кошку ... – Drew

6

А что?

C-x RET c dos RET C-x C-f FILENAME RET 

Я создал файл с двумя строками, второй - с возвратом каретки. Emacs откроет файл в кодировке Unix, а система переключения кодирования ничего не сделает. Тем не менее, работает universal-coding-system-argument.

+4

Немного изменен для уже открытого файла: 'C-x RET c dos RET M-x revert-buffer RET' – Shelvacu

20

Современные версии emacs знают, как обращаться с окончанием строки UNIX и DOS, поэтому, когда в файле появляется^M, это означает, что в файле есть смесь обоих. Когда есть такая смесь, emacs по умолчанию работает в режиме UNIX, поэтому видны Ms. Реальное решение заключается в том, чтобы исправить программу, создав файл, чтобы он использовал согласованные окончания строк.

+3

Emacs ошибочен. Реальное решение - исправить Emacs. Например. git создает файлы конфликтов, которые не имеют^M s в строках 'control' (например, строки, начинающиеся с <<<<<<). Для git вполне допустимо игнорировать любую строку, заканчивающуюся файлом, поскольку строки управления являются «мета». – EoghanM

68
(defun remove-dos-eol() 
    "Do not show ^M in files containing mixed UNIX and DOS line endings." 
    (interactive) 
    (setq buffer-display-table (make-display-table)) 
    (aset buffer-display-table ?\^M [])) 

Решение от Johan Bockgård. Я нашел его here.

+0

работает очаровательно. Почему TS не принимает этот ответ? спасибо – swdev

+4

Если вы хотите, чтобы эта функция запускалась почти всегда, добавьте следующее в ваш '.emacs' (мне понадобилось некоторое время, чтобы узнать):' (add-hook 'text-mode-hook' remove-dos-eol) ' – Henrik

+1

ЛЕТ Я страдаю^М. Спасибо. – EoghanM

1

Вы можете изменить запись в таблице символов Control-M (^M), чтобы сделать ее отображаемой как пробел или даже полностью исчезнуть (пустой). Смотрите код в библиотеке pp-c-l.el (Pretty Control-L) для вдохновения. Он отображает ^L символы произвольным образом.

Отредактировано: К сожалению, я просто заметил, что @binOr уже упомянул этот метод.

3

Ответ Эдрика должен привлечь больше внимания. Решение Йохана Бокгард обращается к жалобе плаката, поскольку оно делает невидимым^M, но это просто маскирует основную проблему и поощряет дальнейшее смешивание окончаний строк Unix и DOS.

Правильным решением было бы сделать глобальный M-x replace-regexp, чтобы превратить все окончания строк в DOS (или Unix, в зависимости от обстоятельств). Затем закройте и снова откройте файл (не уверены, достаточно ли M-x revert-buffer), и^M будет либо невидимым, либо все исчезнет.

+3

Mx replace-string Cq Cm RET (из http://lists.netisland.net/archives/plug/plug-1999-06/msg00365.html) –

2

это в вашем .emacs:

(defun dos2unix() 
    "Replace DOS eolns CR LF with Unix eolns CR" 
    (interactive) 
    (goto-char (point-min)) 
     (while (search-forward "\r" nil t) (replace-match ""))) 

Теперь вы можете просто позвонить dos2unix и удалить все ^M символы.

0

Если вы столкнулись ^M с в полученной почты в Gnus, вы можете использовать W c (мыть CRS) или

(setq gnus-treat-strip-cr t) 
0

ответ sudeepdino008 не работал для меня (я не мог прокомментировать свой ответ, так что я должен был добавить свой собственный ответ.).

я был в состоянии исправить это с помощью этого кода:

(defun dos2unix() 
    "Replace DOS eolns CR LF with Unix eolns CR" 
    (interactive) 
    (goto-char (point-min)) 
     (while (search-forward (string ?\C-m) nil t) (replace-match ""))) 
+0

В будущем используйте '@' перед именем человека: @RMK – Czipperz