Skip to content

Commit

Permalink
Merge branch 'master' into update-neovim
Browse files Browse the repository at this point in the history
  • Loading branch information
qvacua committed Dec 23, 2022
2 parents 9520130 + d7b2574 commit 339bd0c
Show file tree
Hide file tree
Showing 42 changed files with 209 additions and 167 deletions.
2 changes: 1 addition & 1 deletion .swiftformat
@@ -1,6 +1,6 @@
--swiftversion 5.3

--exclude Carthage,third-party,**/*.generated.swift
--exclude Carthage,third-party,**/*.generated.swift,**/*.template.swift

--indent 2
--maxwidth 100
Expand Down
2 changes: 1 addition & 1 deletion Commons/Tests/CommonsTests/SwiftCommonsTest.swift
Expand Up @@ -143,7 +143,7 @@ class ArraySliceTest: XCTestCase {
expect(grouped).to(equal(
[
1...1,
2...2
2...2,
]
))
}
Expand Down
2 changes: 1 addition & 1 deletion Ignore/Sources/Ignore/GitUtils.swift
Expand Up @@ -3,7 +3,7 @@

import Foundation

public final class GitUtils {
public enum GitUtils {
static func globalGitignoreFileUrl() -> URL? {
guard let path = shellCommandOutput(
"git config --get core.excludesFile",
Expand Down
2 changes: 1 addition & 1 deletion NvimView/Sources/NvimView/CellAttributesCollection.swift
Expand Up @@ -26,7 +26,7 @@ final class CellAttributesCollection {

func attributes(of id: Int, withDefaults defaults: CellAttributes) -> CellAttributes? {
if id == Self.markedAttributesId {
var attr = defaultAttributes
var attr = self.defaultAttributes
attr.fontTrait.formUnion(.underline)
return attr
}
Expand Down
3 changes: 1 addition & 2 deletions NvimView/Sources/NvimView/FontUtils.swift
Expand Up @@ -21,8 +21,7 @@ private struct SizedFontTrait: Hashable {

extension FontTrait: Hashable {}

final class FontUtils {

enum FontUtils {
static func fontHeight(of font: NSFont) -> CGFloat {
if let cached = fontHeightCache.valueForKey(font) { return cached }

Expand Down
1 change: 1 addition & 0 deletions NvimView/Sources/NvimView/KeyUtils.swift
Expand Up @@ -37,6 +37,7 @@ final class KeyUtils {

return key
}

static func isHalfWidth(char: Character) -> Bool {
// https://stackoverflow.com/questions/13505075/analyzing-full-width-or-half-width-character-in-java?noredirect=1&lq=1 // swiftlint:disable:this all
switch char {
Expand Down
2 changes: 1 addition & 1 deletion NvimView/Sources/NvimView/NvimView+Api.swift
Expand Up @@ -6,9 +6,9 @@
import Cocoa
import MessagePack
import PureLayout
import RxNeovim
import RxPack
import RxSwift
import RxNeovim
import SpriteKit

public extension NvimView {
Expand Down
3 changes: 2 additions & 1 deletion NvimView/Sources/NvimView/NvimView+Key.swift
Expand Up @@ -204,7 +204,8 @@ public extension NvimView {

func _unmarkText() {
guard self.hasMarkedText() else { return }
// wait inserted text gui update event, so hanji in korean get right previous string and can popup candidate window
// wait inserted text gui update event, so hanji in korean get right previous string and can
// popup candidate window
DispatchQueue.main.async { [self] in
if let markedInfo = self.ugrid.markedInfo {
self.ugrid.markedInfo = nil
Expand Down
34 changes: 17 additions & 17 deletions NvimView/Sources/NvimView/NvimView+Mouse.swift
Expand Up @@ -6,44 +6,44 @@
import Cocoa
import RxSwift

extension NvimView {
override public func mouseDown(with event: NSEvent) {
public extension NvimView {
override func mouseDown(with event: NSEvent) {
self.mouse(event: event, vimName: "LeftMouse")
}

override public func mouseUp(with event: NSEvent) {
override func mouseUp(with event: NSEvent) {
self.mouse(event: event, vimName: "LeftRelease")
}

override public func mouseDragged(with event: NSEvent) {
override func mouseDragged(with event: NSEvent) {
self.mouse(event: event, vimName: "LeftDrag")
}

override public func rightMouseDown(with event: NSEvent) {
override func rightMouseDown(with event: NSEvent) {
self.mouse(event: event, vimName: "RightMouse")
}

override public func rightMouseUp(with event: NSEvent) {
override func rightMouseUp(with event: NSEvent) {
self.mouse(event: event, vimName: "RightRelease")
}

override public func rightMouseDragged(with event: NSEvent) {
override func rightMouseDragged(with event: NSEvent) {
self.mouse(event: event, vimName: "RightDrag")
}

override public func otherMouseUp(with event: NSEvent) {
override func otherMouseUp(with event: NSEvent) {
self.mouse(event: event, vimName: "MiddleMouse")
}

override public func otherMouseDown(with event: NSEvent) {
override func otherMouseDown(with event: NSEvent) {
self.mouse(event: event, vimName: "MiddleRelease")
}

override public func otherMouseDragged(with event: NSEvent) {
override func otherMouseDragged(with event: NSEvent) {
self.mouse(event: event, vimName: "MiddleDrag")
}

override public func scrollWheel(with event: NSEvent) {
override func scrollWheel(with event: NSEvent) {
let (deltaX, deltaY) = (event.scrollingDeltaX, event.scrollingDeltaY)
if deltaX == 0, deltaY == 0 { return }

Expand All @@ -69,15 +69,15 @@ extension NvimView {
}

if event.phase == .began {
self.trackpadScrollDeltaX = 0
self.trackpadScrollDeltaY = 0
self.trackpadScrollDeltaX = 0
self.trackpadScrollDeltaY = 0
}

self.trackpadScrollDeltaX += deltaX
self.trackpadScrollDeltaY += deltaY
let (deltaCellX, deltaCellY) = (
(self.trackpadScrollDeltaX / self.cellSize.width).rounded(.toNearestOrEven),
(self.trackpadScrollDeltaY / self.cellSize.height).rounded(.toNearestOrEven)
(self.trackpadScrollDeltaX / self.cellSize.width).rounded(.toNearestOrEven),
(self.trackpadScrollDeltaY / self.cellSize.height).rounded(.toNearestOrEven)
)
self.trackpadScrollDeltaX.formRemainder(dividingBy: self.cellSize.width)
self.trackpadScrollDeltaY.formRemainder(dividingBy: self.cellSize.height)
Expand All @@ -95,7 +95,7 @@ extension NvimView {
.disposed(by: self.disposeBag)
}

override public func magnify(with event: NSEvent) {
override func magnify(with event: NSEvent) {
let factor = 1 + event.magnification
let pinchTargetScale = self.pinchTargetScale * factor
let resultingFontSize = round(pinchTargetScale * self.font.pointSize)
Expand Down Expand Up @@ -123,7 +123,7 @@ extension NvimView {
self.markForRenderWholeView()
}

func position(at location: CGPoint) -> Position {
internal func position(at location: CGPoint) -> Position {
let row = Int((self.bounds.size.height - location.y - self.offset.y) / self.cellSize.height)
let column = Int((location.x - self.offset.x) / self.cellSize.width)

Expand Down
2 changes: 1 addition & 1 deletion NvimView/Sources/NvimView/NvimView+Objects.swift
Expand Up @@ -4,8 +4,8 @@
*/

