Скрытие ^ M в emacs

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

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

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

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

Ответ 1

(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. Я нашел это здесь.

Ответ 2

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

Ответ 3

Как насчет?

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

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

Ответ 4

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

Вы можете либо написать код elisp, либо сделать макрос клавиатуры для выполнения следующих

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

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

Ответ 5

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

C-x RET f UNIX RET

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

Ответ 6

Эдрик ответ должен получить больше внимания. Решение Johan Bockgård рассматривает жалобу на плакат, поскольку это делает M невидимым, но это просто маскирует основную проблему и поощряет дальнейшее смешивание строк Unix и DOS.

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

Ответ 7

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

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

Ответ 8

Поместите это в ваш .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.

Ответ 9

как насчет использования dos2unix, unix2dos (теперь tofrodos)?

Ответ 10

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

(setq gnus-treat-strip-cr t)

Ответ 11

Ответ 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 "")))

Ответ 12

Как сказал binOr, добавьте это в ваш% APPDATA%.emacs.d\init.el в Windows или где бы то ни было ваш конфиг.

;; Windows EOL
(defun hide-dos-eol ()
  "Hide ^M in files containing mixed UNIX and DOS line endings."
  (interactive)
  (setq buffer-display-table (make-display-table))
  (aset buffer-display-table ?\^M []))

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

(add-hook 'text-mode-hook 'hide-dos-eol)