Сокрытие ^ M в Emacs - PullRequest
       60

Сокрытие ^ M в Emacs

55 голосов
/ 08 апреля 2009

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

Установка кодировки конца строки в стиле Unix или DOS, похоже, не имеет большого значения (но Unix-стиль мой по умолчанию). Я использую систему кодирования undecided- (unix | dos).

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

Есть подсказки?

Ответы [ 12 ]

73 голосов
/ 15 апреля 2009
(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. Я нашел это здесь .

19 голосов
/ 09 апреля 2009

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

6 голосов
/ 08 апреля 2009

А как же?

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

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

4 голосов
/ 08 апреля 2009

Если вы хотите просмотреть файлы журналов и просто скрыть ^ 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 '

3 голосов
/ 27 июля 2012

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

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

3 голосов
/ 08 апреля 2009

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

C-x RET f UNIX RET

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

2 голосов
/ 07 ноября 2013

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

2 голосов
/ 01 января 2012

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

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

0 голосов
/ 24 апреля 2019

Как сказал 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)
0 голосов
/ 04 марта 2015

Ответ 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 "")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...