Emacs 有条件地在本地设置'dired list switches',但在远程设置'nil'

Emacs 有条件地在本地设置'dired list switches',但在远程设置'nil',emacs,dired,Emacs,Dired,以下设置在本地(OSX)运行良好,但会阻止Emacs在远程服务器(Linux)上正确显示目录/文件: 我通过以下方式登录到远程服务器: C-x C-f /ssh:user@server:/home/user/ 因此,dired列表开关需要在本地设置,但nil需要远程设置。如何通过编程实现这一点?尽管我很想使用一个钩子,但没有一个dired钩子允许这种定制,因为dired在如何加载东西方面有点懒惰 Advice将允许您通过编程方式切换dired列表开关的值,方法是允许我们用更多代码围绕“dire

以下设置在本地(OSX)运行良好,但会阻止Emacs在远程服务器(Linux)上正确显示目录/文件:

我通过以下方式登录到远程服务器:

C-x C-f /ssh:user@server:/home/user/

因此,
dired列表开关
需要在本地设置,但
nil
需要远程设置。如何通过编程实现这一点?

尽管我很想使用一个钩子,但没有一个dired钩子允许这种定制,因为dired在如何加载东西方面有点懒惰

Advice将允许您通过编程方式切换dired列表开关的值,方法是允许我们用更多代码围绕“dired”函数体

传入dired的第一个值是目录,因此可以使用
file-remote-p
确定它是否是服务器位置。您可以使用
ad get arg

(defadvice dired(大约没有服务器文件激活开关)
打开远程位置的dired时,请使用默认开关
(let((dired列表开关)(if(file-remote-p(ad get arg 0))
“-al”;默认开关
目录列表开关)
广告(做这件事)
如果这是您第一次遇到功能建议,请阅读文档

M-:(信息“(elisp)通知功能”)输入


我不相信您希望变量为nil,而是默认值。当我尝试使用nil时,dired会给我一个错误。如果您甚至不想要默认值,请将其切换为空字符串。

如果您这样做只是为了交互式使用
dired
,而不是为了对函数
dired
进行编程调用,那么您不需要(因此可能不应该)建议
dired

相反,只需定义一个新命令,
my dired
,它使用
file-remote-p
测试其arg,然后使用适当的开关调用
dired
。然后将
dired
重新映射到您的命令,以进行键绑定。类似地,对于
dired其他窗口

如果希望允许类似于
dired
的前缀arg行为,也可以这样做。例如,如果
当前前缀arg
,则读取并使用用户提供的开关,否则按上述操作:测试arg并相应设置开关

例如(未经测试):


记住,建议会改变你建议的功能。问问你自己,你是想在一般情况下这样做,还是仅仅为了交互使用该功能。如果是后者,则您通常不需要或不想建议该函数-只需定义并使用不同的命令。

非常感谢。我的初步测试需要删除
(setq dired listing switches“-aBhl——首先是组目录”)
的设置,并将
dired listing switches
替换为
“-aBhl——首先是组目录”
。stock
M-x dired
在本地正常工作,目录/文件在远程正确显示。我的自定义打开文件/显示缓冲区功能失败,因此可能需要稍微调整一下。你肯定用
(if(file-remote-p(ad get arg 0))击中了要害…
我将在今晚晚些时候进一步研究它,并向您报告。您的自定义ope文件/显示缓冲区函数是什么?它与打开的直接缓冲区是如何交互的?您的答案和我的错误消息之间的冲突可能是由此函数引起的:
(defun lawlist custom open file()(交互式)(如果缓冲区文件名(dired nil)(cond((eq系统类型'darwin)(dired“~/.0.data”))((eq系统类型'windowsnt)(dired“y:/”)))(lawlist add buffer))
此时,以下暂定解决方案(基于您对
file-remote-p
的使用)运行良好:
(添加hook'dired模式hook(lambda())(file-remote-p dired目录)(setq本地dired实际开关“-al”)(setq本地dired实际开关“-aBhl--组目录优先”))
我假设
dired mode hook
是在变量
dired dired directory
确定之后运行的谢谢--我将尝试一下,并在今天晚些时候报告。以下是我的初步想法:
(添加hook'dired mode hook(lambda()(if(file-remote-p dired directory)(setq local dired实际开关“-al”)(setq local dired实际开关“-aBhl——首先是组目录”))
我需要为
(或开关…)添加一些内容
以防万一有
开关而不是
dired列表开关
…我怀疑这会对你有帮助-
dired模式钩子
dired模式
的最后运行。我的建议是:定义一个命令,检查
DIRNAME
参数并设置
开关
一致y、 其他人可能有其他建议,但那是我的。我添加了一个示例(未经测试)。我只是稍微调整了
dired-read-dir和switches的现有代码。您修改后的示例运行得很好。我之前只看到了一个在打开远程目录时
find file
的示例,并且在这种情况下会打开一个
dired
缓冲区。这就是为什么我对
dired
函数感到困惑的原因在后台使用。我使用您的示例创建了一个功能,效果很好:
(defun lawlist remote server login()(interactive)(my dired)/ssh:lawlist@12.34.56.789:/home/lawlist/public_html/”)
非常感谢--非常感谢!:)未经测试,但现在
C-h i g(emacs)连接变量
可能是一个可行的选项。
C-x C-f /ssh:user@server:/home/user/
(defun my-dired (dirname &optional switches)
  "..."
  (interactive
   (let* ((dir  (if (next-read-file-uses-dialog-p)
                    (read-directory-name "Dired (directory): "
                                         nil default-directory nil)
                  (read-file-name "Dired (directory): "
                                  nil default-directory nil)))
          (sws  (if current-prefix-arg
                    (read-string "Dired listing switches: "
                                 dired-listing-switches)
                  (if (file-remote-p dir)
                      "-al"
                    "-aBhl --group-directories-first"))))
     (list dir sws)))
  (switch-to-buffer (dired-noselect dirname switches)))