or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

completers.mdcompletion-engine.mdindex.mdscripts.mdshell-integration.mdutilities.md

completers.mddocs/

0

# Completers

1

2

Built-in completer classes that provide different completion strategies for various argument types. Completers can be assigned to specific arguments to customize their completion behavior.

3

4

## Capabilities

5

6

### Base Completer

7

8

Abstract base class that all argcomplete completers should inherit from.

9

10

```python { .api }

11

class BaseCompleter:

12

def __call__(

13

self,

14

*,

15

prefix: str,

16

action: argparse.Action,

17

parser: argparse.ArgumentParser,

18

parsed_args: argparse.Namespace

19

) -> None:

20

"""

21

Generate completions for the given prefix.

22

23

Parameters:

24

- prefix: The partial string being completed

25

- action: The argparse action being completed

26

- parser: The argument parser instance

27

- parsed_args: Already parsed arguments

28

29

Returns:

30

- Iterator or list of completion strings

31

"""

32

```

33

34

### Choice Completion

35

36

Completer for predefined choices, useful for arguments with a fixed set of valid values.

37

38

```python { .api }

39

class ChoicesCompleter(BaseCompleter):

40

def __init__(self, choices):

41

"""

42

Create completer for predefined choices.

43

44

Parameters:

45

- choices: Iterable of valid choices

46

"""

47

48

def __call__(self, **kwargs):

49

"""Returns completions matching the choices."""

50

```

51

52

**Usage:**

53

54

```python

55

import argparse

56

import argcomplete

57

from argcomplete import ChoicesCompleter

58

59

parser = argparse.ArgumentParser()

60

parser.add_argument('--format', choices=['json', 'xml', 'yaml'])

61

62

# Use built-in choices completion (automatic)

63

# or explicitly assign:

64

parser.add_argument('--level').completer = ChoicesCompleter(['debug', 'info', 'warning', 'error'])

65

66

argcomplete.autocomplete(parser)

67

```

68

69

### File Completion

70

71

Completer for file and directory paths with optional filtering by file extensions.

72

73

```python { .api }

74

class FilesCompleter(BaseCompleter):

75

def __init__(self, allowednames=(), directories=True):

76

"""

77

Create file completer with optional filtering.

78

79

Parameters:

80

- allowednames: Tuple/list of allowed file extensions (without dots)

81

- directories: Whether to include directories in completion

82

"""

83

84

def __call__(self, prefix, **kwargs):

85

"""Returns file and directory completions matching the prefix."""

86

```

87

88

**Usage:**

89

90

```python

91

from argcomplete import FilesCompleter

92

93

# Complete any files and directories

94

parser.add_argument('--input').completer = FilesCompleter()

95

96

# Complete only Python files and directories

97

parser.add_argument('--script').completer = FilesCompleter(

98

allowednames=('py', 'pyw'),

99

directories=True

100

)

101

102

# Complete only files, no directories

103

parser.add_argument('--data').completer = FilesCompleter(directories=False)

104

105

# Complete multiple file types

106

parser.add_argument('--config').completer = FilesCompleter(

107

allowednames=('json', 'yaml', 'yml', 'toml')

108

)

109

```

110

111

### Directory Completion

112

113

Specialized completer that only completes directories, not files.

114

115

```python { .api }

116

class DirectoriesCompleter(BaseCompleter):

117

def __init__(self):

118

"""Create directory-only completer."""

119

```

120

121

**Usage:**

122

123

```python

124

from argcomplete import DirectoriesCompleter

125

126

parser.add_argument('--output-dir').completer = DirectoriesCompleter()

127

parser.add_argument('--workdir').completer = DirectoriesCompleter()

128

```

129

130

### Environment Variable Completion

131

132

Pre-configured completer for environment variable names.

133

134

```python { .api }

135

EnvironCompleter: ChoicesCompleter # Pre-instantiated with os.environ keys

136

```

137

138

**Usage:**

139

140

```python

141

from argcomplete import EnvironCompleter

142

143

parser.add_argument('--env-var').completer = EnvironCompleter

144

```

145

146

### Suppress Completion

147

148

Completer that suppresses completion for specific arguments.

149

150

```python { .api }

151

class SuppressCompleter(BaseCompleter):

152

def __init__(self):

153

"""Create completer that suppresses completion."""

154

155

def suppress(self) -> bool:

156

"""Returns True to indicate completion should be suppressed."""

157

```

158

159

**Usage:**

160

161

```python

162

from argcomplete import SuppressCompleter

163

164

# Disable completion for sensitive arguments

165

parser.add_argument('--password').completer = SuppressCompleter()

166

parser.add_argument('--secret-key').completer = SuppressCompleter()

167

```

168

169

## Custom Completers

170

171

### Creating Custom Completers

172

173

You can create custom completers by inheriting from BaseCompleter:

174

175

```python

176

import subprocess

177

from argcomplete import BaseCompleter

178

179

class GitBranchCompleter(BaseCompleter):

180

def __call__(self, prefix, **kwargs):

181

try:

182

output = subprocess.check_output(

183

['git', 'branch', '--format=%(refname:short)'],

184

universal_newlines=True

185

)

186

branches = output.strip().split('\n')

187

return [branch for branch in branches if branch.startswith(prefix)]

188

except subprocess.CalledProcessError:

189

return []

190

191

# Use the custom completer

192

parser.add_argument('--branch').completer = GitBranchCompleter()

193

```

194

195

### Dynamic Completers

196

197

Completers can use parsed arguments to provide context-sensitive completion:

198

199

```python

200

class ContextCompleter(BaseCompleter):

201

def __call__(self, prefix, action, parser, parsed_args, **kwargs):

202

if parsed_args.mode == 'development':

203

return ['debug', 'trace', 'verbose']

204

elif parsed_args.mode == 'production':

205

return ['error', 'warning', 'info']

206

return []

207

208

parser.add_argument('--mode', choices=['development', 'production'])

209

parser.add_argument('--log-level').completer = ContextCompleter()

210

```

211

212

### Completer with Descriptions

213

214

Completers can return dictionaries to provide descriptions for completions:

215

216

```python

217

class DocumentedCompleter(BaseCompleter):

218

def __call__(self, prefix, **kwargs):

219

options = {

220

'fast': 'Quick processing with basic features',

221

'thorough': 'Complete processing with all features',

222

'balanced': 'Good balance of speed and features'

223

}

224

return {k: v for k, v in options.items() if k.startswith(prefix)}

225

226

parser.add_argument('--mode').completer = DocumentedCompleter()

227

```

228

229

## Best Practices

230

231

### Performance Considerations

232

233

- Keep completion fast (< 100ms) to maintain responsiveness

234

- Cache expensive operations when possible

235

- Handle exceptions gracefully to prevent completion failures

236

237

```python

238

class CachedCompleter(BaseCompleter):

239

def __init__(self):

240

self._cache = None

241

self._cache_time = 0

242

243

def __call__(self, prefix, **kwargs):

244

import time

245

now = time.time()

246

247

if self._cache is None or now - self._cache_time > 60:

248

self._cache = self._fetch_completions()

249

self._cache_time = now

250

251

return [item for item in self._cache if item.startswith(prefix)]

252

```

253

254

### Error Handling

255

256

```python

257

class RobustCompleter(BaseCompleter):

258

def __call__(self, prefix, **kwargs):

259

try:

260

return self._get_completions(prefix)

261

except Exception:

262

# Fall back to no completions rather than breaking completion

263

return []

264

```