2009-12-01 2 views
2

У меня есть небольшой скрипт elisp, который применяет Perl :: Tidy для региона или всего файла. Для справки, вот скрипт (заимствовано из EmacsWiki):Как установить кодировку вывода команды shell-command-on-region?

(defun perltidy-command(start end) 
"The perltidy command we pass markers to." 
(shell-command-on-region start 
         end 
         "perltidy" 
         t 
         t 
         (get-buffer-create "*Perltidy Output*"))) 

(defun perltidy-dwim (arg) 
"Perltidy a region of the entire buffer" 
(interactive "P") 
(let ((point (point)) (start) (end)) 
(if (and mark-active transient-mark-mode) 
    (setq start (region-beginning) 
      end (region-end)) 
    (setq start (point-min) 
     end (point-max))) 
(perltidy-command start end) 
(goto-char point))) 

(global-set-key "\C-ct" 'perltidy-dwim) 

Я использую Emacs тока 23,1 для Windows (EmacsW32). Проблема, с которой я столкнулась, заключается в том, что если я применил этот скрипт в кодированном файле UTF-8 («U (Unix)» в строке состояния), то на выходе возвращается латинский-1, то есть два или более символа для каждого не- Исходный символ ASCII.

Есть ли способ исправить это?

EDIT: Проблема, кажется, решается с помощью (set-terminal-coding-system 'utf-8-unix) в моей init.el. У кого-нибудь есть другие решения, продолжайте и пишите!

ответ

2

Цитирование документацию для shell-command-on-region (C-h f shell-command-on-region RET):

Чтобы указать систему кодирования для преобразования не-ASCII символов на входе и выходе на команду оболочки, использовать С-х RET C перед этой командой. По умолчанию вход (из текущего буфера) закодирован в той же системе кодирования, которая будет использоваться для сохранения файла, `buffer-file-coding-system '. Если выход заменит регион, , то он будет декодирован из той же системы кодирования.

Неинтерактивные аргументы: START, END, COMMAND, OUTPUT-BUFFER, REPLACE, ERROR-BUFFER и DISPLAY-ERROR-BUFFER. Неинтерактивные абоненты могут указывать системы кодирования путем привязки `coding-system-for-read 'и` coding-system-for-write'.

Другими словами, вы могли бы сделать что-то вроде

(let ((coding-system-for-read 'utf-8-unix)) 
    (shell-command-on-region ...)) 

Это проверялось, не уверен, что значение coding-system-for-read (или, возможно, -write вместо этого? Или так же?) Должны быть в вашем случае , Я думаю, вы также можете использовать аргумент OUTPUT-BUFFER и направлять вывод в буфер, система кодирования которого соответствует тому, что вам нужно.

Другой вариант может заключаться в том, чтобы повернуть язык в вызове perltidy, но опять же, без дополнительной информации о том, что вы используете сейчас, и нет возможности поэкспериментировать с системой, подобной вашей, я могу только намекнуть.

2

Ниже приведены из shell-command-on-region документа

To specify a coding system for converting non-ASCII characters 
in the input and output to the shell command, use C-x RET c 
before this command. By default, the input (from the current buffer) 
is encoded using coding-system specified by `process-coding-system-alist', 
falling back to `default-process-coding-system' if no match for COMMAND 
is found in `process-coding-system-alist'. 

Во время выполнения, он ищет систему кодировки из process-coding-system-alist на первый, если это ноль, то выглядит от default-process-coding-system.

Если вы хотите изменить кодировку, вы можете добавить свой вариант преобразования в process-coding-system-alist, ниже - его содержимое.

Value: (("\\.dz\\'" no-conversion . no-conversion) 
... 
("\\.elc\\'" . utf-8-emacs) 
("\\.utf\\(-8\\)?\\'" . utf-8) 
("\\.xml\\'" . xml-find-file-coding-system) 
... 
("" undecided)) 

Или, если вы не установили process-coding-system-alist, это ноль, можно назначить свой вариант кодирования для default-process-coding-system,

, например:

(setq default-process-coding-system '(utf-8 . utf-8)) 

(Если вход кодируется как utf-8 , затем вывод кодируется как utf-8)

or

(setq default-process-coding-system '(undecided-unix . iso-latin-1-unix)) 

Я также написал post об этом, если хотите подробности.