Ranger作为终端下的vim风格文件管理器,支持通过自定义命令和Python脚本扩展功能,获取用户输入是实现交互式扩展的核心能力之一,可满足路径跳转、文件操作确认、参数输入等多种需求。

Ranger获取用户输入的基础方式
Ranger内置了prompt方法用于获取用户输入,该方法属于Ranger的Command类,自定义命令时可以直接调用。基础调用格式如下:
# 自定义Ranger命令的基础结构
from ranger.api.commands import Command
class my_command(Command):
def execute(self):
# 调用prompt获取用户输入,第一个参数为提示文本
user_input = self._prompt("请输入内容: ")
# 处理用户输入
self.fm.notify("你输入的内容是: " + user_input)
上述代码中,self._prompt会暂停当前操作,在Ranger底部显示提示文本,等待用户输入完成后返回输入内容字符串,用户输入为空时返回空字符串。
带默认值和输入校验的获取方式
实际使用中经常需要给用户输入设置默认值,或者对输入内容做校验,避免无效输入。可以通过重写提示逻辑实现:
from ranger.api.commands import Command
class rename_with_input(Command):
def execute(self):
# 获取当前选中文件名作为默认值
default_name = self.fm.thisfile.basename
# 自定义提示,显示默认值
prompt_text = "请输入新文件名 [默认: " + default_name + "]: "
# 获取输入,若输入为空则使用默认值
new_name = self._prompt(prompt_text) or default_name
# 校验文件名是否合法,避免包含路径分隔符
if "/" in new_name or "\" in new_name:
self.fm.notify("文件名不能包含路径分隔符", bad=True)
return
# 执行重命名操作
import os
old_path = self.fm.thisfile.path
new_path = os.path.join(os.path.dirname(old_path), new_name)
os.rename(old_path, new_path)
self.fm.notify("重命名成功: " + new_name)
多步输入和复杂交互场景
如果需要获取多个用户输入,可以多次调用_prompt方法,按顺序获取不同参数:
from ranger.api.commands import Command
class create_file_with_info(Command):
def execute(self):
# 第一步获取文件名
file_name = self._prompt("请输入文件名: ")
if not file_name:
self.fm.notify("文件名不能为空", bad=True)
return
# 第二步获取文件内容
file_content = self._prompt("请输入文件内容: ")
# 创建文件并写入内容
file_path = os.path.join(self.fm.thisdir.path, file_name)
try:
with open(file_path, "w", encoding="utf-8") as f:
f.write(file_content)
self.fm.notify("文件创建成功: " + file_path)
except Exception as e:
self.fm.notify("创建文件失败: " + str(e), bad=True)
常见问题说明
- 用户输入过程中按ESC键会取消输入,此时
_prompt返回None,需要做空值判断避免报错。 - Ranger的
_prompt方法不支持输入密码等隐藏字符的场景,若需要隐藏输入内容,可以结合终端的getpass模块实现,但需要额外处理Ranger的终端状态。 - 自定义命令需要保存到
~/.config/ranger/commands.py文件中,重启Ranger后才会生效。
总结
在Ranger中获取用户输入核心是使用_prompt方法,结合自定义Command类可以实现各类交互功能。开发者可以根据需求扩展输入逻辑,添加默认值、校验规则,满足不同的文件管理场景需求。