mirror of
https://github.com/gryf/pentadactyl-pm.git
synced 2025-12-20 07:28:00 +01:00
Allow specifying line numbers in 'editor'. Take advantage in <C-i> and view-source links.
This commit is contained in:
@@ -964,33 +964,31 @@ const Buffer = Module("buffer", {
|
|||||||
let doc = buffer.focusedFrame.document;
|
let doc = buffer.focusedFrame.document;
|
||||||
|
|
||||||
if (isArray(url)) {
|
if (isArray(url)) {
|
||||||
let chrome = "chrome://global/content/viewSource.xul";
|
if (options.get("editor").has("l"))
|
||||||
window.openDialog(chrome, "_blank", "all,dialog=no",
|
this.viewSourceExternally(url[0] || doc, url[1]);
|
||||||
url[0], null, null, url[1]);
|
else {
|
||||||
/* FIXME
|
let chrome = "chrome://global/content/viewSource.xul";
|
||||||
let win = dactyl.open(chrome)[0];
|
window.openDialog(chrome, "_blank", "all,dialog=no",
|
||||||
while (win.document.documentURI != chrome)
|
url[0], null, null, url[1]);
|
||||||
util.threadYield(false, true);
|
}
|
||||||
win.arguments = [url[0], null, null, url[1]];
|
|
||||||
*/
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (useExternalEditor)
|
|
||||||
this.viewSourceExternally(url || doc);
|
|
||||||
else {
|
else {
|
||||||
url = url || doc.location.href;
|
if (useExternalEditor)
|
||||||
const PREFIX = "view-source:";
|
this.viewSourceExternally(url || doc);
|
||||||
if (url.indexOf(PREFIX) == 0)
|
else {
|
||||||
url = url.substr(PREFIX.length);
|
url = url || doc.location.href;
|
||||||
else
|
const PREFIX = "view-source:";
|
||||||
url = PREFIX + url;
|
if (url.indexOf(PREFIX) == 0)
|
||||||
|
url = url.substr(PREFIX.length);
|
||||||
|
else
|
||||||
|
url = PREFIX + url;
|
||||||
|
|
||||||
let sh = history.session;
|
let sh = history.session;
|
||||||
if (sh[sh.index].URI.spec == url)
|
if (sh[sh.index].URI.spec == url)
|
||||||
window.getWebNavigation().gotoIndex(sh.index);
|
window.getWebNavigation().gotoIndex(sh.index);
|
||||||
else
|
else
|
||||||
dactyl.open(url, { hide: true });
|
dactyl.open(url, { hide: true });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -1011,8 +1009,8 @@ const Buffer = Module("buffer", {
|
|||||||
viewSourceExternally: Class("viewSourceExternally",
|
viewSourceExternally: Class("viewSourceExternally",
|
||||||
XPCOM([Ci.nsIWebProgressListener, Ci.nsISupportsWeakReference]), {
|
XPCOM([Ci.nsIWebProgressListener, Ci.nsISupportsWeakReference]), {
|
||||||
init: function (doc, callback) {
|
init: function (doc, callback) {
|
||||||
this.callback = callback ||
|
this.callback = callable(callback) ? callback :
|
||||||
function (file) editor.editFileExternally(file.path);
|
function (file) editor.editFileExternally(file.path, callback);
|
||||||
|
|
||||||
let url = isString(doc) ? doc : doc.location.href;
|
let url = isString(doc) ? doc : doc.location.href;
|
||||||
let uri = util.newURI(url, charset);
|
let uri = util.newURI(url, charset);
|
||||||
|
|||||||
@@ -241,13 +241,11 @@ const Editor = Module("editor", {
|
|||||||
return -1;
|
return -1;
|
||||||
},
|
},
|
||||||
|
|
||||||
editFileExternally: function (path) {
|
editFileExternally: function (path, line, column) {
|
||||||
// TODO: save return value in v:shell_error
|
let args = options.get("editor").format({ f: path, l: line, c: column });
|
||||||
let args = commands.parseArgs(options["editor"], { argCount: "*", allowUnknownOptions: true });
|
|
||||||
|
|
||||||
dactyl.assert(args.length >= 1, "No editor specified");
|
dactyl.assert(args.length >= 1, "No editor specified");
|
||||||
|
|
||||||
args.push(path);
|
|
||||||
io.run(io.expandPath(args.shift()), args, true);
|
io.run(io.expandPath(args.shift()), args, true);
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -257,6 +255,7 @@ const Editor = Module("editor", {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
let textBox = config.isComposeWindow ? null : dactyl.focus;
|
let textBox = config.isComposeWindow ? null : dactyl.focus;
|
||||||
|
let line, column;
|
||||||
|
|
||||||
if (!forceEditing && textBox && textBox.type == "password") {
|
if (!forceEditing && textBox && textBox.type == "password") {
|
||||||
commandline.input("Editing a password field externally will reveal the password. Would you like to continue? (yes/[no]): ",
|
commandline.input("Editing a password field externally will reveal the password. Would you like to continue? (yes/[no]): ",
|
||||||
@@ -267,8 +266,12 @@ const Editor = Module("editor", {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (textBox)
|
if (textBox) {
|
||||||
var text = textBox.value;
|
var text = textBox.value;
|
||||||
|
let pre = text.substr(0, textBox.selectionStart);
|
||||||
|
line = 1 + pre.replace(/[^\n]/g, "").length;
|
||||||
|
column = 1 + pre.replace(/[^]*\n/, "").length;
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
var editor = window.GetCurrentEditor ? GetCurrentEditor()
|
var editor = window.GetCurrentEditor ? GetCurrentEditor()
|
||||||
: Editor.getEditor(document.commandDispatcher.focusedWindow);
|
: Editor.getEditor(document.commandDispatcher.focusedWindow);
|
||||||
@@ -310,7 +313,7 @@ const Editor = Module("editor", {
|
|||||||
timer.initWithCallback({ notify: update }, 100, timer.TYPE_REPEATING_SLACK);
|
timer.initWithCallback({ notify: update }, 100, timer.TYPE_REPEATING_SLACK);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
this.editFileExternally(tmpfile.path);
|
this.editFileExternally(tmpfile.path, line, column);
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
timer.cancel();
|
timer.cancel();
|
||||||
@@ -770,7 +773,21 @@ const Editor = Module("editor", {
|
|||||||
options: function () {
|
options: function () {
|
||||||
options.add(["editor"],
|
options.add(["editor"],
|
||||||
"Set the external text editor",
|
"Set the external text editor",
|
||||||
"string", "gvim -f");
|
"string", "gvim -f +%l %f", {
|
||||||
|
format: function (obj, value) {
|
||||||
|
let args = commands.parseArgs(value || this.value, { argCount: "*", allowUnknownOptions: true })
|
||||||
|
.map(util.compileFormat).filter(function (fmt) fmt.valid(obj))
|
||||||
|
.map(function (fmt) fmt(obj));
|
||||||
|
if (obj["f"] && !this.has("f"))
|
||||||
|
args.push(obj["f"]);
|
||||||
|
return args;
|
||||||
|
},
|
||||||
|
has: function (key) set.has(util.compileFormat(this.value).seen, key),
|
||||||
|
validator: function (value) {
|
||||||
|
this.format({}, value);
|
||||||
|
return Object.keys(util.compileFormat(value).seen).every(function (k) "cfl".indexOf(k) >= 0)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
options.add(["insertmode", "im"],
|
options.add(["insertmode", "im"],
|
||||||
"Use Insert mode as the default for text areas",
|
"Use Insert mode as the default for text areas",
|
||||||
|
|||||||
@@ -69,6 +69,25 @@
|
|||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
|
<p tag="format-string">
|
||||||
|
Some options may be given format strings containing %-delimited escape
|
||||||
|
sequences. Character sequences in the form of <em>%</em><a>character</a> are
|
||||||
|
substituted by a specified replacement string. If <a>character</a> is
|
||||||
|
upper-case, then the string is automatically
|
||||||
|
<link topic="quoting">quoted</link>. Any substring enclosed by <em>%[</em>
|
||||||
|
and <em>%]</em> is automatically elided if any of the contained format
|
||||||
|
characters aren't currently valid. A literal <em>%</em> character may be
|
||||||
|
included with the special escape sequence <em>%%</em>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
For example, given the format string <str>%[(cmd: %c) %]%[line: %l %]%F</str>,
|
||||||
|
where <em>l</em>=<hl key="Number">32</hl> and
|
||||||
|
<em>f</em>=<str delim="'">Lieder eines fahrenden Gesellen.txt</str>,
|
||||||
|
the result is formatted as
|
||||||
|
<str>line: 32 'Lieder eines fahrenden Gesellen.txt'</str>
|
||||||
|
</p>
|
||||||
|
|
||||||
<h2 tag="set-option E764">Setting options</h2>
|
<h2 tag="set-option E764">Setting options</h2>
|
||||||
|
|
||||||
<item>
|
<item>
|
||||||
@@ -544,6 +563,19 @@
|
|||||||
other commands which launch an external text editor.
|
other commands which launch an external text editor.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Accepts a <t>format-string</t> with the following escapes available.
|
||||||
|
Arguments containing escapes which are not relevant to a given call
|
||||||
|
are automatically elided. All field splitting is done before format
|
||||||
|
characters are processed.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl>
|
||||||
|
<dt>%f</dt> <dd>The file to edit. Appended as the final argument if missing.</dd>
|
||||||
|
<dt>%l</dt> <dd>The line number at which to position the cursor.</dd>
|
||||||
|
<dt>%c</dt> <dd>The column at which to position the cursor.</dd>
|
||||||
|
</dl>
|
||||||
|
|
||||||
<warning>
|
<warning>
|
||||||
&dactyl.appName; will not behave correctly if the editor forks its
|
&dactyl.appName; will not behave correctly if the editor forks its
|
||||||
own process rather than blocking until editing is complete. Gvim
|
own process rather than blocking until editing is complete. Gvim
|
||||||
|
|||||||
@@ -182,10 +182,10 @@ const Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference])
|
|||||||
stack.top.elements.push(update(
|
stack.top.elements.push(update(
|
||||||
function (obj) obj[char] != null ? quote(obj, char) : "",
|
function (obj) obj[char] != null ? quote(obj, char) : "",
|
||||||
{ test: function (obj) obj[char] != null }));
|
{ test: function (obj) obj[char] != null }));
|
||||||
}
|
|
||||||
|
|
||||||
for (let elem in array.iterValues(stack))
|
for (let elem in array.iterValues(stack))
|
||||||
elem.seen[char] = true;
|
elem.seen[char] = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (end < format.length)
|
if (end < format.length)
|
||||||
stack.top.elements.push(format.substr(end));
|
stack.top.elements.push(format.substr(end));
|
||||||
|
|||||||
Reference in New Issue
Block a user