import Foundation
import RxPack
import RxNeovim
import RxPack

public extension NvimView {
struct Buffer: Equatable {
Expand Down
12 changes: 6 additions & 6 deletions NvimView/Sources/NvimView/NvimView+TouchBar.swift
Expand Up @@ -5,9 +5,9 @@
*/

import Cocoa
import RxNeovim
import RxPack
import RxSwift
import RxNeovim

extension NvimView: NSTouchBarDelegate, NSScrubberDataSource, NSScrubberDelegate {
override public func makeTouchBar() -> NSTouchBar? {
Expand Down Expand Up @@ -66,11 +66,11 @@ extension NvimView: NSTouchBarDelegate, NSScrubberDataSource, NSScrubberDelegate
.observe(on: MainScheduler.instance)
.subscribe(onSuccess: { [weak self] in
self?.tabsCache = $0

guard let tabsControl = self?.getTabsControl() else { return }

tabsControl.reloadData()

let scrubberProportionalLayout = tabsControl.scrubberLayout as! NSScrubberProportionalLayout
scrubberProportionalLayout.numberOfVisibleItems = tabsControl
.numberOfItems > 0 ? tabsControl.numberOfItems : 1
Expand All @@ -87,9 +87,9 @@ extension NvimView: NSTouchBarDelegate, NSScrubberDataSource, NSScrubberDelegate
.observe(on: MainScheduler.instance)
.subscribe(onSuccess: { [weak self] in
self?.tabsCache = $0

guard let tabsControl = self?.getTabsControl() else { return }

tabsControl.reloadData()
tabsControl.selectedIndex = self?.selectedTabIndex() ?? tabsControl.selectedIndex
}, onFailure: { error in
Expand Down
2 changes: 1 addition & 1 deletion NvimView/Sources/NvimView/NvimView+Types.swift
Expand Up @@ -6,8 +6,8 @@
import Cocoa
import MessagePack
import PureLayout
import RxPack
import RxNeovim
import RxPack
import Tabs

public extension NvimView {
Expand Down
89 changes: 49 additions & 40 deletions NvimView/Sources/NvimView/UGrid.swift
Expand Up @@ -137,8 +137,8 @@ final class UGrid: CustomStringConvertible, Codable {
step = -1
}
var oldMarkedInfo: MarkedInfo?
if let row = self.markedInfo?.position.row, region.top <= row && row <= region.bottom {
oldMarkedInfo = popMarkedInfo()
if let row = self.markedInfo?.position.row, region.top <= row, row <= region.bottom {
oldMarkedInfo = self.popMarkedInfo()
}
defer {
// keep markedInfo position not changed. markedInfo only following cursor position change
Expand Down Expand Up @@ -196,7 +196,7 @@ final class UGrid: CustomStringConvertible, Codable {
repeating: UCell(string: clearString, attrId: CellAttributesCollection.defaultAttributesId),
count: self.size.width
)
updateMarkedInfo(newValue: nil) // everything need to be reset
self.updateMarkedInfo(newValue: nil) // everything need to be reset
self.cells = Array(repeating: emptyRow, count: self.size.height)
}

Expand Down Expand Up @@ -236,7 +236,7 @@ final class UGrid: CustomStringConvertible, Codable {
// remove marked patch and recover after modified from vim
var oldMarkedInfo: MarkedInfo?
if row == self.markedInfo?.position.row {
oldMarkedInfo = popMarkedInfo()
oldMarkedInfo = self.popMarkedInfo()
}
defer {
if let oldMarkedInfo = oldMarkedInfo {
Expand All @@ -258,73 +258,82 @@ final class UGrid: CustomStringConvertible, Codable {
)
}
}

struct MarkedInfo {
var position: Position
var markedCell: [UCell]
var selectedRange: NSRange // begin from markedCell and calculate by ucell count
var position: Position
var markedCell: [UCell]
var selectedRange: NSRange // begin from markedCell and calculate by ucell count
}

var _markedInfo: MarkedInfo?
func popMarkedInfo() -> MarkedInfo? {
if let markedInfo = _markedInfo {
// true clear or just popup
updateMarkedInfo(newValue: nil)
return markedInfo
}
return nil
if let markedInfo = _markedInfo {
// true clear or just popup
self.updateMarkedInfo(newValue: nil)
return markedInfo
}
return nil
}

// return changedRowStart. Int.max if no change
@discardableResult
func updateMarkedInfo(newValue: MarkedInfo?) -> Int {
assert(Thread.isMainThread, "should occur on main thread!")
var changedRowStart = Int.max
if let old = _markedInfo {
self.cells[old.position.row].removeSubrange(old.position.column..<(old.position.column+old.markedCell.count))
self.cells[old.position.row]
.removeSubrange(old.position.column..<(old.position.column + old.markedCell.count))
changedRowStart = old.position.row
}
_markedInfo = newValue
self._markedInfo = newValue
if let new = newValue {
self.cells[new.position.row].insert(contentsOf: new.markedCell, at: new.position.column)
changedRowStart = min(changedRowStart, new.position.row)
}
return changedRowStart
}

var markedInfo: MarkedInfo? {
get { _markedInfo }
set {
let changedRowStart = updateMarkedInfo(newValue: newValue)
if changedRowStart < self.size.height {
recomputeFlatIndices(rowStart: changedRowStart)
}
get { self._markedInfo }
set {
let changedRowStart = self.updateMarkedInfo(newValue: newValue)
if changedRowStart < self.size.height {
self.recomputeFlatIndices(rowStart: changedRowStart)
}
}
}

func cursorPositionWithMarkedInfo(allowOverflow: Bool = false) -> Position {
var position: Position = cursorPosition
var position: Position = self.cursorPosition
if let markedInfo = markedInfo { position.column += markedInfo.selectedRange.location }
if !allowOverflow, position.column >= size.width { position.column = size.width - 1 }
if !allowOverflow, position.column >= self.size.width { position.column = self.size.width - 1 }
return position
}

// marked text insert into cell directly
// marked text always following cursor position
func updateMark(
markedText: String,
selectedRange: NSRange
markedText: String,
selectedRange: NSRange
) {
assert(Thread.isMainThread, "should occur on main thread!")
var selectedRangeByCell = selectedRange
let markedTextArray: [String] = markedText.enumerated().reduce(into: []) { (array, pair) in
array.append(String(pair.element))
if !KeyUtils.isHalfWidth(char: pair.element) {
array.append("")
if pair.offset < selectedRange.location { selectedRangeByCell.location += 1 }
else { selectedRangeByCell.length += 1 }
}
}
let cells = markedTextArray.map {
UCell(string: $0, attrId: CellAttributesCollection.markedAttributesId)
assert(Thread.isMainThread, "should occur on main thread!")
var selectedRangeByCell = selectedRange
let markedTextArray: [String] = markedText.enumerated().reduce(into: []) { array, pair in
array.append(String(pair.element))
if !KeyUtils.isHalfWidth(char: pair.element) {
array.append("")
if pair.offset < selectedRange.location { selectedRangeByCell.location += 1 }
else { selectedRangeByCell.length += 1 }
}
self.markedInfo = MarkedInfo(position: cursorPosition, markedCell: cells, selectedRange: selectedRangeByCell)

}
let cells = markedTextArray.map {
UCell(string: $0, attrId: CellAttributesCollection.markedAttributesId)
}
self.markedInfo = MarkedInfo(
position: self.cursorPosition,
markedCell: cells,
selectedRange: selectedRangeByCell
)
}

func recomputeFlatIndices(rowStart: Int) {
Expand All @@ -336,7 +345,7 @@ final class UGrid: CustomStringConvertible, Codable {
}

// should update following char too since previous line is change
for row in rowStart...(size.height - 1) {
for row in rowStart...(self.size.height - 1) {
// marked text may overflow size, counter it too
for column in self.cells[row].indices {
if self.cells[row][column].string.isEmpty { counter -= 1 }
Expand Down
2 changes: 1 addition & 1 deletion NvimView/Sources/NvimView/UiBridge.swift
Expand Up @@ -279,7 +279,7 @@ final class UiBridge {
process.launchPath = Bundle.module.url(forResource: "NvimServer", withExtension: nil)!.path
process
.arguments = [self.localServerName, self.remoteServerName, usesCustomTabBarArg] +
["--headless"] + self.nvimArgs
["--headless"] + self.nvimArgs

self.log.debug(
"Launching NvimServer with args: \(String(describing: process.arguments))"
Expand Down

0 comments on commit 339bd0c

Please sign in to comment.