LINUX.ORG.RU

emacs скрипт для перекодирования в cp1251


0

0

В гугле нашел скрипт для перекоирования документа в разные кодировки.

(defun recode-buffer-dangerous (target-coding-system)
"* Recode buffer as if it were encoded with `target-coding-system'.
If current buffer is write-protected (`buffer-read-only'), temporarily toggle
read-only flag, recode, then turn it back."
(interactive "zEnter target coding system: ")
(labels ((do-recode nil
(encode-coding-region (point-min)
(point-max)
buffer-file-coding-system)
(decode-coding-region (point-min)
(point-max)
target-coding-system)
(set-buffer-file-coding-system target-coding-system)))
(if buffer-read-only
(let ((buffer-read-only nil))
(do-recode)
(set-buffer-modified-p nil))
(do-recode))))

забиндил на него клавишу

(global-set-key (kbd "<f12>") 'recode-buffer-dangerous)

Но мне бы хотелось что бы скрипт не спрашивал меня в какую кодировку переводить а сразу перекодировал буфер в cp1251, как это можно осуществить


Даже не стал смотреть, что там скрипт делает. Но ты же можешь вместо target-coding-system прибить гвоздями cp1251 и убрать interactive.

Zubok ★★★★★
()

Вот так, например, перепиши.

(defun recode-buffer-to-cp1251 ()
  (interactive)
  (labels ((do-recode nil
		      (encode-coding-region (point-min) (point-max)
					    buffer-file-coding-system)
		      (decode-coding-region (point-min) (point-max) 'cp1251)
		      (set-buffer-file-coding-system 'cp1251)))
    (if buffer-read-only
	(let ((buffer-read-only nil))
	  (do-recode)
	  (set-buffer-modified-p nil))
      (do-recode))))

Zubok ★★★★★
()

не понял - зачем нужен этот скрпит?

set-buffer-file-coding-system должно хватить сразу

ott ★★★★★
()
Ответ на: комментарий от ott

>set-buffer-file-coding-system должно хватить сразу

Нет, если открыли файл, который на диске лежит в cp1251 через C-x C-f, а не через C-x RET c C-x C-f, то надо как-то из кракозябров его вывести (перекодировать). set-buffer-file-coding-system этого не сделает, а только выберет кодировку для сохранения на диск того, что в буфере.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Вот эту пару 


(encode-coding-region (point-min) (point-max)
                       buffer-file-coding-system)
(decode-coding-region (point-min) (point-max) 'cp1251)


можно заменить на функцию recode-region

(recode-region (point-min) (point-max)
 	       'cp1251 buffer-file-coding-system)

Zubok ★★★★★
()
Ответ на: комментарий от n4ela

>Спасибо большое, все работает.

Я тут взглянул на то, что есть в emacs. Просто мне не приходится как-то с разными кодировками работать. Есть уже функция-то готовая :)

revert-buffer-with-coding-system . Вызывается по C-x RET r.

Можно повесить не кнопку в виде (revert-buffer-with-coding-system 'cp1251 t)

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

>revert-buffer-with-coding-system . Вызывается по C-x RET r.

Хотя ее минус в том, что если ты сделал изменения "вслепую" в неперекодированном файле (что-то стер) и не сохранил, то эта функция при перекодировании перепрочтет файл с диска. Соответсвенно, стирать придется заново. А та функция, которая в исходном сообщении, она перекодирует то, что есть в буфере, не перечитывая с диска.

Zubok ★★★★★
()

>(global-set-key (kbd "<f12>") 'recode-buffer-dangerous)

И еще. Чего-то я сразу не сообразил. Можно же было исходную функцию не менять, а просто передать ей параметр. Моя совсем плохой.

(global-set-key (kbd "<f12>") (lambda () (interactive) (recode-buffer-dangerous 'cp1251)))

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

>Нет, если открыли файл, который на диске лежит в cp1251 через C-x C-f,

нажимаем C-x-enter-r вводим кодировку и он крякозябры исчезают

fghj ★★★★★
()
Ответ на: комментарий от fghj

>нажимаем C-x-enter-r вводим кодировку и он крякозябры исчезают

Товарищ, то, что я потом написал, читаем или нет? Это и есть revert-buffer-with-coding-system, о которой я выше написал. И даже распальцовку эту указал. Отметил разницу даже между этим методом и методом, что предложен в топике.

Zubok ★★★★★
()
Ответ на: комментарий от trapezoid

>бедные люди вим это сам умеет, причём давно

Мне кажется, ты плохо читал ветку. :) Emacs это тоже умеет "из коробки".

Zubok ★★★★★
()
Ответ на: комментарий от wenduzyatnik

>Бедные линуксойды! Откройте для себя Юникод, а то вечно в вашей поделке кроказябры

Бугога. Не смешно. Эти кракозябры из-за файлов в windows-1251. Попробоуйте прочесть в названии кодировки слово linux и unicode. :)

Zubok ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.