-
-
Notifications
You must be signed in to change notification settings - Fork 262
User Menu Cookbook
coderaiser edited this page May 28, 2019
·
31 revisions
User Menu is a power feature of Cloud Commander that was added in v12.2.0.
If you create file .cloudcmd.menu.js in the HOME or any top-level directory, it will be used when you press
F2. If you enabled it before with help of --user-menu command line flag.
Here you can find ready to use scripts for your user menu.
You can combine them in any way, and also add yours 😉.
The simplest way to show rename file dialog.
module.exports = {
'F2 - Rename file': async ({DOM}) => {
await DOM.renameCurrent();
},
};Simple example of running bash scripts with help of TerminalRun.
const isMp3 = (a) => /\.mp3$/.test(a);
module.exports = {
'F - Convert flac to mp3': async ({DOM, CloudCmd}) => {
const convert = 'for f in *.flac; do ffmpeg -vsync 2 -i "$f" -b:a 320k "${f%flac}mp3"; done';
const command = `bash -c '${convert}'`;
const exitCode = await CloudCmd.TerminalRun.show({
command,
});
if (exitCode)
return;
await CloudCmd.refresh();
const {IO, CurrentInfo} = DOM;
// get mp3 file names
const {dirPath, files} = CurrentInfo;
const names = DOM.getFilenames(files);
const mp3Dir = `${dirPath}mp3`;
const mp3Names = names.filter(isMp3);
// create mp3 directory
await IO.write(`${mp3Dir}?dir`);
// move *.mp3 files to mp3 directory
await IO.mv({
from: dirPath,
to: mp3Dir,
names: mp3Names,
});
await CloudCmd.refresh();
},
}This is how you can create .cloudcmd.menu.js file.
module.exports = {
'C - Create User Menu File': async ({DOM, CloudCmd}) => {
const {CurrentInfo} = DOM;
const {dirPath} = CurrentInfo;
const path = `${dirPath}.cloudcmd.menu.js`;
const {prefix} = CloudCmd;
const data = await readDefaultMenu({prefix});
await createDefaultMenu({
path,
data,
DOM,
CloudCmd,
});
},
};
async function createDefaultMenu({path, data, DOM, CloudCmd}) {
const {IO} = DOM;
await IO.write(path, data);
await CloudCmd.refresh();
DOM.setCurrentByName('.cloudcmd.menu.js');
await CloudCmd.EditFile.show();
}
async function readDefaultMenu({prefix}) {
const res = await fetch(`${prefix}/api/v1/user-menu/default`);
const data = await res.text();
return data;
}module.exports =
'D - Compare directories': async ({DOM}) => {
const {
CurrentInfo,
getFilenames,
getCurrentByName,
selectFile,
} = DOM;
const {
files,
filesPassive,
panel,
panelPassive,
} = CurrentInfo;
const names = getFilenames(files);
const namesPassive = getFilenames(filesPassive);
const selectedNames = compare(names, namesPassive);
const selectedNamesPassive = compare(namesPassive, names);
selectNames(selectedNames, panel, {
selectFile,
getCurrentByName,
});
selectNames(selectedNamesPassive, panelPassive, {
selectFile,
getCurrentByName,
});
},
}
function selectNames(names, panel, {selectFile, getCurrentByName}) {
for (const name of names) {
const file = getCurrentByName(name, panel);
selectFile(file);
}
};
function compare(a, b) {
const result = [];
for (const el of a) {
if (b.includes(el))
continue;
result.push(el);
}
return result;
}