代码之家  ›  专栏  ›  技术社区  ›  Christian Berg

如何在win32上从emacs打印?

  •  7
  • Christian Berg  · 技术社区  · 17 年前

    我运行的是emacs 23.0.60.1,下载自 here ,在Windows XP上,将网络打印机配置为默认打印机。

    如何设置Emacs以轻松打印缓冲区内容?

    这个 documentation 修补过的Emacs版本的win32中提到了“快速而简单”的打印,但是“快速打印”菜单项没有出现,常规项(“打印缓冲区”、“PostScript打印缓冲区”)似乎没有做任何事情。

    编辑:
    我对Emacs22.3的官方Windows版本也有同样的问题。因此,任何版本的安装/故障排除说明都会受到欢迎。

    编辑2:
    我使用了下面JoeCasadonte提供的printfile解决方案,它工作得很好。不过,我仍然对“正确”的方法不起作用的任何想法感兴趣。

    (顺便问一句,这是一个适当的问题吗,仅仅与编程有关?)

    3 回复  |  直到 17 年前
        1
  •  4
  •   Joe Casadonte    17 年前

    这不是“正确”的方式,但我多年来一直这样做,而且效果非常好。我用 PrintFile 免费打印程序(也可以独立使用)。然后我的.emacs中有这个:

    (defun joc-make-fname-from-buffer-name (buffer-name-in)
      "Returns a valid filename from a given buffer name"
      (interactive "b")
      (save-match-data
        (let* ((start (string-match "[^ \*]" buffer-name-in))
               (end (string-match "[ \*]*$" buffer-name-in (match-end 0)))
               (rc (substring buffer-name-in start end)))
          ;; remove some special characters
          (while (string-match "[:]+" rc)
            (setq rc (replace-match "_" t t rc)))
          rc)))
    
    (when is-win32
        (defun joc-print-buffer-or-region (prefix)
          "Prints buffer or region via PrintFile32.  If a prefix arg is set (via C-u) then
           the current region is printed, otherwise the current buffer is printed."
    
          (interactive "P")
    
          ;; ----- set the print directory, fname and args -----
          (let* ((print-dir (expand-file-name "~/emacs/print"))
                 (print-fname (joc-make-fname-from-buffer-name (buffer-name)))
                 (print-fullpath (concat print-dir "/" print-fname))
                 (print-args "/delete")
                 ;; ----- set rstart and rend to the current region -----
                 (rstart (point-min)) (rend (point-max)))
    
            ;; ----- if prefix given, set them to region -----
            (if (and prefix)
                (if (and (point) (mark) (/= (point) (mark)))
                    (progn (setq rstart (min (point) (mark)))
                           (setq rend (max (point) (mark))))
                  (error "No region defined")))
    
            ;; ----- make the directory -----
            (if (not (file-directory-p print-dir))
                (make-directory print-dir))
    
            ;; ----- write buffer/region to a temp file, print it, delete directory -----
            (write-region rstart rend print-fullpath)
            (call-process "prfile32" nil t nil print-args print-fullpath)
            (delete-directory print-dir))))
    

    我已经好几年没看过了,因为它只是起作用了,所以我相信它可以改进。

        2
  •  5
  •   ayckoster    15 年前

    我将用一个通用的USB打印机描述Windows7的所有功能。根据您的版本调整流程。网络通常可以以同样的方式访问。只使用 //NetworkComputerName/SharedPrinterName 而不是//mycomputer/myprinter,跳过步骤1.-6.。

    1. 去 启动->控制面板->硬件和声音->设备和打印机
    2. 右键单击打印机,选择“打印机属性”
    3. 转到“共享”并选中“共享此打印机”和“在客户端计算机上呈现打印作业”
    4. 输入共享名: MyPrinter 或者一些你能记住并且没有空格的东西。
    5. 单击“确定”保存更改。
    6. 去 启动->计算机 检查左下角的计算机名称(例如 MyComputer )
    7. 在Emacs中评估 (setq printer-name "//MyComputer/MyPrinter") 或者把它放在.emacs.el文件中
    8. 完成。您可以用打印文件 M-x print-buffer
        3
  •  1
  •   Oleg Pavliv    17 年前

    将以下行添加到Emacs初始化文件中

    (setq printer-name "//domain/printer-name")