Skip to content

Commit

Permalink
Add default keybinding flag. Resolves #1691
Browse files Browse the repository at this point in the history
  • Loading branch information
kyle tibbetts authored and Dawa Ometto committed May 26, 2022
1 parent 9c2f8df commit 9e722c5
Show file tree
Hide file tree
Showing 19 changed files with 131 additions and 25 deletions.
1 change: 1 addition & 0 deletions README.md
Expand Up @@ -136,6 +136,7 @@ Gollum comes with the following command line options:
| --template-dir | [PATH] | Specify custom mustache template directory. Only overrides templates that exist in this directory. |
| --template-page | none | Use _Template in root as a template for new pages. Must be committed. |
| --emoji | none | Parse and interpret emoji tags (e.g. `:heart:`) except when the leading colon is backslashed (e.g. `\:heart:`). |
| --default-keybind | none | Set the default keybinding for the editor. Can be set to `vim`, or `emacs`. |
| --lenient-tag-lookup | none | Internal links resolve case-insensitively, will treat spaces as hyphens, and will match the first page found with a certain filename, anywhere in the repository. Provides compatibility with Gollum 4.x. |
| --help | none | Display the list of options on the command line. |
| --version | none | Display the current version of Gollum. |
Expand Down
6 changes: 5 additions & 1 deletion bin/gollum
Expand Up @@ -15,7 +15,7 @@ options = {
}
wiki_options = {
:allow_uploads => false,
:allow_editing => true,
:allow_editing => true
}

opts = OptionParser.new do |opts|
Expand Down Expand Up @@ -166,6 +166,10 @@ MSG
opts.on('--emoji', 'Parse and interpret emoji tags (e.g. :heart:) except when the leading colon is backslashed (e.g. \\:heart:).') do
wiki_options[:emoji] = true
end
opts.on('--default-keybinding [KEYBINDING]', Gollum::KEYBINDINGS.drop(1), 'Set the default keybinding for the editor. Can be set to \'vim\', or \'emacs\'.') do |keybinding|
wiki_options[:default_keybinding] = keybinding.to_s
puts wiki_options[:default_keybinding]
end
opts.separator ''
opts.separator ' Common:'

Expand Down
3 changes: 2 additions & 1 deletion lib/gollum.rb
Expand Up @@ -14,7 +14,8 @@

module Gollum
VERSION = '5.3.0'

KEYBINDINGS = ['default', 'vim', 'emacs']

::I18n.available_locales = [:en]
::I18n.load_path = Dir[::File.expand_path("lib/gollum/locales") + "/*.yml"]

Expand Down
1 change: 1 addition & 0 deletions lib/gollum/app.rb
Expand Up @@ -110,6 +110,7 @@ class App < Sinatra::Base
@show_local_time = settings.wiki_options.fetch(:show_local_time, false)

@wiki_title = settings.wiki_options.fetch(:title, 'Gollum Wiki')
@default_keybinding = settings.wiki_options.fetch(:default_keybinding, 'default')

