diff --git a/chrome/content/vimperator/bookmarks.js b/chrome/content/vimperator/bookmarks.js index 199d6c1b..6d462b4c 100644 --- a/chrome/content/vimperator/bookmarks.js +++ b/chrome/content/vimperator/bookmarks.js @@ -458,12 +458,12 @@ function Marks() //{{{ else { var pattern = new RegExp("[" + marks_str.replace(/\s+/g, '') + "]"); - for (mark in url_marks) + for (var mark in url_marks) { if (pattern.test(mark)) removeURLMark(mark); } - for (mark in local_marks) + for (var mark in local_marks) { if (pattern.test(mark)) removeLocalMark(mark); @@ -554,4 +554,83 @@ function Marks() //{{{ //}}} } //}}} +function QuickMarks() //{{{ +{ + //////////////////////////////////////////////////////////////////////////////// + ////////////////////// PRIVATE SECTION ///////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////{{{ + + var marks = {}; + // load the commandline history -- TODO: change to sqlite + var saved_marks = Options.getPref("quickmarks", "").split("\n"); + for (var i=0; i < saved_marks.length -1; i+= 2) + { + marks[saved_marks[i]] = saved_marks[i+1]; + } + + /////////////////////////////////////////////////////////////////////////////}}} + ////////////////////// PUBLIC SECTION ////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////{{{ + + this.add = function(mark, location) + { + marks[mark] = location; + } + + this.remove = function(marks_str) + { + var pattern = new RegExp("[" + marks_str.replace(/\s+/g, '') + "]"); + for (var mark in marks) + { + if (pattern.test(mark)) + delete marks[mark]; + } + } + + this.jumpTo = function(mark, newtab) + { + var url = marks[mark]; + if (url) + { + if(newtab) + openURLsInNewTab(url, true); + else + openURLs(url); + } + else + vimperator.echoerr("E20: QuickMark not set"); // FIXME: move up? + } + + this.list = function() + { + // FIXME: hashes don't have a .length property --mst +// if (local_marks.length + url_marks.length < 1) +// { +// vimperator.echoerr("No marks defined"); +// return; +// } + + var list = ""; + for (var i in marks) + { + list += ""; + } + list += "
markURL
 " + i + "" + + marks[i] + "
"; + vimperator.commandline.echo(list, true); // TODO: force of multiline widget a better way + } + + this.destroy = function() + { + // save the marks + var saved_marks = ""; + for (var i in marks) + { + saved_marks += i + "\n"; + saved_marks += marks[i] + "\n"; + } + Options.setPref("quickmarks", saved_marks); + } + //}}} +} //}}} // vim: set fdm=marker sw=4 ts=4 et: diff --git a/chrome/content/vimperator/commands.js b/chrome/content/vimperator/commands.js index 02f39f15..c7b928e8 100644 --- a/chrome/content/vimperator/commands.js +++ b/chrome/content/vimperator/commands.js @@ -515,7 +515,6 @@ function Commands() //{{{ )); addDefaultCommand(new Command(["marks"], function(args) { - //vimperator.echo("marks not implemented yet"); vimperator.marks.list(args) }, { @@ -743,37 +742,35 @@ function Commands() //{{{ )); addDefaultCommand(new Command(["qmarka[dd]", "qma[dd]"], function(args) { - vimperator.echo("qmarkadd not implemented yet"); - //set_url_mark("mark", "url"); - }, // FIXME + var split = args.split(/\s+/); + vimperator.quickmarks.add(split[0], split[1] ? split[1] : getCurrentLocation()); + }, { usage: ["qmarka[dd] {a-zA-Z0-9} [url]"], short_help: "Mark a URL with a letter for quick access", - help: "Not implemented yet.", + help: "TODO.", completer: function(filter) { return [["a", ""], ["b", ""]]; } } )); addDefaultCommand(new Command(["qmarkd[el]", "qmd[el]"], function(args) { - vimperator.echo("qmarkdel not implemented yet"); - //set_url_mark("mark", "url"); - }, // FIXME + vimperator.quickmarks.remove(args); + }, { usage: ["qmarkd[el] {a-zA-Z0-9}"], short_help: "Remove a marked URL", - help: "Not implemented yet.", + help: "TODO.", completer: function(filter) { return [["a", ""], ["b", ""]]; } } )); addDefaultCommand(new Command(["qmarks", "qms"], function(args) { - vimperator.echo("qmarks not implemented yet"); - //show_url_marks(args); - }, // FIXME + vimperator.quickmarks.list(args); + }, { usage: ["qmarks"], short_help: "Shows marked URLs", - help: "Not implemented yet." + help: "TODO." } )); addDefaultCommand(new Command(["ve[rsion]"], diff --git a/chrome/content/vimperator/mappings.js b/chrome/content/vimperator/mappings.js index 35057bec..743d5580 100644 --- a/chrome/content/vimperator/mappings.js +++ b/chrome/content/vimperator/mappings.js @@ -248,6 +248,24 @@ function Mappings() //{{{ help: "Opens the homepage in a new tab." } )); + addDefaultMap(new Map(vimperator.modes.NORMAL, ["go"], + function (mark) { vimperator.quickmarks.jumpTo(mark, false) }, + { + short_help: "Jump to a QuickMark in the current buffer", + usage: ["go{a-zA-Z0-9}"], + help: "TODO", + flags: Mappings.flags.ARGUMENT + } + )); + addDefaultMap(new Map(vimperator.modes.NORMAL, ["gO"], + function (mark) { vimperator.quickmarks.jumpTo(mark, true) }, + { + short_help: "Jump to a QuickMark in a new buffer", + usage: ["gO{a-zA-Z0-9}"], + help: "TODO", + flags: Mappings.flags.ARGUMENT + } + )); addDefaultMap(new Map(vimperator.modes.NORMAL, ["gP"], function(count) { openURLsInNewTab(readFromClipboard(), false); }, { @@ -280,6 +298,15 @@ function Mappings() //{{{ flags: Mappings.flags.ARGUMENT } )); + addDefaultMap(new Map(vimperator.modes.NORMAL, ["M"], + function(mark) { vimperator.quickmarks.add(mark, getCurrentLocation()) }, + { + short_help: "Add new QuickMark for current URL", + usage: ["M{a-zA-Z0-9}"], + help: "TODO.", + flags: Mappings.flags.ARGUMENT + } + )); addDefaultMap(new Map(vimperator.modes.NORMAL, ["o"], function(count) { vimperator.commandline.open(":", "open ", vimperator.modes.EX); }, { diff --git a/chrome/content/vimperator/vimperator.js b/chrome/content/vimperator/vimperator.js index 2b8390f7..7d67daab 100644 --- a/chrome/content/vimperator/vimperator.js +++ b/chrome/content/vimperator/vimperator.js @@ -73,6 +73,8 @@ function init() //{{{ Vimperator.prototype.tabs = new Tabs(); vimperator.log("Loading module marks...", 3); Vimperator.prototype.marks = new Marks(); + vimperator.log("Loading module quickmarks...", 3); + Vimperator.prototype.quickmarks = new QuickMarks(); vimperator.log("Loading module hints...", 3); Vimperator.prototype.hints = new Hints(); vimperator.log("All modules loaded", 3); @@ -136,8 +138,8 @@ function unload() //{{{ { /*** save our preferences ***/ vimperator.commandline.destroy(); - vimperator.events.destroy(); + vimperator.quickmarks.destroy(); // reset some modified firefox prefs if (Options.getFirefoxPref('dom.popup_allowed_events', 'change click dblclick mouseup reset submit')