@@ -103,7 +103,13 @@ function addWorkspaceToArgumentsIfExists(args, workspace) {
103103 return args ;
104104}
105105
106- function getArgumentsForLineNumber ( editor , fileName , lineNumber , workspace ) {
106+ function getArgumentsForLineNumber (
107+ editor ,
108+ fileName ,
109+ lineNumber ,
110+ colNumber ,
111+ workspace
112+ ) {
107113 const editorBasename = path . basename ( editor ) . replace ( / \. ( e x e | c m d | b a t ) $ / i, '' ) ;
108114 switch ( editorBasename ) {
109115 case 'atom' :
@@ -112,17 +118,19 @@ function getArgumentsForLineNumber(editor, fileName, lineNumber, workspace) {
112118 case 'subl' :
113119 case 'sublime' :
114120 case 'sublime_text' :
121+ return [ fileName + ':' + lineNumber + ':' + colNumber ] ;
115122 case 'wstorm' :
116123 case 'charm' :
117124 return [ fileName + ':' + lineNumber ] ;
118125 case 'notepad++' :
119- return [ '-n' + lineNumber , fileName ] ;
126+ return [ '-n' + lineNumber , '-c' + colNumber , fileName ] ;
120127 case 'vim' :
121128 case 'mvim' :
122129 case 'joe' :
130+ return [ '+' + lineNumber , fileName ] ;
123131 case 'emacs' :
124132 case 'emacsclient' :
125- return [ '+' + lineNumber , fileName ] ;
133+ return [ '+' + lineNumber + ':' + colNumber , fileName ] ;
126134 case 'rmate' :
127135 case 'mate' :
128136 case 'mine' :
@@ -132,7 +140,7 @@ function getArgumentsForLineNumber(editor, fileName, lineNumber, workspace) {
132140 case 'code-insiders' :
133141 case 'Code - Insiders' :
134142 return addWorkspaceToArgumentsIfExists (
135- [ '-g' , fileName + ':' + lineNumber ] ,
143+ [ '-g' , fileName + ':' + lineNumber + ':' + colNumber ] ,
136144 workspace
137145 ) ;
138146 case 'appcode' :
@@ -255,17 +263,24 @@ function printInstructions(fileName, errorMessage) {
255263}
256264
257265let _childProcess = null ;
258- function launchEditor ( fileName , lineNumber ) {
266+ function launchEditor ( fileName , lineNumber , colNumber ) {
259267 if ( ! fs . existsSync ( fileName ) ) {
260268 return ;
261269 }
262270
263271 // Sanitize lineNumber to prevent malicious use on win32
264272 // 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 ) ) {
266275 return ;
267276 }
268277
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+
269284 let [ editor , ...args ] = guessEditor ( ) ;
270285
271286 if ( ! editor ) {
@@ -294,7 +309,13 @@ function launchEditor(fileName, lineNumber) {
294309 let workspace = null ;
295310 if ( lineNumber ) {
296311 args = args . concat (
297- getArgumentsForLineNumber ( editor , fileName , lineNumber , workspace )
312+ getArgumentsForLineNumber (
313+ editor ,
314+ fileName ,
315+ lineNumber ,
316+ colNumber ,
317+ workspace
318+ )
298319 ) ;
299320 } else {
300321 args . push ( fileName ) ;
0 commit comments