if settings.wiki_options[:template_dir]
Precious::Views::Layout.extend Precious::Views::TemplateCascade
Expand Down
@@ -1 +1 @@
{"files":{"app-f05401ee374f0c7f48fc2bc08e30b4f4db705861fd5895ed70998683b383bfb5.js":{"logical_path":"app.js","mtime":"2021-11-15T20:08:30-08:00","size":136040,"digest":"f05401ee374f0c7f48fc2bc08e30b4f4db705861fd5895ed70998683b383bfb5","integrity":"sha256-8FQB7jdPDH9I/CvAjjC09NtwWGH9WJXtcJmGg7ODv7U="},"editor-9881d0c7ae663293f0e3a7e72729eec7e940fa613185c076709b76d292f5703a.js":{"logical_path":"editor.js","mtime":"2021-11-15T20:08:30-08:00","size":744886,"digest":"9881d0c7ae663293f0e3a7e72729eec7e940fa613185c076709b76d292f5703a","integrity":"sha256-mIHQx65mMpPw46fnJynux+lA+mExhcB2cJt20pL1cDo="},"app-309be032396e783b13a47df58f389b7c8e11c2b2d42640560b874f677c25f6e5.css":{"logical_path":"app.css","mtime":"2021-11-15T20:08:30-08:00","size":396731,"digest":"309be032396e783b13a47df58f389b7c8e11c2b2d42640560b874f677c25f6e5","integrity":"sha256-MJvgMjlueDsTpH31jzibfI4RwrLUJkBWC4dPZ3wl9uU="},"criticmarkup-31ae5d3282bbb8e7b7c3c9917e9fb68e3315a6b4a75da6cec48d21b8846905c4.css":{"logical_path":"criticmarkup.css","mtime":"2021-08-22T15:24:51-07:00","size":646,"digest":"31ae5d3282bbb8e7b7c3c9917e9fb68e3315a6b4a75da6cec48d21b8846905c4","integrity":"sha256-Ma5dMoK7uOe3w8mRfp+2jjMVprSnXabOxI0huIRpBcQ="},"print-512498c368be0d3fb1ba105dfa84289ae48380ec9fcbef948bd4e23b0b095bfb.css":{"logical_path":"print.css","mtime":"2021-08-22T15:24:51-07:00","size":75,"digest":"512498c368be0d3fb1ba105dfa84289ae48380ec9fcbef948bd4e23b0b095bfb","integrity":"sha256-USSYw2i+DT+xuhBd+oQomuSDgOyfy++Ui9TiOwsJW/s="}},"assets":{"app.js":"app-f05401ee374f0c7f48fc2bc08e30b4f4db705861fd5895ed70998683b383bfb5.js","editor.js":"editor-9881d0c7ae663293f0e3a7e72729eec7e940fa613185c076709b76d292f5703a.js","app.css":"app-309be032396e783b13a47df58f389b7c8e11c2b2d42640560b874f677c25f6e5.css","criticmarkup.css":"criticmarkup-31ae5d3282bbb8e7b7c3c9917e9fb68e3315a6b4a75da6cec48d21b8846905c4.css","print.css":"print-512498c368be0d3fb1ba105dfa84289ae48380ec9fcbef948bd4e23b0b095bfb.css"}}
{"files":{"app-f05401ee374f0c7f48fc2bc08e30b4f4db705861fd5895ed70998683b383bfb5.js":{"logical_path":"app.js","mtime":"2021-11-15T20:08:30-08:00","size":136040,"digest":"f05401ee374f0c7f48fc2bc08e30b4f4db705861fd5895ed70998683b383bfb5","integrity":"sha256-8FQB7jdPDH9I/CvAjjC09NtwWGH9WJXtcJmGg7ODv7U="},"editor-9881d0c7ae663293f0e3a7e72729eec7e940fa613185c076709b76d292f5703a.js":{"logical_path":"editor.js","mtime":"2021-11-15T20:08:30-08:00","size":744886,"digest":"9881d0c7ae663293f0e3a7e72729eec7e940fa613185c076709b76d292f5703a","integrity":"sha256-mIHQx65mMpPw46fnJynux+lA+mExhcB2cJt20pL1cDo="},"app-309be032396e783b13a47df58f389b7c8e11c2b2d42640560b874f677c25f6e5.css":{"logical_path":"app.css","mtime":"2022-05-26T12:13:37+02:00","size":396731,"digest":"309be032396e783b13a47df58f389b7c8e11c2b2d42640560b874f677c25f6e5","integrity":"sha256-MJvgMjlueDsTpH31jzibfI4RwrLUJkBWC4dPZ3wl9uU="},"criticmarkup-31ae5d3282bbb8e7b7c3c9917e9fb68e3315a6b4a75da6cec48d21b8846905c4.css":{"logical_path":"criticmarkup.css","mtime":"2020-03-29T22:28:51+02:00","size":646,"digest":"31ae5d3282bbb8e7b7c3c9917e9fb68e3315a6b4a75da6cec48d21b8846905c4","integrity":"sha256-Ma5dMoK7uOe3w8mRfp+2jjMVprSnXabOxI0huIRpBcQ="},"print-512498c368be0d3fb1ba105dfa84289ae48380ec9fcbef948bd4e23b0b095bfb.css":{"logical_path":"print.css","mtime":"2020-03-30T11:12:22+02:00","size":75,"digest":"512498c368be0d3fb1ba105dfa84289ae48380ec9fcbef948bd4e23b0b095bfb","integrity":"sha256-USSYw2i+DT+xuhBd+oQomuSDgOyfy++Ui9TiOwsJW/s="},"app-eb6effc9f708916af14718a5c9d2a5028625664f62c2528e5989538537f3f4a8.js":{"logical_path":"app.js","mtime":"2022-05-26T13:00:46+02:00","size":188288,"digest":"eb6effc9f708916af14718a5c9d2a5028625664f62c2528e5989538537f3f4a8","integrity":"sha256-627/yfcIkWrxRxilydKlAoYlZk9iwlKOWYlThTfz9Kg="},"editor-ebdf534a0063fe3b05a7e7daaf7aa40b78fab9863142b161d88f32a3f035378a.js":{"logical_path":"editor.js","mtime":"2022-05-26T13:00:46+02:00","size":745160,"digest":"ebdf534a0063fe3b05a7e7daaf7aa40b78fab9863142b161d88f32a3f035378a","integrity":"sha256-699TSgBj/jsFp+far3qkC3j6uYYxQrFh2I8yo/A1N4o="}},"assets":{"app.js":"app-eb6effc9f708916af14718a5c9d2a5028625664f62c2528e5989538537f3f4a8.js","editor.js":"editor-ebdf534a0063fe3b05a7e7daaf7aa40b78fab9863142b161d88f32a3f035378a.js","app.css":"app-309be032396e783b13a47df58f389b7c8e11c2b2d42640560b874f677c25f6e5.css","criticmarkup.css":"criticmarkup-31ae5d3282bbb8e7b7c3c9917e9fb68e3315a6b4a75da6cec48d21b8846905c4.css","print.css":"print-512498c368be0d3fb1ba105dfa84289ae48380ec9fcbef948bd4e23b0b095bfb.css"}}
Binary file not shown.

