mirror of
https://github.com/qvacua/vimr.git
synced 2024-12-25 06:43:24 +03:00
Merge branch 'develop' into update-neovim
Conflicts: NvimServer NvimView/Sources/NvimView/NvimAutoCommandEvent.generated.swift NvimView/Sources/NvimView/NvimCursorModeShape.generated.swift
This commit is contained in:
commit
69e650b16f
15
DEVELOP.md
15
DEVELOP.md
@ -38,21 +38,6 @@ then continuously invoke the `build_nvimserver_for_local_dev` script.
|
||||
|
||||
## How to release
|
||||
|
||||
### NvimServer
|
||||
|
||||
* Tag with the name `nvimserver-x.y.z-n`. GitHub actions will build the `x86_64` version,
|
||||
create a release and upload it.
|
||||
* Build the `arm64` version locally and upload it:
|
||||
```bash
|
||||
clean=true build_libnvim=true ./NvimServer/bin/build_nvimserver.sh
|
||||
```
|
||||
* Build a universal binary by the following and upload the artefact:
|
||||
```bash
|
||||
tag=nvimserver-x.y.z-n ./NvimServer/bin/build_release.sh
|
||||
```
|
||||
|
||||
### VimR
|
||||
|
||||
* Set a new version of VimR via
|
||||
```bash
|
||||
is_snapshot=true ./bin/set_new_versions.sh # for snapshot or
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
public class GitUtils {
|
||||
public final class GitUtils {
|
||||
static func globalGitignoreFileUrl() -> URL? {
|
||||
guard let path = shellCommandOutput(
|
||||
"git config --get core.excludesFile",
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
public class Ignore {
|
||||
public final class Ignore {
|
||||
public static let defaultIgnoreFileNames = [".ignore", ".gitignore"]
|
||||
public static let vcsFolderPattern = [".svn/", ".hg/", ".git/"]
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
import Cocoa
|
||||
|
||||
class KeyUtils {
|
||||
final class KeyUtils {
|
||||
static func isControlCode(key: String) -> Bool {
|
||||
guard key.count == 1 else {
|
||||
return false
|
||||
|
@ -1,4 +1,8 @@
|
||||
<<<<<<< HEAD
|
||||
// Auto generated for nvim v0.8.0-dev
|
||||
=======
|
||||
// Auto generated for nvim v0.7.2
|
||||
>>>>>>> develop
|
||||
// See bin/generate_autocmds.py
|
||||
|
||||
enum NvimAutoCommandEvent: Int {
|
||||
|
@ -25,7 +25,7 @@ public protocol NvimViewDelegate: AnyObject {
|
||||
func isMenuItemKeyEquivalent(_: NSEvent) -> Bool
|
||||
}
|
||||
|
||||
public class NvimView: NSView,
|
||||
public final class NvimView: NSView,
|
||||
UiBridgeConsumer,
|
||||
NSUserInterfaceValidations,
|
||||
NSTextInputClient
|
||||
|
@ -41,7 +41,7 @@ protocol UiBridgeConsumer: AnyObject {
|
||||
func suspend()
|
||||
}
|
||||
|
||||
class UiBridge {
|
||||
final class UiBridge {
|
||||
weak var consumer: UiBridgeConsumer?
|
||||
|
||||
init(uuid: UUID, config: NvimView.Config) {
|
||||
|
@ -53,7 +53,7 @@ git submodule update
|
||||
xcode-select --install # install the Xcode command line tools, if you haven't already
|
||||
brew bundle
|
||||
|
||||
code_sign=false use_carthage_cache=false ./bin/build_vimr.sh
|
||||
clean=true notarize=false use_carthage_cache=false ./bin/build_vimr.sh
|
||||
# VimR.app will be placed in ./build/Build/Products/Release/
|
||||
```
|
||||
|
||||
|
@ -11,7 +11,7 @@
|
||||
|
||||
import Cocoa
|
||||
|
||||
class DraggingSingleRowStackView: NSStackView {
|
||||
final class DraggingSingleRowStackView: NSStackView {
|
||||
var postDraggingHandler: ((NSStackView, NSView) -> Void)?
|
||||
|
||||
override func mouseDragged(with event: NSEvent) {
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
import Cocoa
|
||||
|
||||
class HorizontalOnlyScrollView: NSScrollView {
|
||||
final class HorizontalOnlyScrollView: NSScrollView {
|
||||
// Needed to be able to override scrollWheel(with:)
|
||||
// https://stackoverflow.com/a/31201614
|
||||
override static var isCompatibleWithResponsiveScrolling: Bool { true }
|
||||
|
@ -13,7 +13,7 @@ struct TabPosition: OptionSet {
|
||||
let rawValue: Int
|
||||
}
|
||||
|
||||
class Tab<Rep: TabRepresentative>: NSView {
|
||||
final class Tab<Rep: TabRepresentative>: NSView {
|
||||
var title: String { self.tabRepresentative.title }
|
||||
|
||||
var tabRepresentative: Rep {
|
||||
|
@ -11,7 +11,7 @@ public protocol TabRepresentative: Hashable {
|
||||
var isSelected: Bool { get }
|
||||
}
|
||||
|
||||
public class TabBar<Rep: TabRepresentative>: NSView {
|
||||
public final class TabBar<Rep: TabRepresentative>: NSView {
|
||||
public typealias TabCallback = (Int, Rep, [Rep]) -> Void
|
||||
|
||||
public var theme: Theme { self._theme }
|
||||
|
@ -1127,7 +1127,7 @@
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_IDENTITY = "-";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 20220618.161750;
|
||||
CURRENT_PROJECT_VERSION = 20220626.182832;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
@ -1188,7 +1188,7 @@
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_IDENTITY = "-";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 20220618.161750;
|
||||
CURRENT_PROJECT_VERSION = 20220626.182832;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
@ -1217,7 +1217,7 @@
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 20220618.161750;
|
||||
CURRENT_PROJECT_VERSION = 20220626.182832;
|
||||
DEFINES_MODULE = YES;
|
||||
IBC_MODULE = VimR;
|
||||
INFOPLIST_FILE = VimR/Info.plist;
|
||||
@ -1239,7 +1239,7 @@
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 20220618.161750;
|
||||
CURRENT_PROJECT_VERSION = 20220626.182832;
|
||||
DEFINES_MODULE = YES;
|
||||
IBC_MODULE = VimR;
|
||||
INFOPLIST_FILE = VimR/Info.plist;
|
||||
|
@ -57,6 +57,16 @@
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "4BEBA5041CFF374B00673FDF"
|
||||
BuildableName = "VimR.app"
|
||||
BlueprintName = "VimR"
|
||||
ReferencedContainer = "container:VimR.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
class AdvancedPrefReducer: ReducerType {
|
||||
final class AdvancedPrefReducer: ReducerType {
|
||||
typealias StateType = AppState
|
||||
typealias ActionType = AdvancedPref.Action
|
||||
|
||||
|
@ -7,7 +7,7 @@ import Cocoa
|
||||
import PureLayout
|
||||
import RxSwift
|
||||
|
||||
class AdvancedPref: PrefPane, UiComponent, NSTextFieldDelegate {
|
||||
final class AdvancedPref: PrefPane, UiComponent, NSTextFieldDelegate {
|
||||
typealias StateType = AppState
|
||||
|
||||
enum Action {
|
||||
|
@ -14,7 +14,7 @@ import Sparkle
|
||||
|
||||
let debugMenuItemIdentifier = NSUserInterfaceItemIdentifier("debug-menu-item")
|
||||
|
||||
class UpdaterDelegate: NSObject, SPUUpdaterDelegate {
|
||||
final class UpdaterDelegate: NSObject, SPUUpdaterDelegate {
|
||||
var useSnapshotChannel = false
|
||||
|
||||
func feedURLString(for _: SPUUpdater) -> String? {
|
||||
@ -27,7 +27,7 @@ class UpdaterDelegate: NSObject, SPUUpdaterDelegate {
|
||||
}
|
||||
|
||||
@NSApplicationMain
|
||||
class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDelegate {
|
||||
final class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDelegate {
|
||||
struct OpenConfig {
|
||||
var urls: [URL]
|
||||
var cwd: URL
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
class AppDelegateReducer: ReducerType {
|
||||
final class AppDelegateReducer: ReducerType {
|
||||
typealias StateType = AppState
|
||||
typealias ActionType = AppDelegate.Action
|
||||
|
||||
|
@ -8,7 +8,9 @@ import NvimView
|
||||
import PureLayout
|
||||
import RxSwift
|
||||
|
||||
class AppearancePref: PrefPane, NSComboBoxDelegate, NSControlTextEditingDelegate, NSFontChanging {
|
||||
final class AppearancePref: PrefPane, NSComboBoxDelegate, NSControlTextEditingDelegate,
|
||||
NSFontChanging
|
||||
{
|
||||
typealias StateType = AppState
|
||||
|
||||
enum Action {
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
class AppearancePrefReducer: ReducerType {
|
||||
final class AppearancePrefReducer: ReducerType {
|
||||
typealias StateType = AppState
|
||||
typealias ActionType = AppearancePref.Action
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
import Cocoa
|
||||
import Sparkle
|
||||
|
||||
class Application: NSApplication {
|
||||
final class Application: NSApplication {
|
||||
override init() {
|
||||
setPressAndHoldSetting()
|
||||
super.init()
|
||||
|
@ -9,7 +9,7 @@ import NvimView
|
||||
import PureLayout
|
||||
import RxSwift
|
||||
|
||||
class BuffersList: NSView,
|
||||
final class BuffersList: NSView,
|
||||
UiComponent,
|
||||
NSTableViewDataSource,
|
||||
NSTableViewDelegate,
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
class BuffersListReducer: ReducerType {
|
||||
final class BuffersListReducer: ReducerType {
|
||||
typealias StateType = MainWindow.State
|
||||
typealias ActionType = UuidAction<BuffersList.Action>
|
||||
|
||||
|
@ -12,7 +12,7 @@ extension ReduxTypes {
|
||||
typealias ActionType = AnyAction
|
||||
}
|
||||
|
||||
class Context: ReduxContext {
|
||||
final class Context: ReduxContext {
|
||||
// The following should only be used when Cmd-Q'ing
|
||||
func savePrefs() { self.prefMiddleware.applyPref(from: self.state) }
|
||||
|
||||
|
@ -8,7 +8,7 @@ import CoreData
|
||||
import Foundation
|
||||
import os
|
||||
|
||||
class CoreDataStack {
|
||||
final class CoreDataStack {
|
||||
enum Error: Swift.Error {
|
||||
case noCacheFolder
|
||||
case pathDoesNotExit
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
import Cocoa
|
||||
|
||||
class CssUtils {
|
||||
final class CssUtils {
|
||||
static let cssOverridesTemplate: String = try! String(
|
||||
contentsOf: Resources.cssOverridesTemplateUrl
|
||||
)
|
||||
|
@ -6,7 +6,7 @@
|
||||
import Foundation
|
||||
import RxSwift
|
||||
|
||||
class Debouncer<T> {
|
||||
final class Debouncer<T> {
|
||||
let observable: Observable<T>
|
||||
|
||||
init(interval: RxTimeInterval) {
|
||||
|
@ -10,7 +10,7 @@ import PureLayout
|
||||
import RxSwift
|
||||
import Workspace
|
||||
|
||||
class FileBrowser: NSView,
|
||||
final class FileBrowser: NSView,
|
||||
UiComponent
|
||||
{
|
||||
typealias StateType = MainWindow.State
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
class FileBrowserReducer: ReducerType {
|
||||
final class FileBrowserReducer: ReducerType {
|
||||
typealias StateType = MainWindow.State
|
||||
typealias ActionType = UuidAction<FileBrowser.Action>
|
||||
|
||||
|
@ -8,7 +8,7 @@ import EonilFSEvents
|
||||
import Foundation
|
||||
import os
|
||||
|
||||
class FileMonitor {
|
||||
final class FileMonitor {
|
||||
static let fileSystemEventsLatency = 1.0
|
||||
|
||||
private(set) var urlToMonitor = FileUtils.userHomeUrl
|
||||
|
@ -11,7 +11,7 @@ import os
|
||||
import PureLayout
|
||||
import RxSwift
|
||||
|
||||
class FileOutlineView: NSOutlineView,
|
||||
final class FileOutlineView: NSOutlineView,
|
||||
UiComponent,
|
||||
NSOutlineViewDelegate,
|
||||
ThemedView
|
||||
@ -495,7 +495,7 @@ extension FileOutlineView {
|
||||
}
|
||||
}
|
||||
|
||||
class Node: NSObject, Comparable {
|
||||
final class Node: NSObject, Comparable {
|
||||
static func < (lhs: Node, rhs: Node) -> Bool { lhs.displayName < rhs.displayName }
|
||||
|
||||
@objc dynamic var url: URL
|
||||
|
@ -10,7 +10,7 @@ import Ignore
|
||||
import os
|
||||
import Misc
|
||||
|
||||
class FuzzySearchService {
|
||||
final class FuzzySearchService {
|
||||
typealias ScoredUrlsCallback = ([ScoredUrl]) -> Void
|
||||
|
||||
var root: URL {
|
||||
|
@ -7,7 +7,7 @@ import Cocoa
|
||||
import PureLayout
|
||||
import RxSwift
|
||||
|
||||
class GeneralPref: PrefPane, UiComponent, NSTextFieldDelegate {
|
||||
final class GeneralPref: PrefPane, UiComponent, NSTextFieldDelegate {
|
||||
typealias StateType = AppState
|
||||
|
||||
enum Action {
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
class GeneralPrefReducer: ReducerType {
|
||||
final class GeneralPrefReducer: ReducerType {
|
||||
typealias StateType = AppState
|
||||
typealias ActionType = GeneralPref.Action
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
import Commons
|
||||
import Foundation
|
||||
|
||||
class HtmlPreviewMiddleware: MiddlewareType {
|
||||
final class HtmlPreviewMiddleware: MiddlewareType {
|
||||
static func selectFirstHtmlUrl(uuid: UUID) -> URL {
|
||||
FileUtils.tempDir().appendingPathComponent("\(uuid)-select-first.html")
|
||||
}
|
||||
|
@ -14,7 +14,7 @@ import Workspace
|
||||
|
||||
private let fileSystemEventsLatency = 1.0
|
||||
|
||||
class HtmlPreviewTool: NSView, UiComponent, WKNavigationDelegate {
|
||||
final class HtmlPreviewTool: NSView, UiComponent, WKNavigationDelegate {
|
||||
enum Action {
|
||||
case selectHtmlFile(URL)
|
||||
}
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
class HtmlPreviewReducer {
|
||||
final class HtmlPreviewReducer {
|
||||
static let basePath = "tools/html-preview"
|
||||
|
||||
static func serverUrl(baseUrl: URL, uuid: UUID) -> URL {
|
||||
|
@ -7,7 +7,7 @@ import Foundation
|
||||
import os
|
||||
import Swifter
|
||||
|
||||
class HttpServerMiddleware {
|
||||
final class HttpServerMiddleware {
|
||||
let htmlPreviewTool: HtmlPreviewToolMiddleware
|
||||
let htmlPreviewMainWindow: HtmlPreviewMainWindowMiddleware
|
||||
let markdownPreview: MarkdownPreviewMiddleware
|
||||
|
@ -6,7 +6,7 @@ import Foundation
|
||||
import Ignore
|
||||
import OrderedCollections
|
||||
|
||||
class IgnoreService {
|
||||
final class IgnoreService {
|
||||
var root: URL {
|
||||
didSet {
|
||||
self.rootIgnore = Ignore(base: self.root, parent: Ignore.globalGitignore(base: self.root))
|
||||
|
@ -6,7 +6,7 @@
|
||||
import Cocoa
|
||||
import PureLayout
|
||||
|
||||
class ImageAndTextTableCell: NSTableCellView {
|
||||
final class ImageAndTextTableCell: NSTableCellView {
|
||||
private let _textField = NSTextField(forAutoLayout: ())
|
||||
private let _imageView = NSImageView(forAutoLayout: ())
|
||||
|
||||
|
@ -1224,7 +1224,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>0.40.0</string>
|
||||
<string>0.41.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleURLTypes</key>
|
||||
@ -1241,7 +1241,7 @@
|
||||
</dict>
|
||||
</array>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>20220618.161750</string>
|
||||
<string>20220626.182832</string>
|
||||
<key>LSApplicationCategoryType</key>
|
||||
<string>public.app-category.productivity</string>
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
|
@ -7,7 +7,7 @@ import Cocoa
|
||||
import PureLayout
|
||||
import RxSwift
|
||||
|
||||
class KeysPref: PrefPane, UiComponent, NSTextFieldDelegate {
|
||||
final class KeysPref: PrefPane, UiComponent, NSTextFieldDelegate {
|
||||
typealias StateType = AppState
|
||||
|
||||
enum Action {
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
class KeysPrefReducer: ReducerType {
|
||||
final class KeysPrefReducer: ReducerType {
|
||||
typealias StateType = AppState
|
||||
typealias ActionType = KeysPref.Action
|
||||
|
||||
|
@ -11,7 +11,7 @@ import RxSwift
|
||||
import Tabs
|
||||
import Workspace
|
||||
|
||||
class MainWindow: NSObject,
|
||||
final class MainWindow: NSObject,
|
||||
UiComponent,
|
||||
NSWindowDelegate,
|
||||
NSUserInterfaceValidations,
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
class MainWindowReducer: ReducerType {
|
||||
final class MainWindowReducer: ReducerType {
|
||||
typealias StateType = MainWindow.State
|
||||
typealias ActionType = UuidAction<MainWindow.Action>
|
||||
|
||||
|
@ -7,7 +7,7 @@ import Down
|
||||
import Foundation
|
||||
import os
|
||||
|
||||
class MarkdownPreviewMiddleware {
|
||||
final class MarkdownPreviewMiddleware {
|
||||
let markdownTool: MarkdownToolMiddleware
|
||||
let mainWindow: MainWindowMiddleware
|
||||
|
||||
|
@ -7,7 +7,7 @@ import Cocoa
|
||||
import Commons
|
||||
import NvimView
|
||||
|
||||
class MarkdownPreviewReducer {
|
||||
final class MarkdownPreviewReducer {
|
||||
private static func previewState(
|
||||
for uuid: UUID,
|
||||
baseUrl: URL,
|
||||
|
@ -10,7 +10,7 @@ import PureLayout
|
||||
import RxSwift
|
||||
import WebKit
|
||||
|
||||
class MarkdownTool: NSView, UiComponent, WKNavigationDelegate {
|
||||
final class MarkdownTool: NSView, UiComponent, WKNavigationDelegate {
|
||||
enum Action {
|
||||
case refreshNow
|
||||
case reverseSearch(to: Position)
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
class MarkdownToolReducer: ReducerType {
|
||||
final class MarkdownToolReducer: ReducerType {
|
||||
typealias StateType = MainWindow.State
|
||||
typealias ActionType = UuidAction<MarkdownTool.Action>
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
import Cocoa
|
||||
|
||||
class OpenQuicklyFileViewRow: NSTableRowView {
|
||||
final class OpenQuicklyFileViewRow: NSTableRowView {
|
||||
override func drawSelection(in dirtyRect: NSRect) {
|
||||
if self.isSelected {
|
||||
NSColor.selectedControlColor.set()
|
||||
|
@ -6,7 +6,7 @@
|
||||
import Foundation
|
||||
import RxSwift
|
||||
|
||||
class OpenQuicklyReducer: ReducerType {
|
||||
final class OpenQuicklyReducer: ReducerType {
|
||||
typealias StateType = AppState
|
||||
typealias ActionType = OpenQuicklyWindow.Action
|
||||
|
||||
|
@ -10,7 +10,7 @@ import PureLayout
|
||||
import RxCocoa
|
||||
import RxSwift
|
||||
|
||||
class OpenQuicklyWindow: NSObject,
|
||||
final class OpenQuicklyWindow: NSObject,
|
||||
UiComponent,
|
||||
NSWindowDelegate,
|
||||
NSTextFieldDelegate,
|
||||
|
@ -7,7 +7,7 @@ import Cocoa
|
||||
import DictionaryCoding
|
||||
import os
|
||||
|
||||
class PrefMiddleware: MiddlewareType {
|
||||
final class PrefMiddleware: MiddlewareType {
|
||||
typealias StateType = AppState
|
||||
typealias ActionType = AnyAction
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
//
|
||||
// Created by Tae Won Ha on 2/27/17.
|
||||
// Copyright (c) 2017 Tae Won Ha. All rights reserved.
|
||||
//
|
||||
/**
|
||||
* Tae Won Ha - http://taewon.de - @hataewon
|
||||
* See LICENSE
|
||||
*/
|
||||
|
||||
import Cocoa
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
import Cocoa
|
||||
import NvimView
|
||||
|
||||
class PrefUtils {
|
||||
final class PrefUtils {
|
||||
static func value<T>(from dict: [String: Any], for key: String) -> T? {
|
||||
dict[key] as? T
|
||||
}
|
||||
|
@ -7,7 +7,7 @@ import Cocoa
|
||||
import PureLayout
|
||||
import RxSwift
|
||||
|
||||
class PrefWindow: NSObject,
|
||||
final class PrefWindow: NSObject,
|
||||
UiComponent,
|
||||
NSWindowDelegate,
|
||||
NSTableViewDataSource, NSTableViewDelegate
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
class PrefWindowReducer: ReducerType {
|
||||
final class PrefWindowReducer: ReducerType {
|
||||
typealias StateType = AppState
|
||||
typealias ActionType = PrefWindow.Action
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
class Resources {
|
||||
final class Resources {
|
||||
static let resourceUrl = Bundle.main.resourceURL!
|
||||
static let previewUrl = resourceUrl.appendingPathComponent("preview")
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
class RpcAppearanceEpic: EpicType {
|
||||
final class RpcAppearanceEpic: EpicType {
|
||||
typealias StateType = AppState
|
||||
typealias ActionType = UuidAction<MainWindow.Action>
|
||||
typealias EmitActionType = AppearancePref.Action
|
||||
|
@ -10,7 +10,7 @@ extension Observable {
|
||||
func completableSubject() -> CompletableSubject<Element> { CompletableSubject(source: self) }
|
||||
}
|
||||
|
||||
class CompletableSubject<T> {
|
||||
final class CompletableSubject<T> {
|
||||
func asObservable() -> Observable<T> { self.subject.asObservable() }
|
||||
|
||||
init(source: Observable<T>) {
|
||||
|
@ -40,7 +40,7 @@ protocol ReduxContextType {
|
||||
/**
|
||||
`typealias` `StateType` and `ActionType` either within the class definition or in an extension.
|
||||
*/
|
||||
class ReduxTypes: ReduxContextType {}
|
||||
final class ReduxTypes: ReduxContextType {}
|
||||
|
||||
protocol ReducerType {
|
||||
associatedtype StateType
|
||||
@ -110,7 +110,7 @@ protocol UiComponent {
|
||||
init(source: Observable<StateType>, emitter: ActionEmitter, state: StateType)
|
||||
}
|
||||
|
||||
class ActionEmitter {
|
||||
final class ActionEmitter {
|
||||
var observable: Observable<ReduxTypes.ActionType> {
|
||||
self.subject.asObservable().observe(on: self.scheduler)
|
||||
}
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
import Cocoa
|
||||
|
||||
class ShortcutItem: NSObject, Comparable {
|
||||
final class ShortcutItem: NSObject, Comparable {
|
||||
static func < (lhs: ShortcutItem, rhs: ShortcutItem) -> Bool { lhs.title < rhs.title }
|
||||
|
||||
@objc dynamic var title: String
|
||||
|
@ -6,7 +6,7 @@
|
||||
import Cocoa
|
||||
import ShortcutRecorder
|
||||
|
||||
class ShortcutService {
|
||||
final class ShortcutService {
|
||||
func update(shortcuts: [Shortcut]) {
|
||||
self.shortcuts = shortcuts
|
||||
}
|
||||
|
@ -8,7 +8,7 @@ import PureLayout
|
||||
import RxSwift
|
||||
import ShortcutRecorder
|
||||
|
||||
class ShortcutsPref: PrefPane,
|
||||
final class ShortcutsPref: PrefPane,
|
||||
UiComponent,
|
||||
NSOutlineViewDelegate,
|
||||
RecorderControlDelegate
|
||||
|
@ -6,7 +6,7 @@
|
||||
import Cocoa
|
||||
import ShortcutRecorder
|
||||
|
||||
class ShortcutTableRow: NSTableRowView {
|
||||
final class ShortcutTableRow: NSTableRowView {
|
||||
init(withIdentifier identifier: String) {
|
||||
super.init(frame: .zero)
|
||||
self.identifier = NSUserInterfaceItemIdentifier(identifier)
|
||||
@ -18,7 +18,7 @@ class ShortcutTableRow: NSTableRowView {
|
||||
}
|
||||
}
|
||||
|
||||
class ShortcutTableCell: NSTableCellView {
|
||||
final class ShortcutTableCell: NSTableCellView {
|
||||
static let font = NSFont.systemFont(ofSize: 13)
|
||||
static let boldFont = NSFont.boldSystemFont(ofSize: 13)
|
||||
|
||||
|
@ -12,7 +12,7 @@ protocol ThemedView: AnyObject {
|
||||
var lastThemeMark: Token { get }
|
||||
}
|
||||
|
||||
class ThemedTableRow: NSTableRowView {
|
||||
final class ThemedTableRow: NSTableRowView {
|
||||
weak var triangleView: NSButton?
|
||||
var themeToken: Token
|
||||
|
||||
@ -32,7 +32,7 @@ class ThemedTableRow: NSTableRowView {
|
||||
}
|
||||
}
|
||||
|
||||
override open func drawBackground(in dirtyRect: NSRect) {
|
||||
override func drawBackground(in dirtyRect: NSRect) {
|
||||
if let cell = self.view(atColumn: 0) as? ThemedTableCell {
|
||||
if cell.isDir {
|
||||
cell.textField?.textColor
|
||||
@ -62,7 +62,7 @@ class ThemedTableRow: NSTableRowView {
|
||||
required init?(coder _: NSCoder) { fatalError("init(coder:) has not been implemented") }
|
||||
}
|
||||
|
||||
class ThemedTableCell: NSTableCellView {
|
||||
final class ThemedTableCell: NSTableCellView {
|
||||
// MARK: - API
|
||||
|
||||
static let font = NSFont.systemFont(ofSize: 12)
|
||||
|
@ -7,7 +7,7 @@ import Cocoa
|
||||
import PureLayout
|
||||
import RxSwift
|
||||
|
||||
class ToolsPref: PrefPane, UiComponent {
|
||||
final class ToolsPref: PrefPane, UiComponent {
|
||||
typealias StateType = AppState
|
||||
|
||||
enum Action {
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
class ToolsPrefReducer: ReducerType {
|
||||
final class ToolsPrefReducer: ReducerType {
|
||||
typealias StateType = AppState
|
||||
typealias ActionType = ToolsPref.Action
|
||||
|
||||
|
@ -16,7 +16,7 @@ protocol UuidTagged {
|
||||
var uuid: UUID { get }
|
||||
}
|
||||
|
||||
class UuidAction<A>: UuidTagged, CustomStringConvertible {
|
||||
final class UuidAction<A>: UuidTagged, CustomStringConvertible {
|
||||
let uuid: UUID
|
||||
let payload: A
|
||||
|
||||
@ -30,7 +30,7 @@ class UuidAction<A>: UuidTagged, CustomStringConvertible {
|
||||
}
|
||||
}
|
||||
|
||||
class UuidState<S>: UuidTagged, CustomStringConvertible {
|
||||
final class UuidState<S>: UuidTagged, CustomStringConvertible {
|
||||
let uuid: UUID
|
||||
let payload: S
|
||||
|
||||
@ -44,7 +44,7 @@ class UuidState<S>: UuidTagged, CustomStringConvertible {
|
||||
}
|
||||
}
|
||||
|
||||
class Token: Hashable, CustomStringConvertible {
|
||||
final class Token: Hashable, CustomStringConvertible {
|
||||
func hash(into hasher: inout Hasher) {
|
||||
hasher.combine(ObjectIdentifier(self))
|
||||
}
|
||||
@ -58,7 +58,7 @@ class Token: Hashable, CustomStringConvertible {
|
||||
}
|
||||
}
|
||||
|
||||
class Marked<T>: CustomStringConvertible {
|
||||
final class Marked<T>: CustomStringConvertible {
|
||||
let mark: Token
|
||||
let payload: T
|
||||
|
||||
@ -80,7 +80,7 @@ class Marked<T>: CustomStringConvertible {
|
||||
}
|
||||
}
|
||||
|
||||
class UiComponentTemplate: UiComponent {
|
||||
final class UiComponentTemplate: UiComponent {
|
||||
typealias StateType = State
|
||||
|
||||
struct State {
|
||||
|
@ -6,7 +6,7 @@
|
||||
import Cocoa
|
||||
import RxSwift
|
||||
|
||||
class UiRoot: UiComponent {
|
||||
final class UiRoot: UiComponent {
|
||||
typealias StateType = AppState
|
||||
|
||||
enum Action {
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
class UiRootReducer: ReducerType {
|
||||
final class UiRootReducer: ReducerType {
|
||||
typealias StateType = AppState
|
||||
typealias ActionType = UiRoot.Action
|
||||
|
||||
|
@ -15,10 +15,10 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>BNDL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>0.40.0</string>
|
||||
<string>0.41.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>20220618.161750</string>
|
||||
<string>20220626.182832</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
@ -18,7 +18,7 @@ open class CustomToolBar: NSView {
|
||||
- Close button
|
||||
- Cog button: not shown when there's no menu
|
||||
*/
|
||||
public class InnerToolBar: NSView, NSUserInterfaceValidations {
|
||||
public final class InnerToolBar: NSView, NSUserInterfaceValidations {
|
||||
// MARK: - Public
|
||||
|
||||
public static let iconDimension = 16.0
|
||||
|
@ -9,7 +9,7 @@ import PureLayout
|
||||
/**
|
||||
This class is used to display the placeholder bar when a tool is drag & dropped to a location with no existing tools.
|
||||
*/
|
||||
class ProxyWorkspaceBar: NSView {
|
||||
final class ProxyWorkspaceBar: NSView {
|
||||
var theme = Workspace.Theme.default
|
||||
|
||||
@available(*, unavailable)
|
||||
|
@ -21,7 +21,7 @@ public protocol WorkspaceDelegate: AnyObject {
|
||||
func moved(tool: WorkspaceTool)
|
||||
}
|
||||
|
||||
public class Workspace: NSView, WorkspaceBarDelegate {
|
||||
public final class Workspace: NSView, WorkspaceBarDelegate {
|
||||
// MARK: - Public
|
||||
|
||||
public struct Config {
|
||||
|
@ -45,7 +45,7 @@ private class ProxyBar: NSView {
|
||||
}
|
||||
}
|
||||
|
||||
class WorkspaceBar: NSView, WorkspaceToolDelegate {
|
||||
final class WorkspaceBar: NSView, WorkspaceToolDelegate {
|
||||
private static let separatorThickness = 1.0
|
||||
|
||||
fileprivate(set) var tools = [WorkspaceTool]()
|
||||
|
@ -10,7 +10,7 @@ protocol WorkspaceToolDelegate: AnyObject {
|
||||
func toggle(_ tool: WorkspaceTool)
|
||||
}
|
||||
|
||||
public class WorkspaceTool: NSView {
|
||||
public final class WorkspaceTool: NSView {
|
||||
public var dimension: CGFloat
|
||||
|
||||
// MARK: - Public
|
||||
|
@ -6,7 +6,7 @@
|
||||
import Cocoa
|
||||
import Commons
|
||||
|
||||
public class WorkspaceToolButton: NSView, NSDraggingSource {
|
||||
public final class WorkspaceToolButton: NSView, NSDraggingSource {
|
||||
private static let titlePadding = CGSize(width: 8, height: 2)
|
||||
private static let dummyButton = WorkspaceToolButton(title: "Dummy")
|
||||
|
||||
|
26
appcast.xml
26
appcast.xml
@ -6,32 +6,22 @@
|
||||
<description>Most recent changes with links to updates for VimR.</description>
|
||||
<language>en</language>
|
||||
<item>
|
||||
<title>v0.40.0-20220618.161750</title>
|
||||
<title>v0.41.0-20220626.182832</title>
|
||||
<link>https://twitter.com/vimrefined</link>
|
||||
<sparkle:version>20220618.161750</sparkle:version>
|
||||
<sparkle:shortVersionString>v0.40.0</sparkle:shortVersionString>
|
||||
<sparkle:version>20220626.182832</sparkle:version>
|
||||
<sparkle:shortVersionString>v0.41.0</sparkle:shortVersionString>
|
||||
<description><![CDATA[
|
||||
<ul>
|
||||
<li>Improved trackpad scrolling sensitivity (removed the option for customizing the sensitivity). Thanks @tsung-ju for the PR!</li>
|
||||
<li>Refactor open quickly:<ul>
|
||||
<li>Use <a href="https://github.com/jhawthorn/fzy">fzy</a> instead of <a href="https://github.com/MaskRay/ccls">ccls</a></li>
|
||||
<li>Replace <a href="https://github.com/ggreer/the_silver_searcher">The Silver Searcher</a>'s ignore mechanism with own implementation in Swift using <a href="https://github.com/davvid/wildmatch">wildmatch</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Dependencies updates<ul>
|
||||
<li>Quick/Nimble@10.0.0</li>
|
||||
<li>qvacua/misc.swift@0.0.1</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Neovim 0.7.2 😀</li>
|
||||
</ul>
|
||||
]]></description>
|
||||
<releaseNotesLink>
|
||||
https://github.com/qvacua/vimr/releases/tag/v0.40.0-20220618.161750
|
||||
https://github.com/qvacua/vimr/releases/tag/v0.41.0-20220626.182832
|
||||
</releaseNotesLink>
|
||||
<pubDate>2022-06-18T16:26:12.761684</pubDate>
|
||||
<pubDate>2022-06-26T18:52:31.247376</pubDate>
|
||||
<minimumSystemVersion>10.13.0</minimumSystemVersion>
|
||||
<enclosure url="https://github.com/qvacua/vimr/releases/download/v0.40.0-20220618.161750/VimR-v0.40.0.tar.bz2"
|
||||
sparkle:edSignature="ajaCAcCSK14qN1Fo7zGWM5p+GdkID9S+14tHPjJWGJg9ZyA7qCM0j+FPE8WRpRc9ymvs77zxxTPcEL8qwLpDCg==" length="21435446"
|
||||
<enclosure url="https://github.com/qvacua/vimr/releases/download/v0.41.0-20220626.182832/VimR-v0.41.0.tar.bz2"
|
||||
sparkle:edSignature="IUqDBwkTsTFh6M//X1AL21+4q2CbiBjv1PZZDdp3tqP84iwBq9VIauTY4sw07PrRE3xZ09w+CwZ/BNeVKGzfDg==" length="21355568"
|
||||
type="application/octet-stream"/>
|
||||
</item>
|
||||
</channel>
|
||||
|
@ -6,32 +6,22 @@
|
||||
<description>Most recent changes with links to updates for VimR.</description>
|
||||
<language>en</language>
|
||||
<item>
|
||||
<title>v0.40.0-20220618.161750</title>
|
||||
<title>v0.41.0-20220626.182832</title>
|
||||
<link>https://twitter.com/vimrefined</link>
|
||||
<sparkle:version>20220618.161750</sparkle:version>
|
||||
<sparkle:shortVersionString>v0.40.0</sparkle:shortVersionString>
|
||||
<sparkle:version>20220626.182832</sparkle:version>
|
||||
<sparkle:shortVersionString>v0.41.0</sparkle:shortVersionString>
|
||||
<description><![CDATA[
|
||||
<ul>
|
||||
<li>Improved trackpad scrolling sensitivity (removed the option for customizing the sensitivity). Thanks @tsung-ju for the PR!</li>
|
||||
<li>Refactor open quickly:<ul>
|
||||
<li>Use <a href="https://github.com/jhawthorn/fzy">fzy</a> instead of <a href="https://github.com/MaskRay/ccls">ccls</a></li>
|
||||
<li>Replace <a href="https://github.com/ggreer/the_silver_searcher">The Silver Searcher</a>'s ignore mechanism with own implementation in Swift using <a href="https://github.com/davvid/wildmatch">wildmatch</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Dependencies updates<ul>
|
||||
<li>Quick/Nimble@10.0.0</li>
|
||||
<li>qvacua/misc.swift@0.0.1</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Neovim 0.7.2 😀</li>
|
||||
</ul>
|
||||
]]></description>
|
||||
<releaseNotesLink>
|
||||
https://github.com/qvacua/vimr/releases/tag/v0.40.0-20220618.161750
|
||||
https://github.com/qvacua/vimr/releases/tag/v0.41.0-20220626.182832
|
||||
</releaseNotesLink>
|
||||
<pubDate>2022-06-18T16:26:12.761684</pubDate>
|
||||
<pubDate>2022-06-26T18:52:31.247376</pubDate>
|
||||
<minimumSystemVersion>10.13.0</minimumSystemVersion>
|
||||
<enclosure url="https://github.com/qvacua/vimr/releases/download/v0.40.0-20220618.161750/VimR-v0.40.0.tar.bz2"
|
||||
sparkle:edSignature="ajaCAcCSK14qN1Fo7zGWM5p+GdkID9S+14tHPjJWGJg9ZyA7qCM0j+FPE8WRpRc9ymvs77zxxTPcEL8qwLpDCg==" length="21435446"
|
||||
<enclosure url="https://github.com/qvacua/vimr/releases/download/v0.41.0-20220626.182832/VimR-v0.41.0.tar.bz2"
|
||||
sparkle:edSignature="IUqDBwkTsTFh6M//X1AL21+4q2CbiBjv1PZZDdp3tqP84iwBq9VIauTY4sw07PrRE3xZ09w+CwZ/BNeVKGzfDg==" length="21355568"
|
||||
type="application/octet-stream"/>
|
||||
</item>
|
||||
</channel>
|
||||
|
@ -11,7 +11,7 @@ main() {
|
||||
|
||||
pushd "./NvimServer"
|
||||
./NvimServer/bin/build_nvimserver.sh
|
||||
cp ./.build/release/NvimServer ../NvimView/Sources/NvimView/Resources
|
||||
cp ./.build/apple/Products/Release/NvimServer ../NvimView/Sources/NvimView/Resources
|
||||
cp -r ./runtime ../NvimView/Sources/NvimView/Resources
|
||||
cp ../NvimView/Sources/NvimView/Resources/com.qvacua.NvimView.vim ../NvimView/Sources/NvimView/Resources/runtime/plugin
|
||||
popd >/dev/null
|
||||
|
@ -56,9 +56,7 @@ check_gh_release_present() {
|
||||
|
||||
build_release() {
|
||||
echo "### Building release"
|
||||
code_sign=true use_carthage_cache=false ./bin/build_vimr.sh
|
||||
|
||||
vimr_app_path="${build_folder_path}/VimR.app" ./bin/notarize_vimr.sh
|
||||
clean=true notarize=true use_carthage_cache=false ./bin/build_vimr.sh
|
||||
|
||||
pushd "${build_folder_path}" >/dev/null
|
||||
tar cjf "VimR-${marketing_version}.tar.bz2" VimR.app
|
||||
|
@ -1,14 +1,31 @@
|
||||
#!/bin/bash
|
||||
set -Eeuo pipefail
|
||||
|
||||
readonly code_sign=${code_sign:?"true or false"}
|
||||
readonly notarize=${notarize:?"true or false"}
|
||||
readonly use_carthage_cache=${use_carthage_cache:?"true or false"}
|
||||
readonly clean=${clean:?"true or false"}
|
||||
|
||||
main () {
|
||||
pushd "$(dirname "${BASH_SOURCE[0]}")/.." >/dev/null
|
||||
echo "### Building VimR target"
|
||||
prepare_nvimserver() {
|
||||
resources_folder="./NvimView/Sources/NvimView/Resources"
|
||||
rm -rf "${resources_folder}/NvimServer"
|
||||
rm -rf "${resources_folder}/runtime"
|
||||
|
||||
local -r build_path="./build"
|
||||
# Build NvimServer and copy
|
||||
build_libnvim=true ./NvimServer/NvimServer/bin/build_nvimserver.sh
|
||||
cp ./NvimServer/.build/apple/Products/Release/NvimServer "${resources_folder}"
|
||||
|
||||
# Create and copy runtime folder
|
||||
install_path="$(/usr/bin/mktemp -d -t 'nvim-runtime')"
|
||||
nvim_install_path="${install_path}" ./NvimServer/NvimServer/bin/build_runtime.sh
|
||||
cp -r "${install_path}/share/nvim/runtime" "${resources_folder}"
|
||||
rm -rf "${install_path}"
|
||||
|
||||
# Copy VimR specific vim file to runtime/plugin folder
|
||||
cp "${resources_folder}/com.qvacua.NvimView.vim" "${resources_folder}/runtime/plugin"
|
||||
}
|
||||
|
||||
build_vimr() {
|
||||
local -r build_path=$1
|
||||
|
||||
# Carthage often crashes => do it at the beginning.
|
||||
echo "### Updating carthage"
|
||||
@ -18,22 +35,31 @@ main () {
|
||||
carthage update --platform macos
|
||||
fi
|
||||
|
||||
./bin/download_nvimserver.sh
|
||||
|
||||
echo "### Xcodebuilding"
|
||||
rm -rf ${build_path}
|
||||
|
||||
xcodebuild -configuration Release -derivedDataPath ${build_path} \
|
||||
rm -rf "${build_path}"
|
||||
xcodebuild \
|
||||
-configuration Release -derivedDataPath "${build_path}" \
|
||||
-workspace VimR.xcworkspace -scheme VimR \
|
||||
clean build
|
||||
}
|
||||
|
||||
if [[ "${code_sign}" == true ]]; then
|
||||
local -r -x vimr_app_path="${build_path}/Build/Products/Release/VimR.app"
|
||||
./bin/sign_vimr.sh
|
||||
main () {
|
||||
pushd "$(dirname "${BASH_SOURCE[0]}")/.." >/dev/null
|
||||
echo "### Building VimR"
|
||||
|
||||
prepare_nvimserver
|
||||
|
||||
local -r build_path="./build"
|
||||
build_vimr "${build_path}"
|
||||
|
||||
if [[ "${notarize}" == true ]]; then
|
||||
local -r -x vimr_app_path="${build_path}/Build/Products/Release/VimR.app"
|
||||
./bin/sign_vimr.sh
|
||||
./bin/notarize_vimr.sh
|
||||
fi
|
||||
|
||||
echo "### Built VimR target"
|
||||
echo "### VimR built in ${build_path}/Build/Products/VimR.app"
|
||||
popd >/dev/null
|
||||
}
|
||||
|
||||
main
|
||||
main
|
||||
|
@ -1,6 +1,7 @@
|
||||
#!/bin/bash
|
||||
set -Eeuo pipefail
|
||||
|
||||
readonly clean=${clean:?"true or false"}
|
||||
readonly use_committed_nvim=${use_committed_nvim:?"If true, checkout the committed version of nvim, otherwise use the workspace."}
|
||||
|
||||
main() {
|
||||
@ -23,7 +24,6 @@ main() {
|
||||
nvim_version="v$major.$minor.$patch$prerelease"
|
||||
echo "### Using nvim version: $nvim_version"
|
||||
|
||||
local -r -x build_deps=false
|
||||
./NvimServer/bin/build_libnvim.sh
|
||||
popd > /dev/null
|
||||
|
||||
|
@ -2,6 +2,10 @@
|
||||
|
||||
* ...
|
||||
|
||||
# 0.41.0-20220626.182832
|
||||
|
||||
* Neovim 0.7.2 😀
|
||||
|
||||
# 0.40.0-20220618.161750
|
||||
|
||||
* Improved trackpad scrolling sensitivity (removed the option for customizing the sensitivity). Thanks @tsung-ju for the PR!
|
||||
|
Loading…
Reference in New Issue
Block a user