aboutsummaryrefslogtreecommitdiff
path: root/src/shared/settings/Settings.ts
blob: 116c7d766889236cdc841d4bd64f9fc79181ec87 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
import Keymaps, { KeymapsJSON } from './Keymaps';
import Search, { SearchJSON } from './Search';
import Properties, { PropertiesJSON } from './Properties';
import Blacklist, { BlacklistJSON } from './Blacklist';

export type SettingsJSON = {
  keymaps: KeymapsJSON,
  search: SearchJSON,
  properties: PropertiesJSON,
  blacklist: BlacklistJSON,
};

export default class Settings {
  public keymaps: Keymaps;

  public search: Search;

  public properties: Properties;

  public blacklist: Blacklist;

  constructor({
    keymaps,
    search,
    properties,
    blacklist,
  }: {
    keymaps: Keymaps;
    search: Search;
    properties: Properties;
    blacklist: Blacklist;
  }) {
    this.keymaps = keymaps;
    this.search = search;
    this.properties = properties;
    this.blacklist = blacklist;
  }

  static fromJSON(json: any): Settings {
    let settings = { ...DefaultSetting };
    for (let key of Object.keys(json)) {
      switch (key) {
      case 'keymaps':
        settings.keymaps = Keymaps.fromJSON(json.keymaps);
        break;
      case 'search':
        settings.search = Search.fromJSON(json.search);
        break;
      case 'properties':
        settings.properties = Properties.fromJSON(json.properties);
        break;
      case 'blacklist':
        settings.blacklist = Blacklist.fromJSON(json.blacklist);
        break;
      default:
        throw new TypeError('unknown setting: ' + key);
      }
    }
    return new Settings(settings);
  }

  toJSON(): SettingsJSON {
    return {
      keymaps: this.keymaps.toJSON(),
      search: this.search.toJSON(),
      properties: this.properties.toJSON(),
      blacklist: this.blacklist.toJSON(),
    };
  }
}

export const DefaultSetting: Settings = Settings.fromJSON({
  keymaps: {
    '0': { 'type': 'scroll.home' },
    ':': { 'type': 'command.show' },
    'o': { 'type': 'command.show.open', 'alter': false },
    'O': { 'type': 'command.show.open', 'alter': true },
    't': { 'type': 'command.show.tabopen', 'alter': false },
    'T': { 'type': 'command.show.tabopen', 'alter': true },
    'w': { 'type': 'command.show.winopen', 'alter': false },
    'W': { 'type': 'command.show.winopen', 'alter': true },
    'b': { 'type': 'command.show.buffer' },
    'a': { 'type': 'command.show.addbookmark', 'alter': true },
    'k': { 'type': 'scroll.vertically', 'count': -1 },
    'j': { 'type': 'scroll.vertically', 'count': 1 },
    'h': { 'type': 'scroll.horizonally', 'count': -1 },
    'l': { 'type': 'scroll.horizonally', 'count': 1 },
    '<C-U>': { 'type': 'scroll.pages', 'count': -0.5 },
    '<C-D>': { 'type': 'scroll.pages', 'count': 0.5 },
    '<C-B>': { 'type': 'scroll.pages', 'count': -1 },
    '<C-F>': { 'type': 'scroll.pages', 'count': 1 },
    'gg': { 'type': 'scroll.top' },
    'G': { 'type': 'scroll.bottom' },
    '$': { 'type': 'scroll.end' },
    'd': { 'type': 'tabs.close' },
    'D': { 'type': 'tabs.close', 'select': 'left' },
    'x$': { 'type': 'tabs.close.right' },
    '!d': { 'type': 'tabs.close.force' },
    'u': { 'type': 'tabs.reopen' },
    'K': { 'type': 'tabs.prev' },
    'J': { 'type': 'tabs.next' },
    'gT': { 'type': 'tabs.prev' },
    'gt': { 'type': 'tabs.next' },
    'g0': { 'type': 'tabs.first' },
    'g$': { 'type': 'tabs.last' },
    '<C-6>': { 'type': 'tabs.prevsel' },
    'r': { 'type': 'tabs.reload', 'cache': false },
    'R': { 'type': 'tabs.reload', 'cache': true },
    'zp': { 'type': 'tabs.pin.toggle' },
    'zd': { 'type': 'tabs.duplicate' },
    'zi': { 'type': 'zoom.in' },
    'zo': { 'type': 'zoom.out' },
    'zz': { 'type': 'zoom.neutral' },
    'f': { 'type': 'follow.start', 'newTab': false, 'background': false },
    'F': { 'type': 'follow.start', 'newTab': true, 'background': false },
    'm': { 'type': 'mark.set.prefix' },
    '\'': { 'type': 'mark.jump.prefix' },
    'H': { 'type': 'navigate.history.prev' },
    'L': { 'type': 'navigate.history.next' },
    '[[': { 'type': 'navigate.link.prev' },
    ']]': { 'type': 'navigate.link.next' },
    'gu': { 'type': 'navigate.parent' },
    'gU': { 'type': 'navigate.root' },
    'gi': { 'type': 'focus.input' },
    'gf': { 'type': 'page.source' },
    'gh': { 'type': 'page.home', 'newTab': false },
    'gH': { 'type': 'page.home', 'newTab': true },
    'y': { 'type': 'urls.yank' },
    'p': { 'type': 'urls.paste', 'newTab': false },
    'P': { 'type': 'urls.paste', 'newTab': true },
    '/': { 'type': 'find.start' },
    'n': { 'type': 'find.next' },
    'N': { 'type': 'find.prev' },
    '.': { 'type': 'repeat.last' },
    '<S-Esc>': { 'type': 'addon.toggle.enabled' }
  },
  search: {
    default: 'google',
    engines: {
      'google': 'https://google.com/search?q={}',
      'yahoo': 'https://search.yahoo.com/search?p={}',
      'bing': 'https://www.bing.com/search?q={}',
      'duckduckgo': 'https://duckduckgo.com/?q={}',
      'twitter': 'https://twitter.com/search?q={}',
      'wikipedia': 'https://en.wikipedia.org/w/index.php?search={}'
    }
  },
  properties: {
    hintchars: 'abcdefghijklmnopqrstuvwxyz',
    smoothscroll: false,
    complete: 'sbh'
  },
  blacklist: [],
});