##// END OF EJS Templates
Remove -i options from mv, rm and cp aliases...
Steve Chan -
Show More
@@ -1,238 +1,238 b''
1 1 # encoding: utf-8
2 2 """
3 3 System command aliases.
4 4
5 5 Authors:
6 6
7 7 * Fernando Perez
8 8 * Brian Granger
9 9 """
10 10
11 11 #-----------------------------------------------------------------------------
12 12 # Copyright (C) 2008-2011 The IPython Development Team
13 13 #
14 14 # Distributed under the terms of the BSD License.
15 15 #
16 16 # The full license is in the file COPYING.txt, distributed with this software.
17 17 #-----------------------------------------------------------------------------
18 18
19 19 #-----------------------------------------------------------------------------
20 20 # Imports
21 21 #-----------------------------------------------------------------------------
22 22
23 23 import os
24 24 import re
25 25 import sys
26 26
27 27 from IPython.config.configurable import Configurable
28 28 from IPython.core.error import UsageError
29 29
30 30 from IPython.utils.py3compat import string_types
31 31 from IPython.utils.traitlets import List, Instance
32 32 from IPython.utils.warn import error
33 33
34 34 #-----------------------------------------------------------------------------
35 35 # Utilities
36 36 #-----------------------------------------------------------------------------
37 37
38 38 # This is used as the pattern for calls to split_user_input.
39 39 shell_line_split = re.compile(r'^(\s*)()(\S+)(.*$)')
40 40
41 41 def default_aliases():
42 42 """Return list of shell aliases to auto-define.
43 43 """
44 44 # Note: the aliases defined here should be safe to use on a kernel
45 45 # regardless of what frontend it is attached to. Frontends that use a
46 46 # kernel in-process can define additional aliases that will only work in
47 47 # their case. For example, things like 'less' or 'clear' that manipulate
48 48 # the terminal should NOT be declared here, as they will only work if the
49 49 # kernel is running inside a true terminal, and not over the network.
50 50
51 51 if os.name == 'posix':
52 52 default_aliases = [('mkdir', 'mkdir'), ('rmdir', 'rmdir'),
53 ('mv', 'mv -i'), ('rm', 'rm -i'), ('cp', 'cp -i'),
53 ('mv', 'mv'), ('rm', 'rm'), ('cp', 'cp'),
54 54 ('cat', 'cat'),
55 55 ]
56 56 # Useful set of ls aliases. The GNU and BSD options are a little
57 57 # different, so we make aliases that provide as similar as possible
58 58 # behavior in ipython, by passing the right flags for each platform
59 59 if sys.platform.startswith('linux'):
60 60 ls_aliases = [('ls', 'ls -F --color'),
61 61 # long ls
62 62 ('ll', 'ls -F -o --color'),
63 63 # ls normal files only
64 64 ('lf', 'ls -F -o --color %l | grep ^-'),
65 65 # ls symbolic links
66 66 ('lk', 'ls -F -o --color %l | grep ^l'),
67 67 # directories or links to directories,
68 68 ('ldir', 'ls -F -o --color %l | grep /$'),
69 69 # things which are executable
70 70 ('lx', 'ls -F -o --color %l | grep ^-..x'),
71 71 ]
72 72 else:
73 73 # BSD, OSX, etc.
74 74 ls_aliases = [('ls', 'ls -F -G'),
75 75 # long ls
76 76 ('ll', 'ls -F -l -G'),
77 77 # ls normal files only
78 78 ('lf', 'ls -F -l -G %l | grep ^-'),
79 79 # ls symbolic links
80 80 ('lk', 'ls -F -l -G %l | grep ^l'),
81 81 # directories or links to directories,
82 82 ('ldir', 'ls -F -G -l %l | grep /$'),
83 83 # things which are executable
84 84 ('lx', 'ls -F -l -G %l | grep ^-..x'),
85 85 ]
86 86 default_aliases = default_aliases + ls_aliases
87 87 elif os.name in ['nt', 'dos']:
88 88 default_aliases = [('ls', 'dir /on'),
89 89 ('ddir', 'dir /ad /on'), ('ldir', 'dir /ad /on'),
90 90 ('mkdir', 'mkdir'), ('rmdir', 'rmdir'),
91 91 ('echo', 'echo'), ('ren', 'ren'), ('copy', 'copy'),
92 92 ]
93 93 else:
94 94 default_aliases = []
95 95
96 96 return default_aliases
97 97
98 98
99 99 class AliasError(Exception):
100 100 pass
101 101
102 102
103 103 class InvalidAliasError(AliasError):
104 104 pass
105 105
106 106 class Alias(object):
107 107 """Callable object storing the details of one alias.
108 108
109 109 Instances are registered as magic functions to allow use of aliases.
110 110 """
111 111
112 112 # Prepare blacklist
113 113 blacklist = {'cd','popd','pushd','dhist','alias','unalias'}
114 114
115 115 def __init__(self, shell, name, cmd):
116 116 self.shell = shell
117 117 self.name = name
118 118 self.cmd = cmd
119 119 self.nargs = self.validate()
120 120
121 121 def validate(self):
122 122 """Validate the alias, and return the number of arguments."""
123 123 if self.name in self.blacklist:
124 124 raise InvalidAliasError("The name %s can't be aliased "
125 125 "because it is a keyword or builtin." % self.name)
126 126 try:
127 127 caller = self.shell.magics_manager.magics['line'][self.name]
128 128 except KeyError:
129 129 pass
130 130 else:
131 131 if not isinstance(caller, Alias):
132 132 raise InvalidAliasError("The name %s can't be aliased "
133 133 "because it is another magic command." % self.name)
134 134
135 135 if not (isinstance(self.cmd, string_types)):
136 136 raise InvalidAliasError("An alias command must be a string, "
137 137 "got: %r" % self.cmd)
138 138
139 139 nargs = self.cmd.count('%s')
140 140
141 141 if (nargs > 0) and (self.cmd.find('%l') >= 0):
142 142 raise InvalidAliasError('The %s and %l specifiers are mutually '
143 143 'exclusive in alias definitions.')
144 144
145 145 return nargs
146 146
147 147 def __repr__(self):
148 148 return "<alias {} for {!r}>".format(self.name, self.cmd)
149 149
150 150 def __call__(self, rest=''):
151 151 cmd = self.cmd
152 152 nargs = self.nargs
153 153 # Expand the %l special to be the user's input line
154 154 if cmd.find('%l') >= 0:
155 155 cmd = cmd.replace('%l', rest)
156 156 rest = ''
157 157 if nargs==0:
158 158 # Simple, argument-less aliases
159 159 cmd = '%s %s' % (cmd, rest)
160 160 else:
161 161 # Handle aliases with positional arguments
162 162 args = rest.split(None, nargs)
163 163 if len(args) < nargs:
164 164 raise UsageError('Alias <%s> requires %s arguments, %s given.' %
165 165 (self.name, nargs, len(args)))
166 166 cmd = '%s %s' % (cmd % tuple(args[:nargs]),' '.join(args[nargs:]))
167 167
168 168 self.shell.system(cmd)
169 169
170 170 #-----------------------------------------------------------------------------
171 171 # Main AliasManager class
172 172 #-----------------------------------------------------------------------------
173 173
174 174 class AliasManager(Configurable):
175 175
176 176 default_aliases = List(default_aliases(), config=True)
177 177 user_aliases = List(default_value=[], config=True)
178 178 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC')
179 179
180 180 def __init__(self, shell=None, **kwargs):
181 181 super(AliasManager, self).__init__(shell=shell, **kwargs)
182 182 # For convenient access
183 183 self.linemagics = self.shell.magics_manager.magics['line']
184 184 self.init_aliases()
185 185
186 186 def init_aliases(self):
187 187 # Load default & user aliases
188 188 for name, cmd in self.default_aliases + self.user_aliases:
189 189 self.soft_define_alias(name, cmd)
190 190
191 191 @property
192 192 def aliases(self):
193 193 return [(n, func.cmd) for (n, func) in self.linemagics.items()
194 194 if isinstance(func, Alias)]
195 195
196 196 def soft_define_alias(self, name, cmd):
197 197 """Define an alias, but don't raise on an AliasError."""
198 198 try:
199 199 self.define_alias(name, cmd)
200 200 except AliasError as e:
201 201 error("Invalid alias: %s" % e)
202 202
203 203 def define_alias(self, name, cmd):
204 204 """Define a new alias after validating it.
205 205
206 206 This will raise an :exc:`AliasError` if there are validation
207 207 problems.
208 208 """
209 209 caller = Alias(shell=self.shell, name=name, cmd=cmd)
210 210 self.shell.magics_manager.register_function(caller, magic_kind='line',
211 211 magic_name=name)
212 212
213 213 def get_alias(self, name):
214 214 """Return an alias, or None if no alias by that name exists."""
215 215 aname = self.linemagics.get(name, None)
216 216 return aname if isinstance(aname, Alias) else None
217 217
218 218 def is_alias(self, name):
219 219 """Return whether or not a given name has been defined as an alias"""
220 220 return self.get_alias(name) is not None
221 221
222 222 def undefine_alias(self, name):
223 223 if self.is_alias(name):
224 224 del self.linemagics[name]
225 225 else:
226 226 raise ValueError('%s is not an alias' % name)
227 227
228 228 def clear_aliases(self):
229 229 for name, cmd in self.aliases:
230 230 self.undefine_alias(name)
231 231
232 232 def retrieve_alias(self, name):
233 233 """Retrieve the command to which an alias expands."""
234 234 caller = self.get_alias(name)
235 235 if caller:
236 236 return caller.cmd
237 237 else:
238 238 raise ValueError('%s is not an alias' % name)
General Comments 0
You need to be logged in to leave comments. Login now