Large diffs are not rendered by default.

Binary file not shown.

This file was deleted.

Binary file not shown.
Binary file not shown.

Large diffs are not rendered by default.

Binary file not shown.
Binary file not shown.
41 changes: 30 additions & 11 deletions lib/gollum/public/gollum/javascript/editor/gollum.editor.js
Expand Up @@ -55,6 +55,20 @@
}, 2000);
}

function setEditorKeyboardHandler(mode) {
var editor = window.ace_editor;
var storage = window.localStorage;
storage.setItem('gollum-kbm', mode)
if (mode == "default") {
editor.setKeyboardHandler();
} else if (mode == "vim" || mode == "emacs") {
editor.setKeyboardHandler("ace/keyboard/" + mode);
} else {
editor.setKeyboardHandler();
}
editor.focus();
}

/**
* $.GollumEditor
*
Expand Down Expand Up @@ -97,9 +111,22 @@
});
$('#gollum-autorecover-msg')[0].hidden = false;
}


// Check for user last keybind and ensure ui is correct
var storage = window.localStorage;
var userDefaultKeybind = storage.getItem('gollum-kbm');
if (userDefaultKeybind) {
default_keybinding = userDefaultKeybind;
}
var keybinding = document.getElementById('keybinding')
for (var i = 0; i < keybinding.options.length; ++i) {
if (keybinding.options[i].text === default_keybinding) {
keybinding.options[i].selected = true;
}
}

editor.setTheme("ace/theme/tomorrow");
editor.setKeyboardHandler();
setEditorKeyboardHandler(default_keybinding);
editor.renderer.setShowGutter(false);
editor.getSession().setUseWrapMode(true);
editor.getSession().setValue(textarea.val());
Expand Down Expand Up @@ -151,15 +178,7 @@

$("#keybinding").change(function() {
var mode = $(this).val();
var editor = window.ace_editor;
if (mode == "default") {
editor.setKeyboardHandler();
} else if (mode == "vim" || mode == "emacs") {
editor.setKeyboardHandler("ace/keyboard/" + mode);
} else {
editor.setKeyboardHandler();
}
editor.focus();
setEditorKeyboardHandler(mode)
});

// Remove any autosaved text when we hit save or cancel
Expand Down
6 changes: 3 additions & 3 deletions lib/gollum/templates/editor.mustache
Expand Up @@ -51,9 +51,9 @@
<div id="gollum-editor-format-selector">
<label for="format">Keybinding</label>
<select id="keybinding" name="keybinding" class="form-select input-sm">
<option selected="selected">default</option>
<option>vim</option>
<option>emacs</option>
{{#keybindings}}
<option {{#selected}}selected="selected" {{/selected}}value="{{name}}">{{name}}</option>
{{/keybindings}}
</select>
<label for="format">Markup</label>
<select id="wiki_format" name="format" class="form-select input-sm">
Expand Down
3 changes: 3 additions & 0 deletions lib/gollum/templates/layout.mustache
Expand Up @@ -31,6 +31,9 @@
{{#is_create_page}}
var default_markup = '{{default_markup}}';
{{/is_create_page}}
{{#has_editor}}
var default_keybinding = '{{default_keybinding}}';
{{/has_editor}}
</script>
{{#sprockets_javascript_tag}}app{{/sprockets_javascript_tag}}
Expand Down
12 changes: 12 additions & 0 deletions lib/gollum/views/editable.rb
Expand Up @@ -4,6 +4,18 @@ def has_editor
true
end

def default_keybinding
@default_keybinding
end

def keybindings
Gollum::KEYBINDINGS.map do |kb|
{ :name => kb,
:selected => default_keybinding == kb
}
end
end

def formats(selected = @page.format)
Gollum::Markup.formats.map do |key, val|
{ :name => val[:name],
Expand Down
64 changes: 64 additions & 0 deletions test/test_app.rb
Expand Up @@ -1058,3 +1058,67 @@ def app
Precious::MapGollum.new(@base_path)
end
end

context "Default keybindings" do
include Rack::Test::Methods

setup do
@path = cloned_testpath("examples/empty.git")
@wiki = Gollum::Wiki.new(@path)
@url = '/gollum/create/test'
Precious::App.set(:gollum_path, @path)
Precious::App.set(:wiki_options, {})
end

teardown do
FileUtils.rm_rf(@path)
end

test 'keybinding unset' do
get @url
assert_equal last_response.body.include?('selected="selected" value="default"'), false
assert_equal last_response.body.include?('selected="selected" value="vim"'), false
assert_equal last_response.body.include?('selected="selected" value="emacs"'), false
end

test 'keybinding `dne`' do
# dne := does not exist
Precious::App.set(:wiki_options, {:default_keybinding => 'dne'})
get @url
assert_equal last_response.body.include?('selected="selected" value="default"'), false
assert_equal last_response.body.include?('selected="selected" value="vim"'), false
assert_equal last_response.body.include?('selected="selected" value="emacs"'), false
Precious::App.set(:wiki_options, {:default_keybinding => 'none'})
end

test 'keybinding `default`' do
Precious::App.set(:wiki_options, {:default_keybinding => 'default'})
get @url
assert_equal last_response.body.include?('selected="selected" value="default"'), true
assert_equal last_response.body.include?('selected="selected" value="vim"'), false
assert_equal last_response.body.include?('selected="selected" value="emacs"'), false
Precious::App.set(:wiki_options, {:default_keybinding => 'none'})
end

test 'keybinding `vim`' do
Precious::App.set(:wiki_options, {:default_keybinding => 'vim'})
get @url
assert_equal last_response.body.include?('selected="selected" value="default"'), false
assert_equal last_response.body.include?('selected="selected" value="vim"'), true
assert_equal last_response.body.include?('selected="selected" value="emacs"'), false
Precious::App.set(:wiki_options, {:default_keybinding => 'none'})
end

test 'keybinding `emacs`' do
Precious::App.set(:wiki_options, {:default_keybinding => 'emacs'})
get @url
assert_equal last_response.body.include?('selected="selected" value="default"'), false
assert_equal last_response.body.include?('selected="selected" value="vim"'), false
assert_equal last_response.body.include?('selected="selected" value="emacs"'), true
Precious::App.set(:wiki_options, {:default_keybinding => 'none'})
end

def app
Precious::App
end
end

0 comments on commit 9e722c5

Please sign in to comment.