2009-07-23 8 views
31

Я пытаюсь использовать режим hexl, чтобы вручную удалить некоторые специальные символы из текстового файла и не вижу, как удалить что-либо в шестнадцатеричном режиме.В emacs, как удалить CR (^ M) и оставить символы LF (^ J)?

Я действительно хочу удалить возврат каретки и сохранить символы перевода строки. Правильно ли это режим Hexl?

+0

Если это текстовый файл ... Почему режим использования Hexl? –

+0

Я пытаюсь удалить возврат каретки и оставить строку ... не спрашивайте - программа, которая читает этот файл конфигурации, хочет этого. –

+1

+1 У меня была аналогичная проблема. По какой-то нечетной причине куча шестнадцатеричных символов была добавлена ​​к началу некоторых моих текстовых файлов. Я просто хочу удалить эти символы, но не вижу их в режиме обычного буфера. Почему функция «удалить» так тяжела для hexl-mode? Он должен быть там. – User1

ответ

10

Для этого не требуется шестнадцатеричный режим. Просто выполните глобальный поиск и замену^J^M с помощью^J Works для меня. :) Затем сохраните файл, убейте буфер и перейдите к файлу, чтобы окно отображало новый режим файла (Unix vs DOS).

+0

Это всегда работает для меня. – Cheeso

+2

Зачем даже беспокоиться об этом? Сделайте то, что предлагает keyersoze, и используйте dos2unix и/или unix2dos. –

+0

Вместо того, чтобы убить буфер и пересмотреть файл, вы можете щелкнуть по индикатору типа EOL в строке режима, чтобы просмотреть различные параметры. Таким образом, вы не потеряете кольцо убийства. – phils

3

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

+0

Отличное обходное решение, спасибо! – Anne

5

Если вы хотите удалить возврат каретки (обычно отображается как ^M) и оставить линию подачи. Вы можете просто посетить файл ж/из любого преобразования:

M-x find-file-literally /path/to/file 

Так как файл с символами возврата каретки, как правило, отображается в режиме DOS (скрытие возврат каретки). Строка режима, скорее всего, отображает (DOS) с левой стороны.

Как только вы это сделаете, появится ^M, и вы сможете удалить их, как и любой персонаж.

28

К сожалению. Это^J^M необходимо ввести как два буквальных символа. Используйте c-qc-j, c-qc-m и для замены шнура используйте c-qc-j.

+0

Не могу поверить, как мало голосов! Это полностью спасло бы начинающего (или забывчивого) пользователя Emacs! –

+1

Да, это должно быть выше. Кроме того, вы можете просто заменить^M и игнорировать^J. – ahonnecke

9

Существует также инструмент командной строки, называемый unix2dos/dos2unix, который существует специально для преобразования строк.

4

Вам не нужно использовать шестнадцатеричный режим. Вместо этого:

  • открыть файл таким образом, который отобразит вас the^M. См. M-x find-file-literally/path/to/file выше. В XEmacs вы также можете сделать C-u C-x C-f и выбрать двоичную кодировку.
  • выберите строку, которую вы хотите заменить и скопировать его с помощью Mw
  • сделать M-% (запрос замены) и вставить то, что вы хотите скопировать с помощью Cy
  • присутствует Enter при запросе на то, что заменить его
  • возможно Нажмите ! теперь заменить все случаи

Дело в том, что даже если вы не можете ввести то, что вы пытаетесь заменить, вы всегда можете выбрать/скопировать его.

+0

Спасибо, не знал о find-file-буквально, на самом деле лучший инструмент для просмотра контрольных символов в текстовых файлах, чем в режиме hexl, который я использовал. –

8

Предполагая, что файл с кодировкой DOS должен быть изменен в кодировку UNIX, используйте M-x set-buffer-file-coding-system (C-x RET f), чтобы установить систему кодирования в "unix" и сохранить файл.

1

http://www.xsteve.at/prg/emacs/xsteve-functions.el От:

;02.02.2000 
(defun xsteve-remove-control-M() 
    "Remove ^M at end of line in the whole buffer." 
    (interactive) 
    (save-match-data 
    (save-excursion 
     (let ((remove-count 0)) 
     (goto-char (point-min)) 
     (while (re-search-forward (concat (char-to-string 13) "$") (point-max) t) 
      (setq remove-count (+ remove-count 1)) 
      (replace-match "" nil nil)) 
     (message (format "%d ^M removed from buffer." remove-count)))))) 

Добавьте это в .emacs и запустить его с помощью M-x xsteve-remove-control-M или привязать его к более простой ключ. Он разделит ^M s на anymode.

+1

Это отличное решение. Одна команда для немедленного исправления всего файла. – DOKKA

80

Не нужно искать замену. Просто используйте.

M-x delete-trailing-whitespace 

Вы также можете установить кодировку файла через

C-x RET f unix 
+0

Настройка кодировки файлов решила мою проблему! – Ajoy