2

Perl::Tidy を領域またはファイル全体に適用する小さな elisp スクリプトがあります。参考までに、スクリプトは次のとおりです (EmacsWiki から借用)。

(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)

現在、Windows 用の Emacs 23.1 (EmacsW32) を使用しています。私が抱えている問題は、そのスクリプトを UTF-8 でコード化されたファイル (ステータス バーの「U(Unix)」) に適用すると、出力が Latin-1 でコード化されて返されることです。 ASCII ソース文字。

それを修正する方法はありますか?

編集: (set-terminal-coding-system 'utf-8-unix)myで使用することで問題が解決したようinit.elです。誰でも他の解決策を持っている場合は、先に進んでそれらを書いてください!

4

2 に答える 2

3

以下、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-alistnil の場合は から探し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-alistnil です。エンコード オプションを に割り当てることができますdefault-process-coding-system

例えば:

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

(入力が としてエンコードされた場合utf-8、出力は としてエンコードされますutf-8)

または

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

詳細が必要な場合は、これについての投稿も書きました。

于 2012-11-22T05:51:31.583 に答える
2

shell-command-on-region( )のドキュメントを引用するC-h f shell-command-on-region RET

シェルコマンドへの入力および出力で非ASCII文字を変換するためのコーディングシステムを指定するには、このコマンドの前にCxRETcを使用します。デフォルトでは、(現在のバッファからの)入力は、ファイルの保存に使用されるのと同じコーディングシステム`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引数を利用して、コーディングシステムが必要なものに設定されているバッファーに出力を送ることもできると思います。

もう1つのオプションは、perltidy呼び出しでロケールを小刻みに動かすことですが、ここでも、現在使用しているものに関する詳細情報がなく、同様のシステムで実験する手段がないため、ヒントしか得られません。

于 2011-08-03T06:32:32.487 に答える