Resolve #563 #853 Add file path autocompletion

This commit is contained in:
James-Yu 2018-10-08 14:56:33 +08:00
parent f6c8e70db4
commit 4d7199b99f
4 changed files with 67 additions and 11 deletions

View File

@ -188,14 +188,14 @@ export async function activate(context: vscode.ExtensionContext) {
if (extension.manager.hasTexId(e.document.languageId)) {
extension.linter.lintActiveFileIfEnabledAfterInterval()
const previousRoot = extension.manager.rootFile
extension.manager.findRoot().then(rootFile => {
if (rootFile === undefined || rootFile === previousRoot) {
return
}
extension.structureProvider.refresh()
extension.structureProvider.update()
})
// const previousRoot = extension.manager.rootFile
// extension.manager.findRoot().then(rootFile => {
// if (rootFile === undefined || rootFile === previousRoot) {
// return
// }
// extension.structureProvider.refresh()
// extension.structureProvider.update()
// })
}
}))

View File

@ -0,0 +1,43 @@
import * as vscode from 'vscode'
import * as fs from 'fs-extra'
import * as path from 'path'
import {Extension} from '../../main'
export class Input {
extension: Extension
provideRefreshTime: number
constructor(extension: Extension) {
this.extension = extension
}
provide(payload) : vscode.CompletionItem[] {
const mode = payload[0]
const currentFile = payload[1]
const typedFolder = payload[2]
const suggestions: vscode.CompletionItem[] = []
let baseDir
if (mode === 'include') {
baseDir = path.dirname(currentFile)
} else {
baseDir = path.dirname(this.extension.manager.rootFile)
}
if (typedFolder !== '') {
baseDir = path.join(baseDir, typedFolder)
}
try {
const files = fs.readdirSync(baseDir)
files.forEach(file => {
if (fs.lstatSync(path.join(baseDir, file)).isDirectory()) {
const item = new vscode.CompletionItem(`${file}${path.sep}`, vscode.CompletionItemKind.Folder)
item.command = { title: 'Post-Action', command: 'editor.action.triggerSuggest' }
suggestions.push(item)
} else {
suggestions.push(new vscode.CompletionItem(file, vscode.CompletionItemKind.File))
}
})
} catch (error) {}
return suggestions
}
}

View File

@ -7,6 +7,7 @@ import {Command} from './completer/command'
import {Environment} from './completer/environment'
import {Reference} from './completer/reference'
import {Package} from './completer/package'
import {Input} from './completer/input'
export class Completer implements vscode.CompletionItemProvider {
extension: Extension
@ -15,6 +16,7 @@ export class Completer implements vscode.CompletionItemProvider {
environment: Environment
reference: Reference
package: Package
input: Input
constructor(extension: Extension) {
this.extension = extension
@ -23,6 +25,7 @@ export class Completer implements vscode.CompletionItemProvider {
this.environment = new Environment(extension)
this.reference = new Reference(extension)
this.package = new Package(extension)
this.input = new Input(extension)
let defaultEnvs: string
let defaultCommands: string
let defaultSymbols: string
@ -68,7 +71,7 @@ export class Completer implements vscode.CompletionItemProvider {
}
const line = document.lineAt(position.line).text.substr(0, position.character)
for (const type of ['citation', 'reference', 'environment', 'command', 'package']) {
for (const type of ['citation', 'reference', 'environment', 'package', 'input', 'command']) {
const suggestions = this.completion(type, line)
if (suggestions.length > 0) {
if (type === 'citation') {
@ -101,6 +104,7 @@ export class Completer implements vscode.CompletionItemProvider {
completion(type: string, line: string) : vscode.CompletionItem[] {
let reg
let provider
let payload
switch (type) {
case 'citation':
reg = /(?:\\[a-zA-Z]*cite[a-zA-Z]*(?:\[[^\[\]]*\])*){([^}]*)$/
@ -122,6 +126,10 @@ export class Completer implements vscode.CompletionItemProvider {
reg = /(?:\\usepackage(?:\[[^\[\]]*\])*){([^}]*)$/
provider = this.package
break
case 'input':
reg = /(?:\\(input|include|subfile|includegraphics)(?:\[[^\[\]]*\])*){([^}]*)$/
provider = this.input
break
default:
// This shouldn't be possible, so mark as error case in log.
this.extension.logger.addLogMessage(`Error - trying to complete unknown type ${type}`)
@ -130,7 +138,13 @@ export class Completer implements vscode.CompletionItemProvider {
const result = line.match(reg)
let suggestions: vscode.CompletionItem[] = []
if (result) {
suggestions = provider.provide()
if (type === 'input') {
const editor = vscode.window.activeTextEditor
if (editor) {
payload = [result[1], editor.document.fileName, result[2]]
}
}
suggestions = provider.provide(payload)
}
return suggestions
}

View File

@ -89,7 +89,6 @@ export class SectionNodeProvider implements vscode.TreeDataProvider<Section> {
return rootStack.length === 0
}
this.extension.logger.addLogMessage(`Parsing ${filePath} for outline`)
let content = fs.readFileSync(filePath, 'utf-8')
content = content.replace(/([^\\]|^)%.*$/gm, '$1') // Strip comments
const endPos = content.search(/\\end{document}/gm)