1
1
mirror of https://github.com/qvacua/vimr.git synced 2024-08-16 20:20:28 +03:00

add tentative tcd lcd support

This commit is contained in:
George Harker 2023-12-11 11:18:03 -08:00
parent efb9a5fc60
commit 3c7b75a26b
9 changed files with 107 additions and 5 deletions

View File

@ -58,6 +58,8 @@ public extension NvimView {
case setTitle(String)
case setDirtyStatus(Bool)
case cwdChanged
case tcwdChanged
case lcwdChanged
case bufferListChanged
case tabChanged

View File

@ -333,13 +333,21 @@ extension NvimView {
}
if event == .dirchanged {
guard array.count > 1,
array[1].stringValue != nil
guard array.count > 2,
array[1].stringValue != nil,
let scope = array[2].stringValue
else {
self.bridgeLogger.error("Could not convert \(array)")
return
}
self.cwdChanged(array[1])
if scope == "tabpage" {
self.tcwdChanged(array[1])
} else if scope == "window" {
self.lcwdChanged(array[1])
} else {
self.cwdChanged(array[1])
}
return
}
@ -572,6 +580,28 @@ extension NvimView {
self.eventsSubject.onNext(.cwdChanged)
}
final func tcwdChanged(_ value: MessagePackValue) {
guard let cwd = value.stringValue else {
self.bridgeLogger.error("Could not convert \(value)")
return
}
self.bridgeLogger.debug(cwd)
self._cwd = URL(fileURLWithPath: cwd)
self.eventsSubject.onNext(.tcwdChanged)
}
final func lcwdChanged(_ value: MessagePackValue) {
guard let cwd = value.stringValue else {
self.bridgeLogger.error("Could not convert \(value)")
return
}
self.bridgeLogger.debug(cwd)
self._cwd = URL(fileURLWithPath: cwd)
self.eventsSubject.onNext(.lcwdChanged)
}
final func colorSchemeChanged(_ value: MessagePackValue) {
guard let values = MessagePackUtils.array(
from: value, ofSize: 5, conversion: { $0.intValue }

View File

@ -40,7 +40,7 @@ public protocol NvimViewDelegate: AnyObject {
public final class NvimView: NSView, NSUserInterfaceValidations, NSTextInputClient {
// MARK: - Public
public static let rpcEventName = "com.qvacua.NvimView"
public static let minFontSize = 4.0
@ -142,6 +142,36 @@ public final class NvimView: NSView, NSUserInterfaceValidations, NSTextInputClie
}
}
public var tcwd: URL {
get { self._cwd }
set {
self.api
.exec2(src:"tcd \(newValue.path)", opts: [:])
.subscribe(on: self.scheduler)
.subscribe(onFailure: { [weak self] error in
self?.eventsSubject
.onError(Error.ipc(msg: "Could not set cwd to \(newValue)", cause: error))
})
.disposed(by: self.disposeBag)
}
}
public var lcwd: URL {
get { self._cwd }
set {
self.api
.exec2(src:"lcd \(newValue.path)", opts: [:])
.subscribe(on: self.scheduler)
.subscribe(onFailure: { [weak self] error in
self?.eventsSubject
.onError(Error.ipc(msg: "Could not set cwd to \(newValue)", cause: error))
})
.disposed(by: self.disposeBag)
}
}
public var defaultCellAttributes: CellAttributes {
self.cellAttributesCollection.defaultAttributes
}
@ -375,7 +405,7 @@ public final class NvimView: NSView, NSUserInterfaceValidations, NSTextInputClie
autocmd TabEnter * call rpcnotify(\(channel), 'autocommand', 'tabenter', str2nr(expand('<abuf>')))
autocmd BufWritePost * call rpcnotify(\(channel), 'autocommand', 'bufwritepost', str2nr(expand('<abuf>')))
autocmd BufEnter * call rpcnotify(\(channel), 'autocommand', 'bufenter', str2nr(expand('<abuf>')))
autocmd DirChanged * call rpcnotify(\( channel), 'autocommand', 'dirchanged', expand('<afile>'))
autocmd DirChanged * call rpcnotify(\( channel), 'autocommand', 'dirchanged', expand('<afile>'), v:event['scope'])
autocmd BufModifiedSet * call rpcnotify(\(channel), 'autocommand', 'bufmodifiedset', str2nr(expand('<abuf>')), getbufinfo(str2nr(expand('<abuf>')))[0].changed)
""", opts: [:], errWhenBlocked: false)
// swiftformat:enable all

View File

@ -112,6 +112,8 @@ final class Context: ReduxContext {
private func cleanUpAppState() {
self.state.mainWindows.keys.forEach { uuid in
self.state.mainWindows[uuid]?.cwdToSet = nil
self.state.mainWindows[uuid]?.tcwdToSet = nil
self.state.mainWindows[uuid]?.lcwdToSet = nil
self.state.mainWindows[uuid]?.currentBufferToSet = nil
self.state.mainWindows[uuid]?.viewToBeFocused = nil
self.state.mainWindows[uuid]?.urlsToOpen.removeAll()

View File

@ -67,6 +67,14 @@ extension MainWindow {
self.emit(self.uuidAction(for: .cd(to: self.neoVimView.cwd)))
}
func tcwdChanged() {
self.emit(self.uuidAction(for: .tcd(to: self.neoVimView.cwd)))
}
func lcwdChanged() {
self.emit(self.uuidAction(for: .lcd(to: self.neoVimView.cwd)))
}
func bufferListChanged() {
self.neoVimView
.allBuffers()

View File

@ -10,6 +10,8 @@ import Workspace
extension MainWindow {
enum Action {
case cd(to: URL)
case tcd(to: URL)
case lcd(to: URL)
case setBufferList([NvimView.Buffer])
case newCurrentBuffer(NvimView.Buffer)

View File

@ -290,6 +290,10 @@ final class MainWindow: NSObject,
case .cwdChanged: self?.cwdChanged()
case .tcwdChanged: self?.tcwdChanged()
case .lcwdChanged: self?.lcwdChanged()
case .bufferListChanged: self?.bufferListChanged()
case .tabChanged: self?.tabChanged()
@ -348,6 +352,16 @@ final class MainWindow: NSObject,
self.neoVimView.tabBar?.cwd = cwd.path
}
if let cwd = state.tcwdToSet {
self.neoVimView.tcwd = cwd
self.neoVimView.tabBar?.cwd = cwd.path
}
if let cwd = state.lcwdToSet {
self.neoVimView.lcwd = cwd
self.neoVimView.tabBar?.cwd = cwd.path
}
Completable
.empty()
.andThen {

View File

@ -22,6 +22,18 @@ final class MainWindowReducer: ReducerType {
state.cwdToSet = cwd // Ensure updates also pend to tab bar
}
case let .tcd(to: cwd):
if state.cwd != cwd {
state.cwd = cwd
state.tcwdToSet = cwd // Ensure updates also pend to tab bar
}
case let .lcd(to: cwd):
if state.cwd != cwd {
state.cwd = cwd
state.lcwdToSet = cwd // Ensure updates also pend to tab bar
}
case let .setBufferList(buffers):
state.buffers = buffers

View File

@ -335,6 +335,8 @@ extension MainWindow {
var urlsToOpen = [URL: OpenMode]()
var currentBufferToSet: NvimView.Buffer?
var cwdToSet: URL?
var tcwdToSet: URL?
var lcwdToSet: URL?
var viewToBeFocused: FocusableView? = FocusableView.neoVimView
init(isAllToolsVisible: Bool, isToolButtonsVisible: Bool, nvimBinary: String) {