@@ -103,7 +103,13 @@ function addWorkspaceToArgumentsIfExists(args, workspace) {
103
103
return args ;
104
104
}
105
105
106
- function getArgumentsForLineNumber ( editor , fileName , lineNumber , workspace ) {
106
+ function getArgumentsForLineNumber (
107
+ editor ,
108
+ fileName ,
109
+ lineNumber ,
110
+ colNumber ,
111
+ workspace
112
+ ) {
107
113
const editorBasename = path . basename ( editor ) . replace ( / \. ( e x e | c m d | b a t ) $ / i, '' ) ;
108
114
switch ( editorBasename ) {
109
115
case 'atom' :
@@ -112,17 +118,19 @@ function getArgumentsForLineNumber(editor, fileName, lineNumber, workspace) {
112
118
case 'subl' :
113
119
case 'sublime' :
114
120
case 'sublime_text' :
121
+ return [ fileName + ':' + lineNumber + ':' + colNumber ] ;
115
122
case 'wstorm' :
116
123
case 'charm' :
117
124
return [ fileName + ':' + lineNumber ] ;
118
125
case 'notepad++' :
119
- return [ '-n' + lineNumber , fileName ] ;
126
+ return [ '-n' + lineNumber , '-c' + colNumber , fileName ] ;
120
127
case 'vim' :
121
128
case 'mvim' :
122
129
case 'joe' :
130
+ return [ '+' + lineNumber , fileName ] ;
123
131
case 'emacs' :
124
132
case 'emacsclient' :
125
- return [ '+' + lineNumber , fileName ] ;
133
+ return [ '+' + lineNumber + ':' + colNumber , fileName ] ;
126
134
case 'rmate' :
127
135
case 'mate' :
128
136
case 'mine' :
@@ -132,7 +140,7 @@ function getArgumentsForLineNumber(editor, fileName, lineNumber, workspace) {
132
140
case 'code-insiders' :
133
141
case 'Code - Insiders' :
134
142
return addWorkspaceToArgumentsIfExists (
135
- [ '-g' , fileName + ':' + lineNumber ] ,
143
+ [ '-g' , fileName + ':' + lineNumber + ':' + colNumber ] ,
136
144
workspace
137
145
) ;
138
146
case 'appcode' :
@@ -255,17 +263,24 @@ function printInstructions(fileName, errorMessage) {
255
263
}
256
264
257
265
let _childProcess = null ;
258
- function launchEditor ( fileName , lineNumber ) {
266
+ function launchEditor ( fileName , lineNumber , colNumber ) {
259
267
if ( ! fs . existsSync ( fileName ) ) {
260
268
return ;
261
269
}
262
270
263
271
// Sanitize lineNumber to prevent malicious use on win32
264
272
// via: https://github.com/nodejs/node/blob/c3bb4b1aa5e907d489619fb43d233c3336bfc03d/lib/child_process.js#L333
265
- if ( lineNumber && isNaN ( lineNumber ) ) {
273
+ // and it should be a positive integer
274
+ if ( ! ( Number . isInteger ( lineNumber ) && lineNumber > 0 ) ) {
266
275
return ;
267
276
}
268
277
278
+ // colNumber is optional, but should be a positive integer too
279
+ // default is 1
280
+ if ( ! ( Number . isInteger ( colNumber ) && colNumber > 0 ) ) {
281
+ colNumber = 1 ;
282
+ }
283
+
269
284
let [ editor , ...args ] = guessEditor ( ) ;
270
285
271
286
if ( ! editor ) {
@@ -294,7 +309,13 @@ function launchEditor(fileName, lineNumber) {
294
309
let workspace = null ;
295
310
if ( lineNumber ) {
296
311
args = args . concat (
297
- getArgumentsForLineNumber ( editor , fileName , lineNumber , workspace )
312
+ getArgumentsForLineNumber (
313
+ editor ,
314
+ fileName ,
315
+ lineNumber ,
316
+ colNumber ,
317
+ workspace
318
+ )
298
319
) ;
299
320
} else {
300
321
args . push ( fileName ) ;
0 commit comments