Emacs如何自动将当前文件作为函数参数?自定义Shell命令实现类Vim%功能
在Emacs中自动将当前文件作为命令/函数参数(类似Vim的
%) 嘿,这需求我太熟了——毕竟用惯了Vim的%,刚转Emacs时也纠结过怎么实现。下面分两种场景给你具体的解决方案:
一、自定义交互式Shell命令,回车自动带当前文件
如果你想在调用自定义Shell命令时,默认把当前打开的文件作为参数(像Vim里敲!command %那样),可以用read-shell-command结合buffer-file-name来实现:
(defun my-run-with-current-file () (interactive) ;; 先获取当前文件路径,如果buffer没关联文件就报错提示 (let* ((current-file (buffer-file-name)) (default-cmd (if current-file ;; 默认命令模板,把当前文件拼进去 (format "your-shell-command-here %s" current-file) ""))) (if current-file ;; 弹出命令输入框,默认带当前文件参数,按回车直接执行 (shell-command (read-shell-command "Run command: " default-cmd)) (error "This buffer isn't associated with any file!"))))
使用的时候,绑定个顺手的快捷键(比如C-c r),直接按回车就会执行带当前文件的命令,也可以修改命令后再执行。
二、让自定义函数默认使用当前文件作为参数
如果是你自己写的函数,希望交互式调用时没传参就自动用当前文件,用interactive表单的参数处理逻辑就行:
(defun my-process-file (&optional target-file) (interactive ;; 如果当前buffer有文件就用它,否则弹出文件选择框 (list (or (buffer-file-name) (read-file-name "Select file to process: ")))) (when target-file ;; 这里写你的处理逻辑,比如调用Shell命令或其他操作 (message "Processing file: %s" target-file) (shell-command (format "your-processing-script %s" target-file))))
这个函数调用时,直接按回车就会用当前打开的文件;如果当前buffer没关联文件(比如scratch buffer),会自动弹出文件选择对话框让你选。
小提示
- 如果你需要处理相对路径,可以用
file-relative-name把绝对路径转成相对于当前工作目录的路径:(format "your-command %s" (file-relative-name current-file default-directory)) - 要是经常用这类操作,把函数绑定到顺手的快捷键上,效率会高很多!
内容的提问来源于stack exchange,提问作者Ishu Gupta
相关产品推荐
相关产品推荐

